diff --git a/.eslintignore b/.eslintignore index c684d095051..aec808745ea 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,6 @@ # also ignored in packages/cosmic-proto/.eslintignore, but IDE's pick up the root config -packages/cosmic-proto/dist +packages/cosmic-proto/node_modules/ +packages/cosmic-proto/coverage/ +packages/cosmic-proto/dist/ +packages/cosmic-proto/proto/ packages/cosmic-proto/src/codegen/ diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 1711f4831b6..43f34a9aaa4 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -62,15 +62,12 @@ module.exports = { root: true, parser: '@typescript-eslint/parser', parserOptions: { - // Works for us! - EXPERIMENTAL_useProjectService: true, + useProjectService: true, sourceType: 'module', - project: [ - './packages/*/tsconfig.json', - './packages/*/tsconfig.json', - './packages/wallet/*/tsconfig.json', - './tsconfig.json', - ], + projectService: { + allowDefaultProject: ['*.js'], + defaultProject: 'tsconfig.json', + }, tsconfigRootDir: __dirname, extraFileExtensions: ['.cjs'], }, @@ -141,6 +138,9 @@ module.exports = { // CI has a separate format check but keep this warn to maintain that "eslint --fix" prettifies // UNTIL https://github.com/Agoric/agoric-sdk/issues/4339 'prettier/prettier': 'warn', + + // Not a risk with our coding style + 'no-use-before-define': 'off', }, settings: { jsdoc: { @@ -174,8 +174,8 @@ module.exports = { { files: [ 'packages/**/demo/**/*.js', - 'packages/*/test/**/*.js', - 'packages/*/test/**/*.test.js', + 'packages/*/test/**/*.*s', + 'packages/*/test/**/*.test.*s', 'packages/wallet/api/test/**/*.js', ], rules: { @@ -185,12 +185,23 @@ module.exports = { // NOTE: This rule is enabled for the repository in general. We turn it // off for test code for now. '@jessie.js/safe-await-separator': 'off', + + // Like `'ava/no-only-test`, but works with @endo/ses-ava + 'no-restricted-properties': [ + 'error', + { + object: 'test', + property: 'only', + message: + 'Do not commit .only tests - they prevent other tests from running', + }, + ], }, }, { // These tests use EV() instead of E(), which are easy to confuse. // Help by erroring when E() packages are imported. - files: ['packages/boot/test/**/*.test.*'], + files: ['packages/boot/test/**/*.test.*s'], rules: { 'no-restricted-imports': [ 'error', @@ -226,12 +237,16 @@ module.exports = { { files: ['*.d.ts'], rules: { - // Irrelevant in a typedef - 'no-use-before-define': 'off', // Linter confuses the type declaration with value declaration 'no-redeclare': 'off', }, }, + { + // disable type-aware linting for these files that have can have a .d.ts twin + // because it can't go into tsconfig (because that would cause tsc build to overwrite the .d.ts twin) + files: ['exported.*', 'types-index.*', 'types-ambient.*', 'types.*'], + extends: ['plugin:@typescript-eslint/disable-type-checked'], + }, { // disable type-aware linting in HTML files: ['*.html'], @@ -243,7 +258,7 @@ module.exports = { files: ['a3p-integration/**'], extends: ['plugin:@typescript-eslint/disable-type-checked'], parserOptions: { - EXPERIMENTAL_useProjectService: false, + useProjectService: false, project: false, }, rules: { diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e0728e65b5d..dc1ce3900b3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,11 +2,6 @@ v ✰ Thanks for creating a PR! ✰ ☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> - - -closes: #XXXX -refs: #XXXX - + + +closes: #XXXX +refs: #XXXX + ## Description @@ -32,4 +32,4 @@ These directives should be removed before adding a merge label, so final integra ### Upgrade Considerations - + diff --git a/.github/actions/ci-test-result.cjs b/.github/actions/ci-test-result.cjs new file mode 100644 index 00000000000..0c66ece5848 --- /dev/null +++ b/.github/actions/ci-test-result.cjs @@ -0,0 +1,65 @@ +#! /usr/bin/env node +const fs = require('node:fs'); +const process = require('node:process'); +const { sendMetricsToGCP, makeTimeSeries } = require('./gcp-monitoring.cjs'); + +const resultFiles = process.argv.slice(2); + +const tapResultRegex = new RegExp( + `(^(?not )?ok (?[0-9]+) - (?.+?)(?: %ava-dur=(?[0-9]+)ms)?(?:# (?.+?))?$(?(\n^#.+?$)*)(?(\n^(?:(?!(?:not|ok) ))[^\n\r]+?$)*))`, + 'gms', +); +let timeSeriesData = []; + +function processTAP(packageName, tapbody) { + let m; + const returnValue = []; + // eslint-disable-next-line no-cond-assign + while ((m = tapResultRegex.exec(tapbody))) { + if (m.groups.name) { + const testCaseName = `${m.groups.name}`.replace(/["<>]/g, '').trim(); + + let skipped = false; + let succeeded = true; + let todo = false; + if (m.groups.status) { + succeeded = false; + } + if (m.groups.comments) { + if (m.groups.comments.match(/SKIP/gi)) { + skipped = true; + } + if (m.groups.comments.match(/TODO/gi)) { + todo = true; + skipped = true; + succeeded = true; + } + } + returnValue.push({ + labels: { + test_name: testCaseName, + package: packageName, + test_status: + succeeded && !(todo || skipped) + ? 'succeeded' + : !succeeded + ? 'failed' + : 'skipped', + }, + value: Number(succeeded && !(todo || skipped)), + }); + } + } + return returnValue; +} + +for (const file of resultFiles) { + const resultsBody = fs.readFileSync(file, 'utf-8'); + const packageName = file.split('/').at(-2); + + const response = processTAP(packageName, resultsBody); + timeSeriesData.push(...response); +} + +const timeSeries = makeTimeSeries(timeSeriesData); +sendMetricsToGCP(timeSeries); diff --git a/.github/actions/dump-ci-stats-to-gcp-metrics.cjs b/.github/actions/dump-ci-stats-to-gcp-metrics.cjs new file mode 100644 index 00000000000..b01f72ebba9 --- /dev/null +++ b/.github/actions/dump-ci-stats-to-gcp-metrics.cjs @@ -0,0 +1,169 @@ +const Monitoring = require('@google-cloud/monitoring'); + +const gcpCredentials = JSON.parse(process.env.GCP_CREDENTIALS); +const monitoring = new Monitoring.MetricServiceClient({ + projectId: gcpCredentials.project_id, + credentials: { + client_email: gcpCredentials.client_email, + private_key: gcpCredentials.private_key, + }, +}); + +async function sendMetricsToGCP(metricType, metricValue, labels) { + const projectId = gcpCredentials.project_id; + + const request = { + name: monitoring.projectPath(projectId), + timeSeries: [ + { + metric: { + type: `custom.googleapis.com/github/${metricType}`, + labels: labels, + }, + resource: { + type: 'global', + labels: { + project_id: projectId, + }, + }, + points: [ + { + interval: { + endTime: { + seconds: Math.floor(Date.now() / 1000), + }, + }, + value: { + doubleValue: metricValue, + }, + }, + ], + }, + ], + }; + try { + await monitoring.createTimeSeries(request); + console.log(`Metric ${metricType} sent successfully.`); + } catch (error) { + console.error('Error sending metric:', error); + } +} + +// Function to fetch workflow and job details via GitHub API +async function fetchWorkflowDetails() { + const runId = process.argv[2]; + const repo = process.env.GITHUB_REPOSITORY; + const apiUrl = `https://api.github.com/repos/${repo}/actions/runs/${runId}`; + + try { + const response = await fetch(apiUrl, { + headers: { + Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, + Accept: 'application/vnd.github.v3+json', + }, + }); + + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + const data = await response.json(); + + return { + workflowId: data.id, + workflowName: data.name, + status: data.status, // "completed", "in_progress", etc. + conclusion: data.conclusion, // "success", "failure" + startTime: data.created_at, + endTime: data.updated_at, + trigger: data.event, // "push", "pull_request", etc. + jobs: await fetchJobDetails(repo, data.id), // Fetch individual job details + }; + } catch (error) { + console.error('Error fetching workflow details:', error); + process.exit(1); + } +} + +async function fetchJobDetails(repo, runId) { + const apiUrl = `https://api.github.com/repos/${repo}/actions/runs/${runId}/jobs`; + + try { + const response = await fetch(apiUrl, { + headers: { + Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, + Accept: 'application/vnd.github.v3+json', + }, + }); + + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + const data = await response.json(); + return data.jobs; + } catch (error) { + console.error('Error fetching job details:', error); + return []; + } +} + +// Main function to send metrics +(async () => { + try { + const workflowStats = await fetchWorkflowDetails(); + + const workflowLabels = { + workflow_name: workflowStats.workflowName, + workflow_id: workflowStats.workflowId, + trigger: workflowStats.trigger, + }; + + const workflowDuration = + (new Date(workflowStats.endTime) - new Date(workflowStats.startTime)) / + 1000; + await sendMetricsToGCP( + 'ci_workflow_duration', + workflowDuration, + workflowLabels, + ); + + for (const job of workflowStats.jobs) { + const jobLabels = { + workflow_name: workflowStats.workflowName, + job_name: job.name, + runner_name: job.runner_name, + conclusion: job.conclusion, + }; + + const jobExecutionTime = + (new Date(job.completed_at) - new Date(job.started_at)) / 1000; + await sendMetricsToGCP( + 'ci_job_execution_time', + jobExecutionTime, + jobLabels, + ); + + // Send job status (1 for success, 0 for failure) + const jobStatus = job.conclusion === 'success' ? 1 : 0; + await sendMetricsToGCP('ci_job_status', jobStatus, jobLabels); + + // Capture step-level metrics for step details per job + for (const step of job.steps) { + const stepExecutionTime = + (new Date(step.completed_at) - new Date(step.started_at)) / 1000; + const stepLabels = { + workflow_name: workflowStats.workflowName, + job_name: job.name, + step_name: step.name, + runner_name: job.runner_name, + }; + + await sendMetricsToGCP( + 'ci_step_execution_time', + stepExecutionTime, + stepLabels, + ); + } + } + } catch (error) { + console.error('Error in main function:', error); + process.exit(1); + } + + process.exit(0); +})(); diff --git a/.github/actions/gcp-monitoring.cjs b/.github/actions/gcp-monitoring.cjs new file mode 100644 index 00000000000..d6bea4ea25a --- /dev/null +++ b/.github/actions/gcp-monitoring.cjs @@ -0,0 +1,62 @@ +const Monitoring = require('@google-cloud/monitoring'); + +const gcpCredentials = JSON.parse(process.env.GCP_CREDENTIALS); +const projectId = gcpCredentials.project_id; + +const monitoring = new Monitoring.MetricServiceClient({ + projectId: gcpCredentials.project_id, + credentials: { + client_email: gcpCredentials.client_email, + private_key: gcpCredentials.private_key, + }, +}); + +async function sendMetricsToGCP(timeSeries) { + const batchSize = 200; + for (let i = 0; i < timeSeries.length; i += batchSize) { + const batch = timeSeries.slice(i, i + batchSize); + const request = { + name: monitoring.projectPath(projectId), + timeSeries: batch, + }; + + try { + await monitoring.createTimeSeries(request); + console.log( + `Batch starting with metric ${batch[0].metric.type} sent successfully.`, + ); + } catch (error) { + console.error('Error sending batch:', error); + } + } +} + +function makeTimeSeries(testData) { + const timeSeries = testData.map(({ labels, value }) => ({ + metric: { + type: `custom.googleapis.com/github/test-results`, + labels, + }, + resource: { + type: 'global', + labels: { + project_id: projectId, + }, + }, + points: [ + { + interval: { + endTime: { + seconds: Math.floor(Date.now() / 1000), + }, + }, + value: { + doubleValue: value, + }, + }, + ], + })); + return timeSeries; +} + +module.exports = { sendMetricsToGCP, makeTimeSeries }; diff --git a/.github/actions/post-test/action.yml b/.github/actions/post-test/action.yml index 457c928618e..6515ff3ef53 100644 --- a/.github/actions/post-test/action.yml +++ b/.github/actions/post-test/action.yml @@ -14,6 +14,10 @@ inputs: description: 'site for datadog' required: false default: 'us3.datadoghq.com' + gcp-credentials: + description: 'gcp' + required: false + default: '' runs: using: composite @@ -26,7 +30,7 @@ runs: DATADOG_SITE: ${{ inputs.datadog-site }} continue-on-error: true run: | - ./scripts/ci-collect-testruns.sh + ./scripts/ci/collect-testruns.sh if [ "${{ inputs.datadog-token }}" != "" ]; then export DATADOG_API_KEY="${{ inputs.datadog-token }}" export DD_ENV="ci" @@ -53,3 +57,10 @@ runs: continue-on-error: true with: token: ${{ inputs.codecov-token }} + - name: Send test results to GCP + shell: bash + if: ${{ inputs.gcp-credentials }} + env: + GCP_CREDENTIALS: ${{ inputs.gcp-credentials }} + run: | + node .github/actions/ci-test-result.cjs ./packages/*/_testoutput.txt diff --git a/.github/workflows/after-merge.yml b/.github/workflows/after-merge.yml index 1c8747d8cee..ed37c3c2506 100644 --- a/.github/workflows/after-merge.yml +++ b/.github/workflows/after-merge.yml @@ -105,10 +105,8 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: generate coverage for all tests - run: 'yarn test:c8-all || :' - - name: generate coverage/html reports - run: mkdir -p coverage/tmp && yarn c8 report --reporter=html-spa --reports-dir=coverage/html --temp-directory=coverage/tmp + - name: generate test coverage report + run: ./scripts/ci/generate-test-coverage-report.sh - uses: actions/upload-artifact@v4 with: name: coverage diff --git a/.github/workflows/dump-ci-stats.yml b/.github/workflows/dump-ci-stats.yml new file mode 100644 index 00000000000..4565e0f6fe3 --- /dev/null +++ b/.github/workflows/dump-ci-stats.yml @@ -0,0 +1,39 @@ +name: Dump GH CI Stats + +on: + workflow_run: # This allows the workflow to be reused + workflows: + [ + 'Integration Tests', + 'Test Golang', + 'golangci-lint', + 'Build release Docker Images', + 'Test all Packages', + 'Test Documentation', + 'Manage integration check', + 'after-merge.yml', + ] + types: + - completed + +jobs: + dump_ci_stats: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install GCP Monitoring/Metrics Client + run: yarn add @google-cloud/monitoring --ignore-workspace-root-check + + - name: Run Final Job and Send Logs to GCP + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GCP_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + run: | + node .github/actions/dump-ci-stats-to-gcp-metrics.cjs ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 4ae7458e4d3..4d396afe867 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -229,6 +229,14 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: + - name: update job environment + run: | + if [ ":$HOME" = : ]; then + # Keep the first two path components, e.g. /home/runner. + HOME="(pwd | sed -E 's#^(/[^/]+/[^/]+).*#\1#')" + echo "HOME=$HOME" >> "$GITHUB_ENV" + fi + echo "SLOGFILE=$HOME/test.slog" >> "$GITHUB_ENV" - name: free up disk space run: | # Workaround to provide additional free space for testing. @@ -279,30 +287,28 @@ jobs: - name: run proposals tests run: yarn test working-directory: a3p-integration - - name: collect all core eval scripts - # Core eval scripts will be copied under /tmp/core_eval_scripts directory - # colons in the parent directory name will be replaced with dashes + - name: copy a3p-integration + if: (success() || failure()) run: | - find . -type d -path "./a3p-integration/proposals/*/submission" | while read -r dir; do - # Get the parent directory name - parent_dir=$(basename "$(dirname "$dir")") - # Replace colons with dashes in the parent directory name - sanitized_parent_dir=${parent_dir//:/-} - # Create the destination directory under /tmp/core_eval_scripts if it doesn't exist - destination_dir="/tmp/core_eval_scripts/$sanitized_parent_dir" - mkdir -p "$destination_dir" - # Copy everything from the $dir to the destination directory - cp -r "$dir"/* "$destination_dir/" - echo "Copied contents of $dir to $destination_dir" - done - - name: archive core eval scripts - # The core eval scripts can be found at the bottom of `Summary` page of - # `Integration tests` workflow once the workflow is completed. - # Ref: https://github.com/actions/upload-artifact?tab=readme-ov-file#where-does-the-upload-go + dir='/tmp/export/a3p-integration' + rm -rf "$dir" + scripts/ci/export-a3p.sh a3p-integration "$dir" + # Artifacts can be found at the bottom of `Summary` page of + # `Integration tests` workflow once the workflow is completed. + # Ref: https://github.com/actions/upload-artifact?tab=readme-ov-file#where-does-the-upload-go + - name: archive a3p-integration + if: (success() || failure()) + uses: actions/upload-artifact@v4 + with: + name: a3p-integration + path: /tmp/export/a3p-integration + - name: archive slogfile + if: (success() || failure()) uses: actions/upload-artifact@v4 with: - name: core-eval-scripts - path: /tmp/core_eval_scripts + name: slogfile + path: ${{ env.SLOGFILE }} + retention-days: 10 - name: notify on failure if: failure() && github.event_name != 'pull_request' uses: ./.github/actions/notify-status diff --git a/.github/workflows/multichain-e2e-template.yml b/.github/workflows/multichain-e2e-template.yml new file mode 100644 index 00000000000..32cc3f6594a --- /dev/null +++ b/.github/workflows/multichain-e2e-template.yml @@ -0,0 +1,135 @@ +name: Multichain E2E Workflow Template + +on: + workflow_call: + inputs: + config: + required: true + type: string + test_command: + required: true + type: string + description: 'Test command to run (e.g., "test:main" or "test:fast-usdc")' + +jobs: + multichain-e2e: + runs-on: ubuntu-latest-16core + + steps: + - uses: actions/checkout@v4 + with: + submodules: 'true' + path: ./agoric-sdk + + - uses: ./agoric-sdk/.github/actions/restore-node + with: + node-version: 18.x + path: ./agoric-sdk + + # Extract chain and relayer information + - name: Extract config information + id: extract-config + run: | + # Create logs directory with unique path per run/job + LOG_DIR="$GITHUB_WORKSPACE/agoric-sdk/multichain-testing/logs/$GITHUB_RUN_ID/$GITHUB_JOB" + mkdir -p "$LOG_DIR/validators" + mkdir -p "$LOG_DIR/relayers" + echo "LOG_DIR=${LOG_DIR}" >> $GITHUB_ENV + + # Extract namespace name + NAMESPACE=$(yq e '.name' ./agoric-sdk/multichain-testing/${{ inputs.config }}) + echo "NAMESPACE=${NAMESPACE}" >> $GITHUB_ENV + + # Build validator pod names (chainid-genesis-0) + VALIDATOR_PODS=$(yq e '.chains[] | .id + "-genesis-0"' ./agoric-sdk/multichain-testing/${{ inputs.config }} | tr '\n' ' ') + echo "VALIDATOR_PODS=${VALIDATOR_PODS}" >> $GITHUB_ENV + + # Build relayer pod names (type-name-0) + RELAYER_PODS=$(yq e '.relayers[] | .type + "-" + .name + "-0"' ./agoric-sdk/multichain-testing/${{ inputs.config }} | tr '\n' ' ') + echo "RELAYER_PODS=${RELAYER_PODS}" >> $GITHUB_ENV + + # For debugging + echo "Namespace: ${NAMESPACE}" + echo "Validator pods: ${VALIDATOR_PODS}" + echo "Relayer pods: ${RELAYER_PODS}" + + - name: yarn link + run: | + yarn link-cli ~/bin/agoric + echo "/home/runner/bin" >> $GITHUB_PATH + working-directory: ./agoric-sdk + + - name: Enable Corepack + run: corepack enable + working-directory: ./agoric-sdk/multichain-testing + + - name: Install @agoric/multichain-testing deps + run: yarn install + working-directory: ./agoric-sdk/multichain-testing + + - name: Lint @agoric/multichain-testing + run: yarn lint + working-directory: ./agoric-sdk/multichain-testing + + - name: Setup Starship Infrastructure + id: starship-infra + uses: cosmology-tech/starship-action@0.3.0 + with: + values: ./agoric-sdk/multichain-testing/${{ inputs.config }} + port-forward: true + version: 0.2.20 + timeout: 30m + namespace: ${{ env.NAMESPACE }} + + - name: Fund Provision Pool + run: | + kubectl config set-context --current --namespace=${NAMESPACE} + kubectl get pods + make fund-provision-pool + working-directory: ./agoric-sdk/multichain-testing + + - name: Override Chain Registry + run: make override-chain-registry + working-directory: ./agoric-sdk/multichain-testing + + - name: Register Interchain Bank Assets + run: make register-bank-assets + working-directory: ./agoric-sdk/multichain-testing + + - name: Run @agoric/multichain-testing E2E Tests + run: yarn ${{ inputs.test_command }} + working-directory: ./agoric-sdk/multichain-testing + env: + FILE: ${{ inputs.config }} + + - name: Capture slog.slog + if: always() + run: | + cd $GITHUB_WORKSPACE + echo "Capturing agoric slog.slog" + kubectl exec -i agoriclocal-genesis-0 -c validator -- cat slog.slog > "${LOG_DIR}/slog.slog" 2>&1 || true + + - name: Capture validator logs + if: always() + run: | + cd $GITHUB_WORKSPACE + for pod in ${VALIDATOR_PODS}; do + echo "Capturing validator logs for ${pod}" + kubectl logs ${pod} --container=validator > "${LOG_DIR}/validators/${pod}.log" 2>&1 || true + done + + - name: Capture relayer logs + if: always() + run: | + cd $GITHUB_WORKSPACE + for pod in ${RELAYER_PODS}; do + echo "Capturing relayer logs for ${pod}" + kubectl logs ${pod} --container=relayer > "${LOG_DIR}/relayers/${pod}.log" 2>&1 || true + done + + - name: Upload validator and relayer logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: multichain-e2e-logs-${{ env.NAMESPACE }}-${{ github.run_id }}-${{ github.job }} + path: ${{ env.LOG_DIR }} diff --git a/.github/workflows/multichain-e2e.yml b/.github/workflows/multichain-e2e.yml index 718e9d2974d..bb86c2d7ffc 100644 --- a/.github/workflows/multichain-e2e.yml +++ b/.github/workflows/multichain-e2e.yml @@ -5,81 +5,16 @@ on: workflow_call: jobs: - multichain-e2e: - runs-on: ubuntu-latest-16core - - steps: - - uses: actions/checkout@v4 - with: - submodules: 'true' - path: ./agoric-sdk - - uses: ./agoric-sdk/.github/actions/restore-node - with: - node-version: 18.x - path: ./agoric-sdk - - - name: yarn link - run: | - yarn link-cli ~/bin/agoric - echo "/home/runner/bin" >> $GITHUB_PATH - working-directory: ./agoric-sdk - - - name: Enable Corepack - run: corepack enable - working-directory: ./agoric-sdk/multichain-testing - - - name: Install @agoric/multichain-testing deps - run: yarn install - working-directory: ./agoric-sdk/multichain-testing - - - name: Lint @agoric/multichain-testing - run: yarn lint - working-directory: ./agoric-sdk/multichain-testing - - - name: Setup Starship Infrastructure - id: starship-infra - uses: cosmology-tech/starship-action@0.3.0 - with: - # uses ghcr.io/agoric/agoric-sdk:dev image (latest master) - values: ./agoric-sdk/multichain-testing/config.yaml - port-forward: true - version: 0.2.10 - timeout: 30m - namespace: agoric-multichain - - - name: Fund Provision Pool - run: | - kubectl config set-context --current --namespace=agoric-multichain - kubectl get pods - make fund-provision-pool - working-directory: ./agoric-sdk/multichain-testing - - - name: Ensure ports are forwarded - run: | - curl --fail --retry 3 --retry-delay 10 http://localhost:26657/status || (echo "agoriclocal node is available") - curl --fail --retry 3 --retry-delay 10 http://localhost:8081/chains/agoriclocal || (echo "agoriclocal URL check failed") - curl --fail --retry 3 --retry-delay 10 http://localhost:8081/chains/osmosislocal || (echo "osmosislocal URL check failed") - curl --fail --retry 3 --retry-delay 10 http://localhost:8081/chains/gaialocal || (echo "gaialocal URL check failed") - - - name: Override Chain Registry - run: make override-chain-registry - working-directory: ./agoric-sdk/multichain-testing - - - name: Run @agoric/multichain-testing E2E Tests - run: yarn test - working-directory: ./agoric-sdk/multichain-testing - - - name: Capture and print agoric validator logs - if: always() - run: kubectl logs agoriclocal-genesis-0 --container=validator || true - working-directory: ./agoric-sdk/multichain-testing - - - name: Capture and print agoric-osmosis relayer logs - if: always() - run: kubectl logs hermes-agoric-osmosis-0 --container=relayer || true - working-directory: ./agoric-sdk/multichain-testing - - - name: Capture and print agoric-cosmos relayer logs - if: always() - run: kubectl logs hermes-agoric-gaia-0 --container=relayer || true - working-directory: ./agoric-sdk/multichain-testing + orchestration-api-test: + name: Multichain E2E (Orchestration API) + uses: ./.github/workflows/multichain-e2e-template.yml + with: + config: config.yaml + test_command: test:main + + fast-usdc-test: + name: Multichain E2E (Fast USDC) + uses: ./.github/workflows/multichain-e2e-template.yml + with: + config: config.fusdc.yaml + test_command: test:fast-usdc diff --git a/.github/workflows/test-all-packages.yml b/.github/workflows/test-all-packages.yml index 9acc0f5485d..e775350bab0 100644 --- a/.github/workflows/test-all-packages.yml +++ b/.github/workflows/test-all-packages.yml @@ -82,7 +82,7 @@ jobs: # We split the package tests into two jobs because type linting # is inefficient and slow https://github.com/typescript-eslint/typescript-eslint/issues/2094 lint-primary: - timeout-minutes: 15 + timeout-minutes: 20 needs: build runs-on: ubuntu-latest steps: @@ -91,22 +91,13 @@ jobs: with: node-version: '18.x' - # first job also does repo-level linting - name: lint repo format run: yarn lint:format - # eslint - - name: yarn lint primary - run: ./scripts/lint-with-types.sh primary - # build the API docs to verify it works - - name: build API docs - run: yarn docs - # build the API docs in markdown for agoric/documentation repo to verify it works - - name: build API docs in markdown - run: yarn docs:markdown-for-agoric-documentation-repo + # eslint and tsc + - run: yarn lint:packages + # A second job for what's not covered in primary lint-rest: - timeout-minutes: 15 - needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -117,8 +108,6 @@ jobs: # Check some of a3p-integration in this job that runs on PRs instead of # waiting for the slow integration test that by default only runs in the # master merge check - - name: yarn lint rest of packages/* - run: ./scripts/lint-with-types.sh rest - name: Lint a3p-integration run: yarn install && yarn lint && yarn doctor working-directory: a3p-integration @@ -126,6 +115,13 @@ jobs: run: yarn run build:submissions working-directory: a3p-integration + # Attempt the doc generation to catch build errors before + # landing on master + - name: build API docs + run: yarn docs + - name: build API docs in markdown + run: yarn docs:markdown-for-agoric-documentation-repo + ################## # Fast-running tests run as a group: test-quick: @@ -221,6 +217,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-quick2: # BEGIN-TEST-BOILERPLATE @@ -263,6 +260,9 @@ jobs: - name: yarn test (casting) if: (success() || failure()) run: cd packages/casting && yarn ${{ steps.vars.outputs.test }} | $TEST_COLLECT + - name: yarn test (client-utils) + if: (success() || failure()) + run: cd packages/client-utils && yarn ${{ steps.vars.outputs.test }} | $TEST_COLLECT - name: yarn test (create-dapp) run: cd packages/create-dapp && yarn ${{ steps.vars.outputs.test }} | $TEST_COLLECT - name: yarn test (fast-usdc) @@ -343,6 +343,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} ############## # Long-running tests are executed individually. @@ -386,6 +387,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-solo: # BEGIN-TEST-BOILERPLATE @@ -427,6 +429,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-cosmic-swingset: # BEGIN-TEST-BOILERPLATE @@ -471,6 +474,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-inter-protocol: # BEGIN-TEST-BOILERPLATE @@ -512,6 +516,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-boot: # BEGIN-TEST-BOILERPLATE @@ -557,6 +562,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-swingset: # BEGIN-TEST-BOILERPLATE @@ -608,6 +614,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-zoe-unit: # BEGIN-TEST-BOILERPLATE @@ -651,6 +658,7 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} test-zoe-swingset: # BEGIN-TEST-BOILERPLATE @@ -693,3 +701,4 @@ jobs: with: datadog-token: ${{ secrets.DATADOG_API_KEY }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + gcp-credentials: ${{ secrets.GCP_CREDENTIALS }} diff --git a/COVERAGE.md b/COVERAGE.md index 59d8019d78d..3dcda91d4ed 100644 --- a/COVERAGE.md +++ b/COVERAGE.md @@ -2,59 +2,36 @@ ## Caveat -Until each module can be migrated to support Node.js's builtin ESM -implementation (`nesm`), the coverage line numbers will be out-of-sync with -reality. - -In addition, we will have to implement source maps in all of our +Lines from bundled code cannot be detected until we implement source maps in all of our source-to-source transforms (such as `@endo/bundle-source`, `@agoric/transform-metering`, and `@agoric/static-module-record`). ## Reports -Coverage reports for the current main branch (whose packages support `nesm`) are +### Whole repo +Coverage reports for the current main branch are published by CI to: https://agoric-sdk-coverage.netlify.app -You can create a report in any package (including the top-level directory): +See `scripts/ci/generate-test-coverage-report.sh` + +## Per package +You can create a report in any package: + +```sh +yarn test:c8 +``` +For more flexibility: ```sh # Get options available for coverage: yarn c8 --help -# Run ava under Node.js coverage and display a summary: -yarn c8 -a ava +# Run a particular test +yarn c8 -a ava test/foo.test.js # Generate a nice, detailed HTML report: yarn c8 report --reporter=html-spa open coverage/html/index.html ``` -## Node.js ESM Support - -With the current `patches/esm+3.2.25.diff`, it is possible to migrate packages -to support both resm (`-r esm`) and nesm (Node.js ESM Support). If an -`agoric-sdk` package has dependencies that support nesm, you can attempt to make -it also support nesm by: - -1. Create `ava-nesm.config.js` removing `"require": ["esm"]`: - -```sh -../../scripts/ava-nesm.cjs > ava-nesm.config.js -``` - -2. Make the following changes to its `package.json` (omitting comments): - -```js -{ - // Enable nesm support. - "type": "module", - "scripts": { - // The following line enables coverage generation from the top. - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js" - } -} -``` - -3. Test that both `yarn test` and `yarn test:c8` run correctly. - ## Planned Implementation Our runtime source transforms can be conditional on the `$NODE_V8_COVERAGE` diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 6f3ac44d1ba..12624d0d2c0 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -95,7 +95,7 @@ For each set of changes to include after the base branch point: - If encountering a commit with conflicts that do not have a straightforward resolution, check if picking any prior commit would help resolve the conflicts. - Abort the rebase, update the authored `rebase-todo`, and restart the interactive rebase. - Avoid authoring manual changes unless absolutely necessary. If authoring changes, keep them as separate commits and indicate them as such on the authored rebase todo (insert either a `pick` instruction with the id of the commit you just authored or an `exec` instruction that makes the modifications and ends with `git commit -m $message`, in either case prefixing with an explanatory `##` comment). - - For `exec`, make portable in-place edits with either `ed` or `alias sed-i="sed -i $(sed --help 2>&1 | sed 2q | grep -qe '-i ' && echo "''")"`, e.g. `printf 'H\n/\( *\)foo/ s##\\1// prettier-ignore\\\n&#\nw\n' | ed -s packages/path/to/file'` or `sed-i -E "$(printf 's#( *)foo#\\1// prettier-ignore\\\n&#')" packages/path/to/file`. + - For `exec`, make portable in-place edits with either `ed` or `alias sedi="sed -i $(sed --help 2>&1 | sed 2q | grep -qe '-i ' && echo "''")"`, e.g. `printf 'H\n/\( *\)foo/ s##\\1// prettier-ignore\\\n&#\nw\n' | ed -s packages/path/to/file'` or `sedi -E "$(printf 's#( *)foo#\\1// prettier-ignore\\\n&#')" packages/path/to/file`. - If a commit is empty, skip it and comment it out in the rebase todo. - [ ] Verify that tests pass. In particular: - Linting locally can catch incompatibilities in the cherry-pick, often requiring some changes to be reverted or more commits from `master` to be included. In those cases, update the authored `rebase-todo`, and redo the interactive rebase as necessary. diff --git a/a3p-integration/.eslintignore b/a3p-integration/.eslintignore new file mode 100644 index 00000000000..f14a44ccd20 --- /dev/null +++ b/a3p-integration/.eslintignore @@ -0,0 +1 @@ +agoric-sdk/ diff --git a/a3p-integration/README.md b/a3p-integration/README.md index 6076bb3509f..c5c2a3d4a29 100644 --- a/a3p-integration/README.md +++ b/a3p-integration/README.md @@ -1,8 +1,12 @@ -# Overview +# a3p-integration overview This directory contains an end-to-end integration test executed against a synthetic agoric-3 chain. The test performs a chain software upgrade to the software contained in the enclosing `agoric-sdk` repository, then executes a series of functional tests verifying the upgrade accomplished its goal. -# How to run +## Quick-Start: How to Get a Chain Running + +To get a chain running with an existing proposal such as `f:fast-usdc`, run `yarn test -m fast-usdc --debug`; likewise `yarn test -m --debug` for any other proposal name. + +## How to run The synthetic chain testing infrastructure relies on Docker, Docker Buildx extended build capabilities, and the experimental Buildx Bake extension. Make sure you have a recent Docker engine installed for your system. @@ -108,11 +112,37 @@ Instead of relying on an automatic `submission` folder, a core-eval proposal can # Build details +In the `ghcr.io/agoric/agoric-sdk` image the filesystem is: +``` +/usr/src/agoric-sdk +``` + +With the proposals layered on top of the `agoric-sdk` image, the filesystem adds (for example): +``` +/usr/src/proposals/n:upgrade-next +/usr/src/proposals/z:acceptance +``` + +In agoric-sdk CI and development, we want the proposals to use the versions of the packages in the agoric-sdk source tree. To accomplish this we use `yarn link`. In Yarn 4 (berry) it uses a `portal` protocol to link to another Yarn project on the filesystem. One kink is that in development the command would, +``` +yarn link --relative ../../.. --all +``` +Which configures the package.json resolutions to find agoric-sdk three levels up. + +But in CI the proposals aren't nested under agoric-sdk and the command would be, +``` +yarn link --relative ../../agoric-sdk --all +``` + +To give a consistent location, `a3p-integration` has a symlink to the `agoric-sdk` project where the proposals expect it in the Docker fileystem. (I.e. treating `a3p-integration` as `/usr/src` of the Docker image.) + + The `yarn build` script automates 3 steps: - Building the `unreleased` SDK image - Generating the `submission` folders in core proposal packages - Building the synthetic-chain images using the proposals + ## Generate a docker image with the `agoric-sdk` chain software The chain software upgrade proposal contained in this end-to-end integration test performs an upgrade of the agoric-3 synthetic chain to an `UNRELEASED_A3P_INTEGRATION` plan name (or the corresponding upgrade plan name for release branches). It loads the docker image `ghcr.io/agoric/agoric-sdk:unreleased` for the software implementing that upgrade (both in the `master` branch or in release branches). @@ -127,12 +157,12 @@ make -C ../packages/deployment docker-build-sdk In a3p-integration, many core-eval proposals' `submission` content has to be generated from the local `agoric-sdk`, and must be rebuilt every time there is a -change. The `scripts/build-all-submissions.sh` script contains commands to -generate the core-eval content and move it to the expected proposal package's -submission directory. The generation is executed as part of `a3p-integration`'s -`build:submissions` step. Each proposal that requires such a build step should -add an entry to the `sdk-generate` array in the `agoricProposal` section of -`package.json`. +change. This package's package.json `build:submissions` script runs +`scripts/build-all-submissions.sh` to generate that content and move it into +submission subdirectories under the corresponding [proposal +directories](#package-layering). Each proposal that requires such a build step +should have a corresponding entry in the `sdk-generate` array of its proposal +directory's package.json `agoricProposal` section. Submissions that don't need to pass in options or generate references to source bundles can be written directly in a `foo-submission` subdirectory of the @@ -146,15 +176,17 @@ provided, it should be written as two parts: a core eval (in one of the `.../proposals` directories) and a builder for it (under `.../builders/scripts`). The `build-all-submissions.sh` script reads instructions from -`agoricProposal.sdk-generate` in `package.json`. That field contains a list of -strings, each of which describes a single submission. If there is only one -submission, it can use the default directory name `submission` by specifying -only the name of the script file in `builders/scripts/vars`: +`agoricProposal.sdk-generate` in package.json. That field contains a list of +strings, each of which describes a single submission as a list of +space-separated fields. If there is only one submission, it can use the default +directory name `submission` by specifying just one field, containing the path of +a builder script file relative to +[packages/builders/scripts](../packages/builders/scripts): ```json "sdk-generate": ["test-localchain"], ``` -If there are multiple submissions, each entry has to specify the script name and -a distinct directory name. +If there are multiple submissions, each entry has to specify a distinct +directory name in the second field: ```json "sdk-generate": [ "probe-zcf-bundle probe-submission", @@ -162,8 +194,7 @@ a distinct directory name. "add-auction newAuction-submission" ], ``` -A third argument can be used to provide additional parameters to the -build script. +Any remaining fields provide additional arguments to the build script: ```json "sdk-generate": [ "inter-protocol/updatePriceFeeds.js submission/main main", diff --git a/a3p-integration/agoric-sdk b/a3p-integration/agoric-sdk new file mode 120000 index 00000000000..b870225aa05 --- /dev/null +++ b/a3p-integration/agoric-sdk @@ -0,0 +1 @@ +../ \ No newline at end of file diff --git a/a3p-integration/debug-current.sh b/a3p-integration/debug-current.sh index 93a15440a4c..6fabda024e6 100755 --- a/a3p-integration/debug-current.sh +++ b/a3p-integration/debug-current.sh @@ -1,8 +1,12 @@ -#!/bin/sh +#!/bin/bash +set -ueo pipefail # Convenience script to debug the current proposal being worked on. -scripts/build-submission.sh proposals/z:acceptance testing/start-valueVow.js start-valueVow -scripts/build-submission.sh proposals/z:acceptance testing/restart-valueVow.js restart-valueVow +( + cd 'proposals/z:acceptance' + ../../scripts/build-submission.sh testing/start-valueVow.js start-valueVow + ../../scripts/build-submission.sh testing/restart-valueVow.js restart-valueVow +) yarn test -m acceptance --debug diff --git a/a3p-integration/package.json b/a3p-integration/package.json index ee9bb0a570a..7c36b3494af 100644 --- a/a3p-integration/package.json +++ b/a3p-integration/package.json @@ -8,14 +8,17 @@ "build:sdk": "make -C ../packages/deployment docker-build-sdk", "build:submissions": "scripts/build-all-submissions.sh", "build:synthetic-chain": "yarn synthetic-chain build", - "lint": "../node_modules/.bin/eslint proposals", + "lint-fix": "yarn lint:eslint --fix", + "lint": "../node_modules/.bin/run-s --continue-on-error 'lint:*'", + "lint:types": "find proposals -maxdepth 2 -name package.json -type f -exec ../node_modules/.bin/tsc -p '{}'/.. ';'", + "lint:eslint": "../node_modules/.bin/eslint .", "test": "yarn synthetic-chain test", "doctor": "yarn synthetic-chain doctor" }, "dependencies": { - "@agoric/synthetic-chain": "^0.3.0", + "@agoric/synthetic-chain": "^0.4.3", "@types/better-sqlite3": "^7.6.11" }, - "packageManager": "yarn@4.2.2", + "packageManager": "yarn@4.5.3", "license": "Apache-2.0" } diff --git a/a3p-integration/proposals/a:upgrade-18/.gitignore b/a3p-integration/proposals/a:upgrade-18/.gitignore new file mode 100644 index 00000000000..ba5cba542e2 --- /dev/null +++ b/a3p-integration/proposals/a:upgrade-18/.gitignore @@ -0,0 +1 @@ +testUpgradedBoard/ diff --git a/a3p-integration/proposals/a:upgrade-18/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch b/a3p-integration/proposals/a:upgrade-18/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch new file mode 100644 index 00000000000..9c00803d7a3 --- /dev/null +++ b/a3p-integration/proposals/a:upgrade-18/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch @@ -0,0 +1,45 @@ +diff --git a/dist/node/axios.cjs b/dist/node/axios.cjs +index db4997bee1aa48aca215c6b2e7443292c94c086f..fb39f7e0046c66b1c0275c1a82ed49d3cc7cff83 100644 +--- a/dist/node/axios.cjs ++++ b/dist/node/axios.cjs +@@ -371,9 +371,18 @@ function merge(/* obj1, obj2, obj3, ... */) { + const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { +- a[key] = bind(val, thisArg); +- } else { ++ val = bind(val, thisArg); ++ } ++ const oldDesc = Object.getOwnPropertyDescriptor(a, key); ++ if (oldDesc) { + a[key] = val; ++ } else { ++ Object.defineProperty(a, key, { ++ value: val, ++ writable: true, ++ enumerable: true, ++ configurable: true ++ }); + } + }, {allOwnKeys}); + return a; +@@ -404,7 +413,9 @@ const stripBOM = (content) => { + */ + const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); +- constructor.prototype.constructor = constructor; ++ Object.defineProperty(constructor.prototype, 'constructor', { ++ value: constructor ++ }); + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); +@@ -566,7 +577,7 @@ const isRegExp = kindOfTest('RegExp'); + + const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); +- const reducedDescriptors = {}; ++ const reducedDescriptors = Object.create(null); + + forEach(descriptors, (descriptor, name) => { + let ret; diff --git a/a3p-integration/proposals/a:upgrade-18/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch b/a3p-integration/proposals/a:upgrade-18/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch new file mode 100644 index 00000000000..1122600ffe5 --- /dev/null +++ b/a3p-integration/proposals/a:upgrade-18/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch @@ -0,0 +1,36 @@ +diff --git a/src/util/minimal.js b/src/util/minimal.js +index 3c406dee753b5c6fb29dda2e64d4482e754e7873..564e5dadaa50e4ad05fc18b767ee276c99e9f0f9 100644 +--- a/src/util/minimal.js ++++ b/src/util/minimal.js +@@ -280,7 +280,30 @@ function newError(name) { + merge(this, properties); + } + +- (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError; ++ CustomError.prototype = Object.create(Error.prototype, { ++ constructor: { ++ value: CustomError, ++ writable: true, ++ enumerable: false, ++ configurable: true, ++ }, ++ name: { ++ get() { return name; }, ++ set: undefined, ++ enumerable: false, ++ // configurable: false would accurately preserve the behavior of ++ // the original, but I'm guessing that was not intentional. ++ // For an actual error subclass, this property would ++ // be configurable. ++ configurable: true, ++ }, ++ toString: { ++ value() { return this.name + ": " + this.message; }, ++ writable: true, ++ enumerable: false, ++ configurable: true, ++ }, ++ }); + + Object.defineProperty(CustomError.prototype, "name", { get: function() { return name; } }); + diff --git a/a3p-integration/proposals/a:upgrade-18/acceptInvites.js b/a3p-integration/proposals/a:upgrade-18/acceptInvites.js index 72245bf6d3e..5f61566a150 100644 --- a/a3p-integration/proposals/a:upgrade-18/acceptInvites.js +++ b/a3p-integration/proposals/a:upgrade-18/acceptInvites.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -import '@endo/init'; +import '@endo/init/debug.js'; import { agops, GOV1ADDR, GOV2ADDR } from '@agoric/synthetic-chain'; import { GOV4ADDR } from './agoric-tools.js'; diff --git a/a3p-integration/proposals/a:upgrade-18/addGov4.js b/a3p-integration/proposals/a:upgrade-18/addGov4.js index d84ec7f5890..f95c383fd52 100644 --- a/a3p-integration/proposals/a:upgrade-18/addGov4.js +++ b/a3p-integration/proposals/a:upgrade-18/addGov4.js @@ -1,4 +1,4 @@ -import '@endo/init'; +import '@endo/init/debug.js'; import { execFileSync } from 'node:child_process'; import { makeAgd } from './synthetic-chain-excerpt.js'; import { GOV4ADDR } from './agoric-tools.js'; diff --git a/a3p-integration/proposals/a:upgrade-18/initial.test.js b/a3p-integration/proposals/a:upgrade-18/initial.test.js index e86b4dd9993..c3e26d68692 100644 --- a/a3p-integration/proposals/a:upgrade-18/initial.test.js +++ b/a3p-integration/proposals/a:upgrade-18/initial.test.js @@ -1,15 +1,18 @@ import test from 'ava'; +import '@endo/init/debug.js'; import { getVatDetails } from '@agoric/synthetic-chain'; const vats = { - network: { incarnation: 1 }, - ibc: { incarnation: 1 }, - localchain: { incarnation: 1 }, - orchestration: { incarnation: 0 }, - transfer: { incarnation: 1 }, + network: { incarnation: 2 }, + ibc: { incarnation: 2 }, + localchain: { incarnation: 2 }, + orchestration: { incarnation: 1 }, + transfer: { incarnation: 2 }, walletFactory: { incarnation: 5 }, zoe: { incarnation: 3 }, + // Terminated in a future proposal. + '-ATOM-USD_price_feed-governor': { incarnation: 0 }, }; test(`vat details`, async t => { diff --git a/a3p-integration/proposals/a:upgrade-18/openVault.js b/a3p-integration/proposals/a:upgrade-18/openVault.js new file mode 100644 index 00000000000..1583af59993 --- /dev/null +++ b/a3p-integration/proposals/a:upgrade-18/openVault.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +import { + GOV1ADDR, + CHAINID, + agd, + openVault, + addUser, + waitForBlock, + provisionSmartWallet, + ATOM_DENOM, +} from '@agoric/synthetic-chain'; + +export const bankSend = (from, addr, wanted) => { + const chain = ['--chain-id', CHAINID]; + const fromArg = ['--from', from]; + const testKeyring = ['--keyring-backend', 'test']; + const noise = [...fromArg, ...chain, ...testKeyring, '--yes']; + + return agd.tx('bank', 'send', from, addr, wanted, ...noise); +}; + +const user = await addUser('long-living-vault'); +console.log('USER', user); +await bankSend(GOV1ADDR, user, `80000000uist`); +console.log('IST sent'); +await provisionSmartWallet(user, `20000000ubld,100000000${ATOM_DENOM}`); +console.log('Provision sent'); +await waitForBlock(3); +console.log('Wait For Block done. Sending open vault offer'); + +const mint = '5.0'; +const collateral = '10.0'; +await openVault(user, mint, collateral); diff --git a/a3p-integration/proposals/a:upgrade-18/package.json b/a3p-integration/proposals/a:upgrade-18/package.json index 8332149f061..01f765919d2 100644 --- a/a3p-integration/proposals/a:upgrade-18/package.json +++ b/a3p-integration/proposals/a:upgrade-18/package.json @@ -7,17 +7,21 @@ "coreProposals": [], "releaseNotes": false }, + "sdk-generate": [ + "testing/test-upgraded-board.js testUpgradedBoard" + ], "type": "Software Upgrade Proposal" }, "type": "module", "license": "Apache-2.0", "dependencies": { - "@agoric/synthetic-chain": "^0.3.0", - "@endo/init": "^1.1.5", - "@endo/marshal": "^1.5.4", + "@agoric/client-utils": "dev", + "@agoric/synthetic-chain": "^0.4.3", + "@endo/init": "^1.1.6", + "@endo/marshal": "^1.6.1", "ava": "^5.3.1", "better-sqlite3": "^9.6.0", - "execa": "^9.3.1" + "execa": "9.1.0" }, "ava": { "concurrency": 1, @@ -29,5 +33,14 @@ "scripts": { "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" }, - "packageManager": "yarn@4.2.2" + "packageManager": "yarn@4.5.3", + "devDependencies": { + "eslint": "^8.57.0", + "npm-run-all": "^4.1.5", + "typescript": "^5.6.3" + }, + "resolutions": { + "axios@npm:^1.6.0": "patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch", + "protobufjs@npm:^6.8.8": "patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch" + } } diff --git a/a3p-integration/proposals/a:upgrade-18/priceFeed-follower-auction.test.js b/a3p-integration/proposals/a:upgrade-18/priceFeed-follower-auction.test.js index 1dc0df73472..2844ec3d04b 100644 --- a/a3p-integration/proposals/a:upgrade-18/priceFeed-follower-auction.test.js +++ b/a3p-integration/proposals/a:upgrade-18/priceFeed-follower-auction.test.js @@ -1,4 +1,5 @@ import test from 'ava'; +import '@endo/init/debug.js'; import { getDetailsMatchingVats } from './vatDetails.js'; test('new auction vat', async t => { diff --git a/a3p-integration/proposals/a:upgrade-18/priceFeedUpdate.test.js b/a3p-integration/proposals/a:upgrade-18/priceFeedUpdate.test.js index d0bdaa1b055..557a837be9e 100644 --- a/a3p-integration/proposals/a:upgrade-18/priceFeedUpdate.test.js +++ b/a3p-integration/proposals/a:upgrade-18/priceFeedUpdate.test.js @@ -1,4 +1,5 @@ import test from 'ava'; +import '@endo/init/debug.js'; import { agops, @@ -83,6 +84,7 @@ const openMarginalVault = async t => { const currentVaults = await agops.vaults('list', '--from', USER1ADDR); t.log('opening a vault'); + // @ts-expect-error bad typedef await openVault(USER1ADDR, 5, 10); user1IST += 5; const istBalanceAfterVaultOpen = await getISTBalance(USER1ADDR); @@ -110,9 +112,10 @@ const checkNewAuctionVat = async t => { }; const countPriceFeedVats = async t => { - // price_feed and governor, old and new for two tokens + // price_feed and governor, old and new for two tokens, + // minus governor v110 (terminated by core-eval) const priceFeedDetails = await getDetailsMatchingVats('price_feed'); - t.is(Object.keys(priceFeedDetails).length, 8); + t.is(Object.keys(priceFeedDetails).length, 7); // Two old SPAs, and two new ones const details = await getDetailsMatchingVats('scaledPriceAuthority'); diff --git a/a3p-integration/proposals/a:upgrade-18/replaceElectorate.test.js b/a3p-integration/proposals/a:upgrade-18/replaceElectorate.test.js index 422287dc8b3..b34272901fc 100644 --- a/a3p-integration/proposals/a:upgrade-18/replaceElectorate.test.js +++ b/a3p-integration/proposals/a:upgrade-18/replaceElectorate.test.js @@ -1,5 +1,5 @@ import test from 'ava'; -import '@endo/init'; +import '@endo/init/debug.js'; import { GOV1ADDR, GOV2ADDR } from '@agoric/synthetic-chain'; import { passStyleOf } from '@endo/marshal'; import { GOV4ADDR, queryVstorageFormatted } from './agoric-tools.js'; diff --git a/a3p-integration/proposals/a:upgrade-18/synthetic-chain-excerpt.js b/a3p-integration/proposals/a:upgrade-18/synthetic-chain-excerpt.js index 0c65ed69d5f..832d5e54ffb 100644 --- a/a3p-integration/proposals/a:upgrade-18/synthetic-chain-excerpt.js +++ b/a3p-integration/proposals/a:upgrade-18/synthetic-chain-excerpt.js @@ -32,22 +32,20 @@ const waitForBootstrap = async () => { } }; -export const waitForBlock = async (times = 1) => { - console.log(times); - let time = 0; - while (time < times) { - const block1 = await waitForBootstrap(); +export const waitForBlock = async (n = 1) => { + console.log(`waitForBlock waiting for ${n} new block(s)...`); + const h0 = await waitForBootstrap(); + let lastHeight = h0; + for (let i = 0; i < n; i += 1) { while (true) { - const block2 = await waitForBootstrap(); - - if (block1 !== block2) { - console.log('block produced'); + await new Promise(r => setTimeout(r, 1000)); + const currentHeight = await waitForBootstrap(); + if (currentHeight !== lastHeight) { + console.log(`waitForBlock saw new height ${currentHeight}`); + lastHeight = currentHeight; break; } - - await new Promise(r => setTimeout(r, 1000)); } - time += 1; } }; @@ -57,7 +55,6 @@ const agdBinary = 'agd'; /** * @param {{execFileSync: typeof import('child_process').execFileSync }} io - * @returns */ export const makeAgd = ({ execFileSync }) => { /** diff --git a/a3p-integration/proposals/a:upgrade-18/test-lib/price-feed.js b/a3p-integration/proposals/a:upgrade-18/test-lib/price-feed.js index c0e2acd311d..0fefd5ca52e 100644 --- a/a3p-integration/proposals/a:upgrade-18/test-lib/price-feed.js +++ b/a3p-integration/proposals/a:upgrade-18/test-lib/price-feed.js @@ -6,7 +6,7 @@ import { pushPrices, getPriceQuote, } from '@agoric/synthetic-chain'; -import { retryUntilCondition } from './sync-tools.js'; +import { retryUntilCondition } from '@agoric/client-utils'; export const scale6 = x => BigInt(x * 1_000_000); @@ -57,6 +57,6 @@ export const getPriceFeedRoundId = async brand => { prefix: '', }); - console.log('latestRound: ', latestRound); + console.log(latestRoundPath, latestRound); return Number(latestRound.roundId); }; diff --git a/a3p-integration/proposals/a:upgrade-18/test-lib/sync-tools.js b/a3p-integration/proposals/a:upgrade-18/test-lib/sync-tools.js deleted file mode 100644 index 4a0e727c465..00000000000 --- a/a3p-integration/proposals/a:upgrade-18/test-lib/sync-tools.js +++ /dev/null @@ -1,72 +0,0 @@ -/* eslint-env node */ - -/** - * @file These tools mostly duplicate code that will be added in other PRs - * and eventually migrated to synthetic-chain. Sorry for the duplication. - */ - -/** - * @typedef {object} RetryOptions - * @property {number} [maxRetries] - * @property {number} [retryIntervalMs] - * @property {(...arg0: string[]) => void} log - * @property {(object) => void} [setTimeout] - * @property {string} [errorMessage=Error] - */ - -const ambientSetTimeout = global.setTimeout; - -/** - * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L10 - * - * @param {number} ms - * @param {*} sleepOptions - */ -const sleep = (ms, { log = () => {}, setTimeout = ambientSetTimeout }) => - new Promise(resolve => { - log(`Sleeping for ${ms}ms...`); - setTimeout(resolve, ms); - }); - -/** - * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L24 - * - * @param {() => Promise} operation - * @param {(result: any) => boolean} condition - * @param {string} message - * @param {RetryOptions} options - */ -export const retryUntilCondition = async ( - operation, - condition, - message, - { maxRetries = 6, retryIntervalMs = 3500, log, setTimeout }, -) => { - console.log({ maxRetries, retryIntervalMs, message }); - let retries = 0; - - await null; - while (retries < maxRetries) { - try { - const result = await operation(); - log('RESULT', result); - if (condition(result)) { - return result; - } - } catch (error) { - if (error instanceof Error) { - log(`Error: ${error.message}`); - } else { - log(`Unknown error: ${String(error)}`); - } - } - - retries += 1; - console.log( - `Retry ${retries}/${maxRetries} - Waiting for ${retryIntervalMs}ms for ${message}...`, - ); - await sleep(retryIntervalMs, { log, setTimeout }); - } - - throw Error(`${message} condition failed after ${maxRetries} retries.`); -}; diff --git a/a3p-integration/proposals/a:upgrade-18/test.sh b/a3p-integration/proposals/a:upgrade-18/test.sh index a3bc4a2d845..c7b42dda2d0 100755 --- a/a3p-integration/proposals/a:upgrade-18/test.sh +++ b/a3p-integration/proposals/a:upgrade-18/test.sh @@ -1,8 +1,15 @@ #!/bin/bash +set -ueo pipefail +source /usr/src/upgrade-test-scripts/env_setup.sh # Place here any test that should be executed using the executed proposal. # The effects of this step are not persisted in further proposal layers. +test_val \ + "$(agd q swingset params -o json | jq -Sc .vat_cleanup_budget)" \ + '[{"key":"default","value":"5"},{"key":"kv","value":"50"}]' \ + 'vat cleanup budget' + # suppress file names from glob that run earlier GLOBIGNORE=initial.test.js diff --git a/a3p-integration/proposals/a:upgrade-18/tsconfig.json b/a3p-integration/proposals/a:upgrade-18/tsconfig.json index 39de5a422e9..d3e64ee5baf 100644 --- a/a3p-integration/proposals/a:upgrade-18/tsconfig.json +++ b/a3p-integration/proposals/a:upgrade-18/tsconfig.json @@ -1,12 +1,14 @@ { "compilerOptions": { - "target": "esnext", - "module": "esnext", + "target": "ESNext", + "module": "NodeNext", "allowJs": true, "checkJs": true, "strict": false, "strictNullChecks": true, "noEmit": true, - "noImplicitThis": true + "noImplicitThis": true, + // XXX synthetic-chain has some errors + "skipLibCheck": true } } diff --git a/a3p-integration/proposals/a:upgrade-18/upgradedBoard.test.js b/a3p-integration/proposals/a:upgrade-18/upgradedBoard.test.js new file mode 100644 index 00000000000..c72b130c7f3 --- /dev/null +++ b/a3p-integration/proposals/a:upgrade-18/upgradedBoard.test.js @@ -0,0 +1,15 @@ +/* eslint-env node */ +// @ts-check + +/** @file test that the upgraded board can store and retrieve values. */ + +import '@endo/init/legacy.js'; +import test from 'ava'; +import { evalBundles } from '@agoric/synthetic-chain'; + +test('test upgraded board', async t => { + // agoricProposal.sdk-generate in package.json generates this proposal + await evalBundles('testUpgradedBoard'); + + t.pass(); +}); diff --git a/a3p-integration/proposals/a:upgrade-18/use.sh b/a3p-integration/proposals/a:upgrade-18/use.sh index 4a5aed80220..2e5c54a8382 100644 --- a/a3p-integration/proposals/a:upgrade-18/use.sh +++ b/a3p-integration/proposals/a:upgrade-18/use.sh @@ -9,3 +9,5 @@ set -uxeo pipefail # "oracles" accept their invitations and provide prices to priceFeeds ./verifyPushedPrice.js 'ATOM' 12.01 ./verifyPushedPrice.js 'stATOM' 12.01 + +./openVault.js diff --git a/a3p-integration/proposals/a:upgrade-18/verifyPushedPrice.js b/a3p-integration/proposals/a:upgrade-18/verifyPushedPrice.js index 98449c316a5..ca4ceee38ff 100644 --- a/a3p-integration/proposals/a:upgrade-18/verifyPushedPrice.js +++ b/a3p-integration/proposals/a:upgrade-18/verifyPushedPrice.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +import '@endo/init/debug.js'; import { registerOraclesForBrand, generateOracleMap, diff --git a/a3p-integration/proposals/a:upgrade-18/yarn.lock b/a3p-integration/proposals/a:upgrade-18/yarn.lock index 78dc133a0f9..761d692aa51 100644 --- a/a3p-integration/proposals/a:upgrade-18/yarn.lock +++ b/a3p-integration/proposals/a:upgrade-18/yarn.lock @@ -5,9 +5,320 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/synthetic-chain@npm:^0.3.0": - version: 0.3.0 - resolution: "@agoric/synthetic-chain@npm:0.3.0" +"@agoric/babel-generator@npm:^7.17.6": + version: 7.17.6 + resolution: "@agoric/babel-generator@npm:7.17.6" + dependencies: + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/59db151ae737bd9b1f21c1589df4c7da9cbf484de5b5cc8352052825c2d977283d975303f55acb54d0210c176cb405da263073ceba1d3a6db65c6e21cc6e663f + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-ef0668a.0+ef0668a": + version: 0.1.1-dev-ef0668a.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-ef0668a.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@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/36e876bad26963d49a69c50af976a1f1c2b47a1769de812da8f88508fb6bb47be73b48d3a6c95fbe1497ffea3664067e3fbf23bd51c25e9b4811227d36d74a47 + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-dev-ef0668a.0+ef0668a": + version: 0.4.3-dev-ef0668a.0 + resolution: "@agoric/casting@npm:0.4.3-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@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/ee3c96a1b10a0566e4b67d157d1bd8dc70a8582ec8a3f33b0d9213ff5b108f1a971f194e41daa9b027fb3649fbad0c67c765a964c8a84e1498b27d9b4054e312 + languageName: node + linkType: hard + +"@agoric/client-utils@npm:dev": + version: 0.1.1-dev-ef0668a.0 + resolution: "@agoric/client-utils@npm:0.1.1-dev-ef0668a.0" + dependencies: + "@agoric/casting": "npm:0.4.3-dev-ef0668a.0+ef0668a" + "@agoric/ertp": "npm:0.16.3-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/smart-wallet": "npm:0.5.4-dev-ef0668a.0+ef0668a" + "@agoric/vats": "npm:0.15.2-dev-ef0668a.0+ef0668a" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.7" + "@endo/errors": "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/e6c722a89ddf059797d30793ebdbf33a06e0a646cffa14a1a87f72bd170a500e67f1c414a4fb944444bad6e93c8202f280a069526de09a6a42d5fe92aeac0585 + languageName: node + linkType: hard + +"@agoric/cosmic-proto@npm:0.4.1-dev-ef0668a.0+ef0668a": + version: 0.4.1-dev-ef0668a.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-ef0668a.0" + dependencies: + "@endo/base64": "npm:^1.0.8" + "@endo/init": "npm:^1.1.6" + checksum: 10c0/da5409e4afad2d60852d3ab9193c35f863fbfd764093e84b167898bf3fff096f584645903e3a2d7db04b3ce10cc275a06a3fd4bd9a9a6ba3f09aab13794e4113 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-ef0668a.0+ef0668a": + version: 0.16.3-dev-ef0668a.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-ef0668a.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/zone": "npm:0.2.3-dev-ef0668a.0+ef0668a" + "@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/6331be13e0ab784722842afe64879e093fc025919e208656a838573369e111a79beb74afab56b35059cde504776c37daa12c12d3bed87435ecc9196612126562 + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-dev-ef0668a.0+ef0668a": + version: 0.10.4-dev-ef0668a.0 + resolution: "@agoric/governance@npm:0.10.4-dev-ef0668a.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/time": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/zoe": "npm:0.26.3-dev-ef0668a.0+ef0668a" + "@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/c6717cf600e3a765d056828a6fb0b1389f6cd89086b09626ae5820f946b8f52ca2fa89d822741492b056778c8c21f9cda83ec6e9931171668b38be87d4c7ea41 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-ef0668a.0+ef0668a": + version: 0.3.3-dev-ef0668a.0 + resolution: "@agoric/internal@npm:0.3.3-dev-ef0668a.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@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/3756679ace880447f6f4bc3b8b669a09ee65b6a3020d64db87294255aac4c154bc24e7c81832ad5fe74d9ba66147e464319065d9f569f0e3cc1443fa88466b86 + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-dev-ef0668a.0+ef0668a": + version: 0.1.1-dev-ef0668a.0 + resolution: "@agoric/kmarshal@npm:0.1.1-dev-ef0668a.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/c1827c9c31957b79a847daf4b63b17a5890c6a661bf866fa628821f490f983bf9ef989da3e75e757ba582759dadc8b27c41a969092651aec88d3d7fcc8af2cd6 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-ef0668a.0+ef0668a": + version: 0.1.1-dev-ef0668a.0 + resolution: "@agoric/network@npm:0.1.1-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@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/5c6b1017a94919d4f9587bbc6efbe2fcd0d8765057cd5dc9466e2a6033c095a16d388edbabf902b19e67b38bb69a5747e6700d62761b7615864833f39c30f35d + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-ef0668a.0+ef0668a": + version: 0.6.3-dev-ef0668a.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@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/a978638a15bd476aa8e42a315409c1e789c7f84bf7335868794e260103294a28eaa8cf65adb2a12fb9e2fad9ce1809557a7740694f1006726627f631c5202aad + languageName: node + linkType: hard + +"@agoric/smart-wallet@npm:0.5.4-dev-ef0668a.0+ef0668a": + version: 0.5.4-dev-ef0668a.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-dev-ef0668a.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/vats": "npm:0.15.2-dev-ef0668a.0+ef0668a" + "@agoric/vow": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/zoe": "npm:0.26.3-dev-ef0668a.0+ef0668a" + "@agoric/zone": "npm:0.2.3-dev-ef0668a.0+ef0668a" + "@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/28453a0aa2a29d5f9588a283eb1b6e73af8c511c490a47dd568a23b1b8899577f96aac1b2bd67c08776847f59bd006f8cff251439081c15dea54af7224d28e45 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-ef0668a.0+ef0668a": + version: 0.9.3-dev-ef0668a.0 + resolution: "@agoric/store@npm:0.9.3-dev-ef0668a.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/a53429b482acb2567e2c925e038025ea9ba9d6be4ca61246aff4b7ca604536032cd74938a50e3bd2b56890e8787da7d1364bb9c2d3e3a22d2bce97a241f351e3 + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-dev-ef0668a.0+ef0668a": + version: 0.9.2-dev-ef0668a.0 + resolution: "@agoric/swing-store@npm:0.9.2-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@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/7ea0117c65bea2afe106621fc942e398d2930319ec5246798b79c58fa7a125e1d0af186fefd0441372092ecc4bffdcb8ed90df69d03e3718819f3c4d14df7d68 + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-ef0668a.0+ef0668a": + version: 0.10.3-dev-ef0668a.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@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/3eae88a06b0e0e697d9197a46ecdcad56e0d892f6adbcd7849a5b29eabb9d14f31f31a3a271ebbc9d1947e90885f1818cf0fa87a6b8e325b86b4fb3b44b32d59 + languageName: node + linkType: hard + +"@agoric/swingset-vat@npm:0.32.3-dev-ef0668a.0+ef0668a": + version: 0.32.3-dev-ef0668a.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-dev-ef0668a.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/kmarshal": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/swing-store": "npm:0.9.2-dev-ef0668a.0+ef0668a" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-ef0668a.0+ef0668a" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-ef0668a.0+ef0668a" + "@agoric/time": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/xsnap-lockdown": "npm:0.14.1-dev-ef0668a.0+ef0668a" + "@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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/2d7a80fc325b03c1b026c840a34e1e65edc484972bc03408044806021764e8e384161bb89222819550821e73bfe56fb168741df62b3e002cb1ebb4906b8119e5 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-ef0668a.0+ef0668a": + version: 0.10.3-dev-ef0668a.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-ef0668a.0" + checksum: 10c0/5331abc0640a4469c3a00ffcab6daeaa426136ee97107dad0ea806e977aa79e6982de0fe2ccedf86efae7bda98eab37399974bd93e0772b8433ae656873fac80 + languageName: node + linkType: hard + +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" dependencies: "@endo/zip": "npm:^1.0.7" better-sqlite3: "npm:^9.6.0" @@ -16,121 +327,700 @@ __metadata: execa: "npm:^9.3.1" bin: synthetic-chain: dist/cli/cli.js - checksum: 10c0/17c6241bdc48b8a2a7608c9d4d7c0a0c76fb10d4ee44a31a1150104a792bcd1133f4b1a7e8ab26673a07450b3ceabccd9911999117568221b49221b6ee4306a1 + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b languageName: node linkType: hard -"@endo/base64@npm:^1.0.8": - version: 1.0.8 - resolution: "@endo/base64@npm:1.0.8" - checksum: 10c0/3501efbf866acc25b9ad0912ec2383e3b976c890a18dc67b5c6eb128433708db69e8ed1cc57190305266bdcbd132659aa87edfc6d02a9886b711e8b86adc21c0 +"@agoric/time@npm:0.3.3-dev-ef0668a.0+ef0668a": + version: 0.3.3-dev-ef0668a.0 + resolution: "@agoric/time@npm:0.3.3-dev-ef0668a.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/55e011779445011ec4aead1c2cb2b001cf3ae45c8a859d652b53820da63841e77a44617c8824a9e661369a620071ab6d480c7369d087c42856b0a19677856aa8 languageName: node linkType: hard -"@endo/common@npm:^1.2.6": - version: 1.2.6 - resolution: "@endo/common@npm:1.2.6" +"@agoric/vat-data@npm:0.5.3-dev-ef0668a.0+ef0668a": + version: 0.5.3-dev-ef0668a.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-ef0668a.0" dependencies: - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/promise-kit": "npm:^1.1.6" - checksum: 10c0/7cca372677bd1ab535a0f8fc250eca9bfc202ef7dfd24cac6ff1260003aa4512f8db18419dd632b3e57270a589fec54891496904ff2e8a97047f1e187e3f1401 + "@agoric/base-zone": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-ef0668a.0+ef0668a" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/90147b5df25a8cbb4bbb1525fa2231c0674da749e30d114ed15e7a963afcaba9d6b2fc914af8471d5aa147031fc2bd6906da0e1f8a3f8456a95f90d71cc016f7 languageName: node linkType: hard -"@endo/env-options@npm:^1.1.7": - version: 1.1.7 - resolution: "@endo/env-options@npm:1.1.7" - checksum: 10c0/5784bd68790041b08d9ead4f6c29cc7871d2e554c23fc44fff38cb20b6b4e55cdba2f78d844ba5ad4b0818185c32475ff318c1b77890d628690d7c7a6ede9475 +"@agoric/vats@npm:0.15.2-dev-ef0668a.0+ef0668a": + version: 0.15.2-dev-ef0668a.0 + resolution: "@agoric/vats@npm:0.15.2-dev-ef0668a.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-dev-ef0668a.0+ef0668a" + "@agoric/ertp": "npm:0.16.3-dev-ef0668a.0+ef0668a" + "@agoric/governance": "npm:0.10.4-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/network": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/swingset-vat": "npm:0.32.3-dev-ef0668a.0+ef0668a" + "@agoric/time": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/vow": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/zoe": "npm:0.26.3-dev-ef0668a.0+ef0668a" + "@agoric/zone": "npm:0.2.3-dev-ef0668a.0+ef0668a" + "@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/01c52d6d0615171986bae163f5bff8e754d419219742f1566542784a4de8f517be4dc0cb6a8d1c41f69ec09e3eb4de137546a22ac4c4c51f3b04a20e67353ac3 languageName: node linkType: hard -"@endo/errors@npm:^1.2.6": - version: 1.2.6 - resolution: "@endo/errors@npm:1.2.6" +"@agoric/vow@npm:0.1.1-dev-ef0668a.0+ef0668a": + version: 0.1.1-dev-ef0668a.0 + resolution: "@agoric/vow@npm:0.1.1-dev-ef0668a.0" dependencies: - ses: "npm:^1.9.0" - checksum: 10c0/cbc541c2d26fbfeb1567dd1cdf0e1f110ee9866430c5a1b91d87270d6f00bc8293cc8512301217c4eda35e60677ce62a941d11eb32c7da1f72d450a011ad2bb5 + "@agoric/base-zone": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@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/2e19e69c3ffb8f5742238f6b40a1da4abaa6c65ae98369a20417980bb147fb675effd1cd9223ad13707b496ef0673a9adf751292830f30ab9f4685623b32a83f + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-dev-ef0668a.0+ef0668a": + version: 0.14.1-dev-ef0668a.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-ef0668a.0" + checksum: 10c0/a4c11bbfece91f8ef0d082520e5dc70a55a553407d658e13de370f411fc061e7d67ea536bc7095bc18a280049687c3a16a49c1c9d6f33ee2938dbcad3e4ec5e0 + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-dev-ef0668a.0+ef0668a": + version: 0.26.3-dev-ef0668a.0 + resolution: "@agoric/zoe@npm:0.26.3-dev-ef0668a.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/ertp": "npm:0.16.3-dev-ef0668a.0+ef0668a" + "@agoric/internal": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/notifier": "npm:0.6.3-dev-ef0668a.0+ef0668a" + "@agoric/store": "npm:0.9.3-dev-ef0668a.0+ef0668a" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-ef0668a.0+ef0668a" + "@agoric/swingset-vat": "npm:0.32.3-dev-ef0668a.0+ef0668a" + "@agoric/time": "npm:0.3.3-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@agoric/vow": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/zone": "npm:0.2.3-dev-ef0668a.0+ef0668a" + "@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/2f24a636b6511a31263d76d98bdca09332b8f46b6630ff5e9405d35849e2b72c90d2a33cf5565ded734d8a63bb6fb1bf39c60e312e3025751c81159a24957746 languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.6": - version: 1.2.6 - resolution: "@endo/eventual-send@npm:1.2.6" +"@agoric/zone@npm:0.2.3-dev-ef0668a.0+ef0668a": + version: 0.2.3-dev-ef0668a.0 + resolution: "@agoric/zone@npm:0.2.3-dev-ef0668a.0" dependencies: - "@endo/env-options": "npm:^1.1.7" - checksum: 10c0/6983d6b88bf4e99f6c469d4ca037793582b06cc0bfa2da085b5bc7ad67333a1fba6e5e7077b7f279be23ccfba1dff9e06c7f85f9980b09fd002227f89a673c11 + "@agoric/base-zone": "npm:0.1.1-dev-ef0668a.0+ef0668a" + "@agoric/vat-data": "npm:0.5.3-dev-ef0668a.0+ef0668a" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/669d94b5f00e3c16b7b14c456b20496011612d875d0d2e989d2cf7402d5cae52cc89aecd1d26e7c0c6a8433d0a11e0368a456c8567ad881645212318b005871e languageName: node linkType: hard -"@endo/init@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/init@npm:1.1.5" +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@endo/base64": "npm:^1.0.8" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/lockdown": "npm:^1.0.11" - "@endo/promise-kit": "npm:^1.1.6" - checksum: 10c0/08abda8a0204450cb39c296270d074189f320cdeb03892e87b27a75f6b98c0b5d9c8471e242c53545843211fe713b01b281eec0eabc1c58ca0760a068b90335c + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@endo/lockdown@npm:^1.0.11": - version: 1.0.11 - resolution: "@endo/lockdown@npm:1.0.11" +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - ses: "npm:^1.9.0" - checksum: 10c0/03bb96f370e7ee69d9d8e26b7b124b6381994d3b28a99dc2bcafe77139283701d7543b40e978226cd49443c149e64610e4dd49c32ada931610ba091809478a11 + "@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:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c + languageName: node + linkType: hard + +"@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 -"@endo/marshal@npm:^1.5.4": - version: 1.5.4 - resolution: "@endo/marshal@npm:1.5.4" +"@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/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@endo/common": "npm:^1.2.6" - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/nat": "npm:^5.0.11" - "@endo/pass-style": "npm:^1.4.4" - "@endo/promise-kit": "npm:^1.1.6" - checksum: 10c0/4668a3678567cfbeefc3a47217912ca3f5d8bdb37e0d5d53339953b4ab83950683505f45c0f5c30b415c989bb9df4fa0859849d23b11f5b1064b0da0a13943ab + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 languageName: node linkType: hard -"@endo/nat@npm:^5.0.11": - version: 5.0.11 - resolution: "@endo/nat@npm:5.0.11" - checksum: 10c0/50cd9033657dd35288f0333a966984f788213f1c836e6772c0d731361d5854d0ce24b8a7d6f351d56618eb40f6b369e130c1ad939c83d5833246c09119b2e777 +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@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 -"@endo/pass-style@npm:^1.4.4": - version: 1.4.4 - resolution: "@endo/pass-style@npm:1.4.4" +"@babel/traverse@npm:^7.23.6": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@endo/env-options": "npm:^1.1.7" - "@endo/errors": "npm:^1.2.6" - "@endo/eventual-send": "npm:^1.2.6" - "@endo/promise-kit": "npm:^1.1.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/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @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.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 + languageName: node + linkType: hard + +"@confio/ics23@npm:^0.6.8": + version: 0.6.8 + resolution: "@confio/ics23@npm:0.6.8" + dependencies: + "@noble/hashes": "npm:^1.0.0" + protobufjs: "npm:^6.8.8" + checksum: 10c0/2f3f5032cd6a34c9b2fbd64bbf7e1cdec75ca71f348a770f7b5474b5027b12202bfbcd404eca931efddb5901f769af035a87cb8bddbf3f23d7e5d93c9d3d7f6f + languageName: node + linkType: hard + +"@cosmjs/amino@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/amino@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + checksum: 10c0/cd8e215b0406f5c7b73ab0a21106d06b6f76b1da12f1ab7b612884e1dd8bc626966dc67d4e7580090ade131546cbec70000f854e6596935299d054b788929a7e + languageName: node + linkType: hard + +"@cosmjs/crypto@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/crypto@npm:0.32.4" + dependencies: + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + "@noble/hashes": "npm:^1" + bn.js: "npm:^5.2.0" + elliptic: "npm:^6.5.4" + libsodium-wrappers-sumo: "npm:^0.7.11" + checksum: 10c0/94e742285eb8c7c5393055ba0635f10c06bf87710e953aedc71e3edc2b8e21a12a0d9b5e8eff37e326765f57c9eb3c7fd358f24f639efad4f1a6624eb8189534 + languageName: node + linkType: hard + +"@cosmjs/encoding@npm:^0.32.3, @cosmjs/encoding@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/encoding@npm:0.32.4" + dependencies: + base64-js: "npm:^1.3.0" + bech32: "npm:^1.1.4" + readonly-date: "npm:^1.0.0" + checksum: 10c0/4a30d5ae1a2d1247d44bda46101ce208c7666d8801ca9a33de94edc35cc22460c16b4834ec84d5a65ffef5e2a4b58605e0a0a056c46bc0a042979ec84acf20cd + languageName: node + linkType: hard + +"@cosmjs/json-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/json-rpc@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + xstream: "npm:^11.14.0" + checksum: 10c0/b3ebd240f4fb21260e284d2e503ecc61bac898842187ab717f0efb9a5f21272f161f267cc145629caeb9735f80946844384e2bd410275a4744147a44518c0fa0 + languageName: node + linkType: hard + +"@cosmjs/math@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/math@npm:0.32.4" + dependencies: + bn.js: "npm:^5.2.0" + checksum: 10c0/91e47015be5634d27d71d14c5a05899fb4992b69db02cab1558376dedf8254f96d5e24f097c5601804ae18ed33c7c25d023653ac2bf9d20250fd3e5637f6b101 + languageName: node + linkType: hard + +"@cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/proto-signing@npm:0.32.4" + dependencies: + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + checksum: 10c0/6915059d2e6dbe1abda4a747c3b1abd47a9eff4f8cb2cf9a5545f939b656b4a15bbde2bfc1364357f9b2a081a066280c3b469f6d13dd5fc51b429b0f90a54913 + languageName: node + linkType: hard + +"@cosmjs/socket@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/socket@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + isomorphic-ws: "npm:^4.0.1" + ws: "npm:^7" + xstream: "npm:^11.14.0" + checksum: 10c0/2d94c1fb39016bea3c7c145f4565c8a0fed20c805ac569ea604cd3646c15147b82b8db18a4e3c832d6ae0c3dd14363d4db3d91bcacac922679efba164ed49386 + languageName: node + linkType: hard + +"@cosmjs/stargate@npm:^0.32.3": + version: 0.32.4 + resolution: "@cosmjs/stargate@npm:0.32.4" + dependencies: + "@confio/ics23": "npm:^0.6.8" + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + xstream: "npm:^11.14.0" + checksum: 10c0/c30a3519516aaa7eae58ba827c80fcf74c7fe7a9d3aa5cc8138c3a2768f5f241f59c2f5cec27e9037b4df12b1c6605b4fac9eadb4de97bd84edddc3a80a02e24 + languageName: node + linkType: hard + +"@cosmjs/stream@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stream@npm:0.32.4" + dependencies: + xstream: "npm:^11.14.0" + checksum: 10c0/c677c53f9101c2a36fa03a475d92dea2fa69c475f896751b5e18a5d07087eeecbf6bca2e62a8940003da53fa235a9b2dd78c8257bf19c3f96e3f69fa8d5f183d + languageName: node + linkType: hard + +"@cosmjs/tendermint-rpc@npm:^0.32.3, @cosmjs/tendermint-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/tendermint-rpc@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/json-rpc": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/socket": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + axios: "npm:^1.6.0" + readonly-date: "npm:^1.0.0" + xstream: "npm:^11.14.0" + checksum: 10c0/5fae7afcdf98cc7dd36922aa1586254cc8c202cf8fe66804e61d793d31dcff816f40d33f7a0eb72c1b9226c7c361d4848e4ff12d0489f6fa66f47f0c86ae18dd + languageName: node + linkType: hard + +"@cosmjs/utils@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/utils@npm:0.32.4" + checksum: 10c0/d5ff8b235094be1150853a715116049f73eb5cdfeea8ce8e22ecccc61ec99792db457404d4307782b1a2f935dcf438f5c485beabfcfbc1dc5df26eb6e6da9062 + languageName: node + linkType: hard + +"@endo/base64@npm:^1.0.8, @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:^3.4.2": + 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:^4.4.2": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" + dependencies: + "@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:^1.0.11": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" + dependencies: + "@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:^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.7, @endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" + dependencies: + "@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:^1.3.1, @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:^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.7, @endo/errors@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 + 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:^1.2.7, @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:^1.5.6": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" + dependencies: + "@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.8, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" + dependencies: + "@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.3.1": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" + dependencies: + "@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:^1.1.6, @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:^1.0.12, @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:^1.6.1, @endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" + dependencies: + "@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 + +"@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:^5.0.12, @endo/nat@npm:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 + languageName: node + linkType: hard + +"@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.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/d6c6268b269d4c14541087ce6b2975f9e31847893d01360c0ea92392ae93316d94fbf59cd7299853a0fb5214176ad7ffc4616b9b2581fd720bdb55ef96d0beeb + checksum: 10c0/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/promise-kit@npm:1.1.6" +"@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:^1.9.0" - checksum: 10c0/d60de663e58f9de32b6705268c62c63c4721f1874813d3c10cae7846e921e4ea8a60c8622ef8c937741a3387fbc60110076b25304afedf270727af7b0c3fecb3 + "@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/zip@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/zip@npm:1.0.7" - checksum: 10c0/a1c0d155448ce877012b34c8fe8cd3a58de9eb807514c81cddeebb802ee8e552b27d8a9a40fab3f3e4c49e0cb7fea6902fa1dd12a23ff6f30b56161fc3edc1f8 +"@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: + ses: "npm:^1.10.0" + checksum: 10c0/3a51755822bd4112474bec584005b81f9ffe6a6b590faa16cff7a4994010d001d6d190f58a1e890d85b0feb0eb052d79ed2c5ed88977afb0e47ca53b6b199196 + languageName: node + linkType: hard + +"@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.8" + "@endo/init": "npm:^1.1.7" + ses: "npm:^1.10.0" + peerDependencies: + ava: ^5.3.0 || ^6.1.2 + checksum: 10c0/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf + languageName: node + linkType: hard + +"@endo/stream@npm:^1.2.7": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" + dependencies: + "@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 + +"@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:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + +"@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 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 languageName: node linkType: hard @@ -145,6 +1035,31 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -159,6 +1074,55 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + 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 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -176,7 +1140,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -215,6 +1179,155 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@rollup/plugin-commonjs@npm:^19.0.0": + version: 19.0.2 + resolution: "@rollup/plugin-commonjs@npm:19.0.2" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.1" + glob: "npm:^7.1.6" + is-reference: "npm:^1.2.1" + magic-string: "npm:^0.25.7" + resolve: "npm:^1.17.0" + peerDependencies: + rollup: ^2.38.3 + checksum: 10c0/9adccf77ad835cbe565da4385212f1e54c3e0dca2be174b5c2cfe89cfaeb240f42c7673e97e49b21b7c66ed901cc1c711552b6727f60b43a953ce996eb2868a7 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^13.0.0": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + "@types/resolve": "npm:1.17.1" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.1.0" + is-module: "npm:^1.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + rollup: ^2.42.0 + checksum: 10c0/6caa32a8304a20f1c9953111b25e9543f4de7d254958d81ce0158ad909e4493946bc2060c4ace23d9748b560ebc84c920ee7bc1b7d50dbf8ba852ef13c91af58 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" + picomatch: "npm:^2.2.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.1.0": + 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:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + 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" @@ -229,6 +1342,52 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.1": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: 10c0/42ec66ade1f72ff9d143c5a519a65efc7c1c77be7b1ac5455c530ae9acd87baba065542f8847522af2e3ace2cc999f3ad464ef86e6b7352eece34daf88f8c924 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=13.7.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/resolve@npm:1.17.1": + version: 1.17.1 + resolution: "@types/resolve@npm:1.17.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -236,6 +1395,15 @@ __metadata: languageName: node linkType: hard +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + "acorn-walk@npm:^8.2.0": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" @@ -254,6 +1422,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.2.4, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": version: 7.1.0 resolution: "agent-base@npm:7.1.0" @@ -283,6 +1460,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -297,7 +1486,16 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.0.0": +"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 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -313,6 +1511,13 @@ __metadata: languageName: node linkType: hard +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10c0/1ca7fcf5bc2b78d1e1d9b8c8cc7ce50b5c6cc67a8da5a28c9c975b7b46fff255a04abab02de38a5139190c9d8b34b3d6c59af6724521b077f7d7dfbad9b47a9c + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -332,6 +1537,23 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + 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" + dependencies: + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + languageName: node + linkType: hard + "array-find-index@npm:^1.0.1": version: 1.0.2 resolution: "array-find-index@npm:1.0.2" @@ -339,6 +1561,22 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + languageName: node + linkType: hard + "arrgv@npm:^1.0.2": version: 1.0.2 resolution: "arrgv@npm:1.0.2" @@ -353,6 +1591,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "ava@npm:^5.3.1": version: 5.3.1 resolution: "ava@npm:5.3.1" @@ -411,6 +1656,37 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"axios@npm:1.7.7": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 + languageName: node + linkType: hard + +"axios@patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch": + version: 1.7.7 + resolution: "axios@patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch::version=1.7.7&hash=df7a05" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/49964e1025a39e845ad1824cdf49f313202de26e55bbc4a67e81aaeaba78a8efcbfe3da42ca61c14fdbc249bdbd62b5478e9e54ea3456711d159ec068b12c392 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -418,14 +1694,21 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf languageName: node linkType: hard -"better-sqlite3@npm:^9.6.0": +"bech32@npm:^1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 10c0/5f62ca47b8df99ace9c0e0d8deb36a919d91bf40066700aaa9920a45f86bb10eb56d537d559416fd8703aa0fb60dddb642e58f049701e7291df678b2033e5ee5 + languageName: node + linkType: hard + +"better-sqlite3@npm:^9.1.1, better-sqlite3@npm:^9.6.0": version: 9.6.0 resolution: "better-sqlite3@npm:9.6.0" dependencies: @@ -470,6 +1753,30 @@ __metadata: languageName: node linkType: hard +"bn.js@npm:^4.11.9": + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.0": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + "brace-expansion@npm:^2.0.1": version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" @@ -488,6 +1795,13 @@ __metadata: languageName: node linkType: hard +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -498,6 +1812,13 @@ __metadata: languageName: node linkType: hard +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.1 resolution: "cacache@npm:18.0.1" @@ -518,6 +1839,26 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + "callsites@npm:^4.0.0": version: 4.2.0 resolution: "callsites@npm:4.2.0" @@ -534,6 +1875,27 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^2.4.1": + 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": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + "chalk@npm:^5.2.0, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -648,6 +2010,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -657,6 +2028,13 @@ __metadata: languageName: node linkType: hard +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -664,6 +2042,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" @@ -671,6 +2058,20 @@ __metadata: languageName: node linkType: hard +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + "concordance@npm:^5.0.4": version: 5.0.4 resolution: "concordance@npm:5.0.4" @@ -701,6 +2102,19 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/e05544722e9d7189b4292c66e42b7abeb21db0d07c91b785f4ae5fefceb1f89e626da2703744657b287e86dcd4af57b54567cef75159957ff7a8a761d9055012 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -712,6 +2126,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.2": + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/aa82ce7ac0814a27e6f2b738c5a7cf1fa21a3558a1e42df449fc96541ba3ba731e4d3ecffa4435348808a86212f287c6f20a1ee551ef1ff95d01cfec5f434944 + languageName: node + linkType: hard + "currently-unhandled@npm:^0.4.1": version: 0.4.1 resolution: "currently-unhandled@npm:0.4.1" @@ -721,6 +2146,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + 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" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + 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" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + languageName: node + linkType: hard + "date-time@npm:^3.1.0": version: 3.1.0 resolution: "date-time@npm:3.1.0" @@ -742,6 +2200,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.1, debug@npm:^4.3.2": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -758,6 +2228,49 @@ __metadata: languageName: node linkType: hard +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0": version: 2.0.2 resolution: "detect-libc@npm:2.0.2" @@ -774,6 +2287,15 @@ __metadata: languageName: node linkType: hard +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -781,6 +2303,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.4": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + 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/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 + languageName: node + linkType: hard + "emittery@npm:^1.0.1": version: 1.0.3 resolution: "emittery@npm:1.0.3" @@ -834,6 +2371,116 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + 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": + 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" + 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" + 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" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + 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" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + 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" + 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 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -848,6 +2495,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -855,6 +2509,89 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"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 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + "esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -865,13 +2602,72 @@ __metadata: languageName: node linkType: hard -"esutils@npm:^2.0.3": +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + +"esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 languageName: node linkType: hard +"execa@npm:9.1.0": + version: 9.1.0 + resolution: "execa@npm:9.1.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^7.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^5.2.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/9a4810b93d098eb0bed48793b61c3aa3e5804867c2c5808cd2a597a6e71738151a74dc792909085ce1d38e89f4b0e078d93ffd165aaca2d9a6728f3616f8e5c0 + languageName: node + linkType: hard + "execa@npm:^9.3.1": version: 9.4.0 resolution: "execa@npm:9.4.0" @@ -915,6 +2711,13 @@ __metadata: languageName: node linkType: hard +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + "fast-diff@npm:^1.2.0": version: 1.3.0 resolution: "fast-diff@npm:1.3.0" @@ -935,6 +2738,20 @@ __metadata: languageName: node linkType: hard +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.17.1 resolution: "fastq@npm:1.17.1" @@ -963,6 +2780,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + "file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" @@ -979,6 +2805,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + "find-up@npm:^6.0.0": version: 6.3.0 resolution: "find-up@npm:6.3.0" @@ -989,6 +2825,43 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + "foreground-child@npm:^3.1.0": version: 3.1.1 resolution: "foreground-child@npm:3.1.1" @@ -999,6 +2872,17 @@ __metadata: languageName: node linkType: hard +"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/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -1024,6 +2908,13 @@ __metadata: languageName: node linkType: hard +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + "fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -1043,6 +2934,32 @@ __metadata: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -1050,6 +2967,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + "get-stream@npm:^9.0.0": version: 9.0.1 resolution: "get-stream@npm:9.0.1" @@ -1060,6 +2990,17 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -1076,6 +3017,15 @@ __metadata: languageName: node linkType: hard +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + "glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.3.10 resolution: "glob@npm:10.3.10" @@ -1091,6 +3041,46 @@ __metadata: languageName: node linkType: hard +"glob@npm:^7.1.3, glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + "globby@npm:^13.1.4": version: 13.2.2 resolution: "globby@npm:13.2.2" @@ -1104,13 +3094,119 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6": +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + 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" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1138,6 +3234,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^7.0.0": + version: 7.0.0 + resolution: "human-signals@npm:7.0.0" + checksum: 10c0/ce0c6d62d2e9bfe529d48f7c7fdf4b8c70fce950eef7850719b4e3f5bc71795ae7d61a3699ce13262bed7847705822601cc81f1921ea6a2906852e16228a94ab + languageName: node + linkType: hard + "human-signals@npm:^8.0.0": version: 8.0.0 resolution: "human-signals@npm:8.0.0" @@ -1168,13 +3271,30 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.4": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^2.2.1": + version: 2.2.2 + resolution: "import-meta-resolve@npm:2.2.2" + checksum: 10c0/80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -1196,7 +3316,17 @@ __metadata: languageName: node linkType: hard -"inherits@npm:^2.0.3, inherits@npm:^2.0.4": +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -1210,6 +3340,17 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -1224,6 +3365,32 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -1233,6 +3400,59 @@ __metadata: languageName: node linkType: hard +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: "npm:^1.1.13" + checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + languageName: node + linkType: hard + "is-error@npm:^2.2.2": version: 2.2.2 resolution: "is-error@npm:2.2.2" @@ -1261,7 +3481,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -1277,6 +3497,29 @@ __metadata: languageName: node linkType: hard +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc + 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.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -1284,6 +3527,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -1291,24 +3541,79 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-reference@npm:^1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + 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" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + languageName: node + linkType: hard + +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 languageName: node linkType: hard -"is-promise@npm:^4.0.0": - version: 4.0.0 - resolution: "is-promise@npm:4.0.0" - checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 languageName: node linkType: hard -"is-stream@npm:^4.0.1": - version: 4.0.1 - resolution: "is-stream@npm:4.0.1" - checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca languageName: node linkType: hard @@ -1326,6 +3631,22 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -1340,6 +3661,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -1353,6 +3683,15 @@ __metadata: languageName: node linkType: hard +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 + languageName: node + linkType: hard + "js-string-escape@npm:^1.0.1": version: 1.0.1 resolution: "js-string-escape@npm:1.0.1" @@ -1360,6 +3699,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + "js-yaml@npm:^3.14.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -1372,6 +3718,110 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + 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" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"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.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" + dependencies: + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + "load-json-file@npm:^7.0.0": version: 7.0.1 resolution: "load-json-file@npm:7.0.1" @@ -1379,6 +3829,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + "locate-path@npm:^7.1.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" @@ -1388,6 +3847,13 @@ __metadata: languageName: node linkType: hard +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + "lodash@npm:^4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -1395,6 +3861,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 10c0/50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.1.0 resolution: "lru-cache@npm:10.1.0" @@ -1411,6 +3884,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.25.7": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: "npm:^1.4.8" + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.0 resolution: "make-fetch-happen@npm:13.0.0" @@ -1467,6 +3949,13 @@ __metadata: languageName: node linkType: hard +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 + languageName: node + linkType: hard + "merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -1484,6 +3973,33 @@ __metadata: languageName: node linkType: hard +"microtime@npm:^3.1.0": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.4.0" + checksum: 10c0/02512993de914c6f71424d3b8b28ce53de44ba5895b904a213420fd4fc86a084c1d08ec0876ac60cdae6427022766e1b9b86d9b3442bf408701120bd61455e26 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + "mimic-fn@npm:^4.0.0": version: 4.0.0 resolution: "mimic-fn@npm:4.0.0" @@ -1498,6 +4014,29 @@ __metadata: languageName: node linkType: hard +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + "minimatch@npm:^9.0.1": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -1635,6 +4174,13 @@ __metadata: languageName: node linkType: hard +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + "negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -1642,6 +4188,13 @@ __metadata: languageName: node linkType: hard +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.54.0 resolution: "node-abi@npm:3.54.0" @@ -1651,6 +4204,26 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.4.0": + version: 4.8.3 + resolution: "node-gyp-build@npm:4.8.3" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/a7f43c4128d817db80bb0884f631121449ac586b4a3e708eab0db6fcb7fa0d2e66f6d7d4ee1f49469409de4a9b2e413926befe2dce70b850c6c583a3bbe228d2 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -1689,6 +4262,18 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -1696,6 +4281,36 @@ __metadata: languageName: node linkType: hard +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: "npm:^3.2.1" + chalk: "npm:^2.4.1" + cross-spawn: "npm:^6.0.5" + memorystream: "npm:^0.3.1" + minimatch: "npm:^3.0.4" + pidtree: "npm:^0.3.0" + read-pkg: "npm:^3.0.0" + shell-quote: "npm:^1.6.1" + string.prototype.padend: "npm:^3.0.0" + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.2.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba + languageName: node + linkType: hard + "npm-run-path@npm:^6.0.0": version: 6.0.0 resolution: "npm-run-path@npm:6.0.0" @@ -1706,7 +4321,33 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.1, once@npm:^1.4.0": +"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 + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -1715,6 +4356,20 @@ __metadata: languageName: node linkType: hard +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + 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" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + "p-defer@npm:^1.0.0": version: 1.0.0 resolution: "p-defer@npm:1.0.0" @@ -1731,6 +4386,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + "p-limit@npm:^4.0.0": version: 4.0.0 resolution: "p-limit@npm:4.0.0" @@ -1740,6 +4404,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + "p-locate@npm:^6.0.0": version: 6.0.0 resolution: "p-locate@npm:6.0.0" @@ -1774,6 +4447,25 @@ __metadata: languageName: node linkType: hard +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + "parse-ms@npm:^3.0.0": version: 3.0.0 resolution: "parse-ms@npm:3.0.0" @@ -1788,6 +4480,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + "path-exists@npm:^5.0.0": version: 5.0.0 resolution: "path-exists@npm:5.0.0" @@ -1795,6 +4494,20 @@ __metadata: languageName: node linkType: hard +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -1809,6 +4522,13 @@ __metadata: languageName: node linkType: hard +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + "path-scurry@npm:^1.10.1": version: 1.10.1 resolution: "path-scurry@npm:1.10.1" @@ -1819,6 +4539,15 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -1826,13 +4555,43 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picocolors@npm:^1.0.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be 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 + +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + "pkg-conf@npm:^4.0.0": version: 4.0.0 resolution: "pkg-conf@npm:4.0.0" @@ -1852,6 +4611,13 @@ __metadata: 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" + checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.1 resolution: "prebuild-install@npm:7.1.1" @@ -1874,6 +4640,13 @@ __metadata: languageName: node linkType: hard +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + "pretty-ms@npm:^8.0.0": version: 8.0.0 resolution: "pretty-ms@npm:8.0.0" @@ -1909,6 +4682,61 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:6.11.4": + version: 6.11.4 + resolution: "protobufjs@npm:6.11.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/c244d7b9b6d3258193da5c0d1e558dfb47f208ae345e209f90ec45c9dca911b90fa17e937892a9a39a4136ab9886981aae9efdf6039f7baff4f7225f5eeb9812 + languageName: node + linkType: hard + +"protobufjs@patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch": + version: 6.11.4 + resolution: "protobufjs@patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch::version=6.11.4&hash=1644ab" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/fea6b3d00dbb564157b24c0f0f69dc777b22f30ffbe1fed67fb9a2ef05e6e99e8da6d1811bea650a315ec98d7512638d72317e41136522b94be4fb3c89d8d0ab + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -1919,6 +4747,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + "pure-rand@npm:^6.1.0": version: 6.1.0 resolution: "pure-rand@npm:6.1.0" @@ -1947,6 +4782,17 @@ __metadata: languageName: node linkType: hard +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 + languageName: node + linkType: hard + "readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" @@ -1967,6 +4813,25 @@ __metadata: languageName: node linkType: hard +"readonly-date@npm:^1.0.0": + version: 1.0.0 + resolution: "readonly-date@npm:1.0.0" + checksum: 10c0/7ab32bf19f6bfec102584a524fa79a289e6ede0bf20c80fd90ab309962e45b71d19dd0e3915dff6e81edf226f08fda65e890539b4aca74668921790b10471356 + languageName: node + linkType: hard + +"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.7" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -1983,6 +4848,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + "resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" @@ -1990,6 +4862,32 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -2004,16 +4902,45 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"rollup@npm:^2.79.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 + languageName: node + linkType: hard + "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: - "@agoric/synthetic-chain": "npm:^0.3.0" - "@endo/init": "npm:^1.1.5" - "@endo/marshal": "npm:^1.5.4" + "@agoric/client-utils": "npm:dev" + "@agoric/synthetic-chain": "npm:^0.4.3" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" ava: "npm:^5.3.1" better-sqlite3: "npm:^9.6.0" - execa: "npm:^9.3.1" + eslint: "npm:^8.57.0" + execa: "npm:9.1.0" + npm-run-all: "npm:^4.1.5" + typescript: "npm:^5.6.3" languageName: unknown linkType: soft @@ -2026,6 +4953,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 + languageName: node + linkType: hard + "safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -2033,6 +4972,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -2040,6 +4990,24 @@ __metadata: languageName: node linkType: hard +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + "semver@npm:^7.3.2": version: 7.6.3 resolution: "semver@npm:7.6.3" @@ -2069,12 +5037,47 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.9.0": - version: 1.9.0 - resolution: "ses@npm:1.9.0" +"ses@npm:^1.10.0": + version: 1.10.0 + resolution: "ses@npm:1.10.0" dependencies: - "@endo/env-options": "npm:^1.1.7" - checksum: 10c0/356f9601b04a87f33403a15fc627caf0c649d86d8d7ee1f4b3c75b947ab05c31b254c94c0aa26e9904862787c73950d5a60f3435deebe5dba23017e20c40b0cb + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/83b92bc49e27af04eeb7ee01a2196a0c4b0906e4de51e70403aa9ffc82be1d27a0c3506f2d54da8d6d260be0855f2123a13a7e2c6896e81ec85899df1a428609 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d languageName: node linkType: hard @@ -2087,6 +5090,13 @@ __metadata: languageName: node linkType: hard +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -2094,6 +5104,25 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.6.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + 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 + languageName: node + linkType: hard + "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -2164,6 +5193,61 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -2211,6 +5295,52 @@ __metadata: languageName: node linkType: hard +"string.prototype.padend@npm:^3.0.0": + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -2238,6 +5368,13 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + "strip-final-newline@npm:^4.0.0": version: 4.0.0 resolution: "strip-final-newline@npm:4.0.0" @@ -2245,6 +5382,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -2264,6 +5408,38 @@ __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" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"symbol-observable@npm:^2.0.3": + version: 2.0.3 + resolution: "symbol-observable@npm:2.0.3" + checksum: 10c0/03fb8766b75bfa65a3c7d68ae1e51a13a5ff71b40d6d53b17a0c9c77b1685c20a3bfbf45547ab36214a079665c3f551e250798f6b2f83a2a40762d864ed87f78 + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -2310,6 +5486,13 @@ __metadata: languageName: node linkType: hard +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + "time-zone@npm:^1.0.0": version: 1.0.0 resolution: "time-zone@npm:1.0.0" @@ -2317,6 +5500,13 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -2326,6 +5516,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 + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -2335,6 +5534,15 @@ __metadata: languageName: node linkType: hard +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + "type-fest@npm:^0.13.1": version: 0.13.1 resolution: "type-fest@npm:0.13.1" @@ -2342,6 +5550,104 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + 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" + dependencies: + call-bind: "npm:^1.0.7" + 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 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + 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/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + languageName: node + linkType: hard + +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": + 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@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=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.3.0": version: 0.3.0 resolution: "unicorn-magic@npm:0.3.0" @@ -2367,6 +5673,15 @@ __metadata: languageName: node linkType: hard +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -2374,6 +5689,16 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + "well-known-symbols@npm:^2.0.0": version: 2.0.0 resolution: "well-known-symbols@npm:2.0.0" @@ -2381,6 +5706,43 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -2403,6 +5765,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" @@ -2442,6 +5811,31 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"xstream@npm:^11.14.0": + version: 11.14.0 + resolution: "xstream@npm:11.14.0" + dependencies: + globalthis: "npm:^1.0.1" + symbol-observable: "npm:^2.0.3" + checksum: 10c0/7a28baedc64385dc17597d04c7130ec3135db298e66d6dcf33821eb1953d5ad1b83c5fa08f1ce4d36e75fd219f2e9ef81ee0721aa8d4ccf619acc1760ba37f71 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -2478,6 +5872,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + "yocto-queue@npm:^1.0.0": version: 1.1.1 resolution: "yocto-queue@npm:1.1.1" diff --git a/a3p-integration/proposals/f:fast-usdc/.yarnrc.yml b/a3p-integration/proposals/f:fast-usdc/.yarnrc.yml new file mode 100644 index 00000000000..3186f3f0795 --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/a3p-integration/proposals/f:fast-usdc/deploy.test.js b/a3p-integration/proposals/f:fast-usdc/deploy.test.js new file mode 100644 index 00000000000..2fc6fd8ec8d --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/deploy.test.js @@ -0,0 +1,18 @@ +// @ts-check +/* global globalThis */ +import test from 'ava'; +import '@endo/init/legacy.js'; // axios compat +import { makeVstorageKit } from '@agoric/client-utils'; + +const io = { fetch: globalThis.fetch }; +const networkConfig = { + rpcAddrs: ['http://0.0.0.0:26657'], + chainName: 'agoriclocal', +}; + +test('fastUsdc is in agoricNames.instance', async t => { + const { agoricNames } = await makeVstorageKit(io, networkConfig); + + t.log('agoricNames.instance keys', Object.keys(agoricNames.instance)); + t.truthy(agoricNames.instance.fastUsdc); +}); diff --git a/a3p-integration/proposals/f:fast-usdc/package.json b/a3p-integration/proposals/f:fast-usdc/package.json new file mode 100644 index 00000000000..763e9df5b73 --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/package.json @@ -0,0 +1,28 @@ +{ + "agoricProposal": { + "source": "subdir", + "sdk-generate": [ + "fast-usdc/init-fast-usdc.js submission --net A3P_INTEGRATION --noNoble" + ], + "type": "/agoric.swingset.CoreEvalProposal" + }, + "type": "module", + "license": "Apache-2.0", + "dependencies": { + "@agoric/client-utils": "dev", + "@agoric/synthetic-chain": "^0.4.3", + "@endo/init": "^1.1.7", + "ava": "^5.3.1" + }, + "ava": { + "concurrency": 1, + "timeout": "2m", + "files": [ + "!submission" + ] + }, + "scripts": { + "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" + }, + "packageManager": "yarn@4.5.3" +} diff --git a/a3p-integration/proposals/f:fast-usdc/test-cli.sh b/a3p-integration/proposals/f:fast-usdc/test-cli.sh new file mode 100755 index 00000000000..eb7bbc315ee --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/test-cli.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# FIXME these commands are run against the `@agoric/fast-usdc` pulled from NPM +# but should be run against the local SDK. The `yarn link` command described in +# a3p-integration/README.md is supposed to make that work but it's not working. + +yarn @agoric/fast-usdc operator accept >| accept.json +cat accept.json +yarn agoric wallet send --offer accept.json --from gov1 --keyring-backend="test" +ACCEPT_OFFER_ID=$(agoric wallet extract-id --offer accept.json) + +# FIXME attest something +yarn @agoric/fast-usdc operator attest --previousOfferId "$ACCEPT_OFFER_ID" >| attest.json +cat attest.json +yarn agoric wallet send --offer attest.json --from gov1 --keyring-backend="test" diff --git a/a3p-integration/proposals/f:fast-usdc/test.sh b/a3p-integration/proposals/f:fast-usdc/test.sh new file mode 100755 index 00000000000..e3629e3877d --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -euo pipefail + +yarn ava + +# TODO get CLI test passing and part of CI +./test-cli.sh || echo "CLI test failed" diff --git a/a3p-integration/proposals/f:fast-usdc/yarn.lock b/a3p-integration/proposals/f:fast-usdc/yarn.lock new file mode 100644 index 00000000000..ade53b2d760 --- /dev/null +++ b/a3p-integration/proposals/f:fast-usdc/yarn.lock @@ -0,0 +1,4331 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@agoric/babel-generator@npm:^7.17.6": + version: 7.17.6 + resolution: "@agoric/babel-generator@npm:7.17.6" + dependencies: + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/59db151ae737bd9b1f21c1589df4c7da9cbf484de5b5cc8352052825c2d977283d975303f55acb54d0210c176cb405da263073ceba1d3a6db65c6e21cc6e663f + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-9c61393.0+9c61393": + version: 0.1.1-dev-9c61393.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-9c61393.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/cb872856e25ddb0ea00714194d58db5058fefc306f6a74cb048de7fd75ff06e6283ad990e20c845b0633fadd9ef07f35d59e44a632dc763e9d506214772dc5d7 + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-dev-9c61393.0+9c61393": + version: 0.4.3-dev-9c61393.0 + resolution: "@agoric/casting@npm:0.4.3-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@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.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/2d491ae19f8264ec368bdb16db5f120a8f94de7c8fd54614434439a7f457f7d5539c123e8429b7af5a28fefe13e9543cba177f48fe0b0feb469e2482c8c1b7b7 + languageName: node + linkType: hard + +"@agoric/client-utils@npm:dev": + version: 0.1.1-dev-9c61393.0 + resolution: "@agoric/client-utils@npm:0.1.1-dev-9c61393.0" + dependencies: + "@agoric/casting": "npm:0.4.3-dev-9c61393.0+9c61393" + "@agoric/ertp": "npm:0.16.3-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/smart-wallet": "npm:0.5.4-dev-9c61393.0+9c61393" + "@agoric/vats": "npm:0.15.2-dev-9c61393.0+9c61393" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/41792664f534d9e07e442ce726d6af675e967b4986aedc1b66758b0315c7fd10b4fe1ad2b509f8ddf54759f218f1da2d8a5347c1514c13ccfe56288b6c63e257 + languageName: node + linkType: hard + +"@agoric/cosmic-proto@npm:0.4.1-dev-9c61393.0+9c61393": + version: 0.4.1-dev-9c61393.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-9c61393.0" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + checksum: 10c0/55d09b61206feccfab98a67d41aa90381fa724d8b7018f5bf7d93db92f485f9fe8e1513c96be94be1e5377c3bc462d05aaf7a78064647166450e949150903603 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-9c61393.0+9c61393": + version: 0.16.3-dev-9c61393.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-9c61393.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/zone": "npm:0.2.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + checksum: 10c0/c54db24d131c3f703e8d363650e747fbaa0ffb91e675169a90073483d28a6a1324c80085eb3c2a382971a918990202bcbda9e8548549e37db9ea54adeafd26da + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-dev-9c61393.0+9c61393": + version: 0.10.4-dev-9c61393.0 + resolution: "@agoric/governance@npm:0.10.4-dev-9c61393.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/time": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/zoe": "npm:0.26.3-dev-9c61393.0+9c61393" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/374a3e54c2b332feb515dc25afeb316c0db8304337b07f9161e7ef9d833246d5f3a6bd89df23e143b3d6d78787028c47f38bfd77aafc215a4721aaa29b44e123 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-9c61393.0+9c61393": + version: 0.3.3-dev-9c61393.0 + resolution: "@agoric/internal@npm:0.3.3-dev-9c61393.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-9c61393.0+9c61393" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/5dab64b83cb6a6a311f53722ce5283e61a8a9a3142c2065d9e9baee277a1fecbc3f5edb6fd99e0c3215e897fdfb9e1dce00e5369797a9374e315b3a899dac64e + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-dev-9c61393.0+9c61393": + version: 0.1.1-dev-9c61393.0 + resolution: "@agoric/kmarshal@npm:0.1.1-dev-9c61393.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + checksum: 10c0/38006a8dc82a32e5445c7ef9253ef2a66e53d5ae9e58d6ca5224b79b3155878f3a3ef53e476878ea95270a494a582ce036af78a1440f7f4573a36ac78f456cf4 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-9c61393.0+9c61393": + version: 0.1.1-dev-9c61393.0 + resolution: "@agoric/network@npm:0.1.1-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/935ec80ad05ea3297f456af1d4e5491eb89725b2bb9984dfdbcedc2ba757ae06e9927b3cfc94dd3b2bada4b8de4b33dedb2dd00cb33a1d6bf113c48a213afb3b + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-9c61393.0+9c61393": + version: 0.6.3-dev-9c61393.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/9e28ffad908521f8289afde305248ec93d386b631f0e9271ee64bf56940c67bfbc25cb874ce1aeb9177155331a27663ae1c45eb41bd82a2258a7b68e5953523c + languageName: node + linkType: hard + +"@agoric/smart-wallet@npm:0.5.4-dev-9c61393.0+9c61393": + version: 0.5.4-dev-9c61393.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-dev-9c61393.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/vats": "npm:0.15.2-dev-9c61393.0+9c61393" + "@agoric/vow": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/zoe": "npm:0.26.3-dev-9c61393.0+9c61393" + "@agoric/zone": "npm:0.2.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/2f197adcc84f5dbc32347e2d6e4c4b5626141c283a77793e33fd1562d412034c01d4f3c0110649dc05db843cc404a96213b2f96ee79cef21ee3ee56eb825453d + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-9c61393.0+9c61393": + version: 0.9.3-dev-9c61393.0 + resolution: "@agoric/store@npm:0.9.3-dev-9c61393.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/3772d5502c47734edc27b7cc64ccf890fcaf3130c21804140b45e7d227dafb83ee1028dc02dff84ad0e14b3155bed1548e0852606dbde9bf414ab699ccadc504 + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-dev-9c61393.0+9c61393": + version: 0.9.2-dev-9c61393.0 + resolution: "@agoric/swing-store@npm:0.9.2-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/422c32d0efd6f053292d8207cc58a989da314ec613a333b6c8a5b415d9bb3df9adeb0c9b7864ff1b8995c53cbb1d1a9552cf1041b27a7a7f1992084014b20dc6 + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-9c61393.0+9c61393": + version: 0.10.3-dev-9c61393.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/576708817e95f8de695b0e7dfdc09d099b51aa71e708e485f4a324f9fdeacfff395057e0a1180711471c0d32d6c5cd46d84316f535654b32192b7e3f5338937d + languageName: node + linkType: hard + +"@agoric/swingset-vat@npm:0.32.3-dev-9c61393.0+9c61393": + version: 0.32.3-dev-9c61393.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-dev-9c61393.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/kmarshal": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/swing-store": "npm:0.9.2-dev-9c61393.0+9c61393" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-9c61393.0+9c61393" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-9c61393.0+9c61393" + "@agoric/time": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/xsnap-lockdown": "npm:0.14.1-dev-9c61393.0+9c61393" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" + 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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/64cc1dd51a40f7617a793b141dec9b8c4ea006b594e86691f06a859b163cb58ee289e11c4e8666faaa5c48b129b69ae4d0d86f561b861f06501c3ed838c125c0 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-9c61393.0+9c61393": + version: 0.10.3-dev-9c61393.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-9c61393.0" + checksum: 10c0/9710fbb28e35949b786835ecbcc4179853a968b0bb63a759213450993c1ca69d08b4cbdf3745c0710640b42d7790ea9984cec4ae2dc0631c1327b6019bb5c134 + languageName: node + linkType: hard + +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" + dependencies: + "@endo/zip": "npm:^1.0.7" + better-sqlite3: "npm:^9.6.0" + chalk: "npm:^5.3.0" + cosmjs-types: "npm:^0.9.0" + execa: "npm:^9.3.1" + bin: + synthetic-chain: dist/cli/cli.js + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-dev-9c61393.0+9c61393": + version: 0.3.3-dev-9c61393.0 + resolution: "@agoric/time@npm:0.3.3-dev-9c61393.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/9c89e51041829351c9698b96f624362d3712d2c959780db1a3d5ce29d45f83077fba192b8157da4055e1832f269799e7c621ad0d526ce16b7be254004b5116cb + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-dev-9c61393.0+9c61393": + version: 0.5.3-dev-9c61393.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-9c61393.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/ba27f0acd8c148279067dd47755776a70a26d88b5e45e0675e5e23da610626b6c5169f057591c6992a7744d8ee05f7fd230fc6c20665da34502f5c787648f209 + languageName: node + linkType: hard + +"@agoric/vats@npm:0.15.2-dev-9c61393.0+9c61393": + version: 0.15.2-dev-9c61393.0 + resolution: "@agoric/vats@npm:0.15.2-dev-9c61393.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-dev-9c61393.0+9c61393" + "@agoric/ertp": "npm:0.16.3-dev-9c61393.0+9c61393" + "@agoric/governance": "npm:0.10.4-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/network": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/swingset-vat": "npm:0.32.3-dev-9c61393.0+9c61393" + "@agoric/time": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/vow": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/zoe": "npm:0.26.3-dev-9c61393.0+9c61393" + "@agoric/zone": "npm:0.2.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/e96d1c83c0b6907c69c0f85e87e3b477b50eba49f4d76db98cb4e7f605938f275e3830a5992c057882d12faa54f983ac63ad02e3e6c05d2ef2c9d3b2839caa09 + languageName: node + linkType: hard + +"@agoric/vow@npm:0.1.1-dev-9c61393.0+9c61393": + version: 0.1.1-dev-9c61393.0 + resolution: "@agoric/vow@npm:0.1.1-dev-9c61393.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/7ad19095660f8312224b2a19e892d296da292e66146f3aab8127fdaf6e2ec999958401b5e8052b465e8eb97ff49a0db9f4db9aa445abbd8a51bc9a1216036f57 + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-dev-9c61393.0+9c61393": + version: 0.14.1-dev-9c61393.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-9c61393.0" + checksum: 10c0/f53416887d03a9b96586d96ac47917a898613722a99b6a1f9cb74712f788fd077d0f9530169b46bc40b40ec68fd001446561260799dc1d65a57eb08144069913 + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-dev-9c61393.0+9c61393": + version: 0.26.3-dev-9c61393.0 + resolution: "@agoric/zoe@npm:0.26.3-dev-9c61393.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/ertp": "npm:0.16.3-dev-9c61393.0+9c61393" + "@agoric/internal": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/notifier": "npm:0.6.3-dev-9c61393.0+9c61393" + "@agoric/store": "npm:0.9.3-dev-9c61393.0+9c61393" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-9c61393.0+9c61393" + "@agoric/swingset-vat": "npm:0.32.3-dev-9c61393.0+9c61393" + "@agoric/time": "npm:0.3.3-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@agoric/vow": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/zone": "npm:0.2.3-dev-9c61393.0+9c61393" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/945a3480ca196bf94552c63c37dba97eea5d8cb21e5f9aed4a6d8a6b627a07b83cc2ee0e8ebaa735e3b73e90a1dc1c645d06b89e61f62cc4e838f77ee2ce3e80 + languageName: node + linkType: hard + +"@agoric/zone@npm:0.2.3-dev-9c61393.0+9c61393": + version: 0.2.3-dev-9c61393.0 + resolution: "@agoric/zone@npm:0.2.3-dev-9c61393.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-9c61393.0+9c61393" + "@agoric/vat-data": "npm:0.5.3-dev-9c61393.0+9c61393" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10c0/a3434bf4b2d8be2d2325af3a19fde83b06fdb6b6922e5ec1cf3355ffc15a79a9a4ee6c6968349d92f039808ab521dc7ec20830cc34d2356c5771d9f69c5e3e20 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" + dependencies: + "@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:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c + languageName: node + linkType: hard + +"@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-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/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@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.23.6": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" + dependencies: + "@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/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @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.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 + languageName: node + linkType: hard + +"@confio/ics23@npm:^0.6.8": + version: 0.6.8 + resolution: "@confio/ics23@npm:0.6.8" + dependencies: + "@noble/hashes": "npm:^1.0.0" + protobufjs: "npm:^6.8.8" + checksum: 10c0/2f3f5032cd6a34c9b2fbd64bbf7e1cdec75ca71f348a770f7b5474b5027b12202bfbcd404eca931efddb5901f769af035a87cb8bddbf3f23d7e5d93c9d3d7f6f + languageName: node + linkType: hard + +"@cosmjs/amino@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/amino@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + checksum: 10c0/cd8e215b0406f5c7b73ab0a21106d06b6f76b1da12f1ab7b612884e1dd8bc626966dc67d4e7580090ade131546cbec70000f854e6596935299d054b788929a7e + languageName: node + linkType: hard + +"@cosmjs/crypto@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/crypto@npm:0.32.4" + dependencies: + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + "@noble/hashes": "npm:^1" + bn.js: "npm:^5.2.0" + elliptic: "npm:^6.5.4" + libsodium-wrappers-sumo: "npm:^0.7.11" + checksum: 10c0/94e742285eb8c7c5393055ba0635f10c06bf87710e953aedc71e3edc2b8e21a12a0d9b5e8eff37e326765f57c9eb3c7fd358f24f639efad4f1a6624eb8189534 + languageName: node + linkType: hard + +"@cosmjs/encoding@npm:^0.32.3, @cosmjs/encoding@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/encoding@npm:0.32.4" + dependencies: + base64-js: "npm:^1.3.0" + bech32: "npm:^1.1.4" + readonly-date: "npm:^1.0.0" + checksum: 10c0/4a30d5ae1a2d1247d44bda46101ce208c7666d8801ca9a33de94edc35cc22460c16b4834ec84d5a65ffef5e2a4b58605e0a0a056c46bc0a042979ec84acf20cd + languageName: node + linkType: hard + +"@cosmjs/json-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/json-rpc@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + xstream: "npm:^11.14.0" + checksum: 10c0/b3ebd240f4fb21260e284d2e503ecc61bac898842187ab717f0efb9a5f21272f161f267cc145629caeb9735f80946844384e2bd410275a4744147a44518c0fa0 + languageName: node + linkType: hard + +"@cosmjs/math@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/math@npm:0.32.4" + dependencies: + bn.js: "npm:^5.2.0" + checksum: 10c0/91e47015be5634d27d71d14c5a05899fb4992b69db02cab1558376dedf8254f96d5e24f097c5601804ae18ed33c7c25d023653ac2bf9d20250fd3e5637f6b101 + languageName: node + linkType: hard + +"@cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/proto-signing@npm:0.32.4" + dependencies: + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + checksum: 10c0/6915059d2e6dbe1abda4a747c3b1abd47a9eff4f8cb2cf9a5545f939b656b4a15bbde2bfc1364357f9b2a081a066280c3b469f6d13dd5fc51b429b0f90a54913 + languageName: node + linkType: hard + +"@cosmjs/socket@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/socket@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + isomorphic-ws: "npm:^4.0.1" + ws: "npm:^7" + xstream: "npm:^11.14.0" + checksum: 10c0/2d94c1fb39016bea3c7c145f4565c8a0fed20c805ac569ea604cd3646c15147b82b8db18a4e3c832d6ae0c3dd14363d4db3d91bcacac922679efba164ed49386 + languageName: node + linkType: hard + +"@cosmjs/stargate@npm:^0.32.3": + version: 0.32.4 + resolution: "@cosmjs/stargate@npm:0.32.4" + dependencies: + "@confio/ics23": "npm:^0.6.8" + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + xstream: "npm:^11.14.0" + checksum: 10c0/c30a3519516aaa7eae58ba827c80fcf74c7fe7a9d3aa5cc8138c3a2768f5f241f59c2f5cec27e9037b4df12b1c6605b4fac9eadb4de97bd84edddc3a80a02e24 + languageName: node + linkType: hard + +"@cosmjs/stream@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stream@npm:0.32.4" + dependencies: + xstream: "npm:^11.14.0" + checksum: 10c0/c677c53f9101c2a36fa03a475d92dea2fa69c475f896751b5e18a5d07087eeecbf6bca2e62a8940003da53fa235a9b2dd78c8257bf19c3f96e3f69fa8d5f183d + languageName: node + linkType: hard + +"@cosmjs/tendermint-rpc@npm:^0.32.3, @cosmjs/tendermint-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/tendermint-rpc@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/json-rpc": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/socket": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + axios: "npm:^1.6.0" + readonly-date: "npm:^1.0.0" + xstream: "npm:^11.14.0" + checksum: 10c0/5fae7afcdf98cc7dd36922aa1586254cc8c202cf8fe66804e61d793d31dcff816f40d33f7a0eb72c1b9226c7c361d4848e4ff12d0489f6fa66f47f0c86ae18dd + languageName: node + linkType: hard + +"@cosmjs/utils@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/utils@npm:0.32.4" + checksum: 10c0/d5ff8b235094be1150853a715116049f73eb5cdfeea8ce8e22ecccc61ec99792db457404d4307782b1a2f935dcf438f5c485beabfcfbc1dc5df26eb6e6da9062 + 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:^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:^4.4.3": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" + dependencies: + "@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:^1.0.12": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" + dependencies: + "@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:^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.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" + dependencies: + "@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:^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:^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.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" + dependencies: + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 + 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:^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:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" + dependencies: + "@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.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" + dependencies: + "@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.3.2": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" + dependencies: + "@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:^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:^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:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" + dependencies: + "@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 + +"@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:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 + languageName: node + linkType: hard + +"@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.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/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e + languageName: node + linkType: hard + +"@endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" + dependencies: + "@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:^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:^1.2.8": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" + dependencies: + "@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/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf + languageName: node + linkType: hard + +"@endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" + dependencies: + "@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 + +"@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:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + +"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc + languageName: node + linkType: hard + +"@fast-check/ava@npm:^1.1.5": + version: 1.2.1 + resolution: "@fast-check/ava@npm:1.2.1" + dependencies: + fast-check: "npm:^3.0.0" + peerDependencies: + ava: ^4 || ^5 || ^6 + checksum: 10c0/3800098fd7e8098102544a2f7a595351d063a7ebaeca18ed4901df5ec2679da2330ba8c0db2c820721d4cbb3e23d817ba22fec6d058957930e229f44fa71a684 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + 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 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@rollup/plugin-commonjs@npm:^19.0.0": + version: 19.0.2 + resolution: "@rollup/plugin-commonjs@npm:19.0.2" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.1" + glob: "npm:^7.1.6" + is-reference: "npm:^1.2.1" + magic-string: "npm:^0.25.7" + resolve: "npm:^1.17.0" + peerDependencies: + rollup: ^2.38.3 + checksum: 10c0/9adccf77ad835cbe565da4385212f1e54c3e0dca2be174b5c2cfe89cfaeb240f42c7673e97e49b21b7c66ed901cc1c711552b6727f60b43a953ce996eb2868a7 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^13.0.0": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + "@types/resolve": "npm:1.17.1" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.1.0" + is-module: "npm:^1.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + rollup: ^2.42.0 + checksum: 10c0/6caa32a8304a20f1c9953111b25e9543f4de7d254958d81ce0158ad909e4493946bc2060c4ace23d9748b560ebc84c920ee7bc1b7d50dbf8ba852ef13c91af58 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" + picomatch: "npm:^2.2.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.1.0": + 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:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + 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" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.1": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: 10c0/42ec66ade1f72ff9d143c5a519a65efc7c1c77be7b1ac5455c530ae9acd87baba065542f8847522af2e3ace2cc999f3ad464ef86e6b7352eece34daf88f8c924 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=13.7.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/resolve@npm:1.17.1": + version: 1.17.1 + resolution: "@types/resolve@npm:1.17.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.2.0": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.8.2": + version: 8.13.0 + resolution: "acorn@npm:8.13.0" + bin: + acorn: bin/acorn + checksum: 10c0/f35dd53d68177c90699f4c37d0bb205b8abe036d955d0eb011ddb7f14a81e6fd0f18893731c457c1b5bd96754683f4c3d80d9a5585ddecaa53cdf84e0b3d68f7 + languageName: node + linkType: hard + +"acorn@npm:^8.2.4": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"aggregate-error@npm:^4.0.0": + version: 4.0.1 + resolution: "aggregate-error@npm:4.0.1" + dependencies: + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 10c0/75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10c0/1ca7fcf5bc2b78d1e1d9b8c8cc7ce50b5c6cc67a8da5a28c9c975b7b46fff255a04abab02de38a5139190c9d8b34b3d6c59af6724521b077f7d7dfbad9b47a9c + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"array-find-index@npm:^1.0.1": + version: 1.0.2 + resolution: "array-find-index@npm:1.0.2" + checksum: 10c0/86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 + languageName: node + linkType: hard + +"arrgv@npm:^1.0.2": + version: 1.0.2 + resolution: "arrgv@npm:1.0.2" + checksum: 10c0/7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 + languageName: node + linkType: hard + +"arrify@npm:^3.0.0": + version: 3.0.0 + resolution: "arrify@npm:3.0.0" + checksum: 10c0/2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"ava@npm:^5.3.1": + version: 5.3.1 + resolution: "ava@npm:5.3.1" + dependencies: + acorn: "npm:^8.8.2" + acorn-walk: "npm:^8.2.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.0.0" + cbor: "npm:^8.1.0" + chalk: "npm:^5.2.0" + chokidar: "npm:^3.5.3" + chunkd: "npm:^2.0.1" + ci-info: "npm:^3.8.0" + ci-parallel-vars: "npm:^1.0.1" + clean-yaml-object: "npm:^0.1.0" + cli-truncate: "npm:^3.1.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^5.0.0" + globby: "npm:^13.1.4" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-error: "npm:^2.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + mem: "npm:^9.0.2" + ms: "npm:^2.1.3" + p-event: "npm:^5.0.1" + p-map: "npm:^5.5.0" + picomatch: "npm:^2.3.1" + pkg-conf: "npm:^4.0.0" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.0.1" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" + peerDependencies: + "@ava/typescript": "*" + peerDependenciesMeta: + "@ava/typescript": + optional: true + bin: + ava: entrypoints/cli.mjs + checksum: 10c0/262cbdb9e8c3ce7177be91b92ba521e9d5aef577dcc8095cc591f86baaa291b91c88925928f5d26832c4d1b381a6ae99f2e8804077c592d0d32322c1212605cc + languageName: node + linkType: hard + +"axios@npm:^1.6.0": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bech32@npm:^1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 10c0/5f62ca47b8df99ace9c0e0d8deb36a919d91bf40066700aaa9920a45f86bb10eb56d537d559416fd8703aa0fb60dddb642e58f049701e7291df678b2033e5ee5 + languageName: node + linkType: hard + +"better-sqlite3@npm:^9.1.1, better-sqlite3@npm:^9.6.0": + version: 9.6.0 + resolution: "better-sqlite3@npm:9.6.0" + dependencies: + bindings: "npm:^1.5.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + checksum: 10c0/8db9b38f414e26a56d4c40fc16e94a253118491dae0e2c054338a9e470f1a883c7eb4cb330f2f5737db30f704d4f2e697c59071ca04e03364ee9fe04375aa9c8 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"bindings@npm:^1.5.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"blueimp-md5@npm:^2.10.0": + version: 2.19.0 + resolution: "blueimp-md5@npm:2.19.0" + checksum: 10c0/85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 + languageName: node + linkType: hard + +"bn.js@npm:^4.11.9": + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.0": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"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.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.4 + resolution: "cacache@npm:18.0.4" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f + languageName: node + linkType: hard + +"callsites@npm:^4.0.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: "npm:^3.1.0" + checksum: 10c0/a836e2e7ea0efb1b9c4e5a4be906c57113d730cc42293a34072e0164ed110bb8ac035dc7dca2e3ebb641bd4b37e00fdbbf09c951aa864b3d4888a6ed8c6243f7 + languageName: node + linkType: hard + +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chunkd@npm:^2.0.1": + version: 2.0.1 + resolution: "chunkd@npm:2.0.1" + checksum: 10c0/4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 + languageName: node + linkType: hard + +"ci-info@npm:^3.8.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"ci-parallel-vars@npm:^1.0.1": + version: 1.0.1 + resolution: "ci-parallel-vars@npm:1.0.1" + checksum: 10c0/80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"clean-stack@npm:^4.0.0": + version: 4.2.0 + resolution: "clean-stack@npm:4.2.0" + dependencies: + escape-string-regexp: "npm:5.0.0" + checksum: 10c0/2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 + languageName: node + linkType: hard + +"clean-yaml-object@npm:^0.1.0": + version: 0.1.0 + resolution: "clean-yaml-object@npm:0.1.0" + checksum: 10c0/a6505310590038afb9f0adc7f17a4c66787719c94d23f8491267ea4d9c405cdd378bd576ae1926169b6d997d4c59a8b86516bf4d16ba228280cf615598c58e05 + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: "npm:^5.0.0" + string-width: "npm:^5.0.0" + checksum: 10c0/a19088878409ec0e5dc2659a5166929629d93cfba6d68afc9cde2282fd4c751af5b555bf197047e31c87c574396348d011b7aa806fec29c4139ea4f7f00b324c + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"code-excerpt@npm:^4.0.0": + version: 4.0.0 + resolution: "code-excerpt@npm:4.0.0" + dependencies: + convert-to-spaces: "npm:^2.0.1" + checksum: 10c0/b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concordance@npm:^5.0.4": + version: 5.0.4 + resolution: "concordance@npm:5.0.4" + dependencies: + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 10c0/59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a + languageName: node + linkType: hard + +"convert-to-spaces@npm:^2.0.1": + version: 2.0.1 + resolution: "convert-to-spaces@npm:2.0.1" + checksum: 10c0/d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 + languageName: node + linkType: hard + +"cosmjs-types@npm:^0.9.0": + version: 0.9.0 + resolution: "cosmjs-types@npm:0.9.0" + checksum: 10c0/bc20f4293fb34629d7c5f96bafe533987f753df957ff68eb078d0128ae5a418320cb945024441769a07bb9bc5dde9d22b972fd40d485933e5706ea191c43727b + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"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/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"currently-unhandled@npm:^0.4.1": + version: 0.4.1 + resolution: "currently-unhandled@npm:0.4.1" + dependencies: + array-find-index: "npm:^1.0.1" + checksum: 10c0/32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c + languageName: node + linkType: hard + +"date-time@npm:^3.1.0": + version: 3.1.0 + resolution: "date-time@npm:3.1.0" + dependencies: + time-zone: "npm:^1.0.0" + checksum: 10c0/aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"elliptic@npm:^6.5.4": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + 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/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 + languageName: node + linkType: hard + +"emittery@npm:^1.0.1": + version: 1.0.3 + resolution: "emittery@npm:1.0.3" + checksum: 10c0/91605d044f3891dd1f8ab731aeb94b520488b21e707f7064dcbcf5303bac3b4e7133dfa23c343ede1fc970340bd78a9b1aed522b805bc15104606bba630dd71e + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + +"esutils@npm:^2.0.3": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:^9.3.1": + version: 9.5.1 + resolution: "execa@npm:9.5.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fast-check@npm:^3.0.0": + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10c0/d61ee4a7a2e1abc5126bf2f1894413f532f686b3d1fc15c67fefb60dcca66024934b69a6454d3eba92e6568ac1abbb9882080e212d255865c3b3bbe52c5bf702 + languageName: node + linkType: hard + +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.0": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"figures@npm:^5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + is-unicode-supported: "npm:^1.2.0" + checksum: 10c0/ce0f17d4ea8b0fc429c5207c343534a2f5284ecfb22aa08607da7dc84ed9e1cf754f5b97760e8dcb98d3c9d1a1e4d3d578fe3b5b99c426f05d0f06c7ba618e16 + languageName: node + linkType: hard + +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + +"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/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^6.0.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"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/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"globby@npm:^13.1.4": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c + languageName: node + linkType: hard + +"human-signals@npm:^8.0.0": + version: 8.0.0 + resolution: "human-signals@npm:8.0.0" + checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-by-default@npm:^2.1.0": + version: 2.1.0 + resolution: "ignore-by-default@npm:2.1.0" + checksum: 10c0/3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 + languageName: node + linkType: hard + +"ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^2.2.1": + version: 2.2.2 + resolution: "import-meta-resolve@npm:2.2.2" + checksum: 10c0/80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"irregular-plurals@npm:^3.3.0": + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + languageName: node + linkType: hard + +"is-error@npm:^2.2.2": + version: 2.2.2 + resolution: "is-error@npm:2.2.2" + checksum: 10c0/475d3463968bf16e94485555d7cb7a879ed68685e08d365a3370972e626054f1846ebbb3934403091e06682445568601fe919e41646096e5007952d0c1f4fd9b + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + 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" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 10c0/df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-reference@npm:^1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 + languageName: node + linkType: hard + +"js-string-escape@npm:^1.0.1": + version: 1.0.1 + resolution: "js-string-escape@npm:1.0.1" + checksum: 10c0/2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^3.14.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + 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 + +"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.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" + dependencies: + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 + languageName: node + linkType: hard + +"load-json-file@npm:^7.0.0": + version: 7.0.1 + resolution: "load-json-file@npm:7.0.1" + checksum: 10c0/7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a + languageName: node + linkType: hard + +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + +"lodash@npm:^4.17.15": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 10c0/50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"magic-string@npm:^0.25.7": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: "npm:^1.4.8" + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"map-age-cleaner@npm:^0.1.3": + version: 0.1.3 + resolution: "map-age-cleaner@npm:0.1.3" + dependencies: + p-defer: "npm:^1.0.0" + checksum: 10c0/7495236c7b0950956c144fd8b4bc6399d4e78072a8840a4232fe1c4faccbb5eb5d842e5c0a56a60afc36d723f315c1c672325ca03c1b328650f7fcc478f385fd + languageName: node + linkType: hard + +"matcher@npm:^5.0.0": + version: 5.0.0 + resolution: "matcher@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + checksum: 10c0/eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 + languageName: node + linkType: hard + +"md5-hex@npm:^3.0.1": + version: 3.0.1 + resolution: "md5-hex@npm:3.0.1" + dependencies: + blueimp-md5: "npm:^2.10.0" + checksum: 10c0/ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 + languageName: node + linkType: hard + +"mem@npm:^9.0.2": + version: 9.0.2 + resolution: "mem@npm:9.0.2" + dependencies: + map-age-cleaner: "npm:^0.1.3" + mimic-fn: "npm:^4.0.0" + checksum: 10c0/c2c56141399e520d8f0e50186bb7e4b49300b33984dc919682f3f13e53dec0e6608fbd327d5ae99494f45061a3a05a8ee04ccba6dcf795c3c215b5aa906eb41f + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"microtime@npm:^3.1.0": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.4.0" + checksum: 10c0/02512993de914c6f71424d3b8b28ce53de44ba5895b904a213420fd4fc86a084c1d08ec0876ac60cdae6427022766e1b9b86d9b3442bf408701120bd61455e26 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + 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.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10c0/37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f + languageName: node + linkType: hard + +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.4.0": + version: 4.8.3 + resolution: "node-gyp-build@npm:4.8.3" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/a7f43c4128d817db80bb0884f631121449ac586b4a3e708eab0db6fcb7fa0d2e66f6d7d4ee1f49469409de4a9b2e413926befe2dce70b850c6c583a3bbe228d2 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^4.1.0" + semver: "npm:^7.3.5" + tar: "npm:^6.2.1" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b + languageName: node + linkType: hard + +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 10c0/92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"p-defer@npm:^1.0.0": + version: 1.0.0 + resolution: "p-defer@npm:1.0.0" + checksum: 10c0/ed603c3790e74b061ac2cb07eb6e65802cf58dce0fbee646c113a7b71edb711101329ad38f99e462bd2e343a74f6e9366b496a35f1d766c187084d3109900487 + languageName: node + linkType: hard + +"p-event@npm:^5.0.1": + version: 5.0.1 + resolution: "p-event@npm:5.0.1" + dependencies: + p-timeout: "npm:^5.0.2" + checksum: 10c0/2317171489537f316661fa863f3bb711b2ceb89182937238422cec10223cbb958c432d6c26a238446a622d788187bdd295b1d8ecedbe2e467e045930d60202b0 + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^5.5.0": + version: 5.5.0 + resolution: "p-map@npm:5.5.0" + dependencies: + aggregate-error: "npm:^4.0.0" + checksum: 10c0/410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 + languageName: node + linkType: hard + +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: 10c0/1b026cf9d5878c64bec4341ca9cda8ec6b8b3aea8a57885ca0fe2b35753a20d767fb6f9d3aa41e1252f42bc95432c05ea33b6b18f271fb10bfb0789591850a41 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"parse-ms@npm:^3.0.0": + version: 3.0.0 + resolution: "parse-ms@npm:3.0.0" + checksum: 10c0/056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 + languageName: node + linkType: hard + +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + 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 + +"pkg-conf@npm:^4.0.0": + version: 4.0.0 + resolution: "pkg-conf@npm:4.0.0" + dependencies: + find-up: "npm:^6.0.0" + load-json-file: "npm:^7.0.0" + checksum: 10c0/27d027609f27228edcde121f6f707b4ba1f5488e95e98f2e58652ae4e99792081bd1de67d591f4a0f05b02c0b66d745591d49f82041cbc8d41e2238ef5d73eb4 + languageName: node + linkType: hard + +"plur@npm:^5.1.0": + version: 5.1.0 + resolution: "plur@npm:5.1.0" + dependencies: + irregular-plurals: "npm:^3.3.0" + checksum: 10c0/26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 + languageName: node + linkType: hard + +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 + languageName: node + linkType: hard + +"pretty-ms@npm:^8.0.0": + version: 8.0.0 + resolution: "pretty-ms@npm:8.0.0" + dependencies: + parse-ms: "npm:^3.0.0" + checksum: 10c0/e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d + languageName: node + linkType: hard + +"pretty-ms@npm:^9.0.0": + version: 9.2.0 + resolution: "pretty-ms@npm:9.2.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb + languageName: node + linkType: hard + +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"protobufjs@npm:^6.8.8": + version: 6.11.4 + resolution: "protobufjs@npm:6.11.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/c244d7b9b6d3258193da5c0d1e558dfb47f208ae345e209f90ec45c9dca911b90fa17e937892a9a39a4136ab9886981aae9efdf6039f7baff4f7225f5eeb9812 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"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/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + +"pure-rand@npm:^6.1.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"readonly-date@npm:^1.0.0": + version: 1.0.0 + resolution: "readonly-date@npm:1.0.0" + checksum: 10c0/7ab32bf19f6bfec102584a524fa79a289e6ede0bf20c80fd90ab309962e45b71d19dd0e3915dff6e81edf226f08fda65e890539b4aca74668921790b10471356 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve@npm:^1.17.0, resolve@npm:^1.19.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rollup@npm:^2.79.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + "@agoric/client-utils": "npm:dev" + "@agoric/synthetic-chain": "npm:^0.4.3" + "@endo/init": "npm:^1.1.7" + ava: "npm:^5.3.1" + languageName: unknown + linkType: soft + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + 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 + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 10c0/2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.6": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"supertap@npm:^3.0.1": + version: 3.0.1 + resolution: "supertap@npm:3.0.1" + dependencies: + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"symbol-observable@npm:^2.0.3": + version: 2.0.3 + resolution: "symbol-observable@npm:2.0.3" + checksum: 10c0/03fb8766b75bfa65a3c7d68ae1e51a13a5ff71b40d6d53b17a0c9c77b1685c20a3bfbf45547ab36214a079665c3f551e250798f6b2f83a2a40762d864ed87f78 + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"temp-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "temp-dir@npm:3.0.0" + checksum: 10c0/a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 + languageName: node + linkType: hard + +"time-zone@npm:^1.0.0": + version: 1.0.0 + resolution: "time-zone@npm:1.0.0" + checksum: 10c0/d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 + languageName: node + linkType: hard + +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + 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 + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + 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@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=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"well-known-symbols@npm:^2.0.0": + version: 2.0.0 + resolution: "well-known-symbols@npm:2.0.0" + checksum: 10c0/cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + 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" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: 10c0/e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d + languageName: node + linkType: hard + +"ws@npm:^7": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"xstream@npm:^11.14.0": + version: 11.14.0 + resolution: "xstream@npm:11.14.0" + dependencies: + globalthis: "npm:^1.0.1" + symbol-observable: "npm:^2.0.3" + checksum: 10c0/7a28baedc64385dc17597d04c7130ec3135db298e66d6dcf33821eb1953d5ad1b83c5fa08f1ce4d36e75fd219f2e9ef81ee0721aa8d4ccf619acc1760ba37f71 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 + languageName: node + linkType: hard + +"yoctocolors@npm:^2.0.0": + version: 2.1.1 + resolution: "yoctocolors@npm:2.1.1" + checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 + languageName: node + linkType: hard diff --git a/a3p-integration/proposals/p:upgrade-19/.gitignore b/a3p-integration/proposals/p:upgrade-19/.gitignore new file mode 100644 index 00000000000..ffa9f22d144 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/.gitignore @@ -0,0 +1,9 @@ +replaceFeeDistributor/ +addUsdLemons/ +addUsdOlives/ +upgradeProvisionPool/ +upgradeAgoricNames/ +publishTestInfo/ +upgrade-mintHolder/ +upgradeAssetReserve/ +terminate-governor/ diff --git a/a3p-integration/proposals/p:upgrade-19/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch b/a3p-integration/proposals/p:upgrade-19/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch new file mode 100644 index 00000000000..9c00803d7a3 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch @@ -0,0 +1,45 @@ +diff --git a/dist/node/axios.cjs b/dist/node/axios.cjs +index db4997bee1aa48aca215c6b2e7443292c94c086f..fb39f7e0046c66b1c0275c1a82ed49d3cc7cff83 100644 +--- a/dist/node/axios.cjs ++++ b/dist/node/axios.cjs +@@ -371,9 +371,18 @@ function merge(/* obj1, obj2, obj3, ... */) { + const extend = (a, b, thisArg, {allOwnKeys}= {}) => { + forEach(b, (val, key) => { + if (thisArg && isFunction(val)) { +- a[key] = bind(val, thisArg); +- } else { ++ val = bind(val, thisArg); ++ } ++ const oldDesc = Object.getOwnPropertyDescriptor(a, key); ++ if (oldDesc) { + a[key] = val; ++ } else { ++ Object.defineProperty(a, key, { ++ value: val, ++ writable: true, ++ enumerable: true, ++ configurable: true ++ }); + } + }, {allOwnKeys}); + return a; +@@ -404,7 +413,9 @@ const stripBOM = (content) => { + */ + const inherits = (constructor, superConstructor, props, descriptors) => { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); +- constructor.prototype.constructor = constructor; ++ Object.defineProperty(constructor.prototype, 'constructor', { ++ value: constructor ++ }); + Object.defineProperty(constructor, 'super', { + value: superConstructor.prototype + }); +@@ -566,7 +577,7 @@ const isRegExp = kindOfTest('RegExp'); + + const reduceDescriptors = (obj, reducer) => { + const descriptors = Object.getOwnPropertyDescriptors(obj); +- const reducedDescriptors = {}; ++ const reducedDescriptors = Object.create(null); + + forEach(descriptors, (descriptor, name) => { + let ret; diff --git a/a3p-integration/proposals/p:upgrade-19/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch b/a3p-integration/proposals/p:upgrade-19/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch new file mode 100644 index 00000000000..1122600ffe5 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch @@ -0,0 +1,36 @@ +diff --git a/src/util/minimal.js b/src/util/minimal.js +index 3c406dee753b5c6fb29dda2e64d4482e754e7873..564e5dadaa50e4ad05fc18b767ee276c99e9f0f9 100644 +--- a/src/util/minimal.js ++++ b/src/util/minimal.js +@@ -280,7 +280,30 @@ function newError(name) { + merge(this, properties); + } + +- (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError; ++ CustomError.prototype = Object.create(Error.prototype, { ++ constructor: { ++ value: CustomError, ++ writable: true, ++ enumerable: false, ++ configurable: true, ++ }, ++ name: { ++ get() { return name; }, ++ set: undefined, ++ enumerable: false, ++ // configurable: false would accurately preserve the behavior of ++ // the original, but I'm guessing that was not intentional. ++ // For an actual error subclass, this property would ++ // be configurable. ++ configurable: true, ++ }, ++ toString: { ++ value() { return this.name + ": " + this.message; }, ++ writable: true, ++ enumerable: false, ++ configurable: true, ++ }, ++ }); + + Object.defineProperty(CustomError.prototype, "name", { get: function() { return name; } }); + diff --git a/a3p-integration/proposals/p:upgrade-19/.yarnrc.yml b/a3p-integration/proposals/p:upgrade-19/.yarnrc.yml new file mode 100644 index 00000000000..3186f3f0795 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral-permit.json b/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral-permit.json new file mode 100644 index 00000000000..211b499fe4c --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral-permit.json @@ -0,0 +1,8 @@ +{ + "consume": { + "contractKits": true, + "zoe": true, + "agoricNames": true, + "reserveKit": true + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral.js b/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral.js new file mode 100644 index 00000000000..c14306cf0eb --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/addCollateral/add-collateral.js @@ -0,0 +1,59 @@ +// @ts-nocheck +/* eslint-disable no-undef */ + +const addCollateral = async powers => { + const { + consume: { + contractKits: contractKitsP, + reserveKit: reserveKitP, + zoe, + agoricNames, + }, + } = powers; + + const [contractKits, reserveKit, usdLemonsIssuer, usdLemonsBrand] = + await Promise.all([ + contractKitsP, + reserveKitP, + E(agoricNames).lookup('issuer', 'USD_LEMONS'), + E(agoricNames).lookup('brand', 'USD_LEMONS'), + ]); + + console.log('[CONTRACT_KITS]', contractKits); + console.log('[ISSUER]', usdLemonsIssuer); + + const { governorCreatorFacet } = reserveKit; + + const arPublicFacet = await E(governorCreatorFacet).getPublicFacet(); + const arLimitedFacet = await E(governorCreatorFacet).getCreatorFacet(); + + let usdLemonsMint; + for (const { publicFacet, creatorFacet: mint } of contractKits.values()) { + if (publicFacet === usdLemonsIssuer) { + usdLemonsMint = mint; + console.log('USD_LEMONS found', mint); + break; + } + } + + await E(arLimitedFacet).addIssuer(usdLemonsIssuer, 'USD_LEMONS'); + + console.log('Minting USD_LEMONS'); + const amt = harden({ brand: usdLemonsBrand, value: 500000n }); + const helloPayment = await E(usdLemonsMint).mintPayment(amt); + + console.log('Adding to the reserve...'); + + const seat = E(zoe).offer( + E(arPublicFacet).makeAddCollateralInvitation(), + harden({ + give: { Collateral: amt }, + }), + harden({ Collateral: helloPayment }), + ); + + console.log(await E(seat).getOfferResult()); + console.log('Done.'); +}; + +addCollateral; diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNames.test.js b/a3p-integration/proposals/p:upgrade-19/agoricNames.test.js new file mode 100644 index 00000000000..0d61c976b45 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNames.test.js @@ -0,0 +1,236 @@ +/* eslint-env node */ + +/** + * @file The goal of this file is to test different aspects of agoricNames to make sure + * everything works after an upgrade. Here's the test plan; + * 1. publish a new node called 'testInfo' under agoricNames + * CONTEXT: onUpdate callback of testInfo nameAdmin is registered in a core-eval. Which means it is + * both ephemeral and lives in bootstrap vat. We create a scenario like this to make sure any ephemeral + * onUpdate keeps working after an agoricNames upgrade. + * 2. upgrade agoricNames + * 3. send a core-eval that writes into children of agoricNames (brand, issuer, instance...) + * 3b. expect a child nameHub of agoricNames will publish ALL its entries when a new item is written to it + * 3c. check the values in the vstorage match before and after the upgrade + * 3d. also check that new items are in the vstorage as well + * 4. append new chain + * CONTEXT: there are two new children introduced to agoricNames by orchestration and their + * onUpdate callback isn't durable. So we must check that if we write a new chain info to those child + * nameHubs, we should observe the new value in vstorage. + * 4b. send a core-eval that writes new chain info to published.agoricNames.chain and published.agoricNames.chainConnection + * 4c. wait until the expected data observed in vstorage + * + * + * TESTING CODE THAT HOLDS ONTO 'agoricNames': smartWallet is one of the vats that depend on agoricNames to work properly the most. + * smartWallet uses agoricNames to; + * - create purses for known brands + * - looks for the brand in agoricNames.brand + * - creates a purse for the brand using the issuer in agoricNames.issuer + * - create invitations for a from the publicFacet of a given instance (agoricNames.instance) + * + * So the fact that a user can complete an offer successfully means; + * - smartWallet can find the instance on agoricNames.instance (for invitationSource = 'agoricContract') + * - smartWallet can find, if not present create, a purse for known brand, agoricNames.brand + * and agoricNames.issuer returned correct values + * + * + * 5. add a new PSM and swap against it + * 5b. adding the new PSM requires introducing a new asset to the chain and writing + * the PSM instance to agoricNames.instance + * 5c. being able to deposit the new asset to a user means that smartWallet created a purse + * for the new brand + * 5d. being able to send the offer to the PSM instance means smartWallet can find the instance + * in agoricNames.instance + * + * 6. we want to make sure objects that were already in agoricNames works as well, so open a vault + * in an existing collateralManager + * 6a. fund GOV1 with ATOM + * 6b. open a vault + * 6c. check the vault is opened successfully + * + */ + +import '@endo/init'; +import test from 'ava'; +import { + agoric, + ATOM_DENOM, + evalBundles, + getIncarnation, + GOV1ADDR, + openVault, +} from '@agoric/synthetic-chain'; +import { makeVstorageKit, retryUntilCondition } from '@agoric/client-utils'; +import { + bankSend, + extractBalance, + psmSwap, + tryISTBalances, +} from './test-lib/psm-lib.js'; +import { getBalances, listVaults } from './test-lib/utils.js'; +import { walletUtils } from './test-lib/index.js'; + +const AGORIC_NAMES_UPGRADE_DIR = 'agoricNamesCoreEvals/upgradeAgoricNames'; +const WRITE_AGORIC_NAMES_DIR = 'agoricNamesCoreEvals/writeToAgoricNames'; +const ADD_USD_OLIVES_DIR = 'agoricNamesCoreEvals/addUsdOlives'; +const DEPOSIT_USD_OLIVES_DIR = 'agoricNamesCoreEvals/depositUsdOlives'; +const PUBLISH_TEST_INFO_DIR = 'agoricNamesCoreEvals/publishTestInfo'; +const WRITE_TEST_INFO_DIR = 'agoricNamesCoreEvals/writeToTestInfo'; + +const makeWaitUntilKeyFound = (keyFinder, vstorage) => (path, targetKey) => + retryUntilCondition( + () => vstorage.keys(path), + keys => keyFinder(keys, targetKey), + 'Key not found.', + { maxRetries: 5, retryIntervalMs: 2000, log: console.log, setTimeout }, + ); + +test.before(async t => { + const vstorageKit = await makeVstorageKit( + { fetch }, + { rpcAddrs: ['http://localhost:26657'], chainName: 'agoriclocal' }, + ); + + t.context = { + vstorageKit, + }; +}); + +test.serial('publish test info', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + const waitUntilKeyFound = makeWaitUntilKeyFound( + (keys, targetKey) => keys.includes(targetKey), + vstorageKit.vstorage, + ); + + await evalBundles(PUBLISH_TEST_INFO_DIR); + await waitUntilKeyFound('published.agoricNames', 'testInfo'); + + const testInfo = await vstorageKit.readLatestHead( + 'published.agoricNames.testInfo', + ); + t.deepEqual(Object.fromEntries(testInfo), { + agoric: { + isAwesome: 'yes', + tech: ['HardenedJs', 'Orchestration', 'Async_Execution'], + }, + }); +}); + +test.serial('upgrade agoricNames', async t => { + await evalBundles(AGORIC_NAMES_UPGRADE_DIR); + + const incarnation = await getIncarnation('agoricNames'); + t.is(incarnation, 1, 'incorrect incarnation'); +}); + +test.serial('check all existing values are preserved', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + const agoricNamesChildren = [ + 'brand', + 'installation', + 'instance', + 'issuer', + 'oracleBrand', + 'vbankAsset', + ]; + + const getAgoricNames = () => + Promise.all( + agoricNamesChildren.map(async child => { + const content = await vstorageKit.readLatestHead( + `published.agoricNames.${child}`, + ); + return [child, Object.fromEntries(content)]; + }), + ).then(rawAgoricNames => Object.fromEntries(rawAgoricNames)); + + const agoricNamesBefore = await getAgoricNames(); + console.log('AGORIC_NAMES_BEFORE', agoricNamesBefore); + + await evalBundles(WRITE_AGORIC_NAMES_DIR); + + const agoricNamesAfter = await getAgoricNames(); + t.like(agoricNamesAfter, agoricNamesBefore); + + agoricNamesChildren.forEach(child => + assert( + agoricNamesAfter[child][`test${child}`], + 'we should be able to add new value', + ), + ); +}); + +test.serial('check testInfo still works', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + await evalBundles(WRITE_TEST_INFO_DIR); + + const testInfo = await vstorageKit.readLatestHead( + 'published.agoricNames.testInfo', + ); + t.deepEqual(Object.fromEntries(testInfo), { + agoric: { + isAwesome: 'yes', + tech: ['HardenedJs', 'Orchestration', 'Async_Execution'], + }, + ethereum: { + isAwesome: 'yes', + tech: ['Solidity', 'EVM'], + }, + }); +}); + +test.serial('check contracts depend on agoricNames are not broken', async t => { + await evalBundles(ADD_USD_OLIVES_DIR); + await evalBundles(DEPOSIT_USD_OLIVES_DIR); + + const psmSwapIo = { + now: Date.now, + follow: agoric.follow, + setTimeout, + log: console.log, + }; + + const balancesBefore = await getBalances([GOV1ADDR]); + + await psmSwap( + GOV1ADDR, + ['swap', '--pair', 'IST.USD_OLIVES', '--wantMinted', 1], + psmSwapIo, + ); + + const balancesAfter = await getBalances([GOV1ADDR]); + await tryISTBalances( + t, + extractBalance(balancesAfter, 'uist'), + extractBalance(balancesBefore, 'uist') + 1000000, // in uist + ); +}); + +test.serial('open a vault', async t => { + await bankSend(GOV1ADDR, `200000000000000000${ATOM_DENOM}`); + const istBalanceBefore = await getBalances([GOV1ADDR]); + const activeVaultsBefore = await listVaults(GOV1ADDR, walletUtils); + + const mint = '5.0'; + const collateral = '10.0'; + await openVault(GOV1ADDR, mint, collateral); + + const istBalanceAfter = await getBalances([GOV1ADDR]); + const activeVaultsAfter = await listVaults(GOV1ADDR, walletUtils); + + await tryISTBalances( + t, + extractBalance(istBalanceAfter, 'uist'), + extractBalance(istBalanceBefore, 'uist') + 5000000, + ); + + t.is( + activeVaultsAfter.length, + activeVaultsBefore.length + 1, + `The number of active vaults should increase after opening a new vault.`, + ); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json new file mode 100644 index 00000000000..d5f34fdb422 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json @@ -0,0 +1,7 @@ +{ + "consume": { + "contractKits": true, + "namesByAddressAdmin": true, + "agoricNames": true + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js new file mode 100644 index 00000000000..c7ebcf75281 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js @@ -0,0 +1,52 @@ +// @ts-nocheck +/* eslint-disable no-undef */ +const GOV_ONE_ADDR = 'agoric1ee9hr0jyrxhy999y755mp862ljgycmwyp4pl7q'; + +const depositUsdOlives = async powers => { + const { + consume: { + contractKits: contractKitsP, + namesByAddressAdmin: namesByAddressAdminP, + agoricNames, + }, + } = powers; + + const namesByAddressAdmin = await namesByAddressAdminP; + + const getDepositFacet = async address => { + const hub = E(E(namesByAddressAdmin).lookupAdmin(address)).readonly(); + return E(hub).lookup('depositFacet'); + }; + + const [contractKits, usdOlivesIssuer, usdOlivesBrand, ppDepositFacet] = + await Promise.all([ + contractKitsP, + E(agoricNames).lookup('issuer', 'USD_OLIVES'), + E(agoricNames).lookup('brand', 'USD_OLIVES'), + getDepositFacet(GOV_ONE_ADDR), + ]); + + console.log('[CONTRACT_KITS]', contractKits); + console.log('[ISSUER]', usdOlivesIssuer); + + let usdOlivesMint; + for (const { publicFacet, creatorFacet: mint } of contractKits.values()) { + if (publicFacet === usdOlivesIssuer) { + usdOlivesMint = mint; + console.log('BINGO', mint); + break; + } + } + + console.log('Minting USD_OLIVES'); + const helloPayment = await E(usdOlivesMint).mintPayment( + harden({ brand: usdOlivesBrand, value: 1_000_000n }), + ); + + console.log('Funding provision pool...'); + await E(ppDepositFacet).receive(helloPayment); + + console.log('Done.'); +}; + +depositUsdOlives; diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json new file mode 100644 index 00000000000..7204f88ad23 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json @@ -0,0 +1,5 @@ +{ + "consume": { + "agoricNamesAdmin": true + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js new file mode 100644 index 00000000000..89b37f95cca --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js @@ -0,0 +1,30 @@ +// @ts-nocheck +/* eslint-disable no-undef */ +const writeToAgoricNames = async powers => { + const { + consume: { agoricNamesAdmin }, + } = powers; + + console.log('writing to agoricNames...'); + const agoricNamesChildren = [ + 'brand', + 'installation', + 'instance', + 'issuer', + 'oracleBrand', + 'vbankAsset', + ]; + + await Promise.all( + agoricNamesChildren.map(async (child, index) => + E(E(agoricNamesAdmin).lookupAdmin(child)).update( + `test${child}`, + Far(`test${child}`, { getBoardId: () => `board${index}` }), + ), + ), + ); + + console.log('DONE'); +}; + +writeToAgoricNames; diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json new file mode 100644 index 00000000000..7204f88ad23 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json @@ -0,0 +1,5 @@ +{ + "consume": { + "agoricNamesAdmin": true + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js new file mode 100644 index 00000000000..a155259902b --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js @@ -0,0 +1,18 @@ +// @ts-nocheck +/* eslint-disable no-undef */ +const writeToTestInfo = async powers => { + const { + consume: { agoricNamesAdmin }, + } = powers; + + console.log('writing to testInfo...'); + + E(E(agoricNamesAdmin).lookupAdmin('testInfo')).update('ethereum', { + isAwesome: 'yes', + tech: ['Solidity', 'EVM'], + }); + + console.log('DONE'); +}; + +writeToTestInfo; diff --git a/a3p-integration/proposals/p:upgrade-19/assetReserve.test.js b/a3p-integration/proposals/p:upgrade-19/assetReserve.test.js new file mode 100644 index 00000000000..a3bda12bde3 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/assetReserve.test.js @@ -0,0 +1,92 @@ +/* eslint-env node */ +/** + * @file The goal of this file is to make sure v36-reserve upgraded. + * + * The test scenario is as follows; + * 1. Add asset USD_LEMONS + * 2. Add collateral to the reserve + * 3. Upgrade reserve + * 4. Ensure that the collateral is still in the reserve + */ + +import '@endo/init'; +import test from 'ava'; +import { + evalBundles, + agd as agdAmbient, + agoric, + getDetailsMatchingVats, +} from '@agoric/synthetic-chain'; +import { + makeVstorageKit, + waitUntilContractDeployed, +} from '@agoric/client-utils'; + +const ADD_PSM_DIR = 'addUsdLemons'; +const UPGRADE_AR_DIR = 'upgradeAssetReserve'; +const ADD_COLLATERAL = 'addCollateral'; + +const ambientAuthority = { + query: agdAmbient.query, + follow: agoric.follow, + setTimeout, + log: console.log, +}; + +/** + * @typedef {import('@agoric/ertp').NatAmount} NatAmount + * @typedef {{ + * allocations: { Fee: NatAmount, USD_LEMONS: NatAmount }, + * }} ReserveAllocations + */ + +test.before(async t => { + const vstorageKit = await makeVstorageKit( + { fetch }, + { rpcAddrs: ['http://localhost:26657'], chainName: 'agoriclocal' }, + ); + + t.context = { + vstorageKit, + }; +}); + +test.serial('add collatoral to reserve', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + // Introduce USD_LEMONS + await evalBundles(ADD_PSM_DIR); + await waitUntilContractDeployed('psm-IST-USD_LEMONS', ambientAuthority, { + errorMessage: 'psm-IST-USD_LEMONS instance not observed.', + }); + + await evalBundles(ADD_COLLATERAL); + + const metrics = /** @type {ReserveAllocations} */ ( + await vstorageKit.readLatestHead('published.reserve.metrics') + ); + + t.truthy(Object.keys(metrics.allocations).includes('USD_LEMONS')); + t.is(metrics.allocations.USD_LEMONS.value, 500000n); +}); + +test.serial('upgrade', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + await evalBundles(UPGRADE_AR_DIR); + + const vatDetailsAfter = await getDetailsMatchingVats('reserve'); + const { incarnation } = vatDetailsAfter.find(vat => vat.vatID === 'v36'); // assetReserve is v36 + + t.log(vatDetailsAfter); + t.is(incarnation, 1, 'incorrect incarnation'); + + const metrics = /** @type {ReserveAllocations} */ ( + await vstorageKit.readLatestHead('published.reserve.metrics') + ); + + t.truthy(Object.keys(metrics.allocations).includes('USD_LEMONS')); + t.is(metrics.allocations.USD_LEMONS.value, 500000n); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons-permit.json b/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons-permit.json new file mode 100644 index 00000000000..0a580519276 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons-permit.json @@ -0,0 +1,8 @@ +{ + "consume": { + "contractKits": true, + "namesByAddressAdmin": true, + "agoricNames": true + } +} + diff --git a/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons.js b/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons.js new file mode 100644 index 00000000000..c7ee0db948f --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/depositUSD-LEMONS/deposit-usd-lemons.js @@ -0,0 +1,52 @@ +// @ts-nocheck +/* eslint-disable no-undef */ +const PROVISIONING_POOL_ADDR = 'agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346'; + +const depositUsdLemons = async powers => { + const { + consume: { + contractKits: contractKitsP, + namesByAddressAdmin: namesByAddressAdminP, + agoricNames, + }, + } = powers; + + const namesByAddressAdmin = await namesByAddressAdminP; + + const getDepositFacet = async address => { + const hub = E(E(namesByAddressAdmin).lookupAdmin(address)).readonly(); + return E(hub).lookup('depositFacet'); + }; + + const [contractKits, usdLemonsIssuer, usdLemonsBrand, ppDepositFacet] = + await Promise.all([ + contractKitsP, + E(agoricNames).lookup('issuer', 'USD_LEMONS'), + E(agoricNames).lookup('brand', 'USD_LEMONS'), + getDepositFacet(PROVISIONING_POOL_ADDR), + ]); + + console.log('[CONTRACT_KITS]', contractKits); + console.log('[ISSUER]', usdLemonsIssuer); + + let usdLemonsMint; + for (const { publicFacet, creatorFacet: mint } of contractKits.values()) { + if (publicFacet === usdLemonsIssuer) { + usdLemonsMint = mint; + console.log('BINGO', mint); + break; + } + } + + console.log('Minting USD_LEMONS'); + const helloPayment = await E(usdLemonsMint).mintPayment( + harden({ brand: usdLemonsBrand, value: 500000n }), + ); + + console.log('Funding provision pool...'); + await E(ppDepositFacet).receive(helloPayment); + + console.log('Done.'); +}; + +depositUsdLemons; diff --git a/a3p-integration/proposals/p:upgrade-19/eval.sh b/a3p-integration/proposals/p:upgrade-19/eval.sh new file mode 100644 index 00000000000..d5a8d48bf87 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/eval.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# evaluate the proposals in the /submission/ directory + +echo "UPGRADE-19 Running proposal declared in package.json" +# copy to run in the proposal package so the dependencies can be resolved +cp /usr/src/upgrade-test-scripts/eval_submission.js . + +echo RUNNING ./eval_submission.js +./eval_submission.js diff --git a/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script-permit.json b/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script-permit.json new file mode 100644 index 00000000000..27ba77ddaf6 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script-permit.json @@ -0,0 +1 @@ +true diff --git a/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script.tjs b/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script.tjs new file mode 100644 index 00000000000..eb1a4815470 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/mint-payment/send-script.tjs @@ -0,0 +1,56 @@ +/* global E */ + +/// +/// + +/** + * The primary purpose of this script is to mint a payment of a certain + * bankAsset and deposit in an user wallet. + * + * The receiverAddress and label placeholders should be replaced with + * the desired address and asset name during the execution of each test case. + * + * See z:acceptance/mintHolder.test.js + * + * @param {BootstrapPowers} powers + */ +const sendBankAsset = async powers => { + const { + consume: { namesByAddress, contractKits: contractKitsP }, + } = powers; + + const receiverAddress = '{{ADDRESS}}'; + const label = '{{LABEL}}'; + const valueStr = '{{VALUE}}'; + const value = BigInt(valueStr) + + console.log(`Start sendBankAsset for ${label}`); + + const contractKits = await contractKitsP; + const mintHolderKit = Array.from(contractKits.values()).filter( + kit => kit.label && kit.label === label, + ); + + const { creatorFacet: mint, publicFacet: issuer } = mintHolderKit[0]; + + /* + * Ensure that publicFacet holds an issuer by verifying that has + * the makeEmptyPurse method. + */ + await E(issuer).makeEmptyPurse() + + const brand = await E(issuer).getBrand(); + const amount = harden({ value, brand }); + const payment = await E(mint).mintPayment(amount); + + const receiverDepositFacet = E(namesByAddress).lookup( + receiverAddress, + 'depositFacet', + ); + + await E(receiverDepositFacet).receive(payment); + + console.log(`Finished sendBankAsset for ${label}`); +}; + +sendBankAsset; diff --git a/a3p-integration/proposals/p:upgrade-19/mintHolder.test.js b/a3p-integration/proposals/p:upgrade-19/mintHolder.test.js new file mode 100644 index 00000000000..32a187bcb25 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/mintHolder.test.js @@ -0,0 +1,28 @@ +/* eslint-env node */ + +import '@endo/init'; +import test from 'ava'; +import { addUser, provisionSmartWallet } from '@agoric/synthetic-chain'; +import { + mintPayment, + getAssetList, + swap, + getPSMChildren, + upgradeMintHolder, +} from './test-lib/mintHolder-helpers.js'; +import { networkConfig } from './test-lib/index.js'; + +test('mintHolder contract is upgraded', async t => { + const receiver = await addUser('receiver'); + await provisionSmartWallet(receiver, `20000000ubld`); + + let assetList = await getAssetList(); + t.log('List of mintHolder vats being upgraded: ', assetList); + await upgradeMintHolder(`upgrade-mintHolder`, assetList); + await mintPayment(t, receiver, assetList, 10); + + const psmLabelList = await getPSMChildren(fetch, networkConfig); + assetList = await getAssetList(psmLabelList); + t.log('List of assets being swapped with IST via PSM: ', assetList); + await swap(t, receiver, assetList, 5); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp-permit.json b/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp-permit.json new file mode 100644 index 00000000000..668a9c7f0d5 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp-permit.json @@ -0,0 +1,7 @@ +{ + "consume": { + "provisionPoolStartResult": true, + "instancePrivateArgs": true, + "economicCommitteeCreatorFacet": true + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp.js b/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp.js new file mode 100644 index 00000000000..be3fdc96b3d --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/nullUpgradePP/null-upgrade-pp.js @@ -0,0 +1,38 @@ +// @ts-nocheck +/* eslint-disable no-undef */ +const nullUpgradePP = async powers => { + const { + consume: { + provisionPoolStartResult: provisionPoolStartResultP, + instancePrivateArgs: instancePrivateArgsP, + economicCommitteeCreatorFacet, + }, + } = powers; + + console.log('awaiting powers'); + const { adminFacet, instance } = await provisionPoolStartResultP; + const instancePrivateArgs = await instancePrivateArgsP; + + console.log('get privateArgs'); + const privateArgs = instancePrivateArgs.get(instance); + const [poolBank, poserInvitation] = await Promise.all([ + privateArgs.poolBank, + E(economicCommitteeCreatorFacet).getPoserInvitation(), + ]); + + console.log('DEBUG', { + adminFacet, + instance, + privateArgs, + poserInvitation, + }); + + await E(adminFacet).restartContract({ + ...privateArgs, + poolBank, + initialPoserInvitation: poserInvitation, + }); + console.log('Done'); +}; + +nullUpgradePP; diff --git a/a3p-integration/proposals/p:upgrade-19/package.json b/a3p-integration/proposals/p:upgrade-19/package.json new file mode 100644 index 00000000000..638d622ecf4 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/package.json @@ -0,0 +1,53 @@ +{ + "agoricProposal": { + "type": "/agoric.swingset.CoreEvalProposal", + "sdk-generate": [ + "testing/replace-feeDistributor-short.js replaceFeeDistributor", + "testing/add-USD-LEMONS.js addUsdLemons", + "vats/upgrade-provisionPool.js upgradeProvisionPool", + "vats/upgrade-asset-reserve.js upgradeAssetReserve", + "vats/upgrade-paRegistry.js", + "vats/upgrade-agoricNames.js agoricNamesCoreEvals/upgradeAgoricNames", + "testing/add-USD-OLIVES.js agoricNamesCoreEvals/addUsdOlives", + "testing/publish-test-info.js agoricNamesCoreEvals/publishTestInfo", + "vats/upgrade-mintHolder.js upgrade-mintHolder A3P_INTEGRATION", + "vats/terminate-governor-instance.js terminate-governor board02963:ATOM-USD_price_feed" + ] + }, + "type": "module", + "license": "Apache-2.0", + "dependencies": { + "@agoric/client-utils": "dev", + "@agoric/ertp": "dev", + "@agoric/internal": "dev", + "@agoric/synthetic-chain": "^0.4.3", + "@agoric/zoe": "dev", + "@endo/errors": "1.2.7", + "@endo/init": "^1.1.5", + "@endo/marshal": "^1.5.4", + "agoric": "dev", + "ava": "^5.3.1", + "better-sqlite3": "^9.6.0", + "execa": "9.1.0" + }, + "ava": { + "concurrency": 1, + "timeout": "2m", + "files": [ + "!submission" + ] + }, + "scripts": { + "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" + }, + "packageManager": "yarn@4.5.3", + "devDependencies": { + "eslint": "^8.57.0", + "npm-run-all": "^4.1.5", + "typescript": "^5.6.3" + }, + "resolutions": { + "protobufjs@npm:^6.8.8": "patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch", + "axios@npm:^1.6.0": "patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch" + } +} diff --git a/a3p-integration/proposals/p:upgrade-19/provisionPool.test.js b/a3p-integration/proposals/p:upgrade-19/provisionPool.test.js new file mode 100644 index 00000000000..12934603921 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/provisionPool.test.js @@ -0,0 +1,186 @@ +/* eslint-env node */ +/** + * @file The goal of this file is to make sure v28-provisionPool and v14-bank can be successfully + * upgraded. These vats are related because of the issues below; + * - https://github.com/Agoric/agoric-sdk/issues/8722 + * - https://github.com/Agoric/agoric-sdk/issues/8724 + * + * The test scenario is as follows; + * 1. Upgrade provisionPool. This upgrade overrides provisionWalletBridgerManager with a durable one + * 2. Add a new account and successfully provision it + * - Observe new account's address under `published.wallet.${address}` + * 3. Send some USDC_axl to provisionPoolAddress and observe its IST balances increases accordingly + * 4. Introduce a new asset to the chain and start a PSM instance for the new asset + * 4a. Deposit some of that asset to provisionPoolAddress + * 4b. Observe provisionPoolAddress' IST balance increase by the amount deposited in step 4a + * 5. Perform a null upgrade for provisionPool. This upgrade does NOT override provisionWalletBridgerManager + * - The goal here is to allow testing the bridgeHandler from the first upgrade is in fact durable + * 6. Auto provision + * 6a. Introduce a new account + * 6b. Fund it with IST and ATOM to be able to open a vault + * 6c. Try to open a vault WITHOUT provisioning the newly introduced account + * 6d. Observe the new account's address under `published.wallet` + * 7. Same as step 2. Checks manual provision works after null upgrade + */ + +import '@endo/init'; +import test from 'ava'; +import { + addUser, + evalBundles, + agd as agdAmbient, + agoric, + getISTBalance, + getDetailsMatchingVats, + GOV1ADDR, + openVault, + ATOM_DENOM, +} from '@agoric/synthetic-chain'; +import { + makeVstorageKit, + waitUntilAccountFunded, + waitUntilContractDeployed, +} from '@agoric/client-utils'; +import { NonNullish } from '@agoric/internal'; +import { + bankSend, + checkUserProvisioned, + introduceAndProvision, + provision, +} from './test-lib/provision-helpers.js'; + +const PROVISIONING_POOL_ADDR = 'agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346'; + +const ADD_PSM_DIR = 'addUsdLemons'; +const DEPOSIT_USD_LEMONS_DIR = 'depositUSD-LEMONS'; +const UPGRADE_PP_DIR = 'upgradeProvisionPool'; +const NULL_UPGRADE_PP_DIR = 'nullUpgradePP'; + +const USDC_DENOM = NonNullish(process.env.USDC_DENOM); + +const ambientAuthority = { + query: agdAmbient.query, + follow: agoric.follow, + setTimeout, + log: console.log, +}; + +test.before(async t => { + const vstorageKit = await makeVstorageKit( + { fetch }, + { rpcAddrs: ['http://localhost:26657'], chainName: 'agoriclocal' }, + ); + + t.context = { + vstorageKit, + }; +}); + +test.serial('upgrade provisionPool', async t => { + await evalBundles(UPGRADE_PP_DIR); + + const vatDetailsAfter = await getDetailsMatchingVats('provisionPool'); + const { incarnation } = vatDetailsAfter.find(vat => + vat.vatName.endsWith('provisionPool'), + ); + + t.log(vatDetailsAfter); + t.is(incarnation, 1, 'incorrect incarnation'); + t.pass(); +}); + +test.serial( + `check provisionPool can recover purse and asset subscribers after upgrade`, + async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + // Introduce new user then provision + const { address } = await introduceAndProvision('provisionTester'); + await checkUserProvisioned(address, vstorageKit); + + // Send USDC_axl to pp + const istBalanceBefore = await getISTBalance(PROVISIONING_POOL_ADDR); + await bankSend(PROVISIONING_POOL_ADDR, `500000${USDC_DENOM}`); + + // Check IST balance + await waitUntilAccountFunded( + PROVISIONING_POOL_ADDR, + ambientAuthority, + { denom: 'uist', value: istBalanceBefore + 500000 }, + { errorMessage: 'Provision pool not able to swap USDC_axl for IST.' }, + ); + + // Introduce USD_LEMONS + await evalBundles(ADD_PSM_DIR); + await waitUntilContractDeployed('psm-IST-USD_LEMONS', ambientAuthority, { + errorMessage: 'psm-IST-USD_LEMONS instance not observed.', + }); + + // Provision the provisionPoolAddress. This is a workaround of provisionPoolAddress + // not having a depositFacet published to namesByAddress. Shouldn't be a problem since + // vat-bank keeps track of virtual purses per address basis. We need there to be + // depositFacet for provisionPoolAddress since we'll fund it with USD_LEMONS + await provision('provisionPoolAddress', PROVISIONING_POOL_ADDR); + await checkUserProvisioned(PROVISIONING_POOL_ADDR, vstorageKit); + + // Send USD_LEMONS to provisionPoolAddress + const istBalanceBeforeLemonsSent = await getISTBalance( + PROVISIONING_POOL_ADDR, + ); + await evalBundles(DEPOSIT_USD_LEMONS_DIR); + + // Check balance again + await waitUntilAccountFunded( + PROVISIONING_POOL_ADDR, + ambientAuthority, + { denom: 'uist', value: istBalanceBeforeLemonsSent + 500000 }, + { errorMessage: 'Provision pool not able to swap USDC_axl for IST.' }, + ); + t.pass(); + }, +); + +test.serial('null upgrade', async t => { + await evalBundles(NULL_UPGRADE_PP_DIR); + + const vatDetailsAfter = await getDetailsMatchingVats('provisionPool'); + const { incarnation } = vatDetailsAfter.find(vat => vat.vatID === 'v28'); // provisionPool is v28 + + t.log(vatDetailsAfter); + t.is(incarnation, 2, 'incorrect incarnation'); + t.pass(); +}); + +test.serial('auto provision', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + const address = await addUser('automaticallyProvisioned'); + console.log('ADDR', 'automaticallyProvisioned', address); + + await bankSend(address, `50000000${ATOM_DENOM}`); + // some ist is needed for opening a new vault + await bankSend(address, `10000000uist`, GOV1ADDR); + await waitUntilAccountFunded( + address, + // TODO: drop agd.query and switch to vstorgeKit + { log: console.log, setTimeout, query: agdAmbient.query }, + { denom: ATOM_DENOM, value: 50_000_000 }, + { errorMessage: `not able to fund ${address}` }, + ); + + await openVault(address, '10.0', '20.0'); + await checkUserProvisioned(address, vstorageKit); + t.pass(); +}); + +test.serial('manual provision', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + const { address } = await introduceAndProvision('manuallyProvisioned'); + await checkUserProvisioned(address, vstorageKit); + t.log('manuallyProvisioned address:', address); + t.pass(); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/registry.test.js b/a3p-integration/proposals/p:upgrade-19/registry.test.js new file mode 100644 index 00000000000..a0d4adb84ed --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/registry.test.js @@ -0,0 +1,20 @@ +// @ts-check +import test from 'ava'; +import '@endo/init/debug.js'; + +import { + getDetailsMatchingVats, + getIncarnation, +} from '@agoric/synthetic-chain'; + +/** + * @file + * A test of upgrading vat-priceAuthority, which is planned to ship in Upgrade 9 + */ + +test('priceAuthorityRegistry upgrade', async t => { + t.is(await getIncarnation('priceAuthority'), 1); + + const priceAuthorityVats = await getDetailsMatchingVats('priceAuthority'); + t.is(priceAuthorityVats.length, 1); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/replaceFeeDistributor.test.js b/a3p-integration/proposals/p:upgrade-19/replaceFeeDistributor.test.js new file mode 100644 index 00000000000..68dc70ad6b4 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/replaceFeeDistributor.test.js @@ -0,0 +1,175 @@ +/* eslint-env node */ +// @ts-check + +/** + * @file The goal of this file is to test the new feeDistributor replacing the old one. + * For a test scenario break down, see https://github.com/Agoric/agoric-sdk/issues/10393#issuecomment-2462481737. + * + * As an improvement to test design explained above, we want to eliminate a scenario like this; + * - calling stop() on the old feeDistributor somehow does not prevent it from collecting fees + * - right after we produce a fee, the old feeDistributor's collection interval waker gets triggered + * - increase in the reserve's allocation is coming from the old feeDistributor + * + * Since we know the new feeDistributor's collection interval is much shorter than the old one, + * seeing consistent increases of the reserve's fee allocations makes sure the fees are coming from the newInstance. + * So we open multiple vaults (see config.vaultCount) and observe reserve's allocations increase in an interval + * that matches the new feeDistributor's collectionInterval. + */ + +import '@endo/init/debug.js'; +import test from 'ava'; +import { + retryUntilCondition, + makeVstorageKit, + sleep, +} from '@agoric/client-utils'; +import { + ATOM_DENOM, + bankSend, + evalBundles, + openVault, + USER1ADDR, +} from '@agoric/synthetic-chain'; +import { AmountMath } from '@agoric/ertp'; +import { floorMultiplyBy } from '@agoric/zoe/src/contractSupport/ratio.js'; + +// TODO @import {Ratio} from '@agoric/zoe' +/** @typedef {any} Ratio */ + +/** + * @typedef {import('@agoric/client-utils').VstorageKit} VstorageKit + * @typedef {import('@agoric/ertp').NatAmount} NatAmount + * @typedef {{ + * allocations: { Fee: NatAmount} + * }} ReserveAllocations + * @typedef {{ + * current: { + * MintFee: { value: Ratio } + * } + * }} ManagerMetricsMintFee + */ + +const config = { + coreEvalDir: 'replaceFeeDistributor', + mintValue: '100.0', + collateralValue: '200.0', + managerIndex: 0, + vaultOwner: { + address: USER1ADDR, + initialCollateralValue: `2000000000${ATOM_DENOM}`, + }, + vaultCount: 3, + retryOptions: { + maxRetries: 5, + retryIntervalMs: 10000, // 10 seconds + }, + networkConfig: { + rpcAddrs: ['http://0.0.0.0:26657'], + chainName: 'agoriclocal', + }, + collectionInterval: 30000, // 30 seconds +}; + +const scale6 = mintValue => BigInt(parseInt(mintValue, 10) * 1_000_000); + +/** + * @param {VstorageKit} vstorage + * @param {NatAmount} feeAmount + */ +const produceFeesAndWait = async (vstorage, feeAmount) => { + const { + mintValue, + collateralValue, + vaultOwner: { address }, + } = config; + const metricsBefore = /** @type {ReserveAllocations} */ ( + await vstorage.readLatestHead('published.reserve.metrics') + ); + // XXX Probably better to not rely on synthetic-chain for opening a vault as per https://github.com/Agoric/agoric-sdk/pull/10396. + // But to make the switch also requires either copying z:acceptance/test-lib here (which is not wanted) or creating a root level + // lib and link it here which requires an all around work across all proposals. Probably a better idea to do it as a separate work. + // I am leaning towards second option so leaving a note here to change this to something similar like + // https://github.com/Agoric/agoric-sdk/blob/3b799b8302ba75327a825515c82d954a1f78103c/a3p-integration/proposals/z%3Aacceptance/vaults.test.js#L40-L69 + await openVault(address, mintValue, collateralValue); + + await retryUntilCondition( + () => vstorage.readLatestHead('published.reserve.metrics'), + metrics => + AmountMath.isEqual( + metrics.allocations.Fee, + AmountMath.add(metricsBefore.allocations.Fee, feeAmount), + ), + 'Fee not received', + { log: console.log, setTimeout, ...config.retryOptions }, + ); +}; + +/** + * @param {number} iteration + */ +function* asyncGenerator(iteration) { + let i = 0; + while (i < iteration) { + i += 1; + yield i; + } +} + +/** + * @param {number} managerIndex + * @param {VstorageKit} vstorage + * @param {bigint} mintValue + * @param {(value: bigint, keyword: string) => NatAmount} toAmount + */ +const calculateFee = async (managerIndex, vstorage, mintValue, toAmount) => { + const path = `published.vaultFactory.managers.manager${managerIndex}.governance`; + + const { + current: { + MintFee: { value: feeRatio }, + }, + } = /** @type {ManagerMetricsMintFee} */ ( + await vstorage.readLatestHead(path) + ); + const feeAmount = floorMultiplyBy(toAmount(mintValue, 'IST'), feeRatio); + return feeAmount; +}; + +test.before(async t => { + await bankSend( + config.vaultOwner.address, + config.vaultOwner.initialCollateralValue, + ); + const vstorage = await makeVstorageKit({ fetch }, config.networkConfig); + const toAmount = (value, brandKeyword) => + // @ts-expect-error casting + AmountMath.make(vstorage.agoricNames.brand[brandKeyword], value); + + t.context = { + vstorage, + toAmount, + }; +}); + +test('replace feeDistributor', async t => { + // @ts-expect-error type + const { vstorage, toAmount } = t.context; + const { collectionInterval, vaultCount, coreEvalDir } = config; + + await evalBundles(coreEvalDir); + // Wait for a round to give the new feeDistributor time to clear out outstanding fees, if any. + await sleep(collectionInterval + 5000, { log: console.log, setTimeout }); + + const feeAmount = await calculateFee( + config.managerIndex, + vstorage, + scale6(config.mintValue), + toAmount, + ); + + for await (const i of asyncGenerator(vaultCount)) { + console.log('----- Starting sequence -----', i); + await produceFeesAndWait(vstorage, feeAmount); + } + t.pass(); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/terminateGovernor.test.js b/a3p-integration/proposals/p:upgrade-19/terminateGovernor.test.js new file mode 100644 index 00000000000..b5f29159b7d --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/terminateGovernor.test.js @@ -0,0 +1,33 @@ +/* eslint-env node */ + +import test from 'ava'; +import '@endo/init/debug.js'; + +import { retryUntilCondition } from '@agoric/client-utils'; +import { evalBundles } from '@agoric/synthetic-chain'; +import { getDetailsMatchingVats } from './vatDetails.js'; + +test('verify governor termination', async t => { + const getVats = () => + getDetailsMatchingVats('-ATOM-USD_price_feed-governor', true); + const vatIsAlive = vat => !vat.terminated; + + const initialVats = await getVats(); + t.log('initial instances', initialVats); + + const initialLiveVats = initialVats.filter(vatIsAlive); + t.true(initialLiveVats.length > 0); + + await evalBundles('terminate-governor'); + const checkForTermination = vats => { + t.log(vats); + return vats.filter(vatIsAlive).length < initialLiveVats.length; + }; + await retryUntilCondition( + getVats, + checkForTermination, + 'ATOM-USD price feed governor termination', + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); + t.pass(); +}); diff --git a/a3p-integration/proposals/p:upgrade-19/test-lib/index.js b/a3p-integration/proposals/p:upgrade-19/test-lib/index.js new file mode 100644 index 00000000000..e726672b3c1 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test-lib/index.js @@ -0,0 +1,20 @@ +/* eslint-env node */ +import { makeWalletUtils } from '@agoric/client-utils'; + +export const networkConfig = { + rpcAddrs: ['http://0.0.0.0:26657'], + chainName: 'agoriclocal', +}; + +/** + * Resolve after a delay in milliseconds. + * + * @param {number} ms + * @returns {Promise} + */ +const delay = ms => new Promise(resolve => setTimeout(() => resolve(), ms)); + +export const walletUtils = await makeWalletUtils( + { delay, fetch }, + networkConfig, +); diff --git a/a3p-integration/proposals/p:upgrade-19/test-lib/mintHolder-helpers.js b/a3p-integration/proposals/p:upgrade-19/test-lib/mintHolder-helpers.js new file mode 100644 index 00000000000..9639fd98662 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test-lib/mintHolder-helpers.js @@ -0,0 +1,162 @@ +/* eslint-env node */ + +import { + agoric, + evalBundles, + getDetailsMatchingVats, + getISTBalance, +} from '@agoric/synthetic-chain'; +import { makeVstorageKit, retryUntilCondition } from '@agoric/client-utils'; +import { readFile, writeFile } from 'node:fs/promises'; +import { psmSwap, snapshotAgoricNames } from './psm-lib.js'; + +/** + * @param {string} fileName base file name without .tjs extension + * @param {Record} replacements + */ +export const replaceTemplateValuesInFile = async (fileName, replacements) => { + let script = await readFile(`${fileName}.tjs`, 'utf-8'); + for (const [template, value] of Object.entries(replacements)) { + script = script.replaceAll(`{{${template}}}`, value); + } + await writeFile(`${fileName}.js`, script); +}; + +export const getPSMChildren = async (fetch, networkConfig) => { + const { + vstorage: { keys }, + } = await makeVstorageKit({ fetch }, networkConfig); + + const children = await keys('published.psm.IST'); + + return children; +}; + +export const getAssetList = async labelList => { + const assetList = []; + const { vbankAssets } = await snapshotAgoricNames(); + + // Determine the assets to consider based on labelList + const assetsToConsider = + labelList || Object.values(vbankAssets).map(asset => asset.issuerName); + + for (const label of assetsToConsider) { + if (label === 'IST') { + break; + } + + const vbankAsset = Object.values(vbankAssets).find( + asset => asset.issuerName === label, + ); + assert(vbankAsset, `vbankAsset not found for ${label}`); + + const { denom } = vbankAsset; + const mintHolderVat = `zcf-mintHolder-${label}`; + + assetList.push({ label, denom, mintHolderVat }); + } + + return assetList; +}; + +export const mintPayment = async (t, address, assetList, value) => { + const SUBMISSION_DIR = 'mint-payment'; + + for (const asset of assetList) { + const { label, denom } = asset; + const scaled = BigInt(parseInt(value, 10) * 1_000_000).toString(); + + await replaceTemplateValuesInFile(`${SUBMISSION_DIR}/send-script`, { + ADDRESS: address, + LABEL: label, + VALUE: scaled, + }); + + await evalBundles(SUBMISSION_DIR); + + const balance = await getISTBalance(address, denom); + + // Add to value the BLD provisioned to smart wallet + if (label === 'BLD') { + value += 10; + } + + t.is( + balance, + value, + `receiver ${denom} balance ${balance} is not ${value}`, + ); + } +}; + +export const swap = async (t, address, assetList, want) => { + for (const asset of assetList) { + const { label, denom } = asset; + + // TODO: remove condition after fixing issue #10655 + if (/^DAI/.test(label)) { + break; + } + + const pair = `IST.${label}`; + + const istBalanceBefore = await getISTBalance(address, 'uist'); + const anchorBalanceBefore = await getISTBalance(address, denom); + + const psmSwapIo = { + now: Date.now, + follow: agoric.follow, + setTimeout, + log: console.log, + }; + + await psmSwap( + address, + ['swap', '--pair', pair, '--wantMinted', want], + psmSwapIo, + ); + + const istBalanceAfter = await getISTBalance(address, 'uist'); + const anchorBalanceAfter = await getISTBalance(address, denom); + + t.is(istBalanceAfter, istBalanceBefore + want); + t.is(anchorBalanceAfter, anchorBalanceBefore - want); + } +}; + +const getIncarnationForAllVats = async assetList => { + const vatsIncarnation = {}; + + for (const asset of assetList) { + const { label, mintHolderVat } = asset; + const matchingVats = await getDetailsMatchingVats(label); + const expectedVat = matchingVats.find(vat => vat.vatName === mintHolderVat); + vatsIncarnation[label] = expectedVat.incarnation; + } + assert(Object.keys(vatsIncarnation).length === assetList.length); + + return vatsIncarnation; +}; + +const checkVatsUpgraded = (before, current) => { + for (const vatLabel in before) { + if (current[vatLabel] !== before[vatLabel] + 1) { + console.log(`${vatLabel} upgrade failed. `); + return false; + } + } + return true; +}; + +export const upgradeMintHolder = async (submissionPath, assetList) => { + const before = await getIncarnationForAllVats(assetList); + + await evalBundles(submissionPath); + + return retryUntilCondition( + async () => getIncarnationForAllVats(assetList), + current => checkVatsUpgraded(before, current), + `mintHolder upgrade not processed yet`, + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); +}; diff --git a/a3p-integration/proposals/p:upgrade-19/test-lib/provision-helpers.js b/a3p-integration/proposals/p:upgrade-19/test-lib/provision-helpers.js new file mode 100644 index 00000000000..1a8eabee12c --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test-lib/provision-helpers.js @@ -0,0 +1,56 @@ +/* eslint-env node */ +import { retryUntilCondition } from '@agoric/client-utils'; +import { + addUser, + CHAINID, + makeAgd, + VALIDATORADDR, +} from '@agoric/synthetic-chain'; +import { execFileSync } from 'node:child_process'; + +const agd = makeAgd({ execFileSync }).withOpts({ keyringBackend: 'test' }); + +/** + * @param {string} addr + * @param {string} wanted + * @param {string} [from] + */ +export const bankSend = (addr, wanted, from = VALIDATORADDR) => { + return agd.tx(['bank', 'send', from, addr, wanted], { + chainId: CHAINID, + from, + yes: true, + }); +}; + +export const provision = (name, address) => + agd.tx(['swingset', 'provision-one', name, address, 'SMART_WALLET'], { + chainId: 'agoriclocal', + from: 'validator', + yes: true, + }); + +export const introduceAndProvision = async name => { + const address = await addUser(name); + console.log('ADDR', name, address); + + const provisionP = provision(name, address); + + return { provisionP, address }; +}; + +/** + * @param {import('@agoric/client-utils').VstorageKit} vstorageKit + */ +export const getProvisionedAddresses = async vstorageKit => { + const children = await vstorageKit.vstorage.keys('published.wallet'); + return children; +}; + +export const checkUserProvisioned = (addr, vstorageKit) => + retryUntilCondition( + () => getProvisionedAddresses(vstorageKit), + children => children.includes(addr), + 'Account not provisioned', + { maxRetries: 5, retryIntervalMs: 1000, log: console.log, setTimeout }, + ); diff --git a/a3p-integration/proposals/p:upgrade-19/test-lib/psm-lib.js b/a3p-integration/proposals/p:upgrade-19/test-lib/psm-lib.js new file mode 100644 index 00000000000..f98f5f6508c --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test-lib/psm-lib.js @@ -0,0 +1,312 @@ +/* eslint-env node */ +// from z:acceptance/test-lib/psm-lib.js + +import { execa } from 'execa'; +import { getNetworkConfig } from 'agoric/src/helpers.js'; +import { + waitUntilOfferResult, + makeFromBoard, + boardSlottingMarshaller, +} from '@agoric/client-utils'; +import { deepMapObject } from '@agoric/internal'; +import { + agd, + agoric, + agopsLocation, + CHAINID, + executeCommand, + VALIDATORADDR, +} from '@agoric/synthetic-chain'; + +/** @import {Result as ExecaResult, ExecaError} from 'execa'; */ +/** + * @typedef {ExecaResult & { all: string } & ( + * | { failed: false } + * | Pick< + * ExecaError & { failed: true }, + * | 'failed' + * | 'shortMessage' + * | 'cause' + * | 'exitCode' + * | 'signal' + * | 'signalDescription' + * > + * )} SendOfferResult + */ + +/** + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * Given either an array of [string, Value] or + * { [labelKey]: string, [valueKey]: Value } entries, or a + * Record object, log a concise representation similar to + * the latter but hiding implementation details of any embedded remotables. + * + * Sample output from any of the following input data: + * - { foo: { brand: FooBrand, value: '42' }, bar: { brand: BarBrand, value: '100' } } + * - [['foo', { brand: FooBrand, value: '42' }], ['bar', { brand: BarBrand, value: '100' }]] + * - [{ label: 'foo', amount: { brand: FooBrand, value: '42' } }, + * { label: 'bar', amount: { brand: BarBrand, value: '100' } }] + * + * $label $shape { + * foo: { + * brand: Object Alleged: Foo brand {}, + * value: '42', + * }, + * bar: { + * brand: Object Alleged: Bar brand {}, + * value: '100', + * }, + * } + * + * where $shape is `{ [label]: amount, ... }` for the third kind of input data + * but is otherwise empty. + * @deprecated should be in @agoric/client-utils? + * + * @template [Value=unknown] + * @param {string} label + * @param {Array<[string, Value] | object> | Record} data + * @param {(...args: unknown[]) => void} [log] + * @returns {void} + */ +export const logRecord = (label, data, log = console.log) => { + const entries = Array.isArray(data) ? [...data] : Object.entries(data); + /** @type {[labelKey: PropertyKey, valueKey: PropertyKey] | undefined} */ + let shape; + for (let i = 0; i < entries.length; i += 1) { + let entry = entries[i]; + if (!Array.isArray(entry)) { + // Determine which key of a two-property "entry object" (e.g., + // {denom, amount} or {brand, value} is the label and which is the value + // (which may be of type object or number or bigint or string). + if (!shape) { + const entryKeys = Object.keys(entry); + if (entryKeys.length !== 2) { + throw Error( + `[INTERNAL logRecord] not shaped like a record entry: {${entryKeys}}`, + ); + } + const valueKeyIndex = entryKeys.findIndex( + k => + typeof entry[k] === 'object' || + (entry[k].trim() !== '' && !Number.isNaN(Number(entry[k]))), + ); + if (valueKeyIndex === undefined) { + throw Error( + `[INTERNAL logRecord] no value property: {${entryKeys}}={${Object.values(entry).map(String)}}`, + ); + } + shape = /** @type {[string, string]} */ ( + valueKeyIndex === 1 ? entryKeys : entryKeys.reverse() + ); + } + // Convert the entry object to a [key, value] entry array. + entries[i] = shape.map(k => entry[k]); + entry = entries[i]; + } + // Simplify remotables in the value. + entry[1] = deepMapObject(entry[1], value => { + const tag = + value && typeof value === 'object' && value[Symbol.toStringTag]; + return tag + ? Object.defineProperty({}, Symbol.toStringTag, { + value: tag, + enumerable: false, + }) + : value; + }); + } + log( + label, + shape ? `{ [${String(shape[0])}]: ${String(shape[1])}, ... }` : '', + Object.fromEntries(entries), + ); +}; + +/** + * @typedef {object} PsmMetrics + * @property {import('@agoric/ertp').Amount<'nat'>} anchorPoolBalance + * @property {import('@agoric/ertp').Amount<'nat'>} feePoolBalance + * @property {import('@agoric/ertp').Amount<'nat'>} mintedPoolBalance + * @property {import('@agoric/ertp').Amount<'nat'>} totalAnchorProvided + * @property {import('@agoric/ertp').Amount<'nat'>} totalMintedProvided + */ + +/** + * Import from synthetic-chain once it is updated + * + * @param {string} addr + * @param {string} wanted + * @param {string} [from] + */ +export const bankSend = (addr, wanted, from = VALIDATORADDR) => { + const chain = ['--chain-id', CHAINID]; + const fromArg = ['--from', from]; + const testKeyring = ['--keyring-backend', 'test']; + const noise = [...fromArg, ...chain, ...testKeyring, '--yes']; + + return agd.tx('bank', 'send', from, addr, wanted, ...noise); +}; + +/** + * A variant of {@link sendOfferAgoric} that uses `agd` directly to e.g. + * control gas calculation. + * + * @param {string} address + * @param {Promise} offerPromise + * @returns {Promise} + */ +export const sendOfferAgd = async (address, offerPromise) => { + const offer = await offerPromise; + const networkConfig = await getNetworkConfig({ env: process.env, fetch }); + const { chainName, rpcAddrs } = networkConfig; + const args = /** @type {string[]} */ ( + // @ts-expect-error heterogeneous concat + [].concat( + [`--node=${rpcAddrs[0]}`, `--chain-id=${chainName}`], + [`--keyring-backend=test`, `--from=${address}`], + ['tx', 'swingset', 'wallet-action', '--allow-spend', offer], + '--yes', + '-bblock', + '-ojson', + ) + ); + + const [settlement] = await Promise.allSettled([ + execa('agd', args, { all: true }), + ]); + + // Upon successful exit, verify that the *output* also indicates success. + // cf. https://github.com/Agoric/agoric-sdk/blob/master/packages/agoric-cli/src/lib/wallet.js + if (settlement.status === 'fulfilled') { + const result = settlement.value; + try { + const tx = JSON.parse(result.stdout); + if (tx.code !== 0) { + return { ...result, failed: true, shortMessage: `code ${tx.code}` }; + } + } catch (err) { + return { + ...result, + failed: true, + shortMessage: 'unexpected output', + cause: err, + }; + } + } + + return settlement.status === 'fulfilled' + ? settlement.value + : settlement.reason; +}; + +/** + * @param {string} address + * @param {Array} params + * @param {{ + * follow: (...params: string[]) => Promise; + * sendOffer?: (address: string, offerPromise: Promise) => Promise; + * setTimeout: typeof global.setTimeout; + * now: () => number; + * log: typeof console.log + * }} io + */ +export const psmSwap = async (address, params, io) => { + const { now, sendOffer = sendOfferAgd, ...waitIO } = io; + const offerId = `${address}-psm-swap-${now()}`; + const newParams = ['psm', ...params, '--offerId', offerId]; + const offerPromise = executeCommand(agopsLocation, newParams); + const sendResult = await sendOffer(address, offerPromise); + if (sendResult.failed) { + const { + command, + durationMs, + shortMessage, + cause, + exitCode, + signal, + signalDescription, + all: output, + } = sendResult; + const summary = { + command, + durationMs, + shortMessage, + cause, + exitCode, + signal, + signalDescription, + output, + }; + console.error('psmSwap tx send failed', summary); + throw Error( + `psmSwap tx send failed: ${JSON.stringify({ exitCode, signal, signalDescription })}`, + { cause }, + ); + } + console.log('psmSwap tx send results', sendResult.all); + + await waitUntilOfferResult(address, offerId, true, waitIO, { + errorMessage: `${offerId} not succeeded`, + }); +}; + +/** + * + * @param {Coin[]} balances + * @param {string} targetDenom + */ +export const extractBalance = (balances, targetDenom) => { + const balance = balances.find(({ denom }) => denom === targetDenom); + if (!balance) return 0; + return Number(balance.amount); +}; + +/** + * Checking IST balances can be tricky because of the execution fee mentioned in + * https://github.com/Agoric/agoric-sdk/issues/6525. So we first check for + * equality, but if that fails we recheck against an assumption that a fee of + * the default "minFeeDebit" has been charged. + * + * @param {import('ava').ExecutionContext} t + * @param {number} actualBalance + * @param {number} expectedBalance + */ +export const tryISTBalances = async (t, actualBalance, expectedBalance) => { + const firstTry = await t.try(tt => { + tt.is(actualBalance, expectedBalance); + }); + if (firstTry.passed) { + firstTry.commit(); + return; + } + + firstTry.discard(); + t.log('tryISTBalances assuming no batched IST fee', ...firstTry.errors); + // See golang/cosmos/x/swingset/types/default-params.go + // and `ChargeBeans` in golang/cosmos/x/swingset/keeper/keeper.go. + const minFeeDebit = 200_000; + t.is(actualBalance + minFeeDebit, expectedBalance); +}; + +const fromBoard = makeFromBoard(); +const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); + +/** + * @param {string} path + */ +const objectFromVstorageEntries = async path => { + const rawEntries = await agoric.follow('-lF', `:${path}`, '-o', 'text'); + return Object.fromEntries(marshaller.fromCapData(JSON.parse(rawEntries))); +}; + +export const snapshotAgoricNames = async () => { + const [brands, instances, vbankAssets] = await Promise.all([ + objectFromVstorageEntries('published.agoricNames.brand'), + objectFromVstorageEntries('published.agoricNames.instance'), + objectFromVstorageEntries('published.agoricNames.vbankAsset'), + ]); + return { brands, instances, vbankAssets }; +}; diff --git a/a3p-integration/proposals/p:upgrade-19/test-lib/utils.js b/a3p-integration/proposals/p:upgrade-19/test-lib/utils.js new file mode 100644 index 00000000000..dfcdff13f64 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test-lib/utils.js @@ -0,0 +1,66 @@ +/* eslint-env node */ +import { makeStargateClient, makeVstorageKit } from '@agoric/client-utils'; +import { readFile, writeFile } from 'node:fs/promises'; +import { networkConfig } from './index.js'; + +export const stargateClientP = makeStargateClient(networkConfig, { fetch }); +export const vstorageKitP = makeVstorageKit({ fetch }, networkConfig); + +/** + * @import {WalletUtils} from '@agoric/client-utils'; + * @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js'; + */ + +/** + * @param {string} fileName base file name without .tjs extension + * @param {Record} replacements + */ +export const replaceTemplateValuesInFile = async (fileName, replacements) => { + let script = await readFile(`${fileName}.tjs`, 'utf-8'); + for (const [template, value] of Object.entries(replacements)) { + script = script.replaceAll(`{{${template}}}`, value); + } + await writeFile(`${fileName}.js`, script); +}; + +// FIXME this return type depends on its arguments in surprising ways +/** + * @param {string[]} addresses + * @param {string} [targetDenom] + * @returns {Promise} + */ +export const getBalances = async (addresses, targetDenom = undefined) => { + const client = await stargateClientP; + const balancesList = await Promise.all( + addresses.map(async address => { + const balances = await client.getAllBalances(address); + + if (targetDenom) { + const balance = balances.find(({ denom }) => denom === targetDenom); + return balance ? BigInt(balance.amount) : undefined; + } + + return balances; + }), + ); + + return addresses.length === 1 ? balancesList[0] : balancesList; +}; + +// TODO move this out of testing. To inter-protocol? +// "vaults" is an Inter thing, but vstorage shape is a full chain (client) thing +// Maybe a plugin architecture where the truth is in inter-protocol and the +// client-lib rolls up the exports of many packages? +/** + * @param {string} addr + * @param {WalletUtils} walletUtils + * @returns {Promise} + */ +export const listVaults = async (addr, { getCurrentWalletRecord }) => { + const current = await getCurrentWalletRecord(addr); + const vaultStoragePaths = current.offerToPublicSubscriberPaths.map( + ([_offerId, pathmap]) => pathmap.vault, + ); + + return vaultStoragePaths; +}; diff --git a/a3p-integration/proposals/p:upgrade-19/test.sh b/a3p-integration/proposals/p:upgrade-19/test.sh new file mode 100644 index 00000000000..9b175d8e6e0 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/test.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +yarn ava terminateGovernor.test.js +yarn ava replaceFeeDistributor.test.js +yarn ava mintHolder.test.js +yarn ava provisionPool.test.js + +yarn ava agoricNames.test.js + +yarn ava assetReserve.test.js + +yarn ava registry.test.js diff --git a/a3p-integration/proposals/p:upgrade-19/tsconfig.json b/a3p-integration/proposals/p:upgrade-19/tsconfig.json new file mode 100644 index 00000000000..23a6b14091b --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "noEmit": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "allowJs": true, + "checkJs": true, + "strict": false, + "strictNullChecks": true, + "noImplicitThis": true, + // XXX synthetic-chain has some errors + "skipLibCheck": true + }, + "exclude": [ + "addUsdLemons/", + "replaceFeeDistributor/", + "upgradeProvisionPool/" + ] +} diff --git a/a3p-integration/proposals/p:upgrade-19/vatDetails.js b/a3p-integration/proposals/p:upgrade-19/vatDetails.js new file mode 100644 index 00000000000..9eeafdf5949 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/vatDetails.js @@ -0,0 +1,129 @@ +// Temporary fork of +// https://github.com/Agoric/agoric-3-proposals/blob/main/packages/synthetic-chain/src/lib/vat-status.js +// for deleted vat information. +// See https://github.com/Agoric/agoric-3-proposals/issues/208 +/* eslint-env node */ + +import dbOpenAmbient from 'better-sqlite3'; + +const HOME = process.env.HOME; + +/** @type {(val: T | undefined) => T} */ +export const NonNullish = val => { + if (!val) throw Error('required'); + return val; +}; + +/** + * @file look up vat incarnation from kernel DB + * @see {getIncarnation} + */ + +const swingstorePath = `${HOME}/.agoric/data/agoric/swingstore.sqlite`; + +/** + * SQL short-hand + * + * @param {import('better-sqlite3').Database} db + */ +export const dbTool = db => { + const prepare = (strings, ...params) => { + const dml = strings.join('?'); + return { stmt: db.prepare(dml), params }; + }; + const sql = (strings, ...args) => { + const { stmt, params } = prepare(strings, ...args); + return stmt.all(...params); + }; + sql.get = (strings, ...args) => { + const { stmt, params } = prepare(strings, ...args); + return stmt.get(...params); + }; + return sql; +}; + +/** + * @param {import('better-sqlite3').Database} db + */ +const makeSwingstore = db => { + const sql = dbTool(db); + + /** @param {string} key */ + // @ts-expect-error cast + const kvGet = key => sql.get`select * from kvStore where key = ${key}`.value; + /** @param {string} key */ + const kvGetJSON = key => JSON.parse(kvGet(key)); + + /** @param {string} vatID */ + const lookupVat = vatID => { + return Object.freeze({ + source: () => kvGetJSON(`${vatID}.source`), + options: () => kvGetJSON(`${vatID}.options`), + currentSpan: () => + sql.get`select * from transcriptSpans where isCurrent = 1 and vatID = ${vatID}`, + getTerminated: () => kvGetJSON('vats.terminated').includes(vatID), + }); + }; + + /** + * @param {string} vatName + * @param {boolean} [includeTerminated] + * @returns {string[]} + */ + const findDynamicVatIDs = (vatName, includeTerminated = false) => { + /** @type {string[]} */ + const terminatedVatIDs = kvGetJSON('vats.terminated'); + /** @type {string[]} */ + const allDynamicIDs = kvGetJSON('vat.dynamicIDs'); + const dynamicIDs = includeTerminated + ? allDynamicIDs + : allDynamicIDs.filter(vatID => !terminatedVatIDs.includes(vatID)); + const matchingIDs = dynamicIDs.filter(vatID => + lookupVat(vatID).options().name.includes(vatName), + ); + return matchingIDs; + }; + + return Object.freeze({ + /** + * @param {string} vatName + * @param {boolean} [includeTerminated] + * @returns {string} + */ + findVat: (vatName, includeTerminated = false) => { + /** @type {string[]} */ + const matchingIDs = findDynamicVatIDs(vatName, includeTerminated); + if (matchingIDs.length === 0) throw Error(`vat not found: ${vatName}`); + return matchingIDs[0]; + }, + findVats: findDynamicVatIDs, + lookupVat, + }); +}; + +/** + * @param {string} vatName + * @param {boolean} [includeTerminated] + */ +export const getDetailsMatchingVats = async ( + vatName, + includeTerminated = false, +) => { + const kStore = makeSwingstore( + dbOpenAmbient(swingstorePath, { readonly: true }), + ); + + const vatIDs = kStore.findVats(vatName, includeTerminated); + const infos = []; + for (const vatID of vatIDs) { + const vatInfo = kStore.lookupVat(vatID); + const name = vatInfo.options().name; + const source = vatInfo.source(); + const terminated = includeTerminated && vatInfo.getTerminated(); + // @ts-expect-error cast + const { incarnation } = vatInfo.currentSpan(); + infos.push({ vatName: name, vatID, incarnation, terminated, ...source }); + } + + return infos; +}; diff --git a/a3p-integration/proposals/p:upgrade-19/yarn.lock b/a3p-integration/proposals/p:upgrade-19/yarn.lock new file mode 100644 index 00000000000..29afd5a4438 --- /dev/null +++ b/a3p-integration/proposals/p:upgrade-19/yarn.lock @@ -0,0 +1,7500 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@agoric/access-token@npm:0.4.22-dev-e596a01.0+e596a01": + version: 0.4.22-dev-e596a01.0 + resolution: "@agoric/access-token@npm:0.4.22-dev-e596a01.0" + dependencies: + n-readlines: "npm:^1.0.0" + proper-lockfile: "npm:^4.1.2" + tmp: "npm:^0.2.1" + checksum: 10c0/087a332eb5ed185826b6699d0f22d9f9c92fc86549b5e385d79859f2dffed43d12c1c9ade41050d27dd20b3762d67ce75b9b716cca579b0883bef4a6cae14a9c + languageName: node + linkType: hard + +"@agoric/babel-generator@npm:^7.17.6": + version: 7.17.6 + resolution: "@agoric/babel-generator@npm:7.17.6" + dependencies: + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/59db151ae737bd9b1f21c1589df4c7da9cbf484de5b5cc8352052825c2d977283d975303f55acb54d0210c176cb405da263073ceba1d3a6db65c6e21cc6e663f + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-1dd4589.0+1dd4589": + version: 0.1.1-dev-1dd4589.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-1dd4589.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-1dd4589.0+1dd4589" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/d0c214a7e69b427df1632d1ac10bc97f977823d723e4696ad8cf92a0eb9dd6297142ce4b98ae211c994547c43380c9a6487959a1719f7ee90fb128a00e5ff669 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-3b799b8.0+3b799b8": + version: 0.1.1-dev-3b799b8.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-3b799b8.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@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/5c1b30fed0ecd37d508d156be70ca9a7c529f0fb2493686658d9cb7eb5c0221c3ac53f9a13142c208b8826c2e083c949fb88cefc7fa5bdf6f903e7d3d44b0658 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-c1ae023.0+c1ae023": + version: 0.1.1-dev-c1ae023.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-c1ae023.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/d7c75720d675c5f2fd524d0c597e83957fecee138392b3fc6dfa5610e8f301ccffecc8fbacb6c5a0700e4f5b9f95496029d0eb05320c92e23bbbeaa428ed9f87 + languageName: node + linkType: hard + +"@agoric/base-zone@npm:0.1.1-dev-e596a01.0+e596a01": + version: 0.1.1-dev-e596a01.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-e596a01.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/80d7d03d2d70e42a8544f8ba559324c4a5e7adf808a179d1a3a10f8f12f589d97422999f700542ed3e2935f6219c53890f7334cecf28bdc1d8c1e11f4ce6f0da + languageName: node + linkType: hard + +"@agoric/cache@npm:0.3.3-dev-e596a01.0+e596a01": + version: 0.3.3-dev-e596a01.0 + resolution: "@agoric/cache@npm:0.3.3-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + checksum: 10c0/6ab6482ca14e179873bccc027643d8a3848e74a810e6f70b1a81c89eaec9105588479298daa07a8aba78d85e3d17b4835c3ceccc7333dcc6dba4ba720a00cdad + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-dev-c1ae023.0+c1ae023": + version: 0.4.3-dev-c1ae023.0 + resolution: "@agoric/casting@npm:0.4.3-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@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.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/e4a8985d94ad49b785102f9db08415aaf07052178974dd2007fa0e359c50f83b9fead0934e9f0e7e81090dddde2c0e1b42e6f9b149989ec29e6887d980153dd6 + languageName: node + linkType: hard + +"@agoric/casting@npm:0.4.3-dev-e596a01.0+e596a01": + version: 0.4.3-dev-e596a01.0 + resolution: "@agoric/casting@npm:0.4.3-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@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.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/87b3e726fc872c286e4ab22759542248403ba00aeadf14c969d3579059e7518525b88d5b5ae93546c6722b319c16ffe1a8e633c38f39c67758a188ac3060cb0e + languageName: node + linkType: hard + +"@agoric/client-utils@npm:0.1.1-dev-e596a01.0+e596a01": + version: 0.1.1-dev-e596a01.0 + resolution: "@agoric/client-utils@npm:0.1.1-dev-e596a01.0" + dependencies: + "@agoric/casting": "npm:0.4.3-dev-e596a01.0+e596a01" + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/smart-wallet": "npm:0.5.4-dev-e596a01.0+e596a01" + "@agoric/vats": "npm:0.15.2-dev-e596a01.0+e596a01" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/7ffb8aca467fda3474081eda4749707c9beae2dac589467bf8eca9e0d6b244bf459458b3e9cff3e58149a04ade7684bb2c31e76a3df24f95ba6b65f542ee7af1 + languageName: node + linkType: hard + +"@agoric/client-utils@npm:dev": + version: 0.1.1-dev-c1ae023.0 + resolution: "@agoric/client-utils@npm:0.1.1-dev-c1ae023.0" + dependencies: + "@agoric/casting": "npm:0.4.3-dev-c1ae023.0+c1ae023" + "@agoric/ertp": "npm:0.16.3-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/smart-wallet": "npm:0.5.4-dev-c1ae023.0+c1ae023" + "@agoric/vats": "npm:0.15.2-dev-c1ae023.0+c1ae023" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/be944d730e4b3c5a0f811d999a9a707f90c447ef8a35f5fabf6db104671252c1c549d8c62c297508de40406d8a8965e8650b7cd827271fd9f6cbad2291a2e9ed + languageName: node + linkType: hard + +"@agoric/cosmic-proto@npm:0.4.1-dev-c1ae023.0+c1ae023": + version: 0.4.1-dev-c1ae023.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-c1ae023.0" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + checksum: 10c0/78571d7f2c64df92d7f186ffad8c1e4c31c428495344555dc38ce74fc66397a4ac44f8d121b0929e6bb64a919bd7ecac708d04b4050021d69c68e388a2ea2de7 + languageName: node + linkType: hard + +"@agoric/cosmic-proto@npm:0.4.1-dev-e596a01.0+e596a01": + version: 0.4.1-dev-e596a01.0 + resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-e596a01.0" + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + checksum: 10c0/2048e794ec9a346fb3a618b1b64d54985241967930b8b34c9220316b206fca4d3ecdf738e23e56021d45c3818f4513842e6d4c4d917a537dad59c13651d0ae35 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-3b799b8.0+3b799b8, @agoric/ertp@npm:dev": + version: 0.16.3-dev-3b799b8.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-3b799b8.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-3b799b8.0+3b799b8" + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@agoric/vat-data": "npm:0.5.3-dev-3b799b8.0+3b799b8" + "@agoric/zone": "npm:0.2.3-dev-3b799b8.0+3b799b8" + "@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/929e929bb290c5723cd7f79594a918eecaa73feb326b01c433803a1c5d33ab3518237d16930310fab9ad9f751986ee5eb7025aefd6fbf4556dafa214e0eeecfa + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-c1ae023.0+c1ae023": + version: 0.16.3-dev-c1ae023.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-c1ae023.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/zone": "npm:0.2.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + checksum: 10c0/5a437d6a2b6b418dd016407c2095d7d98415818c422c3c53db217d99b3bbb2e476f5b7e9decbc628b82c8e85d2da939cf3846248eeb5d688b4789b21a1118194 + languageName: node + linkType: hard + +"@agoric/ertp@npm:0.16.3-dev-e596a01.0+e596a01": + version: 0.16.3-dev-e596a01.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-e596a01.0" + dependencies: + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + checksum: 10c0/ab700381bfa907b08984fa7545ddfecf470ca33417d260d3f46a8e6e9f9de3c1eb32bca8f7ca94ef11e5d694c6f847ed7297eed5d48daa40fba236934caefd93 + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-dev-c1ae023.0+c1ae023": + version: 0.10.4-dev-c1ae023.0 + resolution: "@agoric/governance@npm:0.10.4-dev-c1ae023.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/time": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/zoe": "npm:0.26.3-dev-c1ae023.0+c1ae023" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/445a41d4d2f226bbb99ad274d94d9f90cd4b4277db0428cc62046d7fdc508bbac6745859dfc4d16159a7e83629f501aa22a0752b99481a99b76e7d31f628290c + languageName: node + linkType: hard + +"@agoric/governance@npm:0.10.4-dev-e596a01.0+e596a01": + version: 0.10.4-dev-e596a01.0 + resolution: "@agoric/governance@npm:0.10.4-dev-e596a01.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/time": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/zoe": "npm:0.26.3-dev-e596a01.0+e596a01" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + checksum: 10c0/89da3da85ca87524f7bb81322587a44e9cd24aa72d9e83215bad6763ddda308ab639db1c8db4c0164748c4a897732b652b586b21c03ec9e63799cd2ac5eb1478 + languageName: node + linkType: hard + +"@agoric/inter-protocol@npm:0.16.2-dev-e596a01.0+e596a01": + version: 0.16.2-dev-e596a01.0 + resolution: "@agoric/inter-protocol@npm:0.16.2-dev-e596a01.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/governance": "npm:0.10.4-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/time": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/vats": "npm:0.15.2-dev-e596a01.0+e596a01" + "@agoric/zoe": "npm:0.26.3-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + jessie.js: "npm:^0.3.4" + checksum: 10c0/f4b468a93d33330ae41a57b5892eb25f880fd3f44264031a6b42ffd3b2ddf883af9a89a2dd3e647b75ac665512fff88a136b2e80a4f7c355f2d96a4faaa0f891 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-3b799b8.0+3b799b8": + version: 0.3.3-dev-3b799b8.0 + resolution: "@agoric/internal@npm:0.3.3-dev-3b799b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@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/332369a9acb41e46a579c9e0d084a12e16a78ad71f794f10d631235694281580b06ea88e25bf31d9eadc353b9c8d62e561232a21bb4c45f17c41057d0fb4c171 + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-c1ae023.0+c1ae023": + version: 0.3.3-dev-c1ae023.0 + resolution: "@agoric/internal@npm:0.3.3-dev-c1ae023.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/6ef8c160be33be88adefa67a861fb0758d03933a4bcc6f225e3b4e41c592553555fc9d477c1731e9ce86d28e2db49c72053f53188a199ab0f8c81a06423adc2c + languageName: node + linkType: hard + +"@agoric/internal@npm:0.3.3-dev-e596a01.0+e596a01": + version: 0.3.3-dev-e596a01.0 + resolution: "@agoric/internal@npm:0.3.3-dev-e596a01.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-e596a01.0+e596a01" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/4126ce8655136ccf4f4bf7e01bb376bdada84bd1cda9cc6e1cf15971c28601a301d768d3b3fe2d692fe6e56a7b17726a8df0043c507943f8d28980a5b3d704a0 + languageName: node + linkType: hard + +"@agoric/internal@npm:dev": + version: 0.3.3-dev-1dd4589.0 + resolution: "@agoric/internal@npm:0.3.3-dev-1dd4589.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-1dd4589.0+1dd4589" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + checksum: 10c0/eb261f7bde265f168698c9da04af7458e2747fd54e945cdef82b822af5749e8a9443bb827bbace959269a04ae58d33c4ea465c31b580bf8d07b15fa87cb80ca3 + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-dev-3b799b8.0+3b799b8": + version: 0.1.1-dev-3b799b8.0 + resolution: "@agoric/kmarshal@npm:0.1.1-dev-3b799b8.0" + dependencies: + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/marshal": "npm:^1.6.1" + checksum: 10c0/01b132bb95b226235e1f072238e9a77dafec1f866b7413cb39407d682a990c5fb6989cd0685d16ceec1108de682eb979ccb270946e585cdfe46b6353a1e7ec53 + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-dev-c1ae023.0+c1ae023": + version: 0.1.1-dev-c1ae023.0 + resolution: "@agoric/kmarshal@npm:0.1.1-dev-c1ae023.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + checksum: 10c0/5f4c1784fa4fa6de50f288722794ac0c98d0719e3558bc9147b726014a72dc3222a68f4c7f40e42f170e4b59481579a4d318e3cffb665720dafc23c80915ec6b + languageName: node + linkType: hard + +"@agoric/kmarshal@npm:0.1.1-dev-e596a01.0+e596a01": + version: 0.1.1-dev-e596a01.0 + resolution: "@agoric/kmarshal@npm:0.1.1-dev-e596a01.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + checksum: 10c0/065c51515ce0a679c1d884d1d7a62c20effa371b22ea64acab9204f4a7bde8a18ec90d64cf4c6a577f81df77f49aa3b82269ba76e62670217866ad417fa131f9 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-c1ae023.0+c1ae023": + version: 0.1.1-dev-c1ae023.0 + resolution: "@agoric/network@npm:0.1.1-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/93fd60ad6a0ce650427853677be076c77ce00d3201f29ec0922eb5fd38ce5ec2316fb9a564a76d3fae809299ef193e80109b89b79c4191ddb9525e5e4cb33302 + languageName: node + linkType: hard + +"@agoric/network@npm:0.1.1-dev-e596a01.0+e596a01": + version: 0.1.1-dev-e596a01.0 + resolution: "@agoric/network@npm:0.1.1-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/479f46b9c690b1f849bfa4d7af16eb26d84075ca08b9d9aa5779e9665c3af542c9f721e49705ffe6ff16c1a8eb476e8694bd2da74f3f83ecf027061943c11baf + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-3b799b8.0+3b799b8": + version: 0.6.3-dev-3b799b8.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-3b799b8.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/vat-data": "npm:0.5.3-dev-3b799b8.0+3b799b8" + "@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/c2996d72c5c711d19e128cb772cd682c6c510714bfbec61aae68e753976e7d4dbda4852d27f880d21d0e70dfdb8ed90fe8189b9770adf188e8921d25ea756895 + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-c1ae023.0+c1ae023": + version: 0.6.3-dev-c1ae023.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/b810e7c98305e3e398fc1b97fa611c48b6af9a0144a865d357c2e5ac10cb60fc55bd01d87f8165fbc09c009166c7bc3a0513e2b1bf35e0742c0607e0c6579060 + languageName: node + linkType: hard + +"@agoric/notifier@npm:0.6.3-dev-e596a01.0+e596a01": + version: 0.6.3-dev-e596a01.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/7eccc2a40185ce33027bbfe6f10b7118ff19924295b65053e89189ca512e990218b2a3519f87dd19a411c623777c1a22c55ee256f764e86bc4e6fb56ce1e5058 + languageName: node + linkType: hard + +"@agoric/smart-wallet@npm:0.5.4-dev-c1ae023.0+c1ae023": + version: 0.5.4-dev-c1ae023.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-dev-c1ae023.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/vats": "npm:0.15.2-dev-c1ae023.0+c1ae023" + "@agoric/vow": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/zoe": "npm:0.26.3-dev-c1ae023.0+c1ae023" + "@agoric/zone": "npm:0.2.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/94096186933d72b4db40e965adcef8d2e36b4917e6f4e1ca5d103d949c201daeaa16ad4d48ce121aec7048defb6177f75270418f175ae7ba390f169e8e37c380 + languageName: node + linkType: hard + +"@agoric/smart-wallet@npm:0.5.4-dev-e596a01.0+e596a01": + version: 0.5.4-dev-e596a01.0 + resolution: "@agoric/smart-wallet@npm:0.5.4-dev-e596a01.0" + dependencies: + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/vats": "npm:0.15.2-dev-e596a01.0+e596a01" + "@agoric/vow": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/zoe": "npm:0.26.3-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/c970404d201decbfac57e5a6d6b368639e8f52a13fe1a26219975d7b7b4cdf7e5aa17de8a1135003a9b0383bc3507c794e8c09a9c4f39cc3e7da7a78af2f7051 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-1dd4589.0+1dd4589": + version: 0.9.3-dev-1dd4589.0 + resolution: "@agoric/store@npm:0.9.3-dev-1dd4589.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/72d2c3ff3cb0d8b48f06146e4deb0967273e10a86ec7c01e7bc176c5e1ab31d016b909bde1230c8f031ba60552c31ee7d0eccb5791985fc12330fdb6dcda5edb + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-3b799b8.0+3b799b8": + version: 0.9.3-dev-3b799b8.0 + resolution: "@agoric/store@npm:0.9.3-dev-3b799b8.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/21ed501a37c68cf1845a440f8574660a5aeeefb36dcff30227d77663e13888e2b4f5a2b0f805673f597fd48121f3a85c9b4631f2d06b0580fc89059d23db6728 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-c1ae023.0+c1ae023": + version: 0.9.3-dev-c1ae023.0 + resolution: "@agoric/store@npm:0.9.3-dev-c1ae023.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/9fd6d5464906144140a868d38e63d1ee2f8f06240a8ba2e71ed73eb7df5ce9c03a74a79290b4dc2b2e4c3c3d59ba07228f7019965cf234a4178b815f8861f002 + languageName: node + linkType: hard + +"@agoric/store@npm:0.9.3-dev-e596a01.0+e596a01": + version: 0.9.3-dev-e596a01.0 + resolution: "@agoric/store@npm:0.9.3-dev-e596a01.0" + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/b931aa2566d2ef2fea087938c34a79a6682a15f0fc9a5084e73c671d970f22ab3a1040febab4f7f0ae793858597834d76840b1d9c20a89048b725e3b5443b84f + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-dev-3b799b8.0+3b799b8": + version: 0.9.2-dev-3b799b8.0 + resolution: "@agoric/swing-store@npm:0.9.2-dev-3b799b8.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@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/63b759644e65b805e9d723c05ff043e02e94cd3ebd5906fe3238869801b73158f0ccdcf1f129ad37b7fb2ea1740af9ac9e364b96c0c745a74398a43b402f28c6 + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-dev-c1ae023.0+c1ae023": + version: 0.9.2-dev-c1ae023.0 + resolution: "@agoric/swing-store@npm:0.9.2-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/56adf70976c1c7f6f2437045fdd2c10f128b0d79224f83aed842b8b42f2253328d24151817748e2d4bc8c1f70a840d254646423a69496ff25e049bc3909233d5 + languageName: node + linkType: hard + +"@agoric/swing-store@npm:0.9.2-dev-e596a01.0+e596a01": + version: 0.9.2-dev-e596a01.0 + resolution: "@agoric/swing-store@npm:0.9.2-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + better-sqlite3: "npm:^9.1.1" + checksum: 10c0/bcedeb1c71cdb429e4587730b726309f7feb6ef5e81ad58282d0c350fbbdb1a56f889c0163c3dba35142a6feccb0a10dfbadcb3a8a18d7426684faa6cfbaf71c + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-3b799b8.0+3b799b8": + version: 0.10.3-dev-3b799b8.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-3b799b8.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@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/b0295412d66e748c78e4f068389d9c5d8f786d4a63452b21a2f1be5f679a91abc6ad6bf951a2c98edc53104156b019281ef45830f7ca280ffb9e3cb71311e3db + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-c1ae023.0+c1ae023": + version: 0.10.3-dev-c1ae023.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/a44a74766ce6be12d65f7328a544993a07a2b3b74f8f998c48c085a39b38746644005d285cb5d3e6282b1e327e7e809c9cd23e36667da2b7f11926808000b1f0 + languageName: node + linkType: hard + +"@agoric/swingset-liveslots@npm:0.10.3-dev-e596a01.0+e596a01": + version: 0.10.3-dev-e596a01.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/eecefa9afa9f918753770c42029af28652c432ffa60841c1fdd2ec6ec851d0a4b17838e80b95a3650551819e069d9ec0301114064e1e21fb57de1d69dcd5d21d + languageName: node + linkType: hard + +"@agoric/swingset-vat@npm:0.32.3-dev-3b799b8.0+3b799b8": + version: 0.32.3-dev-3b799b8.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-dev-3b799b8.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/kmarshal": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@agoric/swing-store": "npm:0.9.2-dev-3b799b8.0+3b799b8" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-3b799b8.0+3b799b8" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-3b799b8.0+3b799b8" + "@agoric/time": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/vat-data": "npm:0.5.3-dev-3b799b8.0+3b799b8" + "@agoric/xsnap-lockdown": "npm:0.14.1-dev-3b799b8.0+3b799b8" + "@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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/661426721b4106f9e51bc5f86858b166a24b3954429ec8cfe20f3a6650017807c4af12a78b9f64aa549b317356d1a52f44aee9137dde738f74d077d789dad482 + languageName: node + linkType: hard + +"@agoric/swingset-vat@npm:0.32.3-dev-c1ae023.0+c1ae023": + version: 0.32.3-dev-c1ae023.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-dev-c1ae023.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/kmarshal": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/swing-store": "npm:0.9.2-dev-c1ae023.0+c1ae023" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-c1ae023.0+c1ae023" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-c1ae023.0+c1ae023" + "@agoric/time": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/xsnap-lockdown": "npm:0.14.1-dev-c1ae023.0+c1ae023" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" + 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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/66482c449eeccd00167dec73899a5c510719620eba2ad457e77c04790b3573e8e82138e4d362f1b4ee859719278bdb49835df0007318d216ce6e54e67d08ee95 + languageName: node + linkType: hard + +"@agoric/swingset-vat@npm:0.32.3-dev-e596a01.0+e596a01": + version: 0.32.3-dev-e596a01.0 + resolution: "@agoric/swingset-vat@npm:0.32.3-dev-e596a01.0" + dependencies: + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/kmarshal": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/swing-store": "npm:0.9.2-dev-e596a01.0+e596a01" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-e596a01.0+e596a01" + "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-e596a01.0+e596a01" + "@agoric/time": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/xsnap-lockdown": "npm:0.14.1-dev-e596a01.0+e596a01" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" + 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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + checksum: 10c0/bf6b36fb6323cc00dedba73aecbdedcb6ab82555cbe3faf1bf54528bf057a84b4d813f126d8f59622a80d25a7f659a9be2f84524cf90ef93f1c0e8b1eb7f0e3f + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-3b799b8.0+3b799b8": + version: 0.10.3-dev-3b799b8.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-3b799b8.0" + checksum: 10c0/e12813290edb2a338b0b8090f620c8d9957657e305442f987f0706c9c7796ebf2266ade401d7512564be89a75409a0c8997946ff6ebf4a7262c62ae1ac48e0a7 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-c1ae023.0+c1ae023": + version: 0.10.3-dev-c1ae023.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-c1ae023.0" + checksum: 10c0/9f5b3bfe1f76f74f0ab605a67a8c822ba76fd80f7da9a13ee7933425effce76877240b5bd155a677c20740259bab1f0087131784035ef8a85e1278d718450589 + languageName: node + linkType: hard + +"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-e596a01.0+e596a01": + version: 0.10.3-dev-e596a01.0 + resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-e596a01.0" + checksum: 10c0/917599c1a2d332cade944143894643061cdf260f93dc428e26df4f572cb08e4d649981c814545f15ced1ea737332ebc4f9fa1488f0a2d91cd2a647ead15aa05b + languageName: node + linkType: hard + +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" + dependencies: + "@endo/zip": "npm:^1.0.7" + better-sqlite3: "npm:^9.6.0" + chalk: "npm:^5.3.0" + cosmjs-types: "npm:^0.9.0" + execa: "npm:^9.3.1" + bin: + synthetic-chain: dist/cli/cli.js + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-dev-3b799b8.0+3b799b8": + version: 0.3.3-dev-3b799b8.0 + resolution: "@agoric/time@npm:0.3.3-dev-3b799b8.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@endo/errors": "npm:^1.2.7" + "@endo/nat": "npm:^5.0.12" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/1e0daa37ee894d2be664180963ad49170b71fbfe5460fa042c9bcec9daf270575f719e157b28f9e11ddd0edafbdc62ce17e911539e7f36103db05cdf0c7ff57d + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-dev-c1ae023.0+c1ae023": + version: 0.3.3-dev-c1ae023.0 + resolution: "@agoric/time@npm:0.3.3-dev-c1ae023.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/f4c6c900f25eda4bc32ee045f0b87ad1f3b38aa400047d51fbac534aa69bceaaf4f07130c539276a96c51a885394847ccd0a42da950722c58276998bdd7555ed + languageName: node + linkType: hard + +"@agoric/time@npm:0.3.3-dev-e596a01.0+e596a01": + version: 0.3.3-dev-e596a01.0 + resolution: "@agoric/time@npm:0.3.3-dev-e596a01.0" + dependencies: + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/612a7aef958093220f176a90510544c9a2900654213a6fc28dc77b2d6036c852ee0724eaaa2f92ee6280c9421a5290a8ff276e1e3185b4c2bc1f793edef92c6e + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-dev-3b799b8.0+3b799b8": + version: 0.5.3-dev-3b799b8.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-3b799b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-3b799b8.0+3b799b8" + "@endo/errors": "npm:^1.2.7" + "@endo/exo": "npm:^1.5.6" + "@endo/patterns": "npm:^1.4.6" + checksum: 10c0/f1abe12a47a7aa7a275c9b6d90bdaa74d8a7f8dbb44ba14892f194fc07f27aa581edc0545c10191afaa1509bb8d5532637f2b7fc8ddd0b47004a199da40c42be + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-dev-c1ae023.0+c1ae023": + version: 0.5.3-dev-c1ae023.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-c1ae023.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/009a8ca0f385770d4be37f8db2970ca03b035717193c18e43ce2f8ea6c212fba9a6f925dd376971e449416c6c3569178446318ecebdfc22016b03a50aed3fea4 + languageName: node + linkType: hard + +"@agoric/vat-data@npm:0.5.3-dev-e596a01.0+e596a01": + version: 0.5.3-dev-e596a01.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-e596a01.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" + checksum: 10c0/60cc9df55fcad0607907139e565a3c25c1e7e3c1dbb8aecac9a44d3f38baa51b109caf049d18ac2db37f8c918e8e6f1f99a621a761a14ad29274add4d9c6dbfc + languageName: node + linkType: hard + +"@agoric/vats@npm:0.15.2-dev-c1ae023.0+c1ae023": + version: 0.15.2-dev-c1ae023.0 + resolution: "@agoric/vats@npm:0.15.2-dev-c1ae023.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-dev-c1ae023.0+c1ae023" + "@agoric/ertp": "npm:0.16.3-dev-c1ae023.0+c1ae023" + "@agoric/governance": "npm:0.10.4-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/network": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/swingset-vat": "npm:0.32.3-dev-c1ae023.0+c1ae023" + "@agoric/time": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/vow": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/zoe": "npm:0.26.3-dev-c1ae023.0+c1ae023" + "@agoric/zone": "npm:0.2.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/d8920290ce6cab7f7dccbc6890df6ee0dfb2d25a4b63b9e6d5794aec8379d17bc253196162668ab1c02c824af07bb2aa890053ef9c55206b62342d43079ef806 + languageName: node + linkType: hard + +"@agoric/vats@npm:0.15.2-dev-e596a01.0+e596a01": + version: 0.15.2-dev-e596a01.0 + resolution: "@agoric/vats@npm:0.15.2-dev-e596a01.0" + dependencies: + "@agoric/cosmic-proto": "npm:0.4.1-dev-e596a01.0+e596a01" + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/governance": "npm:0.10.4-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/network": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/swingset-vat": "npm:0.32.3-dev-e596a01.0+e596a01" + "@agoric/time": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/vow": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/zoe": "npm:0.26.3-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + checksum: 10c0/aedf4b872c1871eefadf23e54e48317d29afc512486d6f72f85af3f1ae293ef944e8b0f542f6a67bff40fcff7f44618ddd69a62ad9e1aa08575f1f87f6a4116f + languageName: node + linkType: hard + +"@agoric/vow@npm:0.1.1-dev-3b799b8.0+3b799b8": + version: 0.1.1-dev-3b799b8.0 + resolution: "@agoric/vow@npm:0.1.1-dev-3b799b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@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/f8c8ef74b92d6d38af10f983275f4e201569588eb3470f6ae4745099a6aab8071f1c48b72d9247e8797e630b1e4870142e5195ba6a769dd658abe15d5c41c766 + languageName: node + linkType: hard + +"@agoric/vow@npm:0.1.1-dev-c1ae023.0+c1ae023": + version: 0.1.1-dev-c1ae023.0 + resolution: "@agoric/vow@npm:0.1.1-dev-c1ae023.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/094266768c8ff75032ce96faae9163e7dfa4e9ada55ce88354ca6de4b993d28252bcb6637900793f4e3f7b16afe62ac2f2bcc8825613b5cf95701ca46d4b4066 + languageName: node + linkType: hard + +"@agoric/vow@npm:0.1.1-dev-e596a01.0+e596a01": + version: 0.1.1-dev-e596a01.0 + resolution: "@agoric/vow@npm:0.1.1-dev-e596a01.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + checksum: 10c0/b2e78d46544356663b726be791385fc2518b2ae4b679f774d1bb16f711e7e4e468256bc5d7ab4c389458c1d802ee7b5a729f5be3b475faeaa4b70086cbaf8a01 + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-dev-3b799b8.0+3b799b8": + version: 0.14.1-dev-3b799b8.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-3b799b8.0" + checksum: 10c0/334a328dd29da0cc1d9068ea6ea7fe0eb10209b7e166c699334c1af32e9cf2dd4e16edb0a3a34943140e85969fc78af502e768e2c3529826d7793c739dc18f3f + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-dev-c1ae023.0+c1ae023": + version: 0.14.1-dev-c1ae023.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-c1ae023.0" + checksum: 10c0/65aefeb29497f8780849677ee81ba6f46f358d9f29ad5790541d5626ad8b08e34e27fa9063e24a4ddef5e2bf616e7aec16b6fff505a5bd3bbd0c87ceac110f49 + languageName: node + linkType: hard + +"@agoric/xsnap-lockdown@npm:0.14.1-dev-e596a01.0+e596a01": + version: 0.14.1-dev-e596a01.0 + resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-e596a01.0" + checksum: 10c0/454a7fa69028317d9d1f1c0cd0599a4de85cbc82e9550d51eead6ec5193ee330a1956cd9372632dc25cd248b6a25a6b99e4c8b4cc060a68065a58db756bffc8f + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-dev-c1ae023.0+c1ae023": + version: 0.26.3-dev-c1ae023.0 + resolution: "@agoric/zoe@npm:0.26.3-dev-c1ae023.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/ertp": "npm:0.16.3-dev-c1ae023.0+c1ae023" + "@agoric/internal": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/notifier": "npm:0.6.3-dev-c1ae023.0+c1ae023" + "@agoric/store": "npm:0.9.3-dev-c1ae023.0+c1ae023" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-c1ae023.0+c1ae023" + "@agoric/swingset-vat": "npm:0.32.3-dev-c1ae023.0+c1ae023" + "@agoric/time": "npm:0.3.3-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@agoric/vow": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/zone": "npm:0.2.3-dev-c1ae023.0+c1ae023" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/3b54c53506206d7406c0ffb309cb59d90a5cae13d0697320055127be163379369114a032b2af7c272e5646b9d9b65f1131c88750544ba859d5e1a11b618210b0 + languageName: node + linkType: hard + +"@agoric/zoe@npm:0.26.3-dev-e596a01.0+e596a01": + version: 0.26.3-dev-e596a01.0 + resolution: "@agoric/zoe@npm:0.26.3-dev-e596a01.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/notifier": "npm:0.6.3-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-e596a01.0+e596a01" + "@agoric/swingset-vat": "npm:0.32.3-dev-e596a01.0+e596a01" + "@agoric/time": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@agoric/vow": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/05898e27166028b62eee44f712384d79bc704a19a8277a5b343384c5b4e2de6b5f14799faa349acdbc7c2c69e96aaa89ce39f60f594a6956b94cf7b7c9d7be28 + languageName: node + linkType: hard + +"@agoric/zoe@npm:dev": + version: 0.26.3-dev-3b799b8.0 + resolution: "@agoric/zoe@npm:0.26.3-dev-3b799b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/ertp": "npm:0.16.3-dev-3b799b8.0+3b799b8" + "@agoric/internal": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/notifier": "npm:0.6.3-dev-3b799b8.0+3b799b8" + "@agoric/store": "npm:0.9.3-dev-3b799b8.0+3b799b8" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-3b799b8.0+3b799b8" + "@agoric/swingset-vat": "npm:0.32.3-dev-3b799b8.0+3b799b8" + "@agoric/time": "npm:0.3.3-dev-3b799b8.0+3b799b8" + "@agoric/vat-data": "npm:0.5.3-dev-3b799b8.0+3b799b8" + "@agoric/vow": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/zone": "npm:0.2.3-dev-3b799b8.0+3b799b8" + "@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/ab90b9a93bfef9475deda80eee499e99949f411ea2d3ec6ab26e9113a54f910cc973eb909730f0b4f8ef6d35892f0d3d500f107225e48bafbdd8512e8049f92d + languageName: node + linkType: hard + +"@agoric/zone@npm:0.2.3-dev-3b799b8.0+3b799b8": + version: 0.2.3-dev-3b799b8.0 + resolution: "@agoric/zone@npm:0.2.3-dev-3b799b8.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-3b799b8.0+3b799b8" + "@agoric/vat-data": "npm:0.5.3-dev-3b799b8.0+3b799b8" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/pass-style": "npm:^1.4.6" + checksum: 10c0/26e2ddb50c2021f2851e17bad5f2982aecbb3df506e49d2f8c7b90e5eefafb4201f53ca8a15a7ab468f3f18e6075b997b87ba0b3497e98caff7b3949bf36de0e + languageName: node + linkType: hard + +"@agoric/zone@npm:0.2.3-dev-c1ae023.0+c1ae023": + version: 0.2.3-dev-c1ae023.0 + resolution: "@agoric/zone@npm:0.2.3-dev-c1ae023.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-c1ae023.0+c1ae023" + "@agoric/vat-data": "npm:0.5.3-dev-c1ae023.0+c1ae023" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10c0/292be1e4198ecdbc87a300efc1548190d26698c6c541dd8e0f6794dc0407b9e3bfc013f8dadd6788e995327044ce8f8e4181ff01b851b77562224aa273d066bf + languageName: node + linkType: hard + +"@agoric/zone@npm:0.2.3-dev-e596a01.0+e596a01": + version: 0.2.3-dev-e596a01.0 + resolution: "@agoric/zone@npm:0.2.3-dev-e596a01.0" + dependencies: + "@agoric/base-zone": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/vat-data": "npm:0.5.3-dev-e596a01.0+e596a01" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + checksum: 10c0/f1847d20ff41cce66bcfde787ae87ba8d166387d5442c5121b14cb411dbcdcbfaa6c6e6dddbf6b44f8adc3ad8de97268c2053f091a872a7c379d2ad6df555ff7 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" + dependencies: + "@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:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c + languageName: node + linkType: hard + +"@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-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/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@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.23.6": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" + dependencies: + "@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/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @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.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + +"@confio/ics23@npm:^0.6.8": + version: 0.6.8 + resolution: "@confio/ics23@npm:0.6.8" + dependencies: + "@noble/hashes": "npm:^1.0.0" + protobufjs: "npm:^6.8.8" + checksum: 10c0/2f3f5032cd6a34c9b2fbd64bbf7e1cdec75ca71f348a770f7b5474b5027b12202bfbcd404eca931efddb5901f769af035a87cb8bddbf3f23d7e5d93c9d3d7f6f + languageName: node + linkType: hard + +"@confio/relayer@npm:^0.11.3": + version: 0.11.3 + resolution: "@confio/relayer@npm:0.11.3" + dependencies: + "@cosmjs/cosmwasm-stargate": "npm:^0.32.1" + "@cosmjs/crypto": "npm:^0.32.1" + "@cosmjs/encoding": "npm:^0.32.1" + "@cosmjs/faucet-client": "npm:^0.32.1" + "@cosmjs/math": "npm:^0.32.1" + "@cosmjs/proto-signing": "npm:^0.32.1" + "@cosmjs/stargate": "npm:^0.32.1" + "@cosmjs/stream": "npm:^0.32.1" + "@cosmjs/tendermint-rpc": "npm:^0.32.1" + "@cosmjs/utils": "npm:^0.32.1" + ajv: "npm:7.1.1" + axios: "npm:^1.6.7" + commander: "npm:7.1.0" + cosmjs-types: "npm:^0.9.0" + fast-safe-stringify: "npm:2.0.4" + js-yaml: "npm:4.0.0" + lodash: "npm:4.17.21" + prom-client: "npm:13.1.0" + table: "npm:^6.7.1" + triple-beam: "npm:1.3.0" + winston: "npm:3.3.3" + bin: + ibc-relayer: build/binary/ibc-relayer/index.js + ibc-setup: build/binary/ibc-setup/index.js + checksum: 10c0/f6519a21a7e2b7d79835558305bbac6f6712b90f0e10f2c156ae74583ca170da0b97ec456272c25a2ffdcbe0343ad425e67886b792f2aed1f5303e34b93edf40 + languageName: node + linkType: hard + +"@cosmjs/amino@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/amino@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + checksum: 10c0/cd8e215b0406f5c7b73ab0a21106d06b6f76b1da12f1ab7b612884e1dd8bc626966dc67d4e7580090ade131546cbec70000f854e6596935299d054b788929a7e + languageName: node + linkType: hard + +"@cosmjs/cosmwasm-stargate@npm:^0.32.1": + version: 0.32.4 + resolution: "@cosmjs/cosmwasm-stargate@npm:0.32.4" + dependencies: + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stargate": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + pako: "npm:^2.0.2" + checksum: 10c0/f7e285c51ef8b1098a9ea5ca2546a1e226b4fa0a990d95faa6f3b752f3638b6c55f36a56b6f4b11f0a66fd61e3ae8772921d8e99418218df0b2205efe1c82f37 + languageName: node + linkType: hard + +"@cosmjs/crypto@npm:^0.32.1, @cosmjs/crypto@npm:^0.32.3, @cosmjs/crypto@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/crypto@npm:0.32.4" + dependencies: + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + "@noble/hashes": "npm:^1" + bn.js: "npm:^5.2.0" + elliptic: "npm:^6.5.4" + libsodium-wrappers-sumo: "npm:^0.7.11" + checksum: 10c0/94e742285eb8c7c5393055ba0635f10c06bf87710e953aedc71e3edc2b8e21a12a0d9b5e8eff37e326765f57c9eb3c7fd358f24f639efad4f1a6624eb8189534 + languageName: node + linkType: hard + +"@cosmjs/encoding@npm:^0.32.1, @cosmjs/encoding@npm:^0.32.3, @cosmjs/encoding@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/encoding@npm:0.32.4" + dependencies: + base64-js: "npm:^1.3.0" + bech32: "npm:^1.1.4" + readonly-date: "npm:^1.0.0" + checksum: 10c0/4a30d5ae1a2d1247d44bda46101ce208c7666d8801ca9a33de94edc35cc22460c16b4834ec84d5a65ffef5e2a4b58605e0a0a056c46bc0a042979ec84acf20cd + languageName: node + linkType: hard + +"@cosmjs/faucet-client@npm:^0.32.1": + version: 0.32.4 + resolution: "@cosmjs/faucet-client@npm:0.32.4" + dependencies: + axios: "npm:^1.6.0" + checksum: 10c0/1651cb370eb5fa2b12b6f94e06d1dc9a6306e34cad3fc87d9263d8b8a225d500449e10a9f6e326534f65261778208dab7fada6a70efb63195589ad08f58e1008 + languageName: node + linkType: hard + +"@cosmjs/json-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/json-rpc@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + xstream: "npm:^11.14.0" + checksum: 10c0/b3ebd240f4fb21260e284d2e503ecc61bac898842187ab717f0efb9a5f21272f161f267cc145629caeb9735f80946844384e2bd410275a4744147a44518c0fa0 + languageName: node + linkType: hard + +"@cosmjs/math@npm:^0.32.1, @cosmjs/math@npm:^0.32.3, @cosmjs/math@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/math@npm:0.32.4" + dependencies: + bn.js: "npm:^5.2.0" + checksum: 10c0/91e47015be5634d27d71d14c5a05899fb4992b69db02cab1558376dedf8254f96d5e24f097c5601804ae18ed33c7c25d023653ac2bf9d20250fd3e5637f6b101 + languageName: node + linkType: hard + +"@cosmjs/proto-signing@npm:^0.32.1, @cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/proto-signing@npm:0.32.4" + dependencies: + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + checksum: 10c0/6915059d2e6dbe1abda4a747c3b1abd47a9eff4f8cb2cf9a5545f939b656b4a15bbde2bfc1364357f9b2a081a066280c3b469f6d13dd5fc51b429b0f90a54913 + languageName: node + linkType: hard + +"@cosmjs/socket@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/socket@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + isomorphic-ws: "npm:^4.0.1" + ws: "npm:^7" + xstream: "npm:^11.14.0" + checksum: 10c0/2d94c1fb39016bea3c7c145f4565c8a0fed20c805ac569ea604cd3646c15147b82b8db18a4e3c832d6ae0c3dd14363d4db3d91bcacac922679efba164ed49386 + languageName: node + linkType: hard + +"@cosmjs/stargate@npm:^0.32.1, @cosmjs/stargate@npm:^0.32.3, @cosmjs/stargate@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stargate@npm:0.32.4" + dependencies: + "@confio/ics23": "npm:^0.6.8" + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + xstream: "npm:^11.14.0" + checksum: 10c0/c30a3519516aaa7eae58ba827c80fcf74c7fe7a9d3aa5cc8138c3a2768f5f241f59c2f5cec27e9037b4df12b1c6605b4fac9eadb4de97bd84edddc3a80a02e24 + languageName: node + linkType: hard + +"@cosmjs/stream@npm:^0.32.1, @cosmjs/stream@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stream@npm:0.32.4" + dependencies: + xstream: "npm:^11.14.0" + checksum: 10c0/c677c53f9101c2a36fa03a475d92dea2fa69c475f896751b5e18a5d07087eeecbf6bca2e62a8940003da53fa235a9b2dd78c8257bf19c3f96e3f69fa8d5f183d + languageName: node + linkType: hard + +"@cosmjs/tendermint-rpc@npm:^0.32.1, @cosmjs/tendermint-rpc@npm:^0.32.3, @cosmjs/tendermint-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/tendermint-rpc@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/json-rpc": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/socket": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + axios: "npm:^1.6.0" + readonly-date: "npm:^1.0.0" + xstream: "npm:^11.14.0" + checksum: 10c0/5fae7afcdf98cc7dd36922aa1586254cc8c202cf8fe66804e61d793d31dcff816f40d33f7a0eb72c1b9226c7c361d4848e4ff12d0489f6fa66f47f0c86ae18dd + languageName: node + linkType: hard + +"@cosmjs/utils@npm:^0.32.1, @cosmjs/utils@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/utils@npm:0.32.4" + checksum: 10c0/d5ff8b235094be1150853a715116049f73eb5cdfeea8ce8e22ecccc61ec99792db457404d4307782b1a2f935dcf438f5c485beabfcfbc1dc5df26eb6e6da9062 + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe + languageName: node + linkType: hard + +"@endo/base64@npm:^1.0.8, @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:^3.4.2, @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:^4.4.2, @endo/captp@npm:^4.4.3": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" + dependencies: + "@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:^1.0.11, @endo/check-bundle@npm:^1.0.12": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" + dependencies: + "@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:^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.7, @endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" + dependencies: + "@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:^1.3.1, @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:^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.7": + version: 1.2.7 + resolution: "@endo/errors@npm:1.2.7" + dependencies: + ses: "npm:^1.9.1" + checksum: 10c0/17eed5d01dd968d8e266db37ac44e76859d14894a2b70457d120f2f05021819671aaf1bdf7dc7c2506b84f6df616402e029695d62309fbdbdd13ed4ba34890dd + languageName: node + linkType: hard + +"@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.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 + 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:^1.2.7, @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:^1.5.6, @endo/exo@npm:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" + dependencies: + "@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.8, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" + dependencies: + "@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.3.1, @endo/import-bundle@npm:^1.3.2": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" + dependencies: + "@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:^1.1.5, @endo/init@npm:^1.1.6, @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:^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:^1.5.4, @endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" + dependencies: + "@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 + +"@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:^5.0.12, @endo/nat@npm:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 + languageName: node + linkType: hard + +"@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.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/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e + languageName: node + linkType: hard + +"@endo/patterns@npm:^1.4.6, @endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" + dependencies: + "@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:^1.1.7, @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:^1.2.7, @endo/ses-ava@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" + dependencies: + "@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/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf + languageName: node + linkType: hard + +"@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.8" + "@endo/promise-kit": "npm:^1.1.8" + ses: "npm:^1.10.0" + checksum: 10c0/f435f7650020b32c10bb4cb139910b363b4d4f22bcf9e7a659d3d2eae694a3ea43c3af49c80370760a573370429e5fbe1619dec631251578d4c5eba9ff161613 + 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:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + +"@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 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + +"@fast-check/ava@npm:^1.1.5": + version: 1.2.1 + resolution: "@fast-check/ava@npm:1.2.1" + dependencies: + fast-check: "npm:^3.0.0" + peerDependencies: + ava: ^4 || ^5 || ^6 + checksum: 10c0/3800098fd7e8098102544a2f7a595351d063a7ebaeca18ed4901df5ec2679da2330ba8c0db2c820721d4cbb3e23d817ba22fec6d058957930e229f44fa71a684 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@iarna/toml@npm:^2.2.3": + version: 2.2.5 + resolution: "@iarna/toml@npm:2.2.5" + checksum: 10c0/d095381ad4554aca233b7cf5a91f243ef619e5e15efd3157bc640feac320545450d14b394aebbf6f02a2047437ced778ae598d5879a995441ab7b6c0b2c2f201 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + 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 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@rollup/plugin-commonjs@npm:^19.0.0": + version: 19.0.2 + resolution: "@rollup/plugin-commonjs@npm:19.0.2" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.1" + glob: "npm:^7.1.6" + is-reference: "npm:^1.2.1" + magic-string: "npm:^0.25.7" + resolve: "npm:^1.17.0" + peerDependencies: + rollup: ^2.38.3 + checksum: 10c0/9adccf77ad835cbe565da4385212f1e54c3e0dca2be174b5c2cfe89cfaeb240f42c7673e97e49b21b7c66ed901cc1c711552b6727f60b43a953ce996eb2868a7 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^13.0.0": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + "@types/resolve": "npm:1.17.1" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.1.0" + is-module: "npm:^1.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + rollup: ^2.42.0 + checksum: 10c0/6caa32a8304a20f1c9953111b25e9543f4de7d254958d81ce0158ad909e4493946bc2060c4ace23d9748b560ebc84c920ee7bc1b7d50dbf8ba852ef13c91af58 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" + picomatch: "npm:^2.2.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.1.0": + 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:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + 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" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.1": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: 10c0/42ec66ade1f72ff9d143c5a519a65efc7c1c77be7b1ac5455c530ae9acd87baba065542f8847522af2e3ace2cc999f3ad464ef86e6b7352eece34daf88f8c924 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=13.7.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/resolve@npm:1.17.1": + version: 1.17.1 + resolution: "@types/resolve@npm:1.17.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.2.0": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.2.4, 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/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"aggregate-error@npm:^4.0.0": + version: 4.0.1 + resolution: "aggregate-error@npm:4.0.1" + dependencies: + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 10c0/75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 + languageName: node + linkType: hard + +"agoric@npm:dev": + version: 0.21.2-dev-e596a01.0 + resolution: "agoric@npm:0.21.2-dev-e596a01.0" + dependencies: + "@agoric/access-token": "npm:0.4.22-dev-e596a01.0+e596a01" + "@agoric/cache": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/casting": "npm:0.4.3-dev-e596a01.0+e596a01" + "@agoric/client-utils": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/cosmic-proto": "npm:0.4.1-dev-e596a01.0+e596a01" + "@agoric/ertp": "npm:0.16.3-dev-e596a01.0+e596a01" + "@agoric/governance": "npm:0.10.4-dev-e596a01.0+e596a01" + "@agoric/inter-protocol": "npm:0.16.2-dev-e596a01.0+e596a01" + "@agoric/internal": "npm:0.3.3-dev-e596a01.0+e596a01" + "@agoric/network": "npm:0.1.1-dev-e596a01.0+e596a01" + "@agoric/smart-wallet": "npm:0.5.4-dev-e596a01.0+e596a01" + "@agoric/store": "npm:0.9.3-dev-e596a01.0+e596a01" + "@agoric/swingset-vat": "npm:0.32.3-dev-e596a01.0+e596a01" + "@agoric/vats": "npm:0.15.2-dev-e596a01.0+e596a01" + "@agoric/zoe": "npm:0.26.3-dev-e596a01.0+e596a01" + "@agoric/zone": "npm:0.2.3-dev-e596a01.0+e596a01" + "@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.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:^12.1.0" + deterministic-json: "npm:^1.0.5" + esm: "github:agoric-labs/esm#Agoric-built" + inquirer: "npm:^8.2.2" + opener: "npm:^1.5.2" + tmp: "npm:^0.2.1" + ws: "npm:^7.2.0" + bin: + agops: src/bin-agops.js + agoric: src/entrypoint.js + checksum: 10c0/289b46275e527ada256066d82f5f0e25e3e95c1c09610bf0f4eaaff06ca63f7eca60bd476393590c0bcd5b6f85d0dba4ee5ff2e2db120cc9aa7580eea7a6301f + languageName: node + linkType: hard + +"ajv@npm:7.1.1": + version: 7.1.1 + resolution: "ajv@npm:7.1.1" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: 10c0/328a86011a67dc10eff41e3e2ef412f88f5de546ad2288c8a3d2a563c203dd4dd479660c07f99fd9499e36c723afee212704b25f5599815991409528fd638329 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + 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" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + 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 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10c0/1ca7fcf5bc2b78d1e1d9b8c8cc7ce50b5c6cc67a8da5a28c9c975b7b46fff255a04abab02de38a5139190c9d8b34b3d6c59af6724521b077f7d7dfbad9b47a9c + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + 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" + dependencies: + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + languageName: node + linkType: hard + +"array-find-index@npm:^1.0.1": + version: 1.0.2 + resolution: "array-find-index@npm:1.0.2" + checksum: 10c0/86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + languageName: node + linkType: hard + +"arrgv@npm:^1.0.2": + version: 1.0.2 + resolution: "arrgv@npm:1.0.2" + checksum: 10c0/7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 + languageName: node + linkType: hard + +"arrify@npm:^3.0.0": + version: 3.0.0 + resolution: "arrify@npm:3.0.0" + checksum: 10c0/2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"async@npm:^3.1.0": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"ava@npm:^5.3.1": + version: 5.3.1 + resolution: "ava@npm:5.3.1" + dependencies: + acorn: "npm:^8.8.2" + acorn-walk: "npm:^8.2.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.0.0" + cbor: "npm:^8.1.0" + chalk: "npm:^5.2.0" + chokidar: "npm:^3.5.3" + chunkd: "npm:^2.0.1" + ci-info: "npm:^3.8.0" + ci-parallel-vars: "npm:^1.0.1" + clean-yaml-object: "npm:^0.1.0" + cli-truncate: "npm:^3.1.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^5.0.0" + globby: "npm:^13.1.4" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-error: "npm:^2.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + mem: "npm:^9.0.2" + ms: "npm:^2.1.3" + p-event: "npm:^5.0.1" + p-map: "npm:^5.5.0" + picomatch: "npm:^2.3.1" + pkg-conf: "npm:^4.0.0" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.0.1" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" + peerDependencies: + "@ava/typescript": "*" + peerDependenciesMeta: + "@ava/typescript": + optional: true + bin: + ava: entrypoints/cli.mjs + checksum: 10c0/262cbdb9e8c3ce7177be91b92ba521e9d5aef577dcc8095cc591f86baaa291b91c88925928f5d26832c4d1b381a6ae99f2e8804077c592d0d32322c1212605cc + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"axios@npm:1.7.7": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 + languageName: node + linkType: hard + +"axios@npm:^1.6.7": + version: 1.7.9 + resolution: "axios@npm:1.7.9" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/b7a41e24b59fee5f0f26c1fc844b45b17442832eb3a0fb42dd4f1430eb4abc571fe168e67913e8a1d91c993232bd1d1ab03e20e4d1fee8c6147649b576fc1b0b + languageName: node + linkType: hard + +"axios@patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch": + version: 1.7.7 + resolution: "axios@patch:axios@npm%3A1.7.7#~/.yarn/patches/axios-npm-1.7.7-cfbedc233d.patch::version=1.7.7&hash=df7a05" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/49964e1025a39e845ad1824cdf49f313202de26e55bbc4a67e81aaeaba78a8efcbfe3da42ca61c14fdbc249bdbd62b5478e9e54ea3456711d159ec068b12c392 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bech32@npm:^1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 10c0/5f62ca47b8df99ace9c0e0d8deb36a919d91bf40066700aaa9920a45f86bb10eb56d537d559416fd8703aa0fb60dddb642e58f049701e7291df678b2033e5ee5 + languageName: node + linkType: hard + +"better-sqlite3@npm:^9.1.1, better-sqlite3@npm:^9.6.0": + version: 9.6.0 + resolution: "better-sqlite3@npm:9.6.0" + dependencies: + bindings: "npm:^1.5.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + checksum: 10c0/8db9b38f414e26a56d4c40fc16e94a253118491dae0e2c054338a9e470f1a883c7eb4cb330f2f5737db30f704d4f2e697c59071ca04e03364ee9fe04375aa9c8 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"bindings@npm:^1.5.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + +"bintrees@npm:1.0.2": + version: 1.0.2 + resolution: "bintrees@npm:1.0.2" + checksum: 10c0/132944b20c93c1a8f97bf8aa25980a76c6eb4291b7f2df2dbcd01cb5b417c287d3ee0847c7260c9f05f3d5a4233aaa03dec95114e97f308abe9cc3f72bed4a44 + languageName: node + linkType: hard + +"bl@npm:^4.0.3, bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"blueimp-md5@npm:^2.10.0": + version: 2.19.0 + resolution: "blueimp-md5@npm:2.19.0" + checksum: 10c0/85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 + languageName: node + linkType: hard + +"bn.js@npm:^4.11.9": + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.0": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"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.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.4 + resolution: "cacache@npm:18.0.4" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f + languageName: node + linkType: hard + +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"callsites@npm:^4.0.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: "npm:^3.1.0" + checksum: 10c0/a836e2e7ea0efb1b9c4e5a4be906c57113d730cc42293a34072e0164ed110bb8ac035dc7dca2e3ebb641bd4b37e00fdbbf09c951aa864b3d4888a6ed8c6243f7 + languageName: node + linkType: hard + +"chalk@npm:^2.4.1": + 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": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chunkd@npm:^2.0.1": + version: 2.0.1 + resolution: "chunkd@npm:2.0.1" + checksum: 10c0/4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 + languageName: node + linkType: hard + +"ci-info@npm:^3.8.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"ci-parallel-vars@npm:^1.0.1": + version: 1.0.1 + resolution: "ci-parallel-vars@npm:1.0.1" + checksum: 10c0/80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"clean-stack@npm:^4.0.0": + version: 4.2.0 + resolution: "clean-stack@npm:4.2.0" + dependencies: + escape-string-regexp: "npm:5.0.0" + checksum: 10c0/2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 + languageName: node + linkType: hard + +"clean-yaml-object@npm:^0.1.0": + version: 0.1.0 + resolution: "clean-yaml-object@npm:0.1.0" + checksum: 10c0/a6505310590038afb9f0adc7f17a4c66787719c94d23f8491267ea4d9c405cdd378bd576ae1926169b6d997d4c59a8b86516bf4d16ba228280cf615598c58e05 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: "npm:^5.0.0" + string-width: "npm:^5.0.0" + checksum: 10c0/a19088878409ec0e5dc2659a5166929629d93cfba6d68afc9cde2282fd4c751af5b555bf197047e31c87c574396348d011b7aa806fec29c4139ea4f7f00b324c + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 10c0/125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"code-excerpt@npm:^4.0.0": + version: 4.0.0 + resolution: "code-excerpt@npm:4.0.0" + dependencies: + convert-to-spaces: "npm:^2.0.1" + checksum: 10c0/b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:7.1.0": + version: 7.1.0 + resolution: "commander@npm:7.1.0" + checksum: 10c0/1c114cc2e0c7c980068d7f2472f3fc9129ea5d6f2f0a8699671afe5a44a51d5707a6c73daff1aaa919424284dea9fca4017307d30647935a1116518699d54c9d + languageName: node + linkType: hard + +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concordance@npm:^5.0.4": + version: 5.0.4 + resolution: "concordance@npm:5.0.4" + dependencies: + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 10c0/59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a + languageName: node + linkType: hard + +"convert-to-spaces@npm:^2.0.1": + version: 2.0.1 + resolution: "convert-to-spaces@npm:2.0.1" + checksum: 10c0/d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 + languageName: node + linkType: hard + +"cosmjs-types@npm:^0.9.0": + version: 0.9.0 + resolution: "cosmjs-types@npm:0.9.0" + checksum: 10c0/bc20f4293fb34629d7c5f96bafe533987f753df957ff68eb078d0128ae5a418320cb945024441769a07bb9bc5dde9d22b972fd40d485933e5706ea191c43727b + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.5": + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/aa82ce7ac0814a27e6f2b738c5a7cf1fa21a3558a1e42df449fc96541ba3ba731e4d3ecffa4435348808a86212f287c6f20a1ee551ef1ff95d01cfec5f434944 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + 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/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"currently-unhandled@npm:^0.4.1": + version: 0.4.1 + resolution: "currently-unhandled@npm:0.4.1" + dependencies: + array-find-index: "npm:^1.0.1" + checksum: 10c0/32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + 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" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + 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" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + languageName: node + linkType: hard + +"date-time@npm:^3.1.0": + version: 3.1.0 + resolution: "date-time@npm:3.1.0" + dependencies: + time-zone: "npm:^1.0.0" + checksum: 10c0/aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + +"deterministic-json@npm:^1.0.5": + version: 1.0.5 + resolution: "deterministic-json@npm:1.0.5" + dependencies: + json-stable-stringify: "npm:^1.0.1" + checksum: 10c0/e29679601cd3b05c73665529dcd0132b48797fd7dfbac6793238a479e82b5f3905114316fbb316332da58b4497e35df9aea77b41ff92fd74fe298a6f31b93d40 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"elliptic@npm:^6.5.4": + 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 + +"emittery@npm:^1.0.1": + version: 1.0.3 + resolution: "emittery@npm:1.0.3" + checksum: 10c0/91605d044f3891dd1f8ab731aeb94b520488b21e707f7064dcbcf5303bac3b4e7133dfa23c343ede1fc970340bd78a9b1aed522b805bc15104606bba630dd71e + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + 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": + 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" + 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" + 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" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + 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" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + 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" + 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 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"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 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"esm@github:agoric-labs/esm#Agoric-built": + version: 3.2.25 + resolution: "esm@https://github.com/agoric-labs/esm.git#commit=3603726ad4636b2f865f463188fcaade6375638e" + checksum: 10c0/fc1e112a3a681e7b4152d4f5c76dd5aa9e30496d2020490ffa0fb61aaf57d1e12dae0c1074fdd2e0f08949ab2df7e00e750262356781f072e4119955ee10b754 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + +"esutils@npm:^2.0.2, esutils@npm:^2.0.3": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:9.1.0": + version: 9.1.0 + resolution: "execa@npm:9.1.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^7.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^5.2.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/9a4810b93d098eb0bed48793b61c3aa3e5804867c2c5808cd2a597a6e71738151a74dc792909085ce1d38e89f4b0e078d93ffd165aaca2d9a6728f3616f8e5c0 + languageName: node + linkType: hard + +"execa@npm:^9.3.1": + version: 9.5.1 + resolution: "execa@npm:9.5.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + +"fast-check@npm:^3.0.0": + version: 3.23.1 + resolution: "fast-check@npm:3.23.1" + dependencies: + pure-rand: "npm:^6.1.0" + checksum: 10c0/d61ee4a7a2e1abc5126bf2f1894413f532f686b3d1fc15c67fefb60dcca66024934b69a6454d3eba92e6568ac1abbb9882080e212d255865c3b3bbe52c5bf702 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.0": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.0.4": + version: 2.0.4 + resolution: "fast-safe-stringify@npm:2.0.4" + checksum: 10c0/5e4fbafe8b8c4a1681c2ab259ed8ce6672fc209683a141876f020c36a2cbec73bfe25c417c269f439797020996d04ed2d7c4c6b2c5cf393d6febbf7f4d8a5f53 + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + +"figures@npm:^5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + is-unicode-supported: "npm:^1.2.0" + checksum: 10c0/ce0f17d4ea8b0fc429c5207c343534a2f5284ecfb22aa08607da7dc84ed9e1cf754f5b97760e8dcb98d3c9d1a1e4d3d578fe3b5b99c426f05d0f06c7ba618e16 + languageName: node + linkType: hard + +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + +"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/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"find-up@npm:^6.0.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"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/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"globby@npm:^13.1.4": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + 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" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c + languageName: node + linkType: hard + +"human-signals@npm:^7.0.0": + version: 7.0.0 + resolution: "human-signals@npm:7.0.0" + checksum: 10c0/ce0c6d62d2e9bfe529d48f7c7fdf4b8c70fce950eef7850719b4e3f5bc71795ae7d61a3699ce13262bed7847705822601cc81f1921ea6a2906852e16228a94ab + languageName: node + linkType: hard + +"human-signals@npm:^8.0.0": + version: 8.0.0 + resolution: "human-signals@npm:8.0.0" + checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e + languageName: node + linkType: hard + +"iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-by-default@npm:^2.1.0": + version: 2.1.0 + resolution: "ignore-by-default@npm:2.1.0" + checksum: 10c0/3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^2.2.1": + version: 2.2.2 + resolution: "import-meta-resolve@npm:2.2.2" + checksum: 10c0/80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"inquirer@npm:^8.2.2": + version: 8.2.6 + resolution: "inquirer@npm:8.2.6" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^6.0.1" + checksum: 10c0/eb5724de1778265323f3a68c80acfa899378cb43c24cdcb58661386500e5696b6b0b6c700e046b7aa767fe7b4823c6f04e6ddc268173e3f84116112529016296 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"irregular-plurals@npm:^3.3.0": + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: "npm:^1.1.13" + checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + languageName: node + linkType: hard + +"is-error@npm:^2.2.2": + version: 2.2.2 + resolution: "is-error@npm:2.2.2" + checksum: 10c0/475d3463968bf16e94485555d7cb7a879ed68685e08d365a3370972e626054f1846ebbb3934403091e06682445568601fe919e41646096e5007952d0c1f4fd9b + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + 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" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 10c0/df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc + 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.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-reference@npm:^1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + 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" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 + languageName: node + linkType: hard + +"js-string-escape@npm:^1.0.1": + version: 1.0.1 + resolution: "js-string-escape@npm:1.0.1" + checksum: 10c0/2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:4.0.0": + version: 4.0.0 + resolution: "js-yaml@npm:4.0.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/ef8489b87d9796b45df9f0bf3eefbb343b5063e39a9911d7b8ddbd4518cafaf73b49150d1f5865f54ee68719642ff0ab86110b9a332ff88bb05cd3bcf3039de1 + languageName: node + linkType: hard + +"js-yaml@npm:^3.14.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + 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" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json-stable-stringify@npm:^1.0.1": + version: 1.1.1 + resolution: "json-stable-stringify@npm:1.1.1" + dependencies: + call-bind: "npm:^1.0.5" + isarray: "npm:^2.0.5" + jsonify: "npm:^0.0.1" + object-keys: "npm:^1.1.1" + checksum: 10c0/3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 10c0/7f5499cdd59a0967ed35bda48b7cec43d850bbc8fb955cdd3a1717bb0efadbe300724d5646de765bb7a99fc1c3ab06eb80d93503c6faaf99b4ff50a3326692f6 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"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.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" + dependencies: + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + +"load-json-file@npm:^7.0.0": + version: 7.0.1 + resolution: "load-json-file@npm:7.0.1" + checksum: 10c0/7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 10c0/4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 + languageName: node + linkType: hard + +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"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" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f + languageName: node + linkType: hard + +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 10c0/50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"magic-string@npm:^0.25.7": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: "npm:^1.4.8" + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"map-age-cleaner@npm:^0.1.3": + version: 0.1.3 + resolution: "map-age-cleaner@npm:0.1.3" + dependencies: + p-defer: "npm:^1.0.0" + checksum: 10c0/7495236c7b0950956c144fd8b4bc6399d4e78072a8840a4232fe1c4faccbb5eb5d842e5c0a56a60afc36d723f315c1c672325ca03c1b328650f7fcc478f385fd + languageName: node + linkType: hard + +"matcher@npm:^5.0.0": + version: 5.0.0 + resolution: "matcher@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + checksum: 10c0/eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 + languageName: node + linkType: hard + +"md5-hex@npm:^3.0.1": + version: 3.0.1 + resolution: "md5-hex@npm:3.0.1" + dependencies: + blueimp-md5: "npm:^2.10.0" + checksum: 10c0/ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 + languageName: node + linkType: hard + +"mem@npm:^9.0.2": + version: 9.0.2 + resolution: "mem@npm:9.0.2" + dependencies: + map-age-cleaner: "npm:^0.1.3" + mimic-fn: "npm:^4.0.0" + checksum: 10c0/c2c56141399e520d8f0e50186bb7e4b49300b33984dc919682f3f13e53dec0e6608fbd327d5ae99494f45061a3a05a8ee04ccba6dcf795c3c215b5aa906eb41f + languageName: node + linkType: hard + +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"microtime@npm:^3.1.0": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.4.0" + checksum: 10c0/02512993de914c6f71424d3b8b28ce53de44ba5895b904a213420fd4fc86a084c1d08ec0876ac60cdae6427022766e1b9b86d9b3442bf408701120bd61455e26 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + 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.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 + languageName: node + linkType: hard + +"n-readlines@npm:^1.0.0": + version: 1.0.3 + resolution: "n-readlines@npm:1.0.3" + checksum: 10c0/436c27ac071409314093da35dc3a4c5198c94fb10ad12b1c4d2b3e44bdb634da0a7a8ab0c107c1f4815788cbf5e0c7c180e3037ba3d974f34637cab363a95a74 + languageName: node + linkType: hard + +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10c0/37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f + languageName: node + linkType: hard + +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.4.0": + version: 4.8.2 + resolution: "node-gyp-build@npm:4.8.2" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/d816b43974d31d6257b6e87d843f2626c72389a285208394bc57a7766b210454d2642860a5e5b5c333d8ecabaeabad3b31b94f58cf8ca1aabdef0c320d02baaa + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^4.1.0" + semver: "npm:^7.3.5" + tar: "npm:^6.2.1" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b + languageName: node + linkType: hard + +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 10c0/92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: "npm:^3.2.1" + chalk: "npm:^2.4.1" + cross-spawn: "npm:^6.0.5" + memorystream: "npm:^0.3.1" + minimatch: "npm:^3.0.4" + pidtree: "npm:^0.3.0" + read-pkg: "npm:^3.0.0" + shell-quote: "npm:^1.6.1" + string.prototype.padend: "npm:^3.0.0" + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.2.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba + languageName: node + linkType: hard + +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + +"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 + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + 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" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"p-defer@npm:^1.0.0": + version: 1.0.0 + resolution: "p-defer@npm:1.0.0" + checksum: 10c0/ed603c3790e74b061ac2cb07eb6e65802cf58dce0fbee646c113a7b71edb711101329ad38f99e462bd2e343a74f6e9366b496a35f1d766c187084d3109900487 + languageName: node + linkType: hard + +"p-event@npm:^5.0.1": + version: 5.0.1 + resolution: "p-event@npm:5.0.1" + dependencies: + p-timeout: "npm:^5.0.2" + checksum: 10c0/2317171489537f316661fa863f3bb711b2ceb89182937238422cec10223cbb958c432d6c26a238446a622d788187bdd295b1d8ecedbe2e467e045930d60202b0 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^5.5.0": + version: 5.5.0 + resolution: "p-map@npm:5.5.0" + dependencies: + aggregate-error: "npm:^4.0.0" + checksum: 10c0/410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 + languageName: node + linkType: hard + +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: 10c0/1b026cf9d5878c64bec4341ca9cda8ec6b8b3aea8a57885ca0fe2b35753a20d767fb6f9d3aa41e1252f42bc95432c05ea33b6b18f271fb10bfb0789591850a41 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"pako@npm:^2.0.2": + version: 2.1.0 + resolution: "pako@npm:2.1.0" + checksum: 10c0/8e8646581410654b50eb22a5dfd71159cae98145bd5086c9a7a816ec0370b5f72b4648d08674624b3870a521e6a3daffd6c2f7bc00fdefc7063c9d8232ff5116 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + +"parse-ms@npm:^3.0.0": + version: 3.0.0 + resolution: "parse-ms@npm:3.0.0" + checksum: 10c0/056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 + languageName: node + linkType: hard + +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + 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 + +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pkg-conf@npm:^4.0.0": + version: 4.0.0 + resolution: "pkg-conf@npm:4.0.0" + dependencies: + find-up: "npm:^6.0.0" + load-json-file: "npm:^7.0.0" + checksum: 10c0/27d027609f27228edcde121f6f707b4ba1f5488e95e98f2e58652ae4e99792081bd1de67d591f4a0f05b02c0b66d745591d49f82041cbc8d41e2238ef5d73eb4 + languageName: node + linkType: hard + +"plur@npm:^5.1.0": + version: 5.1.0 + resolution: "plur@npm:5.1.0" + dependencies: + irregular-plurals: "npm:^3.3.0" + checksum: 10c0/26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 + 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" + checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + languageName: node + linkType: hard + +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"pretty-ms@npm:^8.0.0": + version: 8.0.0 + resolution: "pretty-ms@npm:8.0.0" + dependencies: + parse-ms: "npm:^3.0.0" + checksum: 10c0/e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d + languageName: node + linkType: hard + +"pretty-ms@npm:^9.0.0": + version: 9.1.0 + resolution: "pretty-ms@npm:9.1.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/fd111aad8800a04dfd654e6016da69bdaa6fc6a4c280f8e727cffd8b5960558e94942f1a94d4aa6e4d179561a0fbb0366a9ebe0ccefbbb0f8ff853b129cdefb9 + languageName: node + linkType: hard + +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 + languageName: node + linkType: hard + +"prom-client@npm:13.1.0": + version: 13.1.0 + resolution: "prom-client@npm:13.1.0" + dependencies: + tdigest: "npm:^0.1.1" + checksum: 10c0/0f117e044bdbc7e8fb3a926e16e0e76ff3fb308dbc98fdb084dfa16ad52a0b68cf6a79a31e907b1c4ac9009b1d50848e3e72fb36ed43893291148e1505844fc2 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"proper-lockfile@npm:^4.1.2": + version: 4.1.2 + resolution: "proper-lockfile@npm:4.1.2" + dependencies: + graceful-fs: "npm:^4.2.4" + retry: "npm:^0.12.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/2f265dbad15897a43110a02dae55105c04d356ec4ed560723dcb9f0d34bc4fb2f13f79bb930e7561be10278e2314db5aca2527d5d3dcbbdee5e6b331d1571f6d + languageName: node + linkType: hard + +"protobufjs@npm:6.11.4": + version: 6.11.4 + resolution: "protobufjs@npm:6.11.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/c244d7b9b6d3258193da5c0d1e558dfb47f208ae345e209f90ec45c9dca911b90fa17e937892a9a39a4136ab9886981aae9efdf6039f7baff4f7225f5eeb9812 + languageName: node + linkType: hard + +"protobufjs@patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch": + version: 6.11.4 + resolution: "protobufjs@patch:protobufjs@npm%3A6.11.4#~/.yarn/patches/protobufjs-npm-6.11.4-af11968b80.patch::version=6.11.4&hash=1644ab" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/fea6b3d00dbb564157b24c0f0f69dc777b22f30ffbe1fed67fb9a2ef05e6e99e8da6d1811bea650a315ec98d7512638d72317e41136522b94be4fb3c89d8d0ab + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"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/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"pure-rand@npm:^6.1.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"readonly-date@npm:^1.0.0": + version: 1.0.0 + resolution: "readonly-date@npm:1.0.0" + checksum: 10c0/7ab32bf19f6bfec102584a524fa79a289e6ede0bf20c80fd90ab309962e45b71d19dd0e3915dff6e81edf226f08fda65e890539b4aca74668921790b10471356 + languageName: node + linkType: hard + +"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.7" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"rollup@npm:^2.79.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + "@agoric/client-utils": "npm:dev" + "@agoric/ertp": "npm:dev" + "@agoric/internal": "npm:dev" + "@agoric/synthetic-chain": "npm:^0.4.3" + "@agoric/zoe": "npm:dev" + "@endo/errors": "npm:1.2.7" + "@endo/init": "npm:^1.1.5" + "@endo/marshal": "npm:^1.5.4" + agoric: "npm:dev" + ava: "npm:^5.3.1" + better-sqlite3: "npm:^9.6.0" + eslint: "npm:^8.57.0" + execa: "npm:9.1.0" + npm-run-all: "npm:^4.1.5" + typescript: "npm:^5.6.3" + languageName: unknown + linkType: soft + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rxjs@npm:^7.5.5": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + 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.9.1": + version: 1.9.1 + resolution: "ses@npm:1.9.1" + dependencies: + "@endo/env-options": "npm:^1.1.7" + checksum: 10c0/1e795542954f635aaee2749a1d548460f2978257cb29daaea76b814ef99ffa64ab5cca05fbc3d51a814a57cf9fc4563988ee93312cc53bae4eb63dfff0f0682a + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:^1.6.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + 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 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 10c0/2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.6": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string.prototype.padend@npm:^3.0.0": + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"supertap@npm:^3.0.1": + version: 3.0.1 + resolution: "supertap@npm:3.0.1" + dependencies: + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f + 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" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"symbol-observable@npm:^2.0.3": + version: 2.0.3 + resolution: "symbol-observable@npm:2.0.3" + checksum: 10c0/03fb8766b75bfa65a3c7d68ae1e51a13a5ff71b40d6d53b17a0c9c77b1685c20a3bfbf45547ab36214a079665c3f551e250798f6b2f83a2a40762d864ed87f78 + languageName: node + linkType: hard + +"table@npm:^6.7.1": + version: 6.9.0 + resolution: "table@npm:6.9.0" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/35646185712bb65985fbae5975dda46696325844b78735f95faefae83e86df0a265277819a3e67d189de6e858c509b54e66ca3958ffd51bde56ef1118d455bf4 + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"tdigest@npm:^0.1.1": + version: 0.1.2 + resolution: "tdigest@npm:0.1.2" + dependencies: + bintrees: "npm:1.0.2" + checksum: 10c0/10187b8144b112fcdfd3a5e4e9068efa42c990b1e30cd0d4f35ee8f58f16d1b41bc587e668fa7a6f6ca31308961cbd06cd5d4a4ae1dc388335902ae04f7d57df + languageName: node + linkType: hard + +"temp-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "temp-dir@npm:3.0.0" + checksum: 10c0/a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"time-zone@npm:^1.0.0": + version: 1.0.0 + resolution: "time-zone@npm:1.0.0" + checksum: 10c0/d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 + languageName: node + linkType: hard + +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"triple-beam@npm:1.3.0": + version: 1.3.0 + resolution: "triple-beam@npm:1.3.0" + checksum: 10c0/a6da96495f25b6c04b3629df5161c7eb84760927943f16665fd8dcd3a643daadf73d69eee78306b4b68d606937f22f8703afe763bc8d3723632ffb1f3a798493 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + 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 + +"tslib@npm:^2.1.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + 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" + dependencies: + call-bind: "npm:^1.0.7" + 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 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + 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/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + languageName: node + linkType: hard + +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": + 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@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=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"well-known-symbols@npm:^2.0.0": + version: 2.0.0 + resolution: "well-known-symbols@npm:2.0.0" + checksum: 10c0/cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"winston-transport@npm:^4.4.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 + languageName: node + linkType: hard + +"winston@npm:3.3.3": + version: 3.3.3 + resolution: "winston@npm:3.3.3" + dependencies: + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.1.0" + is-stream: "npm:^2.0.0" + logform: "npm:^2.2.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.4.0" + checksum: 10c0/18205fa1e3ebb88dc910fbe5337e3c9d2dbd94310978adca5ab77444b854d5679dec0a70fed425e77cf93e237390c7670bb937f14c492b8415e594ab21540d3d + 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" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.0.1": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: 10c0/e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d + languageName: node + linkType: hard + +"ws@npm:^7, ws@npm:^7.2.0": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"xstream@npm:^11.14.0": + version: 11.14.0 + resolution: "xstream@npm:11.14.0" + dependencies: + globalthis: "npm:^1.0.1" + symbol-observable: "npm:^2.0.3" + checksum: 10c0/7a28baedc64385dc17597d04c7130ec3135db298e66d6dcf33821eb1953d5ad1b83c5fa08f1ce4d36e75fd219f2e9ef81ee0721aa8d4ccf619acc1760ba37f71 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 + languageName: node + linkType: hard + +"yoctocolors@npm:^2.0.0": + version: 2.1.1 + resolution: "yoctocolors@npm:2.1.1" + checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 + languageName: node + linkType: hard diff --git a/a3p-integration/proposals/s:stake-bld/package.json b/a3p-integration/proposals/s:stake-bld/package.json index 39c3d923c8a..2432417370d 100644 --- a/a3p-integration/proposals/s:stake-bld/package.json +++ b/a3p-integration/proposals/s:stake-bld/package.json @@ -9,19 +9,73 @@ "type": "module", "license": "Apache-2.0", "dependencies": { + "@agoric/client-utils": "dev", "@agoric/internal": "0.3.3-dev-5676146.0", - "@agoric/synthetic-chain": "^0.3.0", + "@agoric/synthetic-chain": "^0.4.3", "@cosmjs/stargate": "^0.32.3", "@cosmjs/tendermint-rpc": "^0.32.3", "@endo/errors": "^1.2.2", "@endo/far": "^1.0.4", "@endo/init": "^1.0.4", - "agoric": "0.21.2-dev-5676146.0", + "agoric": "dev", "ava": "^5.3.1", "execa": "^8.0.1" }, "ava": { "concurrency": 1 }, - "packageManager": "yarn@4.2.2" + "packageManager": "yarn@4.5.3", + "devDependencies": { + "@types/node": "^22.0.0", + "typescript": "^5.7.2" + }, + "resolutions": { + "@agoric/cosmos": "portal:../../agoric-sdk/golang/cosmos", + "@agoric/ertp": "portal:../../agoric-sdk/packages/ERTP", + "@agoric/swingset-vat": "portal:../../agoric-sdk/packages/SwingSet", + "@agoric/access-token": "portal:../../agoric-sdk/packages/access-token", + "agoric": "portal:../../agoric-sdk/packages/agoric-cli", + "@agoric/async-flow": "portal:../../agoric-sdk/packages/async-flow", + "@agoric/base-zone": "portal:../../agoric-sdk/packages/base-zone", + "@agoric/builders": "portal:../../agoric-sdk/packages/builders", + "@agoric/cache": "portal:../../agoric-sdk/packages/cache", + "@agoric/casting": "portal:../../agoric-sdk/packages/casting", + "@agoric/client-utils": "portal:../../agoric-sdk/packages/client-utils", + "@agoric/cosmic-proto": "portal:../../agoric-sdk/packages/cosmic-proto", + "@agoric/cosmic-swingset": "portal:../../agoric-sdk/packages/cosmic-swingset", + "@agoric/create-dapp": "portal:../../agoric-sdk/packages/create-dapp", + "@agoric/deploy-script-support": "portal:../../agoric-sdk/packages/deploy-script-support", + "@agoric/eslint-config": "portal:../../agoric-sdk/packages/eslint-config", + "@agoric/fast-usdc": "portal:../../agoric-sdk/packages/fast-usdc", + "@agoric/governance": "portal:../../agoric-sdk/packages/governance", + "@agoric/import-manager": "portal:../../agoric-sdk/packages/import-manager", + "@agoric/inter-protocol": "portal:../../agoric-sdk/packages/inter-protocol", + "@agoric/internal": "portal:../../agoric-sdk/packages/internal", + "@agoric/kmarshal": "portal:../../agoric-sdk/packages/kmarshal", + "@agoric/network": "portal:../../agoric-sdk/packages/network", + "@agoric/notifier": "portal:../../agoric-sdk/packages/notifier", + "@agoric/orchestration": "portal:../../agoric-sdk/packages/orchestration", + "@agoric/pegasus": "portal:../../agoric-sdk/packages/pegasus", + "@agoric/smart-wallet": "portal:../../agoric-sdk/packages/smart-wallet", + "@agoric/solo": "portal:../../agoric-sdk/packages/solo", + "@agoric/sparse-ints": "portal:../../agoric-sdk/packages/sparse-ints", + "@agoric/spawner": "portal:../../agoric-sdk/packages/spawner", + "@agoric/stat-logger": "portal:../../agoric-sdk/packages/stat-logger", + "@agoric/store": "portal:../../agoric-sdk/packages/store", + "@agoric/swing-store": "portal:../../agoric-sdk/packages/swing-store", + "@agoric/swingset-liveslots": "portal:../../agoric-sdk/packages/swingset-liveslots", + "@agoric/swingset-xsnap-supervisor": "portal:../../agoric-sdk/packages/swingset-xsnap-supervisor", + "@agoric/telemetry": "portal:../../agoric-sdk/packages/telemetry", + "@agoric/time": "portal:../../agoric-sdk/packages/time", + "@agoric/vat-data": "portal:../../agoric-sdk/packages/vat-data", + "@agoric/vats": "portal:../../agoric-sdk/packages/vats", + "@agoric/vm-config": "portal:../../agoric-sdk/packages/vm-config", + "@agoric/vow": "portal:../../agoric-sdk/packages/vow", + "@agoric/wallet": "portal:../../agoric-sdk/packages/wallet", + "@agoric/wallet-backend": "portal:../../agoric-sdk/packages/wallet/api", + "@agoric/xsnap": "portal:../../agoric-sdk/packages/xsnap", + "@agoric/xsnap-lockdown": "portal:../../agoric-sdk/packages/xsnap-lockdown", + "@agoric/zoe": "portal:../../agoric-sdk/packages/zoe", + "@agoric/zone": "portal:../../agoric-sdk/packages/zone" + } } diff --git a/a3p-integration/proposals/s:stake-bld/stakeBld.test.js b/a3p-integration/proposals/s:stake-bld/stakeBld.test.js index 9333fb302eb..13836f6cf3d 100644 --- a/a3p-integration/proposals/s:stake-bld/stakeBld.test.js +++ b/a3p-integration/proposals/s:stake-bld/stakeBld.test.js @@ -8,7 +8,7 @@ import { GOV1ADDR } from '@agoric/synthetic-chain'; import { Tendermint34Client } from '@cosmjs/tendermint-rpc'; import assert from 'node:assert'; import process from 'node:process'; -import { networkConfig, walletUtils } from './test-lib/index.js'; +import { networkConfig, agdWalletUtils } from './test-lib/index.js'; // XXX not the same as VALIDATOR_ADDRESS, which is actually the delegator const VALIDATOR_ADDRESS = process.env.VALIDATOR_ADDRESS; @@ -26,11 +26,15 @@ const currentDelegation = async () => { test('basic', async t => { assert(GOV1ADDR); - const { brand } = walletUtils.agoricNames; + const { brand } = agdWalletUtils.agoricNames; t.is((await currentDelegation()).length, 1, 'just the initial delegation'); - await walletUtils.broadcastBridgeAction(GOV1ADDR, { + /** @type {import('@agoric/ertp').Brand} */ + // @ts-expect-error actually a BoardRemote + const BLDBrand = brand.BLD; + + await agdWalletUtils.broadcastBridgeAction(GOV1ADDR, { method: 'executeOffer', offer: { id: 'request-stake', @@ -41,13 +45,13 @@ test('basic', async t => { }, proposal: { give: { - In: { brand: brand.BLD, value: 10n }, + In: { brand: BLDBrand, value: 10n }, }, }, }, }); - await walletUtils.broadcastBridgeAction(GOV1ADDR, { + await agdWalletUtils.broadcastBridgeAction(GOV1ADDR, { method: 'executeOffer', offer: { id: 'request-delegate-6', @@ -55,11 +59,11 @@ test('basic', async t => { source: 'continuing', previousOffer: 'request-stake', invitationMakerName: 'Delegate', - invitationArgs: [VALIDATOR_ADDRESS, { brand: brand.BLD, value: 10n }], + invitationArgs: [VALIDATOR_ADDRESS, { brand: BLDBrand, value: 10n }], }, proposal: { give: { - In: { brand: brand.BLD, value: 10n }, + In: { brand: BLDBrand, value: 10n }, }, }, }, @@ -72,7 +76,7 @@ test('basic', async t => { // omit 'delegation' because it has 'delegatorAddress' which is different every test run }); - await walletUtils.broadcastBridgeAction(GOV1ADDR, { + await agdWalletUtils.broadcastBridgeAction(GOV1ADDR, { method: 'executeOffer', offer: { id: 'request-undelegate', diff --git a/a3p-integration/proposals/s:stake-bld/test-lib/chain.js b/a3p-integration/proposals/s:stake-bld/test-lib/chain.js deleted file mode 100644 index 1e96c0354ae..00000000000 --- a/a3p-integration/proposals/s:stake-bld/test-lib/chain.js +++ /dev/null @@ -1,140 +0,0 @@ -/** @file copied from packages/agoric-cli */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 -// @ts-check -/* global process */ - -const agdBinary = 'agd'; - -/** - * @param {ReadonlyArray} swingsetArgs - * @param {import('./rpc.js').MinimalNetworkConfig & { - * from: string, - * fees?: string, - * dryRun?: boolean, - * verbose?: boolean, - * keyring?: {home?: string, backend: string} - * stdout?: Pick - * execFileSync: typeof import('child_process').execFileSync - * }} opts - */ -export const execSwingsetTransaction = (swingsetArgs, opts) => { - const { - from, - fees, - dryRun = false, - verbose = true, - keyring = undefined, - chainName, - rpcAddrs, - stdout = process.stdout, - execFileSync, - } = opts; - const homeOpt = keyring?.home ? [`--home=${keyring.home}`] : []; - const backendOpt = keyring?.backend - ? [`--keyring-backend=${keyring.backend}`] - : []; - const feeOpt = fees ? ['--fees', fees] : []; - const cmd = [`--node=${rpcAddrs[0]}`, `--chain-id=${chainName}`].concat( - homeOpt, - backendOpt, - feeOpt, - [`--from=${from}`, 'tx', 'swingset'], - swingsetArgs, - ); - - if (dryRun) { - stdout.write(`Run this interactive command in shell:\n\n`); - stdout.write(`${agdBinary} `); - stdout.write(cmd.join(' ')); - stdout.write('\n'); - } else { - const yesCmd = cmd.concat(['--yes']); - if (verbose) console.log('Executing ', yesCmd); - const out = execFileSync(agdBinary, yesCmd, { encoding: 'utf-8' }); - - // agd puts this diagnostic on stdout rather than stderr :-/ - // "Default sign-mode 'direct' not supported by Ledger, using sign-mode 'amino-json'. - if (out.startsWith('Default sign-mode')) { - const stripDiagnostic = out.replace(/^Default[^\n]+\n/, ''); - return stripDiagnostic; - } - return out; - } -}; -harden(execSwingsetTransaction); - -/** - * @param {import('./rpc.js').MinimalNetworkConfig & { - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * period?: number, - * retryMessage?: string, - * }} opts - * @returns {(l: (b: { time: string, height: string }) => Promise) => Promise} - */ -export const pollBlocks = opts => async lookup => { - const { execFileSync, delay, rpcAddrs, period = 3 * 1000 } = opts; - assert(execFileSync, 'missing execFileSync'); - const { retryMessage } = opts; - - const nodeArgs = [`--node=${rpcAddrs[0]}`]; - - await null; // separate sync prologue - - for (;;) { - const sTxt = execFileSync(agdBinary, ['status', ...nodeArgs]); - const status = JSON.parse(sTxt.toString()); - const { - SyncInfo: { latest_block_time: time, latest_block_height: height }, - } = status; - try { - // see await null above - const result = await lookup({ time, height }); - return result; - } catch (_err) { - console.error( - time, - retryMessage || 'not in block', - height, - 'retrying...', - ); - await delay(period); - } - } -}; - -/** - * @param {string} txhash - * @param {import('./rpc.js').MinimalNetworkConfig & { - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * period?: number, - * }} opts - */ -export const pollTx = async (txhash, opts) => { - const { execFileSync, rpcAddrs, chainName } = opts; - assert(execFileSync, 'missing execFileSync in pollTx'); - - const nodeArgs = [`--node=${rpcAddrs[0]}`]; - const outJson = ['--output', 'json']; - - const lookup = async () => { - const out = execFileSync( - agdBinary, - [ - 'query', - 'tx', - txhash, - `--chain-id=${chainName}`, - ...nodeArgs, - ...outJson, - ], - { stdio: ['ignore', 'pipe', 'ignore'] }, - ); - // XXX this type is defined in a .proto file somewhere - /** @type {{ height: string, txhash: string, code: number, timestamp: string }} */ - const info = JSON.parse(out.toString()); - return info; - }; - return pollBlocks({ ...opts, retryMessage: 'tx not in block' })(lookup); -}; diff --git a/a3p-integration/proposals/s:stake-bld/test-lib/index.js b/a3p-integration/proposals/s:stake-bld/test-lib/index.js index c6970eab1df..b56da4836cc 100644 --- a/a3p-integration/proposals/s:stake-bld/test-lib/index.js +++ b/a3p-integration/proposals/s:stake-bld/test-lib/index.js @@ -1,11 +1,9 @@ /* eslint-env node */ +import { makeSmartWalletKit, LOCAL_CONFIG } from '@agoric/client-utils'; import { execFileSync } from 'child_process'; -import { makeWalletUtils } from './wallet.js'; +import { makeAgdWalletKit } from './wallet.js'; -export const networkConfig = { - rpcAddrs: ['http://0.0.0.0:26657'], - chainName: 'agoriclocal', -}; +export const networkConfig = LOCAL_CONFIG; /** * Resolve after a delay in milliseconds. @@ -15,7 +13,12 @@ export const networkConfig = { */ const delay = ms => new Promise(resolve => setTimeout(() => resolve(), ms)); -export const walletUtils = await makeWalletUtils( - { delay, execFileSync, fetch }, +export const smartWalletKit = await makeSmartWalletKit( + { delay, fetch }, + networkConfig, +); + +export const agdWalletUtils = await makeAgdWalletKit( + { execFileSync, smartWalletKit, delay }, networkConfig, ); diff --git a/a3p-integration/proposals/s:stake-bld/test-lib/rpc.js b/a3p-integration/proposals/s:stake-bld/test-lib/rpc.js deleted file mode 100644 index 2cc3c34913f..00000000000 --- a/a3p-integration/proposals/s:stake-bld/test-lib/rpc.js +++ /dev/null @@ -1,266 +0,0 @@ -/** @file copied from packages/agoric-cli */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 -// @ts-check -/* global Buffer */ - -import { Fail } from '@endo/errors'; -import { - boardSlottingMarshaller, - makeBoardRemote, -} from '@agoric/internal/src/marshal.js'; - -export { boardSlottingMarshaller }; - -export const boardValToSlot = val => { - if ('getBoardId' in val) { - return val.getBoardId(); - } - Fail`unknown obj in boardSlottingMarshaller.valToSlot ${val}`; -}; - -export const networkConfigUrl = agoricNetSubdomain => - `https://${agoricNetSubdomain}.agoric.net/network-config`; -export const rpcUrl = agoricNetSubdomain => - `https://${agoricNetSubdomain}.rpc.agoric.net:443`; - -/** - * @typedef {{ rpcAddrs: string[], chainName: string }} MinimalNetworkConfig - */ - -/** @type {MinimalNetworkConfig} */ -const networkConfig = { - rpcAddrs: ['http://0.0.0.0:26657'], - chainName: 'agoriclocal', -}; -export { networkConfig }; -// console.warn('networkConfig', networkConfig); - -/** - * @param {object} powers - * @param {typeof window.fetch} powers.fetch - * @param {MinimalNetworkConfig} config - */ -export const makeVStorage = (powers, config = networkConfig) => { - /** @param {string} path */ - const getJSON = path => { - const url = config.rpcAddrs[0] + path; - // console.warn('fetching', url); - return powers.fetch(url, { keepalive: true }).then(res => res.json()); - }; - // height=0 is the same as omitting height and implies the highest block - const url = (path = 'published', { kind = 'children', height = 0 } = {}) => - `/abci_query?path=%22/custom/vstorage/${kind}/${path}%22&height=${height}`; - - const readStorage = (path = 'published', { kind = 'children', height = 0 }) => - getJSON(url(path, { kind, height })) - .catch(err => { - throw Error(`cannot read ${kind} of ${path}: ${err.message}`); - }) - .then(data => { - const { - result: { response }, - } = data; - if (response?.code !== 0) { - /** @type {any} */ - const err = Error( - `error code ${response?.code} reading ${kind} of ${path}: ${response.log}`, - ); - err.code = response?.code; - err.codespace = response?.codespace; - throw err; - } - return data; - }); - - return { - url, - decode({ result: { response } }) { - const { code } = response; - if (code !== 0) { - throw response; - } - const { value } = response; - return Buffer.from(value, 'base64').toString(); - }, - /** - * - * @param {string} path - * @returns {Promise} latest vstorage value at path - */ - async readLatest(path = 'published') { - const raw = await readStorage(path, { kind: 'data' }); - return this.decode(raw); - }, - async keys(path = 'published') { - const raw = await readStorage(path, { kind: 'children' }); - return JSON.parse(this.decode(raw)).children; - }, - /** - * @param {string} path - * @param {number} [height] default is highest - * @returns {Promise<{blockHeight: number, values: string[]}>} - */ - async readAt(path, height = undefined) { - const raw = await readStorage(path, { kind: 'data', height }); - const txt = this.decode(raw); - /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); - return JSON.parse(value); - }, - /** - * Read values going back as far as available - * - * @param {string} path - * @param {number | string} [minHeight] - * @returns {Promise} - */ - async readFully(path, minHeight = undefined) { - const parts = []; - // undefined the first iteration, to query at the highest - let blockHeight; - await null; - do { - // console.debug('READING', { blockHeight }); - let values; - try { - ({ blockHeight, values } = await this.readAt( - path, - blockHeight && Number(blockHeight) - 1, - )); - // console.debug('readAt returned', { blockHeight }); - } catch (err) { - if ( - // CosmosSDK ErrNotFound; there is no data at the path - (err.codespace === 'sdk' && err.code === 38) || - // CosmosSDK ErrUnknownRequest; misrepresentation of the same until - // https://github.com/Agoric/agoric-sdk/commit/dafc7c1708977aaa55e245dc09a73859cf1df192 - // TODO remove after upgrade-12 - err.message.match(/unknown request/) - ) { - // console.error(err); - break; - } - throw err; - } - parts.push(values); - // console.debug('PUSHED', values); - // console.debug('NEW', { blockHeight, minHeight }); - if (minHeight && Number(blockHeight) <= Number(minHeight)) break; - } while (blockHeight > 0); - return parts.flat(); - }, - }; -}; -/** @typedef {ReturnType} VStorage */ - -export const makeFromBoard = () => { - const cache = new Map(); - const convertSlotToVal = (boardId, iface) => { - if (cache.has(boardId)) { - return cache.get(boardId); - } - const val = makeBoardRemote({ boardId, iface }); - cache.set(boardId, val); - return val; - }; - return harden({ convertSlotToVal }); -}; -/** @typedef {ReturnType} IdMap */ - -export const storageHelper = { - /** @param { string } txt */ - parseCapData: txt => { - assert(typeof txt === 'string', typeof txt); - /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); - const specimen = JSON.parse(value); - const { blockHeight, values } = specimen; - assert(values, `empty values in specimen ${value}`); - const capDatas = storageHelper.parseMany(values); - return { blockHeight, capDatas }; - }, - /** - * @param {string} txt - * @param {IdMap} ctx - */ - unserializeTxt: (txt, ctx) => { - const { capDatas } = storageHelper.parseCapData(txt); - return capDatas.map(capData => - boardSlottingMarshaller(ctx.convertSlotToVal).fromCapData(capData), - ); - }, - /** @param {string[]} capDataStrings array of stringified capData */ - parseMany: capDataStrings => { - assert(capDataStrings && capDataStrings.length); - /** @type {{ body: string, slots: string[] }[]} */ - const capDatas = capDataStrings.map(s => JSON.parse(s)); - for (const capData of capDatas) { - assert(typeof capData === 'object' && capData !== null); - assert('body' in capData && 'slots' in capData); - assert(typeof capData.body === 'string'); - assert(Array.isArray(capData.slots)); - } - return capDatas; - }, -}; -harden(storageHelper); - -/** - * @param {IdMap} ctx - * @param {VStorage} vstorage - * @returns {Promise} - */ -export const makeAgoricNames = async (ctx, vstorage) => { - const reverse = {}; - const entries = await Promise.all( - ['brand', 'instance', 'vbankAsset'].map(async kind => { - const content = await vstorage.readLatest( - `published.agoricNames.${kind}`, - ); - /** @type {Array<[string, import('@agoric/vats/tools/board-utils.js').BoardRemote]>} */ - const parts = storageHelper.unserializeTxt(content, ctx).at(-1); - for (const [name, remote] of parts) { - if ('getBoardId' in remote) { - reverse[remote.getBoardId()] = name; - } - } - return [kind, Object.fromEntries(parts)]; - }), - ); - return { ...Object.fromEntries(entries), reverse }; -}; - -/** - * @param {{ fetch: typeof window.fetch }} io - * @param {MinimalNetworkConfig} config - */ -export const makeRpcUtils = async ({ fetch }, config = networkConfig) => { - await null; - try { - const vstorage = makeVStorage({ fetch }, config); - const fromBoard = makeFromBoard(); - const agoricNames = await makeAgoricNames(fromBoard, vstorage); - - const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); - - /** @type {(txt: string) => unknown} */ - const unserializeHead = txt => - storageHelper.unserializeTxt(txt, fromBoard).at(-1); - - /** @type {(path: string) => Promise} */ - const readLatestHead = path => - vstorage.readLatest(path).then(unserializeHead); - - return { - agoricNames, - fromBoard, - marshaller, - readLatestHead, - unserializeHead, - vstorage, - }; - } catch (err) { - throw Error(`RPC failure (${config.rpcAddrs}): ${err.message}`); - } -}; -/** @typedef {Awaited>} RpcUtils */ diff --git a/a3p-integration/proposals/s:stake-bld/test-lib/wallet.js b/a3p-integration/proposals/s:stake-bld/test-lib/wallet.js index 5fbe9b70027..fa8e8ca5112 100644 --- a/a3p-integration/proposals/s:stake-bld/test-lib/wallet.js +++ b/a3p-integration/proposals/s:stake-bld/test-lib/wallet.js @@ -1,143 +1,21 @@ -/** - * @file copied from packages/agoric-cli, - * removing polling and coalescing features whose dependencies cause import problems here - */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 // @ts-check -/* global */ -import { E, Far } from '@endo/far'; +import { sendAction } from 'agoric/src/lib/index.js'; import { inspect } from 'util'; -import { execSwingsetTransaction, pollTx } from './chain.js'; -import { makeRpcUtils } from './rpc.js'; - -/** @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js' */ -/** @import {AgoricNamesRemotes} from '@agoric/vats/tools/board-utils.js' */ - -/** - * @template T - * @param follower - * @param [options] - */ -export const iterateReverse = (follower, options) => - // For now, just pass through the iterable. - Far('iterateReverse iterable', { - /** @returns {AsyncIterator} */ - [Symbol.asyncIterator]: () => { - const eachIterable = E(follower).getReverseIterable(options); - const iterator = E(eachIterable)[Symbol.asyncIterator](); - return Far('iterateEach iterator', { - next: () => E(iterator).next(), - }); - }, - }); - -/** @type {CurrentWalletRecord} */ -const emptyCurrentRecord = { - purses: [], - offerToUsedInvitation: [], - offerToPublicSubscriberPaths: [], - liveOffers: [], -}; - -/** - * @param {string} addr - * @param {Pick} io - * @returns {Promise} - */ -export const getCurrent = async (addr, { readLatestHead }) => { - // Partial because older writes may not have had all properties - // NB: assumes changes are only additions - let current = - /** @type {Partial | undefined} */ ( - await readLatestHead(`published.wallet.${addr}.current`) - ); - if (current === undefined) { - throw Error(`undefined current node for ${addr}`); - } - - // Repair a type misunderstanding seen in the wild. - // See https://github.com/Agoric/agoric-sdk/pull/7139 - let offerToUsedInvitation = current.offerToUsedInvitation; - if ( - offerToUsedInvitation && - typeof offerToUsedInvitation === 'object' && - !Array.isArray(offerToUsedInvitation) - ) { - offerToUsedInvitation = Object.entries(offerToUsedInvitation); - current = harden({ - ...current, - offerToUsedInvitation, - }); - } - - // override full empty record with defined values from published one - return { ...emptyCurrentRecord, ...current }; -}; /** - * @param {string} addr - * @param {Pick} io - * @returns {Promise} - */ -export const getLastUpdate = (addr, { readLatestHead }) => { - // @ts-expect-error cast - return readLatestHead(`published.wallet.${addr}`); -}; - -/** - * Sign and broadcast a wallet-action. + * Stop-gap using execFileSync until we have a pure JS signing client. * - * @throws { Error & { code: number } } if transaction fails - * @param {import('@agoric/smart-wallet/src/smartWallet.js').BridgeAction} bridgeAction - * @param {import('./rpc.js').MinimalNetworkConfig & { - * from: string, - * marshaller: import('@endo/marshal').Marshal<'string'>, - * fees?: string, - * verbose?: boolean, - * keyring?: {home?: string, backend: string}, - * stdout: Pick, - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * dryRun?: boolean, - * }} opts + * @param {object} root0 + * @param {import('child_process')['execFileSync']} root0.execFileSync + * @param {import('@agoric/client-utils').SmartWalletKit} root0.smartWalletKit + * @param {any} root0.delay + * @param {import('@agoric/client-utils').MinimalNetworkConfig} networkConfig */ -export const sendAction = async (bridgeAction, opts) => { - const { marshaller } = opts; - const offerBody = JSON.stringify(marshaller.toCapData(harden(bridgeAction))); - - // tryExit should not require --allow-spend - // https://github.com/Agoric/agoric-sdk/issues/7291 - const spendMethods = ['executeOffer', 'tryExitOffer']; - const spendArg = spendMethods.includes(bridgeAction.method) - ? ['--allow-spend'] - : []; - - const act = ['wallet-action', ...spendArg, offerBody]; - const out = execSwingsetTransaction([...act, '--output', 'json'], opts); - if (opts.dryRun) { - return; - } - - assert(out); // not dry run - const tx = JSON.parse(out); - if (tx.code !== 0) { - const err = Error(`failed to send tx: ${tx.raw_log} code: ${tx.code}`); - // @ts-expect-error XXX how to add properties to an error? - err.code = tx.code; - throw err; - } - - return pollTx(tx.txhash, opts); -}; - -export const makeWalletUtils = async ( - { delay, execFileSync, fetch }, +export const makeAgdWalletKit = async ( + { execFileSync, smartWalletKit, delay }, networkConfig, ) => { - const { agoricNames, fromBoard, marshaller, readLatestHead, vstorage } = - await makeRpcUtils({ fetch }, networkConfig); - /** * * @param {string} from @@ -150,17 +28,12 @@ export const makeWalletUtils = async ( delay, execFileSync, from, - marshaller, keyring: { backend: 'test' }, }); }; return { - agoricNames, + ...smartWalletKit, broadcastBridgeAction, - fromBoard, - networkConfig, - readLatestHead, - vstorage, }; }; diff --git a/a3p-integration/proposals/s:stake-bld/tsconfig.json b/a3p-integration/proposals/s:stake-bld/tsconfig.json new file mode 100644 index 00000000000..8672f62769d --- /dev/null +++ b/a3p-integration/proposals/s:stake-bld/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "noEmit": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "allowJs": true, + "checkJs": true, + "strict": false, + "strictNullChecks": true, + "noImplicitThis": true, + // XXX synthetic-chain has some errors + "skipLibCheck": true + }, + "exclude": ["submission"] +} diff --git a/a3p-integration/proposals/s:stake-bld/yarn.lock b/a3p-integration/proposals/s:stake-bld/yarn.lock index 0b3c412ed00..1799fda5d88 100644 --- a/a3p-integration/proposals/s:stake-bld/yarn.lock +++ b/a3p-integration/proposals/s:stake-bld/yarn.lock @@ -5,23 +5,15 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/access-token@npm:0.4.22-dev-5676146.0+5676146": - version: 0.4.22-dev-5676146.0 - resolution: "@agoric/access-token@npm:0.4.22-dev-5676146.0" +"@agoric/access-token@portal:../../agoric-sdk/packages/access-token::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/access-token@portal:../../agoric-sdk/packages/access-token::locator=root-workspace-0b6124%40workspace%3A." dependencies: n-readlines: "npm:^1.0.0" proper-lockfile: "npm:^4.1.2" tmp: "npm:^0.2.1" - checksum: 10c0/c1fe4f9f1eaf2e4334ec190099f03d2ccff024e0b06693784230ccac6fbe7a98ebce63f365fade828b9c02c8967239e92c8fa0592d2661086e3b31eecd46e3b0 languageName: node - linkType: hard - -"@agoric/assert@npm:0.6.1-dev-5676146.0+5676146": - version: 0.6.1-dev-5676146.0 - resolution: "@agoric/assert@npm:0.6.1-dev-5676146.0" - checksum: 10c0/3391d53d64f4ca74ae5a87b623dc7489a20d91f45716723c33e393cfe6536fb1553344b72d24ac966f49b83d56906140c263778968ff513dfcdbb30e1be68091 - languageName: node - linkType: hard + linkType: soft "@agoric/babel-generator@npm:^7.17.6": version: 7.17.6 @@ -34,314 +26,308 @@ __metadata: languageName: node linkType: hard -"@agoric/base-zone@npm:0.1.1-dev-5676146.0+5676146": - version: 0.1.1-dev-5676146.0 - resolution: "@agoric/base-zone@npm:0.1.1-dev-5676146.0" +"@agoric/base-zone@portal:../../agoric-sdk/packages/base-zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/base-zone@portal:../../agoric-sdk/packages/base-zone::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@endo/common": "npm:^1.1.0" - "@endo/exo": "npm:^1.2.1" - "@endo/far": "npm:^1.0.4" - "@endo/pass-style": "npm:^1.2.0" - "@endo/patterns": "npm:^1.2.0" - checksum: 10c0/b3dfa47af7cf4a686244e2a31243394b44756f127a7612f5d50c77b1a91f777514386c305866705b46219d2d1e0df2b8d5bff9e08f82275043bb0c198c0601e4 + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft -"@agoric/cache@npm:0.3.3-dev-5676146.0+5676146": - version: 0.3.3-dev-5676146.0 - resolution: "@agoric/cache@npm:0.3.3-dev-5676146.0" +"@agoric/cache@portal:../../agoric-sdk/packages/cache::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/cache@portal:../../agoric-sdk/packages/cache::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - checksum: 10c0/b2967955f99d3cfe9b30700373275290183a5b6284703b6bbfff98246342bd7ff995addc48e31a8b2c52c9330c1aed5566f9e73fc0ae5b753478c961d7cdf258 + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" languageName: node - linkType: hard + linkType: soft -"@agoric/casting@npm:0.4.3-dev-5676146.0+5676146": - version: 0.4.3-dev-5676146.0 - resolution: "@agoric/casting@npm:0.4.3-dev-5676146.0" +"@agoric/casting@portal:../../agoric-sdk/packages/casting::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/casting@portal:../../agoric-sdk/packages/casting::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/spawner": "npm:0.6.9-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" "@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/far": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/lockdown": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/promise-kit": "npm:^1.0.4" - node-fetch: "npm:^2.6.0" - checksum: 10c0/548c929c6535aea1d0a8e2cbc7fc3ec57d04dd8fd5b6e62ee565b674f8a87efe82536091e182a71a985244c0459e19b0195fc81b80a22c480859c37a69815367 + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/cosmic-proto@npm:0.4.1-dev-5676146.0+5676146": - version: 0.4.1-dev-5676146.0 - resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-5676146.0" +"@agoric/client-utils@portal:../../agoric-sdk/packages/client-utils::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/client-utils@portal:../../agoric-sdk/packages/client-utils::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@cosmjs/amino": "npm:^0.32.3" - "@cosmjs/proto-signing": "npm:^0.32.3" + "@agoric/casting": "npm:^0.4.3-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/smart-wallet": "npm:^0.5.4-u18.4" + "@agoric/vats": "npm:^0.16.0-u18.4" "@cosmjs/stargate": "npm:^0.32.3" "@cosmjs/tendermint-rpc": "npm:^0.32.3" - "@endo/init": "npm:^1.0.3" - axios: "npm:^1.6.7" - checksum: 10c0/dc5a39feebce9209a393c37f6bfe6be550600718b2c841e13750a92d3a734d5ed718beb3d7532829c2da5e0344cf96b82f8d779dfc30d4b2c266d89902e2f4b8 + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/ertp@npm:0.16.3-dev-5676146.0+5676146": - version: 0.16.3-dev-5676146.0 - resolution: "@agoric/ertp@npm:0.16.3-dev-5676146.0" +"@agoric/cosmic-proto@portal:../../agoric-sdk/packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/cosmic-proto@portal:../../agoric-sdk/packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/zone": "npm:0.2.3-dev-5676146.0+5676146" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/6a3ef33e6b1052253346a651f6f193dbda9551a2ed3f36f63af0b9da4d27ed80bdf63251f97cc631105c923ac23440ef456198f1b15b56b6aba86ec1a590b6f6 - languageName: node - linkType: hard - -"@agoric/governance@npm:0.10.4-dev-5676146.0+5676146": - version: 0.10.4-dev-5676146.0 - resolution: "@agoric/governance@npm:0.10.4-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/network": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/time": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/zoe": "npm:0.26.3-dev-5676146.0+5676146" - "@endo/bundle-source": "npm:^3.1.0" - "@endo/captp": "npm:^4.0.4" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/promise-kit": "npm:^1.0.4" + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + bech32: "npm:^2.0.0" + query-string: "npm:^9.1.1" + languageName: node + linkType: soft + +"@agoric/ertp@portal:../../agoric-sdk/packages/ERTP::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/ertp@portal:../../agoric-sdk/packages/ERTP::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + languageName: node + linkType: soft + +"@agoric/governance@portal:../../agoric-sdk/packages/governance::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/governance@portal:../../agoric-sdk/packages/governance::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.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/zoe": "npm:^0.26.3-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" import-meta-resolve: "npm:^2.2.1" - checksum: 10c0/64a8a0579fde6dd60630175e5d1bd0a370532c993700049352f2cc83dbfde6cac90b1671acf625afadcc3449a8f4872d1dacc194f8724281b5ac82e6c1b887d1 - languageName: node - linkType: hard - -"@agoric/inter-protocol@npm:0.16.2-dev-5676146.0+5676146": - version: 0.16.2-dev-5676146.0 - resolution: "@agoric/inter-protocol@npm:0.16.2-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/governance": "npm:0.10.4-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/time": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/vats": "npm:0.15.2-dev-5676146.0+5676146" - "@agoric/zoe": "npm:0.26.3-dev-5676146.0+5676146" - "@endo/captp": "npm:^4.0.4" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/promise-kit": "npm:^1.0.4" - jessie.js: "npm:^0.3.2" - checksum: 10c0/6216bb903dc4b292f6b24fdc6121cd3540ebdd402f4c81dded60b00bbf2f8130c25a2565ccb80ffc68dbc2b625d0459df3215cbf69585ed84f101a5d53351e4c languageName: node - linkType: hard + linkType: soft -"@agoric/internal@npm:0.3.3-dev-5676146.0, @agoric/internal@npm:0.3.3-dev-5676146.0+5676146": - version: 0.3.3-dev-5676146.0 - resolution: "@agoric/internal@npm:0.3.3-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/base-zone": "npm:0.1.1-dev-5676146.0+5676146" - "@endo/common": "npm:^1.1.0" - "@endo/far": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - "@endo/stream": "npm:^1.1.0" +"@agoric/inter-protocol@portal:../../agoric-sdk/packages/inter-protocol::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/inter-protocol@portal:../../agoric-sdk/packages/inter-protocol::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-u18.0" + "@agoric/internal": "npm:^0.4.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.4" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + jessie.js: "npm:^0.3.4" + languageName: node + linkType: soft + +"@agoric/internal@portal:../../agoric-sdk/packages/internal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/internal@portal:../../agoric-sdk/packages/internal::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" anylogger: "npm:^0.21.0" - jessie.js: "npm:^0.3.2" - checksum: 10c0/cd2a81ff39790a1b333621b3815f0791b70d0822f201d491175e46602697c80814f1fb87a610167e541a9ad431a771cd7348afe24517a15c45d1591d3d494bc2 + jessie.js: "npm:^0.3.4" languageName: node - linkType: hard + linkType: soft -"@agoric/kmarshal@npm:0.1.1-dev-5676146.0+5676146": - version: 0.1.1-dev-5676146.0 - resolution: "@agoric/kmarshal@npm:0.1.1-dev-5676146.0" +"@agoric/kmarshal@portal:../../agoric-sdk/packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/kmarshal@portal:../../agoric-sdk/packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - checksum: 10c0/6acd0de1ad1cb2b4bd6065f13394222476a713be169dd7979a26934f223bcac2222d9e1560327f31417a774501e82703dce3c0cae0a327eae955e2072e8587d7 + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" languageName: node - linkType: hard + linkType: soft -"@agoric/network@npm:0.1.1-dev-5676146.0+5676146": - version: 0.1.1-dev-5676146.0 - resolution: "@agoric/network@npm:0.1.1-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@endo/base64": "npm:^1.0.2" - "@endo/far": "npm:^1.0.4" - "@endo/patterns": "npm:^1.1.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/92207ef3889c53526490de4d62b93788dfb009fb70809b473a50993adc0bc8fbbd2be8da43db78a51b5df9af19d7cbe24aab55c958daf4bdcb86ae1e6e55af95 +"@agoric/network@portal:../../agoric-sdk/packages/network::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/network@portal:../../agoric-sdk/packages/network::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/notifier@npm:0.6.3-dev-5676146.0+5676146": - version: 0.6.3-dev-5676146.0 - resolution: "@agoric/notifier@npm:0.6.3-dev-5676146.0" +"@agoric/notifier@portal:../../agoric-sdk/packages/notifier::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/notifier@portal:../../agoric-sdk/packages/notifier::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/5357e05ff60d962189658e9476307f5c3a8fd4f6cf82d30dd4526050c5f747f33eafeb8cdb25753c61d91e1390a4c8408424fd6d15ecb103add72e5113b0c4a1 - languageName: node - linkType: hard - -"@agoric/smart-wallet@npm:0.5.4-dev-5676146.0+5676146": - version: 0.5.4-dev-5676146.0 - resolution: "@agoric/smart-wallet@npm:0.5.4-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/casting": "npm:0.4.3-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/vats": "npm:0.15.2-dev-5676146.0+5676146" - "@agoric/zoe": "npm:0.26.3-dev-5676146.0+5676146" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/cc46165846a0d0b3f7290ec4f5fe60030f3272ee7278bd49274634daee5000d96222e2ed3e72f724943100101cee4d2f760e0bf2d5c08620b89930d3fbed5715 + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/spawner@npm:0.6.9-dev-5676146.0+5676146": - version: 0.6.9-dev-5676146.0 - resolution: "@agoric/spawner@npm:0.6.9-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/import-bundle": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - checksum: 10c0/4f605a59a2da5fef37faf8923ebeb237e789f65f678a192c926bb1ccb3ead49eecb75b9120971da9cc4d046de0503087af38814e69811e9d6bfa7d1559b0c510 +"@agoric/smart-wallet@portal:../../agoric-sdk/packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/smart-wallet@portal:../../agoric-sdk/packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@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/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/store@npm:0.9.3-dev-5676146.0+5676146": - version: 0.9.3-dev-5676146.0 - resolution: "@agoric/store@npm:0.9.3-dev-5676146.0" +"@agoric/store@portal:../../agoric-sdk/packages/store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/store@portal:../../agoric-sdk/packages/store::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@endo/exo": "npm:^1.2.1" - "@endo/marshal": "npm:^1.3.0" - "@endo/pass-style": "npm:^1.2.0" - "@endo/patterns": "npm:^1.2.0" - checksum: 10c0/675e73bbcac024c456b658583ec3fd14a50f69fea5fc07aadf30e593978e5cadbc82d365b13976967b5509614a7adf0adad4e84712f7e0b6c13f2a2a93c9ea63 + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft -"@agoric/swing-store@npm:0.9.2-dev-5676146.0+5676146": - version: 0.9.2-dev-5676146.0 - resolution: "@agoric/swing-store@npm:0.9.2-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@endo/base64": "npm:^1.0.2" - "@endo/bundle-source": "npm:^3.1.0" - "@endo/check-bundle": "npm:^1.0.4" - "@endo/nat": "npm:^5.0.4" +"@agoric/swing-store@portal:../../agoric-sdk/packages/swing-store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swing-store@portal:../../agoric-sdk/packages/swing-store::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" better-sqlite3: "npm:^9.1.1" - checksum: 10c0/4f18b4051bc41fb153da4b750144db727f9b59e8fd18196eea1427d12028b47ebf8448b14c47708a2347ed2a4c1ed887fdcf2c0048b5ab4e84869cd17e3dc935 languageName: node - linkType: hard + linkType: soft -"@agoric/swingset-liveslots@npm:0.10.3-dev-5676146.0+5676146": - version: 0.10.3-dev-5676146.0 - resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@endo/env-options": "npm:^1.1.1" - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/exo": "npm:^1.2.1" - "@endo/far": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/pass-style": "npm:^1.2.0" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/17ff4c6b94992d5532b748b4b20a95d273f8eb9ee7345552b95050de90563f5f2b03416ff60b9ca3ce07564bb4f3aa993fbf7710f6b24dc88d902b701a8b6a91 - languageName: node - linkType: hard - -"@agoric/swingset-vat@npm:0.32.3-dev-5676146.0+5676146": - version: 0.32.3-dev-5676146.0 - resolution: "@agoric/swingset-vat@npm:0.32.3-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/kmarshal": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/swing-store": "npm:0.9.2-dev-5676146.0+5676146" - "@agoric/swingset-liveslots": "npm:0.10.3-dev-5676146.0+5676146" - "@agoric/swingset-xsnap-supervisor": "npm:0.10.3-dev-5676146.0+5676146" - "@agoric/time": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/xsnap": "npm:0.14.3-dev-5676146.0+5676146" - "@agoric/xsnap-lockdown": "npm:0.14.1-dev-5676146.0+5676146" - "@endo/base64": "npm:^1.0.2" - "@endo/bundle-source": "npm:^3.1.0" - "@endo/captp": "npm:^4.0.4" - "@endo/check-bundle": "npm:^1.0.4" - "@endo/compartment-mapper": "npm:^1.1.2" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/import-bundle": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - "@endo/ses-ava": "npm:^1.1.2" - "@endo/stream": "npm:^1.1.0" - "@endo/zip": "npm:^1.0.2" +"@agoric/swingset-liveslots@portal:../../agoric-sdk/packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-liveslots@portal:../../agoric-sdk/packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/swingset-vat@portal:../../agoric-sdk/packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-vat@portal:../../agoric-sdk/packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/kmarshal": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swing-store": "npm:^0.10.0-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-xsnap-supervisor": "npm:^0.10.3-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/xsnap-lockdown": "npm:^0.14.1-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" ansi-styles: "npm:^6.2.1" anylogger: "npm:^0.21.0" better-sqlite3: "npm:^9.1.1" @@ -351,23 +337,22 @@ __metadata: tmp: "npm:^0.2.1" yargs-parser: "npm:^21.1.1" peerDependencies: + "@agoric/xsnap": ^0.14.2 ava: ^5.3.0 bin: vat: bin/vat - checksum: 10c0/5eaa97f9e9a71bf20c590d44693c97e12bfbf42e2ce15991d48e3393ff1f9561b8e7717fa63dabc3c0d720795e8922452485003e86b68e307d90bd6aea4c79b0 languageName: node - linkType: hard + linkType: soft -"@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-5676146.0+5676146": - version: 0.10.3-dev-5676146.0 - resolution: "@agoric/swingset-xsnap-supervisor@npm:0.10.3-dev-5676146.0" - checksum: 10c0/495c847ccb69bcfb338e27a2b423ec480e303c52c51e0496aaeea820d17af100c59f2d45e540517c8eba4aea9645ef6c3e200ad3834d46087b4a21671791e077 +"@agoric/swingset-xsnap-supervisor@portal:../../agoric-sdk/packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-xsnap-supervisor@portal:../../agoric-sdk/packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A." languageName: node - linkType: hard + linkType: soft -"@agoric/synthetic-chain@npm:^0.3.0": - version: 0.3.0 - resolution: "@agoric/synthetic-chain@npm:0.3.0" +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" dependencies: "@endo/zip": "npm:^1.0.7" better-sqlite3: "npm:^9.6.0" @@ -376,149 +361,128 @@ __metadata: execa: "npm:^9.3.1" bin: synthetic-chain: dist/cli/cli.js - checksum: 10c0/17c6241bdc48b8a2a7608c9d4d7c0a0c76fb10d4ee44a31a1150104a792bcd1133f4b1a7e8ab26673a07450b3ceabccd9911999117568221b49221b6ee4306a1 + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b languageName: node linkType: hard -"@agoric/time@npm:0.3.3-dev-5676146.0+5676146": - version: 0.3.3-dev-5676146.0 - resolution: "@agoric/time@npm:0.3.3-dev-5676146.0" +"@agoric/time@portal:../../agoric-sdk/packages/time::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/time@portal:../../agoric-sdk/packages/time::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - checksum: 10c0/a221f90a327ffaf9eccc6943b1f59b97b200df3a9932b9da7aee484f938e919302069b056182035d6681ebb3b70759841bcf221549f91f172f89848372efe30a + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft -"@agoric/vat-data@npm:0.5.3-dev-5676146.0+5676146": - version: 0.5.3-dev-5676146.0 - resolution: "@agoric/vat-data@npm:0.5.3-dev-5676146.0" +"@agoric/vat-data@portal:../../agoric-sdk/packages/vat-data::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vat-data@portal:../../agoric-sdk/packages/vat-data::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/base-zone": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/swingset-liveslots": "npm:0.10.3-dev-5676146.0+5676146" - "@agoric/vow": "npm:0.1.1-dev-5676146.0+5676146" - checksum: 10c0/2c08e571cf1ab9af2dc1214c1d7fb9b73446ed9ddaca3a10db2b90160138c07728a0d37cfc9748a37dd424a2945da706bfecc152b2b87fbb59e81bdafaba0e77 + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft -"@agoric/vats@npm:0.15.2-dev-5676146.0+5676146": - version: 0.15.2-dev-5676146.0 - resolution: "@agoric/vats@npm:0.15.2-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/governance": "npm:0.10.4-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/network": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/swingset-vat": "npm:0.32.3-dev-5676146.0+5676146" - "@agoric/time": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/zoe": "npm:0.26.3-dev-5676146.0+5676146" - "@agoric/zone": "npm:0.2.3-dev-5676146.0+5676146" - "@endo/far": "npm:^1.0.4" - "@endo/import-bundle": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" +"@agoric/vats@portal:../../agoric-sdk/packages/vats::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vats@portal:../../agoric-sdk/packages/vats::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-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/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@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/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" import-meta-resolve: "npm:^2.2.1" - jessie.js: "npm:^0.3.2" - checksum: 10c0/ac5117f609b112bf8902488d4769c3f6670cc3402cbe8e75db1c8f227f25e4334b5b447d4fa29cfe674e6d3b93554cdfd3d5858dff6c5b48f89b6e24af636da4 + jessie.js: "npm:^0.3.4" languageName: node - linkType: hard + linkType: soft -"@agoric/vow@npm:0.1.1-dev-5676146.0+5676146": - version: 0.1.1-dev-5676146.0 - resolution: "@agoric/vow@npm:0.1.1-dev-5676146.0" +"@agoric/vow@portal:../../agoric-sdk/packages/vow::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vow@portal:../../agoric-sdk/packages/vow::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-5676146.0+5676146" - "@endo/env-options": "npm:^1.1.1" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/pass-style": "npm:^1.2.0" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/e0aa219b31e962b784bf4c48a2108b032aecf60c7cf05393e305c0279abee887a81879ca6999eb56cbaedebc656d7d575715ba5c470dd624f62304624475de60 + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/xsnap-lockdown@npm:0.14.1-dev-5676146.0+5676146": - version: 0.14.1-dev-5676146.0 - resolution: "@agoric/xsnap-lockdown@npm:0.14.1-dev-5676146.0" - checksum: 10c0/8faa700ff6049b9cd29109c42e2ef3b228f18e265a5908e987af4ee32127e9b6451b7299538ec8fa50514c359f2b0b9a60beb6a5d2e126928def1e5232a3d919 +"@agoric/xsnap-lockdown@portal:../../agoric-sdk/packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/xsnap-lockdown@portal:../../agoric-sdk/packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A." languageName: node - linkType: hard + linkType: soft -"@agoric/xsnap@npm:0.14.3-dev-5676146.0+5676146": - version: 0.14.3-dev-5676146.0 - resolution: "@agoric/xsnap@npm:0.14.3-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/xsnap-lockdown": "npm:0.14.1-dev-5676146.0+5676146" - "@endo/bundle-source": "npm:^3.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/init": "npm:^1.0.4" - "@endo/netstring": "npm:^1.0.4" - "@endo/promise-kit": "npm:^1.0.4" - "@endo/stream": "npm:^1.1.0" - "@endo/stream-node": "npm:^1.0.4" - glob: "npm:^7.1.6" - tmp: "npm:^0.2.1" - bin: - ava-xs: src/ava-xs.js - xsrepl: src/xsrepl - checksum: 10c0/0f5461b8c5cafa94388720cdcbd5b9fc65e0f2416d9084e3e90b60728cf050fcd95c009a67fda284cee2471058814ba504e655e0a3de82cbbc36e03c24e9fc50 - languageName: node - linkType: hard - -"@agoric/zoe@npm:0.26.3-dev-5676146.0+5676146": - version: 0.26.3-dev-5676146.0 - resolution: "@agoric/zoe@npm:0.26.3-dev-5676146.0" - dependencies: - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/base-zone": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/notifier": "npm:0.6.3-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/swingset-liveslots": "npm:0.10.3-dev-5676146.0+5676146" - "@agoric/swingset-vat": "npm:0.32.3-dev-5676146.0+5676146" - "@agoric/time": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@agoric/zone": "npm:0.2.3-dev-5676146.0+5676146" - "@endo/bundle-source": "npm:^3.1.0" - "@endo/captp": "npm:^4.0.4" - "@endo/common": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/exo": "npm:^1.2.1" - "@endo/far": "npm:^1.0.4" - "@endo/import-bundle": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" +"@agoric/zoe@portal:../../agoric-sdk/packages/zoe::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zoe@portal:../../agoric-sdk/packages/zoe::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" yargs-parser: "npm:^21.1.1" - checksum: 10c0/4db929e776483dd41c0453d322fe93d27d35826ab98e31e257314e41f2eb6c86eb2a1da09761790bbc5f2bfa41a348ef5c84534044b6d1de576eca1ecea31a82 languageName: node - linkType: hard + linkType: soft -"@agoric/zone@npm:0.2.3-dev-5676146.0+5676146": - version: 0.2.3-dev-5676146.0 - resolution: "@agoric/zone@npm:0.2.3-dev-5676146.0" +"@agoric/zone@portal:../../agoric-sdk/packages/zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zone@portal:../../agoric-sdk/packages/zone::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/vat-data": "npm:0.5.3-dev-5676146.0+5676146" - "@endo/far": "npm:^1.0.4" - "@endo/pass-style": "npm:^1.2.0" - checksum: 10c0/82a7f1c741bb1c6bfca6398686e71b47135ee584f794dbbfc01ecdb37aea37a2607d857532caefd5c61a03f90a3fb7ac02374c189d4510b759209276f631a8d6 + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft "@babel/code-frame@npm:^7.23.5": version: 7.23.5 @@ -873,375 +837,298 @@ __metadata: languageName: node linkType: hard -"@endo/base64@npm:^1.0.2": - version: 1.0.2 - resolution: "@endo/base64@npm:1.0.2" - checksum: 10c0/287d969b8ca3075d7580d33ffe52965048b28ec1f5d0800522b41eae30c1ba7f2fb059a4002e4a9882b8565e2e6d7281a66c3fb93b15d7b3ea498aff0c080aca +"@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:^3.1.0": - version: 3.1.0 - resolution: "@endo/bundle-source@npm:3.1.0" - dependencies: - "@endo/base64": "npm:^1.0.2" - "@endo/compartment-mapper": "npm:^1.1.2" - "@endo/evasive-transform": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/promise-kit": "npm:^1.0.4" - "@endo/where": "npm:^1.0.2" +"@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/615683c7ea36d2293247052f28c84171c37c2654ea16f8578e52b5bcad7a598f070dfac718239367cab5a1998b8f837a74c46f83e0869793f5d52ec06cffa9dc + bundle-source: ./src/tool.js + checksum: 10c0/7f97194c97eb28abbde6655f7de4410d5aae5d6a2a3d712e1418b9b4fd20823333b7fe8956401c2f201280340731e51e28d9c4fbe3b5a787b0abd00e3ac13b52 languageName: node linkType: hard -"@endo/captp@npm:^4.0.4": - version: 4.0.4 - resolution: "@endo/captp@npm:4.0.4" +"@endo/captp@npm:^4.4.3": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" dependencies: - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/609f7e5f7d8343f6317c531178ab7f6217030451b355baf21770b5698749c3d7375df7ed40e1ad271a99dd28c2e10272b262e45563af1db8e7c812c132aab424 + "@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:^1.0.4": - version: 1.0.4 - resolution: "@endo/check-bundle@npm:1.0.4" +"@endo/check-bundle@npm:^1.0.12": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" dependencies: - "@endo/base64": "npm:^1.0.2" - "@endo/compartment-mapper": "npm:^1.1.2" - "@endo/errors": "npm:^1.1.0" - checksum: 10c0/1e07127229e8b76203f809cdac74c34999ec85726756206f5855c157df69b107d3e69010630e9fa2ba9cc4e29b96b4c41cd6920fead090c67a1a1cfd6031898a + "@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:^1.0.2": - version: 1.0.2 - resolution: "@endo/cjs-module-analyzer@npm:1.0.2" - checksum: 10c0/294d05790408a8d1bac90cbd1811d3c44aba6c311cfbcf61d6cbe4536fdcbc2018ba81133f116cd6deb35d1f0e10a248a2e4bcfcc5799cfc28733e3201a82388 +"@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.1.0": - version: 1.1.0 - resolution: "@endo/common@npm:1.1.0" +"@endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" dependencies: - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/dc8e80366345875d977c5ce31153368cff6853154ed245423f7330061c0c935b52f657c7b6fbcb8fecb7137f0a68ba23849dfe0f71cf7401536c32ff8fcacefd + "@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:^1.1.2": - version: 1.1.2 - resolution: "@endo/compartment-mapper@npm:1.1.2" +"@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.2" - "@endo/static-module-record": "npm:^1.0.4" - "@endo/zip": "npm:^1.0.2" - ses: "npm:^1.3.0" - checksum: 10c0/abb8dae4339851834e17f9353b262e44f33a1a87ed409a0b40569a19cde200de75cb407cf0aaba73b39e5766c10ee170496a82fbeb1b24f4029433bed7324e24 - languageName: node - linkType: hard - -"@endo/env-options@npm:^0.1.4": - version: 0.1.4 - resolution: "@endo/env-options@npm:0.1.4" - checksum: 10c0/5bf49d362849090bff328b15f906adb5b8b6220815e8955e45f81e7ff9a8ab17e509fff8bf30f4c619772f4f1a8cba8f1ca90faec724b53b5b3f1c89050c6b44 + "@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:^1.1.1": - version: 1.1.1 - resolution: "@endo/env-options@npm:1.1.1" - checksum: 10c0/05bfb5630b88f79f402dfab9c57b60381dca4e2090d96ff64b04f7e461af709c9df599621413bed9ed8f6cc8493ee397dc7dc282d7089e49bf9297c1200a44f6 +"@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/env-options@npm:^1.1.4": - version: 1.1.4 - resolution: "@endo/env-options@npm:1.1.4" - checksum: 10c0/8816c8fe1332a6f3366e7e4849b000d757fcd181eac011ed8363ccc4e66dfa2f2d975f8d5cbfb3844f3e327c5391e77ee7e234a59a21744c74c945f683b56df1 - languageName: node - linkType: hard - -"@endo/errors@npm:^1.1.0": - version: 1.1.0 - resolution: "@endo/errors@npm:1.1.0" - dependencies: - ses: "npm:^1.3.0" - checksum: 10c0/3c909f5d76c9d1c0545f72c3e9d5ddb81518f85ea40b3093af01fac828e12fb1f689ba026898f89c5d29e634df7e0e055a1486c47ce939a890c21f2100ecc086 - languageName: node - linkType: hard - -"@endo/errors@npm:^1.2.2": - version: 1.2.2 - resolution: "@endo/errors@npm:1.2.2" +"@endo/errors@npm:^1.2.2, @endo/errors@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" dependencies: - ses: "npm:^1.5.0" - checksum: 10c0/d90baaf803b17130b83fbc562e253504a6a05e4843d63536e74578503f6bd937fdba3464c4d8eeb9df16b795639cd9c4aad143520525f9e54aa3e91dc5184c17 + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 languageName: node linkType: hard -"@endo/evasive-transform@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/evasive-transform@npm:1.0.4" +"@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: "npm:0.7.4" - checksum: 10c0/9fb9159218ac8f8a145c20305bda3515bbce8401863f942865f00f2aa2ad3b9f64cc180121c60556ff41b2e1a5968d27a61d7f034cfb6d3224dd2caef4b82175 + source-map-js: "npm:^1.2.0" + checksum: 10c0/34fae4789ab3142ab73a5c94a46954908737bbc72f1e302c338941ca2556ab2127505ecee57a1c0d11e0b9c7070b4a579ce4e7e60585990161cec64ce0955211 languageName: node linkType: hard -"@endo/eventual-send@npm:^0.17.6": - version: 0.17.6 - resolution: "@endo/eventual-send@npm:0.17.6" - dependencies: - "@endo/env-options": "npm:^0.1.4" - checksum: 10c0/3a8dae48e06ad3a8fdad074d0b6b10ced09f1e440f04f802d98372243ed8ead97278d85d4aa4a310dee34bc7146f09e7aaf6d01b7c06cbe3f8610544c97b5ce2 - languageName: node - linkType: hard - -"@endo/eventual-send@npm:^1.1.2": - version: 1.1.2 - resolution: "@endo/eventual-send@npm:1.1.2" - dependencies: - "@endo/env-options": "npm:^1.1.1" - checksum: 10c0/4d704e9a905b4003735da8d3b198139885dd007db87835d05be8f69189773774116ac7a9a512cdf9d8cf68ca88dcff6eca1596d32aed589734aa50ad18e086ed - languageName: node - linkType: hard - -"@endo/exo@npm:^1.2.1": - version: 1.2.1 - resolution: "@endo/exo@npm:1.2.1" +"@endo/eventual-send@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/eventual-send@npm:1.2.8" dependencies: - "@endo/common": "npm:^1.1.0" - "@endo/env-options": "npm:^1.1.1" - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/far": "npm:^1.0.4" - "@endo/pass-style": "npm:^1.2.0" - "@endo/patterns": "npm:^1.2.0" - checksum: 10c0/b6f3074446f84ff05e89e0e84d83bcd99e898b084bfa7357fda63045e71fb7101d7b89c5539342fed99c45e3b166bfb22045902abc9159be1ce4230a4dbc1b07 + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/d7c16c935441b67d029fcb6785f425a1194fb7f936e4b20dde21eb393266cb7366edf7a95d3fdfa96cd4a3246a3659a06d0dbb3c1217045e1718e1cf34c7a3bd languageName: node linkType: hard -"@endo/far@npm:^0.2.3": - version: 0.2.22 - resolution: "@endo/far@npm:0.2.22" +"@endo/exo@npm:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" dependencies: - "@endo/eventual-send": "npm:^0.17.6" - "@endo/pass-style": "npm:^0.1.7" - checksum: 10c0/bd30a168b47a26014cab296336a64aa2721975c386f7f87b6776dd33cf77f3e85ddb822e8422fbc2befb6920d72301e3b9b206fe71d970dce1870b708b09805d + "@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.4": - version: 1.0.4 - resolution: "@endo/far@npm:1.0.4" +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.0.4, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" dependencies: - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/pass-style": "npm:^1.2.0" - checksum: 10c0/61a0fbefe7b05cc5d67c68b0cb0ed5ef5791aadbb06cc0523493fa412fcc40e66df8977a46ff330b67218c5e1cde231ab72b6159c03330e16e6017444ea2db17 + "@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.0.4": - version: 1.0.4 - resolution: "@endo/import-bundle@npm:1.0.4" +"@endo/import-bundle@npm:^1.3.2": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" dependencies: - "@endo/base64": "npm:^1.0.2" - "@endo/compartment-mapper": "npm:^1.1.2" - "@endo/errors": "npm:^1.1.0" - "@endo/where": "npm:^1.0.2" - ses: "npm:^1.3.0" - checksum: 10c0/8caa71d0a9aee3387e740808807cbe27d6868cea49fb292f97c51ccb3478b106e061ea69d8ab467ca12419ab9ce5ba47a0ea6052c44cb8506a04fb887b80c846 + "@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:^1.0.3, @endo/init@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/init@npm:1.0.4" +"@endo/init@npm:^1.0.4, @endo/init@npm:^1.1.7": + version: 1.1.7 + resolution: "@endo/init@npm:1.1.7" dependencies: - "@endo/base64": "npm:^1.0.2" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/lockdown": "npm:^1.0.4" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/d88dc4f952fe05b2beb08b6ef5bf56a49062f89ca0c3fa5fcf96e0f713c275e4c1764a639aa7cc339a856cdf4aaa80eb180b16e2f0ecd345f75732b98ca550e0 + "@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:^1.0.4": - version: 1.0.4 - resolution: "@endo/lockdown@npm:1.0.4" +"@endo/lockdown@npm:^1.0.13": + version: 1.0.13 + resolution: "@endo/lockdown@npm:1.0.13" dependencies: - ses: "npm:^1.3.0" - checksum: 10c0/e0d8f83c81bed238d8a9d131577c7a17dc2504f3931d3f5da295c0d4d67a89c8d30d66db9e76d9f3afbe30931428e00240a30d94342ddd3041ff2fd4c71a48a3 + ses: "npm:^1.10.0" + checksum: 10c0/9df04cc477595b368088a1d445f2241d8a152cb4dcf6a79d39d4804594dd8ff472380ab2bdf262adeb5b4b7cfc73effb6cc716c5a3aeca282801d57fe8a018a0 languageName: node linkType: hard -"@endo/marshal@npm:^1.3.0": - version: 1.3.0 - resolution: "@endo/marshal@npm:1.3.0" +"@endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" dependencies: - "@endo/common": "npm:^1.1.0" - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/nat": "npm:^5.0.4" - "@endo/pass-style": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/106433ac72c5d58781b6d70541b9441acf991c2e0f622308839c7e0722d4d9fc9e1f6167757a37a6c9017a08fcdce5076122badfb3b2f2ffd4a3a9778419f07f - languageName: node - linkType: hard - -"@endo/nat@npm:^5.0.4": - version: 5.0.4 - resolution: "@endo/nat@npm:5.0.4" - checksum: 10c0/7ddca740b9ab1c0f200e356c389bc2223e4bed9379f54eada5522b34bbf29e03cd3085617006ce8e2c2e4874b8692d1472397bd6e6a9a7f1c4e0682397cb8887 + "@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 -"@endo/netstring@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/netstring@npm:1.0.4" +"@endo/module-source@npm:^1.1.2": + version: 1.1.2 + resolution: "@endo/module-source@npm:1.1.2" dependencies: - "@endo/init": "npm:^1.0.4" - "@endo/promise-kit": "npm:^1.0.4" - "@endo/stream": "npm:^1.1.0" - ses: "npm:^1.3.0" - checksum: 10c0/30a160b37e81a92ad9aa655e36a0269d8464da872af81eb7c82b167da34630f5e4f5d2123e018ff5b00773860f08b73b04772824cab79b94f55886a97ed55736 + "@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/pass-style@npm:^0.1.7": - version: 0.1.7 - resolution: "@endo/pass-style@npm:0.1.7" - dependencies: - "@endo/promise-kit": "npm:^0.2.60" - "@fast-check/ava": "npm:^1.1.5" - checksum: 10c0/0fc8ca918e4b2888619fa10765b9a414f1ab921b590f257421f4af4a523b80b2afc736280691ed99e8f8807ead3afc478c1a855772c52a4c8fbe43733f3fe656 +"@endo/nat@npm:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 languageName: node linkType: hard -"@endo/pass-style@npm:^1.2.0": - version: 1.2.0 - resolution: "@endo/pass-style@npm:1.2.0" +"@endo/pass-style@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/pass-style@npm:1.4.7" dependencies: - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/promise-kit": "npm:^1.0.4" + "@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/7d13abef42ef7fc53b0dbf1af934cb2f010ab9d3258abd36ba857713687608571bc599cf49b86db9de95e0bccf827a97b7e9c2525ca0238c7e6689c00aa63ec2 - languageName: node - linkType: hard - -"@endo/patterns@npm:^1.1.0, @endo/patterns@npm:^1.2.0": - version: 1.2.0 - resolution: "@endo/patterns@npm:1.2.0" - dependencies: - "@endo/common": "npm:^1.1.0" - "@endo/errors": "npm:^1.1.0" - "@endo/eventual-send": "npm:^1.1.2" - "@endo/marshal": "npm:^1.3.0" - "@endo/promise-kit": "npm:^1.0.4" - checksum: 10c0/1a2786982c2dc2325ccac74110756a2a70524eb6b9679f605573373512af2c34834657139234ff11a384d71ea264046e13191edf61048e05655c7c3b3bd50682 - languageName: node - linkType: hard - -"@endo/promise-kit@npm:^0.2.60": - version: 0.2.60 - resolution: "@endo/promise-kit@npm:0.2.60" - dependencies: - ses: "npm:^0.18.8" - checksum: 10c0/45fa191d0211cf9e99a6b300c373849c7662e8832e20fbcfa4a8f4938d9c9509f22c3a76377629be70447adc1d2e4e99a56a99395af19ba2a0c1010bfe1da4dd + checksum: 10c0/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@endo/promise-kit@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/promise-kit@npm:1.0.4" +"@endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" dependencies: - ses: "npm:^1.3.0" - checksum: 10c0/18a62d68baddee3d5936695c4b87924c49367a57992f3c6b141b15fbc28bc3bb486e56a21a2c8857485371d19f8ffe475121cb4c557e331ae95418793e4bb702 + "@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/ses-ava@npm:^1.1.2": - version: 1.1.2 - resolution: "@endo/ses-ava@npm:1.1.2" +"@endo/promise-kit@npm:^1.1.8": + version: 1.1.8 + resolution: "@endo/promise-kit@npm:1.1.8" dependencies: - ses: "npm:^1.3.0" - checksum: 10c0/6a40db9233173531f05da335d5e06f6713162f7fc83c69a1e59949903c2feed366b2720a433d0aa8486db19cc957bc483fc11cc62bd84973487b576ddecb838a + ses: "npm:^1.10.0" + checksum: 10c0/3a51755822bd4112474bec584005b81f9ffe6a6b590faa16cff7a4994010d001d6d190f58a1e890d85b0feb0eb052d79ed2c5ed88977afb0e47ca53b6b199196 languageName: node linkType: hard -"@endo/static-module-record@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/static-module-record@npm:1.0.4" - dependencies: - "@agoric/babel-generator": "npm:^7.17.6" - "@babel/parser": "npm:^7.23.6" - "@babel/traverse": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" - ses: "npm:^1.3.0" - checksum: 10c0/75914c9fd3e617a6ef64da894a7f27947f472334bff275c6f0827d5914ef2cff42d108f8b7bc2212f4ef3a557f95f9d700bfab348ad4d3d976d351513ded8e13 - languageName: node - linkType: hard - -"@endo/stream-node@npm:^1.0.4": - version: 1.0.4 - resolution: "@endo/stream-node@npm:1.0.4" +"@endo/ses-ava@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" dependencies: - "@endo/errors": "npm:^1.1.0" - "@endo/init": "npm:^1.0.4" - "@endo/stream": "npm:^1.1.0" - ses: "npm:^1.3.0" - checksum: 10c0/3b8484767cd784b013251ec97adb3509440f7bc20d5ef75af6def73da4eb0d83d77321d1b9cc6f3e103ac5d1c786f1d8c6fe2052d2f647953c77fbc80247d388 + "@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/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf languageName: node linkType: hard -"@endo/stream@npm:^1.1.0": - version: 1.1.0 - resolution: "@endo/stream@npm:1.1.0" +"@endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" dependencies: - "@endo/eventual-send": "npm:^1.1.2" - "@endo/promise-kit": "npm:^1.0.4" - ses: "npm:^1.3.0" - checksum: 10c0/f0188551e07cb38f1f01945c3273060b47b80d6d1e4e2d45812ba4d6d2bce47b79d7afe1ff2eaa8d563d7db05e614e857380c048deb736f08f2b78e9a1d4df47 + "@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 -"@endo/where@npm:^1.0.2": - version: 1.0.2 - resolution: "@endo/where@npm:1.0.2" - checksum: 10c0/c2a48550b588393fa92cb6ae110a4a2a9782028b4b1d646978ab683c792793f89cff9b35a7d38ca6be3259ebc20ea5ec32dcb3c32906aae7c7a493caa070d760 +"@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/zip@npm:^1.0.2": - version: 1.0.2 - resolution: "@endo/zip@npm:1.0.2" - checksum: 10c0/307b0716ad22415cb5a58fd5678a663cd447d1db9f664b2477638b8a65b79741581a5825d1aede999c2d75d276e3f1501e17f42c903c5af2a62889daa34cbef2 +"@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:^1.0.7": - version: 1.0.7 - resolution: "@endo/zip@npm:1.0.7" - checksum: 10c0/a1c0d155448ce877012b34c8fe8cd3a58de9eb807514c81cddeebb802ee8e552b27d8a9a40fab3f3e4c49e0cb7fea6902fa1dd12a23ff6f30b56161fc3edc1f8 +"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc languageName: node linkType: hard @@ -1472,6 +1359,20 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + "@rollup/plugin-node-resolve@npm:^13.0.0": version: 13.3.0 resolution: "@rollup/plugin-node-resolve@npm:13.3.0" @@ -1501,6 +1402,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.1.0": + 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:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + 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" @@ -1529,6 +1446,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + "@types/long@npm:^4.0.1": version: 4.0.2 resolution: "@types/long@npm:4.0.2" @@ -1545,6 +1469,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.0.0": + version: 22.9.1 + resolution: "@types/node@npm:22.9.1" + dependencies: + undici-types: "npm:~6.19.8" + checksum: 10c0/ea489ae603aa8874e4e88980aab6f2dad09c755da779c88dd142983bfe9609803c89415ca7781f723072934066f63daf2b3339ef084a8ad1a8079cf3958be243 + languageName: node + linkType: hard + "@types/resolve@npm:1.17.1": version: 1.17.1 resolution: "@types/resolve@npm:1.17.1" @@ -1613,48 +1546,50 @@ __metadata: languageName: node linkType: hard -"agoric@npm:0.21.2-dev-5676146.0": - version: 0.21.2-dev-5676146.0 - resolution: "agoric@npm:0.21.2-dev-5676146.0" - dependencies: - "@agoric/access-token": "npm:0.4.22-dev-5676146.0+5676146" - "@agoric/assert": "npm:0.6.1-dev-5676146.0+5676146" - "@agoric/cache": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/casting": "npm:0.4.3-dev-5676146.0+5676146" - "@agoric/cosmic-proto": "npm:0.4.1-dev-5676146.0+5676146" - "@agoric/ertp": "npm:0.16.3-dev-5676146.0+5676146" - "@agoric/governance": "npm:0.10.4-dev-5676146.0+5676146" - "@agoric/inter-protocol": "npm:0.16.2-dev-5676146.0+5676146" - "@agoric/internal": "npm:0.3.3-dev-5676146.0+5676146" - "@agoric/network": "npm:0.1.1-dev-5676146.0+5676146" - "@agoric/smart-wallet": "npm:0.5.4-dev-5676146.0+5676146" - "@agoric/store": "npm:0.9.3-dev-5676146.0+5676146" - "@agoric/swingset-vat": "npm:0.32.3-dev-5676146.0+5676146" - "@agoric/vats": "npm:0.15.2-dev-5676146.0+5676146" - "@agoric/zoe": "npm:0.26.3-dev-5676146.0+5676146" - "@agoric/zone": "npm:0.2.3-dev-5676146.0+5676146" +"agoric@portal:../../agoric-sdk/packages/agoric-cli::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "agoric@portal:../../agoric-sdk/packages/agoric-cli::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/access-token": "npm:^0.4.22-u18.0" + "@agoric/cache": "npm:^0.3.3-u18.0" + "@agoric/casting": "npm:^0.4.3-u18.4" + "@agoric/client-utils": "npm:^0.1.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-u18.0" + "@agoric/inter-protocol": "npm:^0.17.0-u18.5" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/network": "npm:^0.2.0-u18.0" + "@agoric/smart-wallet": "npm:^0.5.4-u18.4" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" "@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.1.0" - "@endo/captp": "npm:^4.0.4" - "@endo/compartment-mapper": "npm:^1.1.2" - "@endo/env-options": "npm:^1.1.1" - "@endo/far": "npm:^1.0.4" - "@endo/init": "npm:^1.0.4" - "@endo/marshal": "npm:^1.3.0" - "@endo/nat": "npm:^5.0.4" - "@endo/patterns": "npm:^1.2.0" - "@endo/promise-kit": "npm:^1.0.4" + "@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" + esm: "agoric-labs/esm#Agoric-built" inquirer: "npm:^8.2.2" opener: "npm:^1.5.2" tmp: "npm:^0.2.1" @@ -1662,9 +1597,8 @@ __metadata: bin: agops: src/bin-agops.js agoric: src/entrypoint.js - checksum: 10c0/abcea0bfd4594c2841d3e69ed6c78bedd5a4c573efa9ebcb34730e87ea445ab283e06a7dff2a0f44834faae3bb4dfc0153a2bd34cfd859064208cd7bfb92a19b languageName: node - linkType: hard + linkType: soft "ajv@npm:7.1.1": version: 7.1.1 @@ -1903,6 +1837,13 @@ __metadata: languageName: node linkType: hard +"bech32@npm:^2.0.0": + version: 2.0.0 + resolution: "bech32@npm:2.0.0" + checksum: 10c0/45e7cc62758c9b26c05161b4483f40ea534437cf68ef785abadc5b62a2611319b878fef4f86ddc14854f183b645917a19addebc9573ab890e19194bc8f521942 + languageName: node + linkType: hard + "better-sqlite3@npm:^9.1.1": version: 9.4.3 resolution: "better-sqlite3@npm:9.4.3" @@ -2331,10 +2272,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 @@ -2430,6 +2371,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" @@ -2642,7 +2590,7 @@ __metadata: languageName: node linkType: hard -"esm@github:agoric-labs/esm#Agoric-built": +"esm@agoric-labs/esm#Agoric-built": version: 3.2.25 resolution: "esm@https://github.com/agoric-labs/esm.git#commit=3603726ad4636b2f865f463188fcaade6375638e" checksum: 10c0/fc1e112a3a681e7b4152d4f5c76dd5aa9e30496d2020490ffa0fb61aaf57d1e12dae0c1074fdd2e0f08949ab2df7e00e750262356781f072e4119955ee10b754 @@ -2666,7 +2614,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^2.0.1": +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af @@ -2845,6 +2793,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:^6.0.0": version: 6.3.0 resolution: "find-up@npm:6.3.0" @@ -3528,12 +3483,12 @@ __metadata: languageName: node linkType: hard -"jessie.js@npm:^0.3.2": - version: 0.3.3 - resolution: "jessie.js@npm:0.3.3" +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" dependencies: - "@endo/far": "npm:^0.2.3" - checksum: 10c0/883897ce3e8e8608f324efcffac9a1e445315cadd88935f2d09bad7fb180806ae1352e7332e99c84b7c097f9ac03bd7cb45dfc46a5d276871031d0c43f9cad51 + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 languageName: node linkType: hard @@ -4045,20 +4000,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 - languageName: node - linkType: hard - "node-gyp-build@npm:^4.4.0": version: 4.8.0 resolution: "node-gyp-build@npm:4.8.0" @@ -4349,6 +4290,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 + "pkg-conf@npm:^4.0.0": version: 4.0.0 resolution: "pkg-conf@npm:4.0.0" @@ -4500,6 +4448,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" @@ -4646,16 +4605,19 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: + "@agoric/client-utils": "npm:dev" "@agoric/internal": "npm:0.3.3-dev-5676146.0" - "@agoric/synthetic-chain": "npm:^0.3.0" + "@agoric/synthetic-chain": "npm:^0.4.3" "@cosmjs/stargate": "npm:^0.32.3" "@cosmjs/tendermint-rpc": "npm:^0.32.3" "@endo/errors": "npm:^1.2.2" "@endo/far": "npm:^1.0.4" "@endo/init": "npm:^1.0.4" - agoric: "npm:0.21.2-dev-5676146.0" + "@types/node": "npm:^22.0.0" + agoric: "npm:dev" ava: "npm:^5.3.1" execa: "npm:^8.0.1" + typescript: "npm:^5.7.2" languageName: unknown linkType: soft @@ -4734,30 +4696,12 @@ __metadata: languageName: node linkType: hard -"ses@npm:^0.18.8": - version: 0.18.8 - resolution: "ses@npm:0.18.8" - dependencies: - "@endo/env-options": "npm:^0.1.4" - checksum: 10c0/2c5c5e40f6a8edee081e1c62b65316128823070a68858c6ee45810fb14464d14a9f82499bf4d1cb274b46e35e199f7c55565755236a708d25ace493da206083f - languageName: node - linkType: hard - -"ses@npm:^1.3.0": - version: 1.3.0 - resolution: "ses@npm:1.3.0" - dependencies: - "@endo/env-options": "npm:^1.1.1" - checksum: 10c0/a1385c91a23677de3b91ffa93a8f08134b6657f93c3002b2269c961e28c19deeeadce4ae30a7bcc177a312268fa8d21de2aa5acfc4370055c17dd8c53885ffa4 - languageName: node - linkType: hard - -"ses@npm:^1.5.0": - version: 1.5.0 - resolution: "ses@npm:1.5.0" +"ses@npm:^1.10.0": + version: 1.10.0 + resolution: "ses@npm:1.10.0" dependencies: - "@endo/env-options": "npm:^1.1.4" - checksum: 10c0/bd5e230ff07abe84632ff212a5dce5163d979ab0ae657c4ac0ee2748aea9f587d83c75639d0058def62eae6dde55c0ae9652f33aecc5e0fe538c89ce54bffcdc + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/83b92bc49e27af04eeb7ee01a2196a0c4b0906e4de51e70403aa9ffc82be1d27a0c3506f2d54da8d6d260be0855f2123a13a7e2c6896e81ec85899df1a428609 languageName: node linkType: hard @@ -4888,10 +4832,10 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard @@ -4909,6 +4853,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 + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -5176,13 +5127,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 - languageName: node - linkType: hard - "triple-beam@npm:1.3.0": version: 1.3.0 resolution: "triple-beam@npm:1.3.0" @@ -5197,6 +5141,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 + "tslib@npm:^2.1.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -5227,6 +5180,46 @@ __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.7.2": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 + 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=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.7.2#optional!builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/f3b8082c9d1d1629a215245c9087df56cb784f9fb6f27b5d55577a20e68afe2a889c040aacff6d27e35be165ecf9dca66e694c42eb9a50b3b2c451b36b5675cb + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -5234,6 +5227,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.3.0": version: 0.3.0 resolution: "unicorn-magic@npm:0.3.0" @@ -5284,13 +5284,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - "well-known-symbols@npm:^2.0.0": version: 2.0.0 resolution: "well-known-symbols@npm:2.0.0" @@ -5298,16 +5291,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" diff --git a/a3p-integration/proposals/z:acceptance/.gitignore b/a3p-integration/proposals/z:acceptance/.gitignore index 7f5da265d56..dc7df2c53f4 100644 --- a/a3p-integration/proposals/z:acceptance/.gitignore +++ b/a3p-integration/proposals/z:acceptance/.gitignore @@ -3,3 +3,5 @@ restart-valueVow start-valueVow localchaintest-submission recorded-instances-submission +upgrade-vaultFactory +upgrade-provisionPool diff --git a/a3p-integration/proposals/z:acceptance/core-eval.test.js b/a3p-integration/proposals/z:acceptance/core-eval.test.js index 0fc33270508..086613e9c65 100644 --- a/a3p-integration/proposals/z:acceptance/core-eval.test.js +++ b/a3p-integration/proposals/z:acceptance/core-eval.test.js @@ -1,7 +1,10 @@ +/* global setTimeout */ + import test from 'ava'; import { readFile, writeFile } from 'node:fs/promises'; -import { agd, evalBundles, waitForBlock } from '@agoric/synthetic-chain'; +import { agd, evalBundles } from '@agoric/synthetic-chain'; +import { retryUntilCondition } from '@agoric/client-utils'; const SUBMISSION_DIR = 'core-eval-test-submission'; @@ -17,6 +20,7 @@ const replaceTemplateValuesInFile = async (fileName, replacements) => { await writeFile(`${fileName}.js`, script); }; +/** @param {string} path */ const readPublished = async path => { const { value } = await agd.query( 'vstorage', @@ -45,7 +49,12 @@ test(`core eval works`, async t => { await evalBundles(SUBMISSION_DIR); - await waitForBlock(2); // enough time for core eval to execute ? + const actualValue = await retryUntilCondition( + async () => readPublished(nodePath), + value => value === nodeValue, + 'core eval not processed yet', + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); - t.is(await readPublished(nodePath), nodeValue); + t.is(actualValue, nodeValue); }); diff --git a/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh b/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh deleted file mode 100755 index 89b175b7340..00000000000 --- a/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -euo pipefail - -source /usr/src/upgrade-test-scripts/env_setup.sh - -OFFER=$(mktemp -t agops.XXX) -agops vaults open --wantMinted 6.00 --giveCollateral 9.0 >| "$OFFER" -agoric wallet send --offer "$OFFER" --from $GOV1ADDR --keyring-backend="test" - -govamount="200000000ubld" -provisionSmartWallet $GOV1ADDR $govamount - -KREAD_ITEM_OFFER=$(mktemp -t kreadItem.XXX) -node ./generate-kread-item-request.mjs > $KREAD_ITEM_OFFER -agops perf satisfaction --from $GOV1ADDR --executeOffer $KREAD_ITEM_OFFER --keyring-backend=test - -agd query vstorage data published.wallet.$GOV1ADDR.current -o json >&gov1.out -name=$(jq '.value | fromjson | .values[2] | fromjson | .body[1:] | fromjson | .purses[1].balance.value.payload[0][0].name ' gov1.out) -test_val $name \"ephemeral_Ace\" "found KREAd character" diff --git a/a3p-integration/proposals/z:acceptance/exitOffer.js b/a3p-integration/proposals/z:acceptance/exitOffer.js deleted file mode 100644 index 959e9ed7c74..00000000000 --- a/a3p-integration/proposals/z:acceptance/exitOffer.js +++ /dev/null @@ -1,98 +0,0 @@ -// Note: limit imports to node modules for portability -/* eslint-env node */ -import { parseArgs, promisify } from 'node:util'; -import { execFile } from 'node:child_process'; -import { writeFile, mkdtemp, rm } from 'node:fs/promises'; -import { join } from 'node:path'; - -const options = /** @type {const} */ ({ - id: { type: 'string' }, - from: { type: 'string' }, - bin: { type: 'string', default: '/usr/src/agoric-sdk/node_modules/.bin' }, -}); - -const Usage = ` -Try to exit an offer, reclaiming any associated payments. - - node exitOffer.js --id ID --from FROM [--bin PATH] - -Options: - --id - --from
- - --bin default: ${options.bin.default} -`; - -const badUsage = () => { - const reason = new Error(Usage); - reason.name = 'USAGE'; - throw reason; -}; - -const { stringify: jq } = JSON; -// limited to JSON data: no remotables/promises; no undefined. -const toCapData = data => ({ body: `#${jq(data)}`, slots: [] }); - -const { entries } = Object; -/** - * @param {Record} obj - e.g. { color: 'blue' } - * @returns {string[]} - e.g. ['--color', 'blue'] - */ -const flags = obj => - entries(obj) - .map(([k, v]) => [`--${k}`, v]) - .flat(); - -const execP = promisify(execFile); - -const showAndRun = (file, args) => { - console.log('$', file, ...args); - return execP(file, args); -}; - -const withTempFile = async (tail, fn) => { - const tmpDir = await mkdtemp('offers-'); - const tmpFile = join(tmpDir, tail); - try { - const result = await fn(tmpFile); - return result; - } finally { - await rm(tmpDir, { recursive: true, force: true }).catch(err => - console.error(err), - ); - } -}; - -const doAction = async (action, from) => { - await withTempFile('offer.json', async tmpOffer => { - await writeFile(tmpOffer, jq(toCapData(action))); - - const out = await showAndRun('agoric', [ - 'wallet', - ...flags({ 'keyring-backend': 'test' }), - 'send', - ...flags({ offer: tmpOffer, from }), - ]); - return out.stdout; - }); -}; - -const main = async (argv, env) => { - const { values } = parseArgs({ args: argv.slice(2), options }); - const { id: offerId, from, bin } = values; - (offerId && from) || badUsage(); - - env.PATH = `${bin}:${env.PATH}`; - const action = { method: 'tryExitOffer', offerId }; - const out = await doAction(action, from); - console.log(out); -}; - -main(process.argv, process.env).catch(e => { - if (e.name === 'USAGE' || e.code === 'ERR_PARSE_ARGS_UNKNOWN_OPTION') { - console.error(e.message); - } else { - console.error(e); - } - process.exit(1); -}); diff --git a/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs b/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs deleted file mode 100644 index 55feaf5f067..00000000000 --- a/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs +++ /dev/null @@ -1,77 +0,0 @@ -/* global process */ -import assert from 'assert'; -import { execFile } from 'child_process'; - -const ISTunit = 1_000_000n; // aka displayInfo: { decimalPlaces: 6 } - -const id = `KREAd-test-${Date.now()}`; - -// poor-man's zx -const $ = cmd => { - const [file, ...args] = cmd.split(' '); - - return new Promise((resolve, reject) => { - execFile(file, args, { encoding: 'utf8' }, (err, out) => { - if (err) return reject(err); - resolve(out); - }); - }); -}; - -const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]); - -const fromSmallCapsEntries = txt => { - const { body, slots } = JSON.parse(txt); - const theEntries = zip(JSON.parse(body.slice(1)), slots).map( - ([[name, ref], boardID]) => { - const iface = ref.replace(/^\$\d+\./, ''); - return [name, { iface, boardID }]; - }, - ); - return Object.fromEntries(theEntries); -}; - -const brand = fromSmallCapsEntries( - await $('agoric follow -lF :published.agoricNames.brand -o text'), -); -assert(brand.IST); - -const slots = []; // XXX global mutable state - -const smallCaps = { - Nat: n => `+${n}`, - // XXX mutates obj - ref: obj => { - if (obj.ix) return obj.ix; - const ix = slots.length; - slots.push(obj.boardID); - obj.ix = `$${ix}.Alleged: ${obj.iface}`; - return obj.ix; - }, -}; - -const body = { - method: 'executeOffer', - offer: { - id, - invitationSpec: { - source: 'agoricContract', - instancePath: ['kread'], - callPipe: [['makeMintCharacterInvitation', []]], - }, - offerArgs: { name: 'ephemeral_Ace' }, - proposal: { - give: { - Price: { - brand: smallCaps.ref(brand.IST), - value: smallCaps.Nat(5n * ISTunit), - }, - }, - }, - }, -}; - -const capData = { body: `#${JSON.stringify(body)}`, slots }; -const action = JSON.stringify(capData); - -console.log(action); diff --git a/a3p-integration/proposals/z:acceptance/governance.test.js b/a3p-integration/proposals/z:acceptance/governance.test.js index 7e4b23b5418..e63a3271030 100644 --- a/a3p-integration/proposals/z:acceptance/governance.test.js +++ b/a3p-integration/proposals/z:acceptance/governance.test.js @@ -1,98 +1,222 @@ -/* global fetch setTimeout */ +/* global fetch */ import test from 'ava'; -import '@endo/init'; -import { execFileSync } from 'node:child_process'; + import { GOV1ADDR, GOV2ADDR } from '@agoric/synthetic-chain'; -import { networkConfig } from './test-lib/index.js'; -import { getLastUpdate, makeWalletUtils } from './test-lib/wallet.js'; import { makeGovernanceDriver } from './test-lib/governance.js'; -import { makeTimerUtils } from './test-lib/utils.js'; +import { agdWalletUtils } from './test-lib/index.js'; +import { upgradeContract } from './test-lib/utils.js'; +import { networkConfig } from './test-lib/rpc.js'; const GOV4ADDR = 'agoric1c9gyu460lu70rtcdp95vummd6032psmpdx7wdy'; const governanceAddresses = [GOV4ADDR, GOV2ADDR, GOV1ADDR]; +const { getLastUpdate, readLatestHead } = agdWalletUtils; +const governanceDriver = await makeGovernanceDriver(fetch, networkConfig); + test.serial( 'economic committee can make governance proposal and vote on it', async t => { - const { waitUntil } = makeTimerUtils({ setTimeout }); - const { readLatestHead } = await makeWalletUtils( - { setTimeout, execFileSync, fetch }, - networkConfig, + const params = { + ChargingPeriod: 400n, + }; + const path = { paramPath: { key: 'governedParams' } }; + t.log('Proposing param change', { params, path }); + const instanceName = 'VaultFactory'; + + await governanceDriver.proposeParamChange( + governanceAddresses[0], + params, + path, + instanceName, + 30, ); - const governanceDriver = await makeGovernanceDriver(fetch, networkConfig); - /** @type {any} */ - const instance = await readLatestHead(`published.agoricNames.instance`); - const instances = Object.fromEntries(instance); + const questionUpdate = await getLastUpdate(governanceAddresses[0]); + t.log(questionUpdate); + t.like(questionUpdate, { + status: { numWantsSatisfied: 1 }, + }); + + t.log('Voting on param change'); + for (const address of governanceAddresses) { + const committeeInvitationForVoter = + await governanceDriver.getCommitteeInvitation(address); + await governanceDriver.voteOnProposedChanges( + address, + committeeInvitationForVoter[0], + ); + + const voteUpdate = await getLastUpdate(address); + t.log(`${address} voted`); + t.like(voteUpdate, { + status: { numWantsSatisfied: 1 }, + }); + } + + await governanceDriver.waitForElection(); + }, +); + +test.serial( + 'VaultFactory governed parameters are intact following contract upgrade', + async t => { /** @type {any} */ - const wallet = await readLatestHead( - `published.wallet.${governanceAddresses[0]}.current`, + const vaultFactoryParamsBefore = await readLatestHead( + 'published.vaultFactory.governance', + ); + + /* + * At the previous test ('economic committee can make governance proposal and vote on it') + * The value of ChargingPeriod was updated to 400 + * The 'published.vaultFactory.governance' node should reflect that change. + */ + t.is( + vaultFactoryParamsBefore.current.ChargingPeriod.value, + 400n, + 'vaultFactory ChargingPeriod parameter value is not the expected ', ); - const usedInvitations = wallet.offerToUsedInvitation; - const charterInvitation = usedInvitations.find( - v => - v[1].value[0].instance.getBoardId() === - instances.econCommitteeCharter.getBoardId(), + await upgradeContract('upgrade-vaultFactory', 'zcf-b1-6c08a-vaultFactory'); + + const vaultFactoryParamsAfter = await readLatestHead( + 'published.vaultFactory.governance', ); - t.log('proposing on param change'); + t.deepEqual( + vaultFactoryParamsAfter, + vaultFactoryParamsBefore, + 'vaultFactory governed parameters did not match', + ); + }, +); + +test.serial( + 'economic committee can make governance proposal for ProvisionPool', + async t => { + /** @type {any} */ + const brand = await readLatestHead(`published.agoricNames.brand`); + const brands = Object.fromEntries(brand); + const params = { - ChargingPeriod: 400n, + PerAccountInitialAmount: { brand: brands.IST, value: 100_000n }, }; const path = { paramPath: { key: 'governedParams' } }; + const instanceName = 'provisionPool'; - await governanceDriver.proposeVaultDirectorParamChange( + await governanceDriver.proposeParamChange( governanceAddresses[0], params, path, - charterInvitation[0], + instanceName, + 30, ); - const questionUpdate = await getLastUpdate(governanceAddresses[0], { - readLatestHead, - }); + const questionUpdate = await getLastUpdate(governanceAddresses[0]); t.like(questionUpdate, { status: { numWantsSatisfied: 1 }, }); - t.log('Voting on param change'); for (const address of governanceAddresses) { - /** @type {any} */ - const voteWallet = await readLatestHead( - `published.wallet.${address}.current`, - ); - - const usedInvitationsForVoter = voteWallet.offerToUsedInvitation; + const committeeInvitationForVoter = + await governanceDriver.getCommitteeInvitation(address); - const committeeInvitationForVoter = usedInvitationsForVoter.find( - v => - v[1].value[0].instance.getBoardId() === - instances.economicCommittee.getBoardId(), - ); await governanceDriver.voteOnProposedChanges( address, committeeInvitationForVoter[0], ); - const voteUpdate = await getLastUpdate(address, { readLatestHead }); + const voteUpdate = await getLastUpdate(address); t.like(voteUpdate, { status: { numWantsSatisfied: 1 }, }); } + await governanceDriver.waitForElection(); + }, +); + +test.serial( + 'ProvisionPool governed parameters are intact following contract upgrade', + async t => { + /** @type {any} */ + const provisionPoolParamsBefore = await readLatestHead( + 'published.provisionPool.governance', + ); + + /* + * At the previous test ('economic committee can make governance proposal and vote on it') + * The value of ChargingPeriod was updated to 400 + * The 'published.vaultFactory.governance' node should reflect that change. + */ + t.is( + provisionPoolParamsBefore.current.PerAccountInitialAmount.value.value, + 100_000n, + 'provisionPool PerAccountInitialAmount parameter value is not the expected ', + ); + + await upgradeContract( + 'upgrade-provisionPool', + 'zcf-b1-db93f-provisionPool', + ); + /** @type {any} */ - const latestQuestion = await readLatestHead( - 'published.committees.Economic_Committee.latestQuestion', + const provisionPoolParamsAfter = await readLatestHead( + 'published.provisionPool.governance', ); - await waitUntil(latestQuestion.closingRule.deadline); - t.log('check if latest outcome is correct'); - const latestOutcome = await readLatestHead( - 'published.committees.Economic_Committee.latestOutcome', + t.deepEqual( + provisionPoolParamsAfter.current.PerAccountInitialAmount, + provisionPoolParamsBefore.current.PerAccountInitialAmount, + 'provisionPool governed parameters did not match', ); - t.like(latestOutcome, { outcome: 'win' }); }, ); + +test.serial('Governance proposals history is visible', async t => { + /* + * List ordered from most recent to earliest of Economic Committee + * parameter changes proposed prior to the execution of this test. + * + * XXX a dynamic solution should replace this hardcoded list to ensure + * the acceptance tests scalability + */ + const expectedParametersChanges = [ + ['PerAccountInitialAmount'], // z:acceptance/governance.test.js + ['ChargingPeriod'], // z:acceptance/governance.test.js + ['DebtLimit'], // z:acceptance/vaults.test.js + ['GiveMintedFee', 'MintLimit', 'WantMintedFee'], // z:acceptance/psm.test.js + ['DebtLimit'], // z:acceptance/scripts/test-vaults.mts + ['ClockStep', 'PriceLockPeriod', 'StartFrequency'], // z:acceptance/scripts/test-vaults.mts + ['DebtLimit'], // agoric-3-proposals/proposals/34:upgrade-10/performActions.js + ['ClockStep', 'PriceLockPeriod', 'StartFrequency'], // agoric-3-proposals/proposals/34:upgrade-10/performActions.js + ]; + + // history of Economic Committee parameters changes proposed since block height 0 + const history = await governanceDriver.getLatestQuestionHistory(); + t.true( + history.length > 0, + 'published.committees.Economic_Committee.latestQuestion node should not be empty', + ); + + const changedParameters = history.map(changes => Object.keys(changes)); + + /* + * In case you see the error message bellow and you + * executed an VoteOnParamChange offer prior to this test, + * please make sure to update the expectedParametersChanges list. + */ + if ( + !( + JSON.stringify(changedParameters) === + JSON.stringify(expectedParametersChanges) + ) + ) { + console.error( + `ERROR: Economic_Committee parameters changes history does not match with the expected list`, + ); + t.log('Economic_Committee parameters changes history: ', changedParameters); + t.log('Expected parameters changes history: ', expectedParametersChanges); + } +}); diff --git a/a3p-integration/proposals/z:acceptance/kread.test.js b/a3p-integration/proposals/z:acceptance/kread.test.js new file mode 100644 index 00000000000..85f22334414 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/kread.test.js @@ -0,0 +1,168 @@ +import test from 'ava'; +import { + provisionSmartWallet, + USER1ADDR as Alice, + GOV1ADDR as Bob, +} from '@agoric/synthetic-chain'; +import { + buyCharacter, + buyItem, + getCharacterInventory, + getMarketCharactersChildren, + getBalanceFromPurse, + getMarketItem, + getMarketItemsChildren, + mintCharacter, + sellCharacter, + sellItem, + unequipAllItems, +} from './test-lib/kread.js'; + +test.serial('Alice mints a new Character', async t => { + await provisionSmartWallet(Alice, '200000000ubld'); + const characterBalanceBefore = await getBalanceFromPurse(Alice, 'character'); + t.is(characterBalanceBefore, null, 'A Character should not exist in purse'); + + await mintCharacter(Alice); + + const characterBalanceAfter = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceAfter.name, + 'ephemeral_Ace', + 'Minted Character name should be ephemeral_Ace', + ); +}); + +test.serial('Alice unequips all defaults Items', async t => { + const itemBalanceBefore = await getBalanceFromPurse(Alice, 'item'); + t.is(itemBalanceBefore, null, 'An Item should not exist in purse'); + + const characterId = 'ephemeral_Ace'; + const characterInventoryBefore = await getCharacterInventory(characterId); + t.is( + characterInventoryBefore.length, + 3, + 'Character should have 3 items in inventory', + ); + + await unequipAllItems(Alice); + + const characterInventoryAfter = await getCharacterInventory(characterId); + t.is( + characterInventoryAfter.length, + 0, + 'Character should have 0 items in inventory', + ); + + const itemBalanceAfter = await getBalanceFromPurse(Alice, 'item'); + t.is( + itemBalanceAfter.description, + characterInventoryBefore[0][0].description, + 'The unequipped Item should exist in purse', + ); +}); + +test.serial('Alice sells one unequipped Item', async t => { + const itemListBefore = await getMarketItemsChildren(); + const itemBefore = await getBalanceFromPurse(Alice, 'item'); + + await sellItem(Alice); + + const itemListAfter = await getMarketItemsChildren(); + t.is( + itemListAfter.length, + itemListBefore.length + 1, + 'Items market should have 1 more item', + ); + + const soldItemNode = itemListAfter.filter( + /** @param {unknown} itemNode */ + itemNode => !itemListBefore.includes(itemNode), + ); + const soldItem = await getMarketItem(soldItemNode); + + t.is( + itemBefore.description, + soldItem.asset.description, + 'Item on purse should have the same description as the one sold to market', + ); +}); + +test.serial('Bob buys an Item on marketplace', async t => { + const itemListBefore = await getMarketItemsChildren(); + const marketItemNode = itemListBefore[0]; + const marketItem = await getMarketItem(marketItemNode); + + await buyItem(Bob); + + const itemListAfter = await getMarketItemsChildren(); + t.is( + itemListAfter.length, + itemListBefore.length - 1, + 'Items market should have 1 less item', + ); + + const boughtItemNode = itemListBefore.filter( + /** @param {unknown} itemNode */ + itemNode => !itemListAfter.includes(itemNode), + ); + t.is( + marketItemNode, + boughtItemNode[0], + 'Item bought should have been removed from market', + ); + + const item = await getBalanceFromPurse(Bob, 'item'); + t.is( + item.description, + marketItem.asset.description, + 'Item on purse should have the same description as the one bought from market', + ); +}); + +test.serial('Alice sells a Character', async t => { + const characterListBefore = await getMarketCharactersChildren(); + t.false( + characterListBefore.includes('character-ephemeral_Ace'), + 'Character should not be on market before selling', + ); + + const characterBalanceBefore = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceBefore.name, + 'ephemeral_Ace', + 'Character name should be ephemeral_Ace', + ); + + await sellCharacter(Alice); + + const characterListAfter = await getMarketCharactersChildren(); + t.true( + characterListAfter.includes('character-ephemeral_Ace'), + 'Character should be on market after selling', + ); + + const characterBalanceAfter = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceAfter, + null, + 'Character should not be in purse after selling', + ); +}); + +test.serial('Bob buys a Character on marketplace', async t => { + await buyCharacter(Bob); + + const characterListBefore = await getMarketCharactersChildren(); + t.false( + characterListBefore.includes('character-ephemeral_Ace'), + 'Character should not be on market after buying', + ); + + const characterBalance = await getBalanceFromPurse(Bob, 'character'); + t.is( + characterBalance.name, + 'ephemeral_Ace', + 'Character name should be ephemeral_Ace', + ); +}); diff --git a/a3p-integration/proposals/z:acceptance/lib/vaults.mts b/a3p-integration/proposals/z:acceptance/lib/vaults.ts similarity index 97% rename from a3p-integration/proposals/z:acceptance/lib/vaults.mts rename to a3p-integration/proposals/z:acceptance/lib/vaults.ts index cec0cfcf062..f130f6d4be7 100644 --- a/a3p-integration/proposals/z:acceptance/lib/vaults.mts +++ b/a3p-integration/proposals/z:acceptance/lib/vaults.ts @@ -1,4 +1,3 @@ -/* eslint-disable @jessie.js/safe-await-separator */ /* eslint-env node */ import { strict as assert } from 'node:assert'; @@ -57,7 +56,13 @@ const voteForNewParams = (accounts: string[], position: number) => { console.log('ACTIONS voting for position', position, 'using', accounts); return Promise.all( accounts.map((account: string) => - agops.ec('vote', '--forPosition', position, '--send-from', account), + agops.ec( + 'vote', + '--forPosition', + String(position), + '--send-from', + account, + ), ), ); }; diff --git a/a3p-integration/proposals/z:acceptance/localchain.test.js b/a3p-integration/proposals/z:acceptance/localchain.test.js index b7145c64d6e..6985cef8a00 100644 --- a/a3p-integration/proposals/z:acceptance/localchain.test.js +++ b/a3p-integration/proposals/z:acceptance/localchain.test.js @@ -1,9 +1,12 @@ -import test from 'ava'; +/* global setTimeout */ -import { agd, evalBundles, waitForBlock } from '@agoric/synthetic-chain'; +import { agd, evalBundles } from '@agoric/synthetic-chain'; +import test from 'ava'; +import { retryUntilCondition } from '@agoric/client-utils'; const SUBMISSION_DIR = 'localchaintest-submission'; +/** @param {string} path */ const readPublished = async path => { const { value } = await agd.query( 'vstorage', @@ -27,7 +30,12 @@ test(`localchain passes tests`, async t => { const nodePath = 'test.localchain'; const nodeValue = JSON.stringify({ success: true }); - await waitForBlock(2); // enough time for core eval to execute ? + const actualValue = await retryUntilCondition( + async () => readPublished(nodePath), + value => value === nodeValue, + 'core eval not processed yet', + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); - t.is(await readPublished(nodePath), nodeValue); + t.is(actualValue, nodeValue); }); diff --git a/a3p-integration/proposals/z:acceptance/package.json b/a3p-integration/proposals/z:acceptance/package.json index 3b19c101aa7..9afa351d90a 100644 --- a/a3p-integration/proposals/z:acceptance/package.json +++ b/a3p-integration/proposals/z:acceptance/package.json @@ -5,24 +5,83 @@ "testing/start-valueVow.js start-valueVow", "testing/recorded-retired-instances.js recorded-instances-submission", "vats/test-localchain.js localchaintest-submission", - "testing/restart-valueVow.js restart-valueVow" + "testing/restart-valueVow.js restart-valueVow", + "testing/upgrade-vaultFactory.js upgrade-vaultFactory", + "vats/upgrade-provisionPool.js upgrade-provisionPool" ] }, "type": "module", "license": "Apache-2.0", "dependencies": { + "@agoric/client-utils": "dev", "@agoric/ertp": "dev", + "@agoric/inter-protocol": "dev", "@agoric/internal": "dev", - "@agoric/synthetic-chain": "^0.3.0", - "@endo/errors": "^1.2.2", - "@endo/far": "^1.1.5", - "@endo/init": "^1.1.4", - "@endo/marshal": "^1.5.3", + "@agoric/store": "dev", + "@agoric/synthetic-chain": "^0.4.3", + "@agoric/zoe": "dev", + "@endo/errors": "^1.2.7", + "@endo/far": "^1.1.8", + "@endo/init": "^1.1.6", + "@endo/marshal": "^1.6.1", + "agoric": "dev", "ava": "^6.1.2", - "execa": "^9.3.1", - "tsx": "^4.17.0" + "execa": "9.1.0" + }, + "$comment": "UNTIL https://github.com/Agoric/agoric-sdk/issues/10259", + "resolutions": { + "$commentXsnap": "UNTIL https://github.com/Agoric/agoric-sdk/issues/10259", + "@agoric/xsnap": "beta", + "@agoric/cosmos": "portal:../../agoric-sdk/golang/cosmos", + "@agoric/ertp": "portal:../../agoric-sdk/packages/ERTP", + "@agoric/swingset-vat": "portal:../../agoric-sdk/packages/SwingSet", + "@agoric/access-token": "portal:../../agoric-sdk/packages/access-token", + "agoric": "portal:../../agoric-sdk/packages/agoric-cli", + "@agoric/async-flow": "portal:../../agoric-sdk/packages/async-flow", + "@agoric/base-zone": "portal:../../agoric-sdk/packages/base-zone", + "@agoric/builders": "portal:../../agoric-sdk/packages/builders", + "@agoric/cache": "portal:../../agoric-sdk/packages/cache", + "@agoric/casting": "portal:../../agoric-sdk/packages/casting", + "@agoric/client-utils": "portal:../../agoric-sdk/packages/client-utils", + "@agoric/cosmic-proto": "portal:../../agoric-sdk/packages/cosmic-proto", + "@agoric/cosmic-swingset": "portal:../../agoric-sdk/packages/cosmic-swingset", + "@agoric/create-dapp": "portal:../../agoric-sdk/packages/create-dapp", + "@agoric/deploy-script-support": "portal:../../agoric-sdk/packages/deploy-script-support", + "@agoric/eslint-config": "portal:../../agoric-sdk/packages/eslint-config", + "@agoric/governance": "portal:../../agoric-sdk/packages/governance", + "@agoric/import-manager": "portal:../../agoric-sdk/packages/import-manager", + "@agoric/inter-protocol": "portal:../../agoric-sdk/packages/inter-protocol", + "@agoric/internal": "portal:../../agoric-sdk/packages/internal", + "@agoric/kmarshal": "portal:../../agoric-sdk/packages/kmarshal", + "@agoric/network": "portal:../../agoric-sdk/packages/network", + "@agoric/notifier": "portal:../../agoric-sdk/packages/notifier", + "@agoric/orchestration": "portal:../../agoric-sdk/packages/orchestration", + "@agoric/pegasus": "portal:../../agoric-sdk/packages/pegasus", + "@agoric/smart-wallet": "portal:../../agoric-sdk/packages/smart-wallet", + "@agoric/solo": "portal:../../agoric-sdk/packages/solo", + "@agoric/sparse-ints": "portal:../../agoric-sdk/packages/sparse-ints", + "@agoric/spawner": "portal:../../agoric-sdk/packages/spawner", + "@agoric/stat-logger": "portal:../../agoric-sdk/packages/stat-logger", + "@agoric/store": "portal:../../agoric-sdk/packages/store", + "@agoric/swing-store": "portal:../../agoric-sdk/packages/swing-store", + "@agoric/swingset-liveslots": "portal:../../agoric-sdk/packages/swingset-liveslots", + "@agoric/swingset-xsnap-supervisor": "portal:../../agoric-sdk/packages/swingset-xsnap-supervisor", + "@agoric/telemetry": "portal:../../agoric-sdk/packages/telemetry", + "@agoric/time": "portal:../../agoric-sdk/packages/time", + "@agoric/vat-data": "portal:../../agoric-sdk/packages/vat-data", + "@agoric/vats": "portal:../../agoric-sdk/packages/vats", + "@agoric/vm-config": "portal:../../agoric-sdk/packages/vm-config", + "@agoric/vow": "portal:../../agoric-sdk/packages/vow", + "@agoric/wallet": "portal:../../agoric-sdk/packages/wallet", + "@agoric/wallet-backend": "portal:../../agoric-sdk/packages/wallet/api", + "@agoric/xsnap-lockdown": "portal:../../agoric-sdk/packages/xsnap-lockdown", + "@agoric/zoe": "portal:../../agoric-sdk/packages/zoe", + "@agoric/zone": "portal:../../agoric-sdk/packages/zone" }, "ava": { + "require": [ + "@endo/init/debug.js" + ], "concurrency": 1, "serial": true, "timeout": "2m", @@ -33,8 +92,10 @@ "scripts": { "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" }, - "packageManager": "yarn@4.2.2", + "packageManager": "yarn@4.5.3", "devDependencies": { - "typescript": "^5.5.4" + "eslint": "^8.57.0", + "npm-run-all": "^4.1.5", + "typescript": "^5.6.3" } } diff --git a/a3p-integration/proposals/z:acceptance/psm.test.js b/a3p-integration/proposals/z:acceptance/psm.test.js index bd64b3c5229..ae176ec51c8 100644 --- a/a3p-integration/proposals/z:acceptance/psm.test.js +++ b/a3p-integration/proposals/z:acceptance/psm.test.js @@ -12,7 +12,6 @@ * 6 - Make sure mint limit is adhered */ -import test from 'ava'; import { agd, agoric, @@ -20,9 +19,11 @@ import { GOV1ADDR, GOV2ADDR, } from '@agoric/synthetic-chain'; +import { waitUntilAccountFunded } from '@agoric/client-utils'; +import test from 'ava'; +import { NonNullish } from '@agoric/internal/src/errors.js'; import { adjustBalancesIfNotProvisioned, - psmSwap, bankSend, checkGovParams, checkSwapExceedMintLimit, @@ -30,11 +31,12 @@ import { getPsmMetrics, implementPsmGovParamChange, initializeNewUser, + logRecord, maxMintBelowLimit, + psmSwap, + sendOfferAgd, } from './test-lib/psm-lib.js'; import { getBalances } from './test-lib/utils.js'; -import { NonNullish } from './test-lib/errors.js'; -import { waitUntilAccountFunded } from './test-lib/sync-tools.js'; // Export these from synthetic-chain? const USDC_DENOM = NonNullish(process.env.USDC_DENOM); @@ -128,7 +130,7 @@ test.serial('initialize new user', async t => { t.pass(); }); -test.serial('swap into IST', async t => { +test.serial('swap into IST using agd with default gas', async t => { const { newUser: { name }, anchor, @@ -147,8 +149,8 @@ test.serial('swap into IST', async t => { balances, psmTrader, ); - t.log('METRICS', metricsBefore); - t.log('BALANCES', balancesBefore); + logRecord('METRICS', metricsBefore, t.log); + logRecord('BALANCES', balancesBefore, t.log); await psmSwap( psmTrader, @@ -161,7 +163,7 @@ test.serial('swap into IST', async t => { '--feePct', wantMintedFeeVal, ], - psmSwapIo, + { ...psmSwapIo, sendOffer: sendOfferAgd }, ); await checkSwapSucceeded(t, metricsBefore, balancesBefore, { @@ -187,8 +189,8 @@ test.serial('swap out of IST', async t => { getBalances([psmTrader]), ]); - t.log('METRICS', metricsBefore); - t.log('BALANCES', balancesBefore); + logRecord('METRICS', metricsBefore, t.log); + logRecord('BALANCES', balancesBefore, t.log); await psmSwap( psmTrader, @@ -227,7 +229,7 @@ test.serial('mint limit is adhered', async t => { await bankSend(otherAddr, `${value}${denom}`); await waitUntilAccountFunded( otherAddr, - { query: agd.query, setTimeout }, + { log: t.log, query: agd.query, setTimeout }, { denom, value: parseInt(value, 10) }, { errorMessage: `${otherAddr} could not be funded with ${value}${denom}` }, ); @@ -237,8 +239,8 @@ test.serial('mint limit is adhered', async t => { getBalances([otherAddr]), ]); - t.log('METRICS', metricsBefore); - t.log('BALANCES', balancesBefore); + logRecord('METRICS', metricsBefore, t.log); + logRecord('BALANCES', balancesBefore, t.log); const { maxMintableValue, wantFeeValue } = await maxMintBelowLimit(anchor); const maxMintFeesAccounted = Math.floor( diff --git a/a3p-integration/proposals/z:acceptance/scripts/test-vaults.mts b/a3p-integration/proposals/z:acceptance/scripts/test-vaults.ts similarity index 94% rename from a3p-integration/proposals/z:acceptance/scripts/test-vaults.mts rename to a3p-integration/proposals/z:acceptance/scripts/test-vaults.ts index 7fdbcef510a..48a216fe8e8 100755 --- a/a3p-integration/proposals/z:acceptance/scripts/test-vaults.mts +++ b/a3p-integration/proposals/z:acceptance/scripts/test-vaults.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env -S node --import ts-blank-space/register /* eslint-disable @jessie.js/safe-await-separator */ import { @@ -13,7 +13,7 @@ import { ISTunit, provisionWallet, setDebtLimit, -} from '../lib/vaults.mjs'; +} from '../lib/vaults.ts'; const START_FREQUENCY = 600; // StartFrequency: 600s (auction runs every 10m) const CLOCK_STEP = 20; // ClockStep: 20s (ensures auction completes in time) diff --git a/a3p-integration/proposals/z:acceptance/test-lib/chain.js b/a3p-integration/proposals/z:acceptance/test-lib/chain.js deleted file mode 100644 index 1e96c0354ae..00000000000 --- a/a3p-integration/proposals/z:acceptance/test-lib/chain.js +++ /dev/null @@ -1,140 +0,0 @@ -/** @file copied from packages/agoric-cli */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 -// @ts-check -/* global process */ - -const agdBinary = 'agd'; - -/** - * @param {ReadonlyArray} swingsetArgs - * @param {import('./rpc.js').MinimalNetworkConfig & { - * from: string, - * fees?: string, - * dryRun?: boolean, - * verbose?: boolean, - * keyring?: {home?: string, backend: string} - * stdout?: Pick - * execFileSync: typeof import('child_process').execFileSync - * }} opts - */ -export const execSwingsetTransaction = (swingsetArgs, opts) => { - const { - from, - fees, - dryRun = false, - verbose = true, - keyring = undefined, - chainName, - rpcAddrs, - stdout = process.stdout, - execFileSync, - } = opts; - const homeOpt = keyring?.home ? [`--home=${keyring.home}`] : []; - const backendOpt = keyring?.backend - ? [`--keyring-backend=${keyring.backend}`] - : []; - const feeOpt = fees ? ['--fees', fees] : []; - const cmd = [`--node=${rpcAddrs[0]}`, `--chain-id=${chainName}`].concat( - homeOpt, - backendOpt, - feeOpt, - [`--from=${from}`, 'tx', 'swingset'], - swingsetArgs, - ); - - if (dryRun) { - stdout.write(`Run this interactive command in shell:\n\n`); - stdout.write(`${agdBinary} `); - stdout.write(cmd.join(' ')); - stdout.write('\n'); - } else { - const yesCmd = cmd.concat(['--yes']); - if (verbose) console.log('Executing ', yesCmd); - const out = execFileSync(agdBinary, yesCmd, { encoding: 'utf-8' }); - - // agd puts this diagnostic on stdout rather than stderr :-/ - // "Default sign-mode 'direct' not supported by Ledger, using sign-mode 'amino-json'. - if (out.startsWith('Default sign-mode')) { - const stripDiagnostic = out.replace(/^Default[^\n]+\n/, ''); - return stripDiagnostic; - } - return out; - } -}; -harden(execSwingsetTransaction); - -/** - * @param {import('./rpc.js').MinimalNetworkConfig & { - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * period?: number, - * retryMessage?: string, - * }} opts - * @returns {(l: (b: { time: string, height: string }) => Promise) => Promise} - */ -export const pollBlocks = opts => async lookup => { - const { execFileSync, delay, rpcAddrs, period = 3 * 1000 } = opts; - assert(execFileSync, 'missing execFileSync'); - const { retryMessage } = opts; - - const nodeArgs = [`--node=${rpcAddrs[0]}`]; - - await null; // separate sync prologue - - for (;;) { - const sTxt = execFileSync(agdBinary, ['status', ...nodeArgs]); - const status = JSON.parse(sTxt.toString()); - const { - SyncInfo: { latest_block_time: time, latest_block_height: height }, - } = status; - try { - // see await null above - const result = await lookup({ time, height }); - return result; - } catch (_err) { - console.error( - time, - retryMessage || 'not in block', - height, - 'retrying...', - ); - await delay(period); - } - } -}; - -/** - * @param {string} txhash - * @param {import('./rpc.js').MinimalNetworkConfig & { - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * period?: number, - * }} opts - */ -export const pollTx = async (txhash, opts) => { - const { execFileSync, rpcAddrs, chainName } = opts; - assert(execFileSync, 'missing execFileSync in pollTx'); - - const nodeArgs = [`--node=${rpcAddrs[0]}`]; - const outJson = ['--output', 'json']; - - const lookup = async () => { - const out = execFileSync( - agdBinary, - [ - 'query', - 'tx', - txhash, - `--chain-id=${chainName}`, - ...nodeArgs, - ...outJson, - ], - { stdio: ['ignore', 'pipe', 'ignore'] }, - ); - // XXX this type is defined in a .proto file somewhere - /** @type {{ height: string, txhash: string, code: number, timestamp: string }} */ - const info = JSON.parse(out.toString()); - return info; - }; - return pollBlocks({ ...opts, retryMessage: 'tx not in block' })(lookup); -}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/errors.js b/a3p-integration/proposals/z:acceptance/test-lib/errors.js deleted file mode 100644 index 57dc771e6a5..00000000000 --- a/a3p-integration/proposals/z:acceptance/test-lib/errors.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @file Copied from "@agoric/internal" - */ - -import { q } from '@endo/errors'; - -/** - * @template T - * @param {T | null | undefined} val - * @param {string} [optDetails] - * @returns {T} - */ -export const NonNullish = (val, optDetails = `unexpected ${q(val)}`) => { - if (val != null) { - // This `!= null` idiom checks that `val` is neither `null` nor `undefined`. - return val; - } - assert.fail(optDetails); -}; -harden(NonNullish); diff --git a/a3p-integration/proposals/z:acceptance/test-lib/governance.js b/a3p-integration/proposals/z:acceptance/test-lib/governance.js index 910764d16c2..a93d14411bd 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/governance.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/governance.js @@ -1,22 +1,39 @@ +/* global setTimeout */ + import { agops, agoric, executeOffer } from '@agoric/synthetic-chain'; -import { makeRpcUtils } from './rpc.js'; +import { + retryUntilCondition, + waitUntilElectionResult, +} from '@agoric/client-utils'; +import { agdWalletUtils } from './index.js'; +import { + checkCommitteeElectionResult, + fetchLatestEcQuestion, +} from './psm-lib.js'; +import { makeVstorageKit } from './rpc.js'; +/** + * @param {typeof window.fetch} fetch + * @param {import('./rpc.js').MinimalNetworkConfig} networkConfig + */ export const makeGovernanceDriver = async (fetch, networkConfig) => { - const { readLatestHead, marshaller } = await makeRpcUtils( + const { readLatestHead, marshaller, vstorage } = await makeVstorageKit( { fetch }, networkConfig, ); - const generateVoteOffer = async previousOfferId => { - const id = `propose-${Date.now()}`; + let deadline; - /** - * @type {object} - */ - const latestQuestionRecord = await readLatestHead( - 'published.committees.Economic_Committee.latestQuestion', - ); + /** @param {string} previousOfferId */ + const generateVoteOffer = async previousOfferId => { + const latestQuestionRecord = + /** @type {import('@agoric/governance/src/types.js').QuestionSpec} */ ( + await readLatestHead( + 'published.committees.Economic_Committee.latestQuestion', + ) + ); + const id = `propose-${Date.now()}`; const chosenPositions = [latestQuestionRecord.positions[0]]; const body = { method: 'executeOffer', @@ -28,6 +45,7 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { source: 'continuing', invitationArgs: harden([ chosenPositions, + // @ts-expect-error narrowing latestQuestionRecord.questionHandle, ]), }, @@ -39,7 +57,10 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { return JSON.stringify(capData); }; - const voteOnProposedChanges = async (address, committeeAcceptOfferId) => { + const voteOnProposedChanges = async ( + /** @type {string} */ address, + /** @type {string} */ committeeAcceptOfferId, + ) => { await null; const offerId = committeeAcceptOfferId || @@ -54,27 +75,41 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { return executeOffer(address, generateVoteOffer(offerId)); }; - const generateVaultDirectorParamChange = async ( + /** + * Generates a parameter change proposal as a `executeOffer` message + * body. + * + * @param {string} previousOfferId - the `id` of the offer that this proposal is + * responding to + * @param {string | number | bigint | boolean} voteDur - how long the vote should + * be open for (in seconds) + * @param {any} params + * @param {{ paramPath: any; }} paramsPath + * @param {string} instanceName + * @returns {Promise} - the `executeOffer` message body as a JSON string + */ + const generateParamChange = async ( previousOfferId, voteDur, params, paramsPath, + instanceName, ) => { - const voteDurSec = BigInt(voteDur); - const toSec = ms => BigInt(Math.round(ms / 1000)); - - const id = `propose-${Date.now()}`; - const deadline = toSec(Date.now()) + voteDurSec; - - const a = await agoric.follow( + const instancesRaw = await agoric.follow( '-lF', ':published.agoricNames.instance', '-o', 'text', ); - const instance = Object.fromEntries(marshaller.fromCapData(JSON.parse(a))); - assert(instance.VaultFactory); + const instances = Object.fromEntries( + marshaller.fromCapData(JSON.parse(instancesRaw)), + ); + const instance = instances[instanceName]; + assert(instance); + const msSinceEpoch = Date.now(); + const id = `propose-${msSinceEpoch}`; + deadline = BigInt(Math.ceil(msSinceEpoch / 1000)) + BigInt(voteDur); const body = { method: 'executeOffer', offer: { @@ -86,7 +121,7 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { }, offerArgs: { deadline, - instance: instance.VaultFactory, + instance, params, path: paramsPath, }, @@ -98,10 +133,21 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { return JSON.stringify(capData); }; - const proposeVaultDirectorParamChange = async ( + /** + * + * @param {string} address + * @param {any} params + * @param {{paramPath: any}} path + * @param {string} instanceName + * @param {number} votingDuration + * @param {string} [charterAcceptOfferId] + */ + const proposeParamChange = async ( address, params, path, + instanceName, + votingDuration, charterAcceptOfferId, ) => { await null; @@ -117,12 +163,107 @@ export const makeGovernanceDriver = async (fetch, networkConfig) => { return executeOffer( address, - generateVaultDirectorParamChange(offerId, 10, params, path), + generateParamChange(offerId, votingDuration, params, path, instanceName), + ); + }; + + const getCharterInvitation = async address => { + const { getCurrentWalletRecord } = agdWalletUtils; + + /** @type {any} */ + const instance = await readLatestHead(`published.agoricNames.instance`); + const instances = Object.fromEntries(instance); + + const wallet = await getCurrentWalletRecord(address); + const usedInvitations = wallet.offerToUsedInvitation; + + const charterInvitation = usedInvitations.find( + v => + v[1].value[0].instance.getBoardId() === + instances.econCommitteeCharter.getBoardId(), ); + assert(charterInvitation, 'missing charter invitation'); + + return charterInvitation; + }; + + const getCommitteeInvitation = async address => { + /** @type {any} */ + const instance = await readLatestHead(`published.agoricNames.instance`); + const instances = Object.fromEntries(instance); + + const voteWallet = + /** @type {import('@agoric/smart-wallet/src/smartWallet.js').CurrentWalletRecord} */ ( + await readLatestHead(`published.wallet.${address}.current`) + ); + + const usedInvitationsForVoter = voteWallet.offerToUsedInvitation; + + const committeeInvitationForVoter = usedInvitationsForVoter.find( + v => + v[1].value[0].instance.getBoardId() === + instances.economicCommittee.getBoardId(), + ); + assert( + committeeInvitationForVoter, + `${address} must have committee invitation`, + ); + + return committeeInvitationForVoter; + }; + + const getLatestQuestion = async () => { + const { latestOutcome, latestQuestion } = await retryUntilCondition( + () => fetchLatestEcQuestion({ follow: agoric.follow }), + electionResult => + checkCommitteeElectionResult(electionResult, { + outcome: 'win', + deadline, + }), + 'Governed param change election failed', + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); + + return { latestOutcome, latestQuestion }; + }; + + const waitForElection = () => + waitUntilElectionResult( + 'published.committees.Economic_Committee', + { outcome: 'win', deadline }, + // @ts-expect-error vstorage casting + { vstorage: { readLatestHead }, log: console.log, setTimeout }, + { + errorMessage: 'Governed param change election failed', + retryIntervalMs: 5000, + maxRetries: 15, + }, + ); + + const getLatestQuestionHistory = async () => { + const nodePath = 'published.committees.Economic_Committee.latestQuestion'; + + const historyIterator = await vstorage.readHistory(nodePath); + const history = []; + + for await (const data of historyIterator) { + if (data) { + const question = marshaller.fromCapData(JSON.parse(data[0])); + const changes = question.positions[0].changes; + history.push(changes); + } + } + + return history; }; return { voteOnProposedChanges, - proposeVaultDirectorParamChange, + proposeParamChange, + getCharterInvitation, + getCommitteeInvitation, + getLatestQuestion, + waitForElection, + getLatestQuestionHistory, }; }; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/index.js b/a3p-integration/proposals/z:acceptance/test-lib/index.js index 55bbfe8ff20..b56da4836cc 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/index.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/index.js @@ -1,4 +1,24 @@ -export const networkConfig = { - rpcAddrs: ['http://0.0.0.0:26657'], - chainName: 'agoriclocal', -}; +/* eslint-env node */ +import { makeSmartWalletKit, LOCAL_CONFIG } from '@agoric/client-utils'; +import { execFileSync } from 'child_process'; +import { makeAgdWalletKit } from './wallet.js'; + +export const networkConfig = LOCAL_CONFIG; + +/** + * Resolve after a delay in milliseconds. + * + * @param {number} ms + * @returns {Promise} + */ +const delay = ms => new Promise(resolve => setTimeout(() => resolve(), ms)); + +export const smartWalletKit = await makeSmartWalletKit( + { delay, fetch }, + networkConfig, +); + +export const agdWalletUtils = await makeAgdWalletKit( + { execFileSync, smartWalletKit, delay }, + networkConfig, +); diff --git a/a3p-integration/proposals/z:acceptance/test-lib/kread.js b/a3p-integration/proposals/z:acceptance/test-lib/kread.js new file mode 100644 index 00000000000..1bb58b3eef1 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/test-lib/kread.js @@ -0,0 +1,361 @@ +// @ts-nocheck FIXME +// XXX uses agoric.follow to read data through spawned processes; replace with VstorageKit +import assert from 'node:assert'; + +import { + agoric, + executeOffer, + getContractInfo, + makeAgd, +} from '@agoric/synthetic-chain'; +import { execFileSync } from 'child_process'; +import { makeCopyBag } from '@agoric/store'; +import { AmountMath } from '@agoric/ertp'; +import { boardSlottingMarshaller, makeFromBoard } from '@agoric/client-utils'; + +const ISTunit = 1_000_000n; + +/** @type {(file: string, args: string[], opts: any) => string} */ +const showAndExec = (file, args, opts) => { + console.log('$', file, ...args); + return execFileSync(file, args, opts); +}; + +// @ts-expect-error string is not assignable to Buffer +const agd = makeAgd({ execFileSync: showAndExec }).withOpts({ + keyringBackend: 'test', +}); + +const fromBoard = makeFromBoard(); +const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); + +const brandsRaw = await agoric.follow( + '-lF', + ':published.agoricNames.brand', + '-o', + 'text', +); +const brands = Object.fromEntries( + marshaller.fromCapData(JSON.parse(brandsRaw)), +); + +assert(brands.IST, 'Brand IST not found'); +assert(brands.timer, 'Brand timer not found'); +assert(brands.KREAdCHARACTER, 'Brand KREAdCHARACTER not found'); +assert(brands.KREAdITEM, 'Brand KREAdITEM not found'); + +export const getMarketCharactersChildren = async () => { + const { children } = await agd.query([ + 'vstorage', + 'children', + `published.kread.market-characters`, + ]); + + return children; +}; + +export const getMarketItemsChildren = async () => { + const { children } = await agd.query([ + 'vstorage', + 'children', + `published.kread.market-items`, + ]); + + return children; +}; + +export const getMarketItem = async itemNode => { + const itemMarketPath = `:published.kread.market-items.${itemNode}`; + const rawItemData = await agoric.follow('-lF', itemMarketPath, '-o', 'text'); + const item = marshaller.fromCapData(JSON.parse(rawItemData)); + + return item; +}; + +export const getCharacterInventory = async characterName => { + const inventoryPath = `kread.character.inventory-${characterName}`; + const characterInventory = await getContractInfo(inventoryPath, { + agoric, + prefix: 'published.', + }); + + return characterInventory; +}; + +export const getMarketCharacterFromVstorage = async () => { + const charactersMarket = await getMarketCharactersChildren(); + const path = `:published.kread.market-characters.${charactersMarket[0]}`; + const rawCharacterData = await agoric.follow('-lF', path, '-o', 'text'); + const marketCharacter = marshaller.fromCapData(JSON.parse(rawCharacterData)); + + return marketCharacter; +}; + +export const getBalanceFromPurse = async (address, type) => { + const walletRaw = await agoric.follow( + '-lF', + `:published.wallet.${address}.current`, + '-o', + 'text', + ); + const purses = marshaller.fromCapData(JSON.parse(walletRaw)).purses; + + const assetBrands = { + character: brands.KREAdCHARACTER, + item: brands.KREAdITEM, + }; + const assetBrand = assetBrands[type]; + if (!assetBrand) { + throw new Error('Invalid type provided. Must be "character" or "item".'); + } + + const assetPurse = purses.find( + ({ brand }) => brand.getBoardId() === assetBrand.getBoardId(), + ); + + return assetPurse?.balance.value.payload[0]?.[0] || null; +}; + +/** @import {Brand, CopyBagAmount} from '@agoric/ertp/src/types.js'; */ + +/** + * @param {Brand} brand + * @param {any} asset + * @returns {CopyBagAmount<'item'>} + */ +export const assetAsAmount = (brand, asset) => { + const assetValue = makeCopyBag([[asset, 1n]]); + const assetAmount = AmountMath.make(brand, assetValue); + return assetAmount; +}; + +export const totalAssetPriceAmount = asset => { + const fees = AmountMath.add(asset.platformFee, asset.royalty); + const price = AmountMath.add(asset.askingPrice, fees); + return price; +}; +const mintCharacterOffer = async () => { + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-mint-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeMintCharacterInvitation', []]], + }, + offerArgs: { name: 'ephemeral_Ace' }, + proposal: { + give: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const unequipAllItemsOffer = async address => { + const kreadCharacter = await getBalanceFromPurse(address, 'character'); + if (!kreadCharacter) { + throw new Error('Character not found on user purse'); + } + + // deal with KREAd's funky parallel character representation swap + const inventoryKeyId = kreadCharacter.keyId === 1 ? 2 : 1; + const kreadCharacter2 = { ...kreadCharacter, keyId: inventoryKeyId }; + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter, + ); + + const kreadCharacter2Amount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter2, + ); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-unequip-all-items-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeUnequipAllInvitation', []]], + }, + proposal: { + give: { + CharacterKey1: kreadCharacterAmount, + }, + want: { + CharacterKey2: kreadCharacter2Amount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const buyItemOffer = async () => { + const children = await getMarketItemsChildren(); + const marketItem = await getMarketItem(children[0]); + + const itemAmount = assetAsAmount(brands.KREAdITEM, marketItem.asset); + const priceAmount = totalAssetPriceAmount(marketItem); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-buy-item-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeBuyItemInvitation', []]], + }, + offerArgs: { entryId: marketItem.id }, + proposal: { + give: { + Price: priceAmount, + }, + want: { + Item: itemAmount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const sellItemOffer = async address => { + const kreadItem = await getBalanceFromPurse(address, 'item'); + if (!kreadItem) { + throw new Error('Item not found on user purse'); + } + + const itemAmount = assetAsAmount(brands.KREAdITEM, kreadItem); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-sell-item-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeSellItemInvitation', []]], + }, + proposal: { + give: { + Item: itemAmount, + }, + want: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const buyCharacterOffer = async () => { + const marketCharacter = await getMarketCharacterFromVstorage(); + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + marketCharacter.asset, + ); + const priceAmount = totalAssetPriceAmount(marketCharacter); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-buy-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeBuyCharacterInvitation', []]], + }, + proposal: { + give: { + Price: priceAmount, + }, + want: { + Character: kreadCharacterAmount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const sellCharacterOffer = async address => { + const kreadCharacter = await getBalanceFromPurse(address, 'character'); + if (!kreadCharacter) { + throw new Error('Character not found on user purse'); + } + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter, + ); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-sell-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeSellCharacterInvitation', []]], + }, + proposal: { + give: { + Character: kreadCharacterAmount, + }, + want: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +export const mintCharacter = async address => { + return executeOffer(address, mintCharacterOffer()); +}; + +export const unequipAllItems = async address => { + return executeOffer(address, unequipAllItemsOffer(address)); +}; + +export const buyItem = async address => { + return executeOffer(address, buyItemOffer()); +}; + +export const sellItem = async address => { + return executeOffer(address, sellItemOffer(address)); +}; + +export const sellCharacter = async address => { + return executeOffer(address, sellCharacterOffer(address)); +}; + +export const buyCharacter = async address => { + return executeOffer(address, buyCharacterOffer()); +}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/price-feed.js b/a3p-integration/proposals/z:acceptance/test-lib/price-feed.js new file mode 100644 index 00000000000..fefe9f7e4b6 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/test-lib/price-feed.js @@ -0,0 +1,63 @@ +/* eslint-env node */ + +import { retryUntilCondition } from '@agoric/client-utils'; +import { + agoric, + getContractInfo, + getPriceQuote, + pushPrices, +} from '@agoric/synthetic-chain'; + +/** @type {(x: number) => bigint} */ +export const scale6 = x => BigInt(x * 1_000_000); + +/** + * + * @param {Map} oraclesByBrand + * @param {string} brand + * @param {number} price + * @param {number} roundId + * @returns {Promise} + */ +export const verifyPushedPrice = async ( + oraclesByBrand, + brand, + price, + roundId, +) => { + const pushPriceRetryOpts = { + maxRetries: 5, // arbitrary + retryIntervalMs: 5000, // in ms + }; + + await pushPrices(price, brand, oraclesByBrand, roundId); + console.log(`Pushing price ${price} for ${brand}`); + + await retryUntilCondition( + () => getPriceQuote(brand), + res => res === `+${scale6(price).toString()}`, + 'price not pushed yet', + { + log: console.log, + setTimeout: global.setTimeout, + ...pushPriceRetryOpts, + }, + ); + console.log(`Price ${price} pushed for ${brand}`); +}; + +/** + * + * @param {string} brand + * @returns {Promise} + */ +export const getPriceFeedRoundId = async brand => { + const latestRoundPath = `published.priceFeed.${brand}-USD_price_feed.latestRound`; + const latestRound = await getContractInfo(latestRoundPath, { + agoric, + prefix: '', + }); + + console.log(latestRoundPath, latestRound); + return Number(latestRound.roundId); +}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/psm-lib.js b/a3p-integration/proposals/z:acceptance/test-lib/psm-lib.js index 442a947500b..24c6a89ff88 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/psm-lib.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/psm-lib.js @@ -1,35 +1,145 @@ /* eslint-env node */ -import '@endo/init'; +import { execa } from 'execa'; +import { getNetworkConfig } from 'agoric/src/helpers.js'; +import { + boardSlottingMarshaller, + makeFromBoard, + retryUntilCondition, + waitUntilAccountFunded, + waitUntilOfferResult, +} from '@agoric/client-utils'; +import { AmountMath } from '@agoric/ertp'; +import { deepMapObject } from '@agoric/internal'; import { addUser, agd, agops, + agopsLocation, agoric, + CHAINID, + executeCommand, executeOffer, getUser, - agopsLocation, - executeCommand, - CHAINID, - VALIDATORADDR, GOV1ADDR, mkTemp, + VALIDATORADDR, } from '@agoric/synthetic-chain'; -import { AmountMath } from '@agoric/ertp'; import fsp from 'node:fs/promises'; -import { boardSlottingMarshaller, makeFromBoard } from './rpc.js'; +import { NonNullish } from '@agoric/internal/src/errors.js'; import { getBalances } from './utils.js'; -import { - retryUntilCondition, - waitUntilAccountFunded, - waitUntilOfferResult, -} from './sync-tools.js'; -import { NonNullish } from './errors.js'; + +/** @import {Result as ExecaResult, ExecaError} from 'execa'; */ +/** + * @typedef {ExecaResult & { all: string } & ( + * | { failed: false } + * | Pick< + * ExecaError & { failed: true }, + * | 'failed' + * | 'shortMessage' + * | 'cause' + * | 'exitCode' + * | 'signal' + * | 'signalDescription' + * > + * )} SendOfferResult + */ // Export these from synthetic-chain? const USDC_DENOM = NonNullish(process.env.USDC_DENOM); const PSM_PAIR = NonNullish(process.env.PSM_PAIR).replace('.', '-'); +/** + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; + */ + +/** + * Given either an array of [string, Value] or + * { [labelKey]: string, [valueKey]: Value } entries, or a + * Record object, log a concise representation similar to + * the latter but hiding implementation details of any embedded remotables. + * + * Sample output from any of the following input data: + * - { foo: { brand: FooBrand, value: '42' }, bar: { brand: BarBrand, value: '100' } } + * - [['foo', { brand: FooBrand, value: '42' }], ['bar', { brand: BarBrand, value: '100' }]] + * - [{ label: 'foo', amount: { brand: FooBrand, value: '42' } }, + * { label: 'bar', amount: { brand: BarBrand, value: '100' } }] + * + * $label $shape { + * foo: { + * brand: Object Alleged: Foo brand {}, + * value: '42', + * }, + * bar: { + * brand: Object Alleged: Bar brand {}, + * value: '100', + * }, + * } + * + * where $shape is `{ [label]: amount, ... }` for the third kind of input data + * but is otherwise empty. + * @deprecated should be in @agoric/client-utils? + * + * @template [Value=unknown] + * @param {string} label + * @param {Array<[string, Value] | object> | Record} data + * @param {(...args: unknown[]) => void} [log] + * @returns {void} + */ +export const logRecord = (label, data, log = console.log) => { + const entries = Array.isArray(data) ? [...data] : Object.entries(data); + /** @type {[labelKey: PropertyKey, valueKey: PropertyKey] | undefined} */ + let shape; + for (let i = 0; i < entries.length; i += 1) { + let entry = entries[i]; + if (!Array.isArray(entry)) { + // Determine which key of a two-property "entry object" (e.g., + // {denom, amount} or {brand, value} is the label and which is the value + // (which may be of type object or number or bigint or string). + if (!shape) { + const entryKeys = Object.keys(entry); + if (entryKeys.length !== 2) { + throw Error( + `[INTERNAL logRecord] not shaped like a record entry: {${entryKeys}}`, + ); + } + const valueKeyIndex = entryKeys.findIndex( + k => + typeof entry[k] === 'object' || + (entry[k].trim() !== '' && !Number.isNaN(Number(entry[k]))), + ); + if (valueKeyIndex === undefined) { + throw Error( + `[INTERNAL logRecord] no value property: {${entryKeys}}={${Object.values(entry).map(String)}}`, + ); + } + shape = /** @type {[string, string]} */ ( + valueKeyIndex === 1 ? entryKeys : entryKeys.reverse() + ); + } + // Convert the entry object to a [key, value] entry array. + entries[i] = shape.map(k => entry[k]); + entry = entries[i]; + } + // Simplify remotables in the value. + entry[1] = deepMapObject(entry[1], value => { + const tag = + value && typeof value === 'object' && value[Symbol.toStringTag]; + return tag + ? Object.defineProperty({}, Symbol.toStringTag, { + value: tag, + enumerable: false, + }) + : value; + }); + } + log( + label, + shape ? `{ [${String(shape[0])}]: ${String(shape[1])}, ... }` : '', + Object.fromEntries(entries), + ); +}; + /** * @typedef {object} PsmMetrics * @property {import('@agoric/ertp').Amount<'nat'>} anchorPoolBalance @@ -37,13 +147,40 @@ const PSM_PAIR = NonNullish(process.env.PSM_PAIR).replace('.', '-'); * @property {import('@agoric/ertp').Amount<'nat'>} mintedPoolBalance * @property {import('@agoric/ertp').Amount<'nat'>} totalAnchorProvided * @property {import('@agoric/ertp').Amount<'nat'>} totalMintedProvided - * - * @typedef {Array<{ denom: string; amount: string; }>} CosmosBalances */ const fromBoard = makeFromBoard(); const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); +/** + * @param {string} path + */ +const objectFromVstorageEntries = async path => { + const rawEntries = await agoric.follow('-lF', `:${path}`, '-o', 'text'); + return Object.fromEntries(marshaller.fromCapData(JSON.parse(rawEntries))); +}; + +const snapshotAgoricNames = async () => { + const [brands, instances] = await Promise.all([ + objectFromVstorageEntries('published.agoricNames.brand'), + objectFromVstorageEntries('published.agoricNames.instance'), + ]); + return { brands, instances }; +}; + +/** + * @param {import('@agoric/ertp').Brand} brand + * @param {bigint} numValInPercent + */ +const toRatio = (brand, numValInPercent) => { + const commonDenominator = AmountMath.make(brand, 10_000n); + const numerator = AmountMath.make(brand, numValInPercent * 100n); // Convert to bps + return { + numerator, + denominator: commonDenominator, + }; +}; + /** * Import from synthetic-chain once it is updated * @@ -60,119 +197,6 @@ export const bankSend = (addr, wanted, from = VALIDATORADDR) => { return agd.tx('bank', 'send', from, addr, wanted, ...noise); }; -/** - * - * @param {{ - * address: string - * instanceName: string - * newParams: Params - * deadline: bigint - * offerId: string - * }} QuestionDetails - */ -export const buildProposePSMParamChangeOffer = async ({ - address, - instanceName, - newParams, - deadline, - offerId, -}) => { - const charterAcceptOfferId = await agops.ec( - 'find-continuing-id', - '--for', - `${'charter\\ member\\ invitation'}`, - '--from', - address, - ); - console.log('charterAcceptOfferId', charterAcceptOfferId); - const [brands, instances] = await Promise.all([ - agoric - .follow('-lF', ':published.agoricNames.brand', '-o', 'text') - .then(brandsRaw => - Object.fromEntries(marshaller.fromCapData(JSON.parse(brandsRaw))), - ), - agoric - .follow('-lF', ':published.agoricNames.instance', '-o', 'text') - .then(instancesRaw => - Object.fromEntries(marshaller.fromCapData(JSON.parse(instancesRaw))), - ), - ]); - - console.log('charterAcceptOfferId', charterAcceptOfferId); - console.log('BRANDS', brands); - console.log('INSTANCE', instances); - - /** - * @param {bigint} numValInPercent - */ - const toRatio = numValInPercent => { - const commonDenominator = AmountMath.make(brands.IST, 10_000n); - const numerator = AmountMath.make(brands.IST, numValInPercent * 100n); // Convert to bps - - return { - numerator, - denominator: commonDenominator, - }; - }; - - const params = {}; - if (newParams.giveMintedFeeVal) { - params.GiveMintedFee = toRatio(newParams.giveMintedFeeVal); - } - - if (newParams.wantMintedFeeVal) { - params.WantMintedFee = toRatio(newParams.wantMintedFeeVal); - } - - if (newParams.mintLimit) { - params.MintLimit = AmountMath.make(brands.IST, newParams.mintLimit); - } - - const offerSpec = { - id: offerId, - invitationSpec: { - source: 'continuing', - previousOffer: charterAcceptOfferId, - invitationMakerName: 'VoteOnParamChange', - }, - proposal: {}, - offerArgs: { - instance: instances[instanceName], - params, - deadline, - }, - }; - - /** @type {string | object} */ - const spendAction = { - method: 'executeOffer', - offer: offerSpec, - }; - - const offer = JSON.stringify(marshaller.toCapData(harden(spendAction))); - console.log(offerSpec); - console.log(offer); - - return executeOffer(address, offer); -}; - -/** - * - * @param {{ - * committeeAddrs: Array - * position: number | string - * }} VotingDetails - */ -export const voteForNewParams = ({ committeeAddrs, position }) => { - console.log('ACTIONS voting for position', position, 'using', committeeAddrs); - return Promise.all( - committeeAddrs.map(account => - // @ts-expect-error Casting - agops.ec('vote', '--forPosition', position, '--send-from', account), - ), - ); -}; - /** * @param {{follow: (...params: string[]) => Promise }} io */ @@ -184,17 +208,20 @@ export const fetchLatestEcQuestion = async io => { const [latestOutcome, latestQuestion] = await Promise.all([ follow('-lF', pathOutcome, '-o', 'text').then(outcomeRaw => - marshaller.fromCapData(JSON.parse(outcomeRaw)), + marshaller.fromCapData(JSON.parse(/** @type {any} */ (outcomeRaw))), ), follow('-lF', pathQuestion, '-o', 'text').then(questionRaw => - marshaller.fromCapData(JSON.parse(questionRaw)), + marshaller.fromCapData(JSON.parse(/** @type {any} */ (questionRaw))), ), ]); return { latestOutcome, latestQuestion }; }; -const checkCommitteeElectionResult = (electionResult, expectedResult) => { +export const checkCommitteeElectionResult = ( + /** @type {{ latestOutcome: { outcome: any; question: any; }; latestQuestion: { closingRule: { deadline: any; }; questionHandle: any; }; }} */ electionResult, + /** @type {{ outcome: any; deadline: any; }} */ expectedResult, +) => { const { latestOutcome: { outcome, question }, latestQuestion: { @@ -238,18 +265,74 @@ const checkCommitteeElectionResult = (electionResult, expectedResult) => { export const implementPsmGovParamChange = async (question, voting, io) => { const { now: getNow, follow } = io; const now = getNow(); - const deadline = BigInt( - question.votingDuration * 60 + Math.round(now / 1000), + + // Read current state. + const { address, instanceName, newParams, votingDuration } = question; + const deadline = BigInt(votingDuration * 60 + Math.round(now / 1000)); + const offerId = now.toString(); + const charterAcceptOfferId = await agops.ec( + 'find-continuing-id', + '--for', + `${'charter\\ member\\ invitation'}`, + '--from', + address, ); + console.log( + 'PSM change gov params charterAcceptOfferId', + charterAcceptOfferId, + ); + const { brands, instances } = await snapshotAgoricNames(); + console.log('PSM change gov params BRANDS', Object.keys(brands)); + console.log('PSM change gov params INSTANCES', Object.keys(instances)); - await buildProposePSMParamChangeOffer({ - ...question, - deadline, - offerId: now.toString(), + // Construct and execute the offer. + const params = {}; + if (newParams.giveMintedFeeVal) { + params.GiveMintedFee = toRatio(brands.IST, newParams.giveMintedFeeVal); + } + if (newParams.wantMintedFeeVal) { + params.WantMintedFee = toRatio(brands.IST, newParams.wantMintedFeeVal); + } + if (newParams.mintLimit) { + params.MintLimit = AmountMath.make(brands.IST, newParams.mintLimit); + } + const offerSpec = /** @type {const} */ ({ + id: offerId, + invitationSpec: { + source: 'continuing', + previousOffer: charterAcceptOfferId, + invitationMakerName: 'VoteOnParamChange', + }, + proposal: {}, + offerArgs: { + instance: instances[instanceName], + params, + deadline, + }, }); - await voteForNewParams(voting); - - console.log('ACTIONS wait for the vote deadline to pass'); + const spendAction = { + method: 'executeOffer', + offer: offerSpec, + }; + // @ts-expect-error XXX Passable + const offer = JSON.stringify(marshaller.toCapData(harden(spendAction))); + console.log('PSM change gov params offer', offerSpec, offer); + await executeOffer(address, offer); + + // Vote on the change. + const { committeeAddrs, position } = voting; + console.log( + 'PSM change gov params voting for position', + position, + 'using', + committeeAddrs, + ); + await Promise.all( + committeeAddrs.map(account => + agops.ec('vote', '--forPosition', `${position}`, '--send-from', account), + ), + ); + console.log('PSM change gov params waiting for vote deadline'); await retryUntilCondition( () => fetchLatestEcQuestion({ follow }), electionResult => @@ -290,7 +373,11 @@ export const getPsmMetrics = async anchor => { return marshaller.fromCapData(JSON.parse(metricsRaw)); }; -export const checkGovParams = async (t, expected, psmName) => { +export const checkGovParams = async ( + /** @type {import("ava").ExecutionContext} */ t, + /** @type {any} */ expected, + /** @type {string} */ psmName, +) => { const current = await getPsmGovernance(psmName); t.log({ @@ -327,7 +414,7 @@ export const checkUserInitializedSuccessfully = async ( * denom: string, * value: string * }} fund - * @param io + * @param {{query: () => Promise, setTimeout: typeof setTimeout}} io */ export const initializeNewUser = async (name, fund, io) => { const psmTrader = await addUser(name); @@ -347,27 +434,81 @@ export const initializeNewUser = async (name, fund, io) => { }; /** - * Similar to https://github.com/Agoric/agoric-3-proposals/blob/422b163fecfcf025d53431caebf6d476778b5db3/packages/synthetic-chain/src/lib/commonUpgradeHelpers.ts#L123-L139 - * However, in the case where "address" is not provisioned "agoric wallet send" is needed because - * "agops perf satisfaction" tries to follow ":published.wallet.${address}" which blocks the execution because no such path exists in - * vstorage. In situations like this "agoric wallet send" seems a better choice as it doesn't depend on following user's vstorage wallet path + * Similar to + * https://github.com/Agoric/agoric-3-proposals/blob/422b163fecfcf025d53431caebf6d476778b5db3/packages/synthetic-chain/src/lib/commonUpgradeHelpers.ts#L123-L139 + * However, for an address that is not provisioned, `agoric wallet send` is + * needed because `agops perf satisfaction` hangs when trying to follow + * nonexistent vstorage path ":published.wallet.${address}". * * @param {string} address * @param {Promise} offerPromise + * @returns {Promise} */ export const sendOfferAgoric = async (address, offerPromise) => { const offerPath = await mkTemp('agops.XXX'); const offer = await offerPromise; await fsp.writeFile(offerPath, offer); - await agoric.wallet( - '--keyring-backend=test', - 'send', - '--offer', - offerPath, - '--from', - address, + const [settlement] = await Promise.allSettled([ + execa({ + all: true, + })`agoric wallet --keyring-backend=test send --offer ${offerPath} --from ${address} --verbose`, + ]); + return settlement.status === 'fulfilled' + ? settlement.value + : settlement.reason; +}; + +/** + * A variant of {@link sendOfferAgoric} that uses `agd` directly to e.g. + * control gas calculation. + * + * @param {string} address + * @param {Promise} offerPromise + * @returns {Promise} + */ +export const sendOfferAgd = async (address, offerPromise) => { + const offer = await offerPromise; + const networkConfig = await getNetworkConfig({ env: process.env, fetch }); + const { chainName, rpcAddrs } = networkConfig; + const args = /** @type {string[]} */ ( + // @ts-expect-error heterogeneous concat + [].concat( + [`--node=${rpcAddrs[0]}`, `--chain-id=${chainName}`], + [`--keyring-backend=test`, `--from=${address}`], + ['tx', 'swingset', 'wallet-action', '--allow-spend', offer], + '--yes', + '-bblock', + '-ojson', + ) ); + + const [settlement] = await Promise.allSettled([ + execa('agd', args, { all: true }), + ]); + + // Upon successful exit, verify that the *output* also indicates success. + // cf. https://github.com/Agoric/agoric-sdk/blob/master/packages/agoric-cli/src/lib/wallet.js + if (settlement.status === 'fulfilled') { + const result = settlement.value; + try { + const tx = JSON.parse(result.stdout); + if (tx.code !== 0) { + return { ...result, failed: true, shortMessage: `code ${tx.code}` }; + } + } catch (err) { + return { + ...result, + failed: true, + shortMessage: 'unexpected output', + cause: err, + }; + } + } + + return settlement.status === 'fulfilled' + ? settlement.value + : settlement.reason; }; /** @@ -375,18 +516,47 @@ export const sendOfferAgoric = async (address, offerPromise) => { * @param {Array} params * @param {{ * follow: (...params: string[]) => Promise; - * setTimeout: (callback: Function, delay: number) => void; + * sendOffer?: (address: string, offerPromise: Promise) => Promise; + * setTimeout: typeof global.setTimeout; * now: () => number * }} io */ export const psmSwap = async (address, params, io) => { - const now = io.now(); - const offerId = `${address}-psm-swap-${now}`; + const { now, sendOffer = sendOfferAgoric, ...waitIO } = io; + const offerId = `${address}-psm-swap-${now()}`; const newParams = ['psm', ...params, '--offerId', offerId]; const offerPromise = executeCommand(agopsLocation, newParams); - await sendOfferAgoric(address, offerPromise); + const sendResult = await sendOffer(address, offerPromise); + if (sendResult.failed) { + const { + command, + durationMs, + shortMessage, + cause, + exitCode, + signal, + signalDescription, + all: output, + } = sendResult; + const summary = { + command, + durationMs, + shortMessage, + cause, + exitCode, + signal, + signalDescription, + output, + }; + console.error('psmSwap tx send failed', summary); + throw Error( + `psmSwap tx send failed: ${JSON.stringify({ exitCode, signal, signalDescription })}`, + { cause }, + ); + } + console.log('psmSwap tx send results', sendResult.all); - await waitUntilOfferResult(address, offerId, true, io, { + await waitUntilOfferResult(address, offerId, true, waitIO, { errorMessage: `${offerId} not succeeded`, }); }; @@ -407,7 +577,7 @@ const receiveAnchor = (base, fee) => Math.ceil(base * (1 - fee)); /** * - * @param {CosmosBalances} balances + * @param {Coin[]} balances * @param {string} targetDenom */ const extractBalance = (balances, targetDenom) => { @@ -418,34 +588,36 @@ const extractBalance = (balances, targetDenom) => { /** * Checking IST balances can be tricky because of the execution fee mentioned in - * https://github.com/Agoric/agoric-sdk/issues/6525. Here we first check with - * whatever is passed in. If the first attempt fails we try again to see if - * there was an execution fee charged. If still fails, we throw. + * https://github.com/Agoric/agoric-sdk/issues/6525. So we first check for + * equality, but if that fails we recheck against an assumption that a fee of + * the default "minFeeDebit" has been charged. * * @param {import('ava').ExecutionContext} t * @param {number} actualBalance * @param {number} expectedBalance */ -const tryISTBalances = async (t, actualBalance, expectedBalance) => { - const firstTry = await t.try( - (tt, actual, expected) => { - tt.deepEqual(actual, expected); - }, - actualBalance, - expectedBalance, - ); +export const tryISTBalances = async (t, actualBalance, expectedBalance) => { + const firstTry = await t.try(tt => { + tt.is(actualBalance, expectedBalance); + }); + if (firstTry.passed) { + firstTry.commit(); + return; + } - if (!firstTry.passed) { - firstTry.discard(); - t.deepEqual(actualBalance + 200000, expectedBalance); - } else firstTry.commit(); + firstTry.discard(); + t.log('tryISTBalances assuming no batched IST fee', ...firstTry.errors); + // See golang/cosmos/x/swingset/types/default-params.go + // and `ChargeBeans` in golang/cosmos/x/swingset/keeper/keeper.go. + const minFeeDebit = 200_000; + t.is(actualBalance + minFeeDebit, expectedBalance); }; /** * * @param {import('ava').ExecutionContext} t * @param {PsmMetrics} metricsBefore - * @param {CosmosBalances} balancesBefore + * @param {Coin[]} balancesBefore * @param {{trader: string; fee: number; anchor: string;} & ( * | {wantMinted: number} * | {giveMinted: number} @@ -462,8 +634,8 @@ export const checkSwapSucceeded = async ( getBalances([tradeInfo.trader]), ]); - t.log('METRICS_AFTER', metricsAfter); - t.log('BALANCES_AFTER', balancesAfter); + logRecord('METRICS_AFTER', metricsAfter, t.log); + logRecord('BALANCES_AFTER', balancesAfter, t.log); if ('wantMinted' in tradeInfo) { const anchorPaid = giveAnchor( diff --git a/a3p-integration/proposals/z:acceptance/test-lib/rpc.js b/a3p-integration/proposals/z:acceptance/test-lib/rpc.js index 5e047204151..1a401875f86 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/rpc.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/rpc.js @@ -1,160 +1,192 @@ -/** @file copied from packages/agoric-cli */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 +/** + * @file This file implements methods currently available in + * packages/client-utils . + * + * With the exceptions of: + * - makeVstorage and mapHistory: copied from `multichain-testing/tools/batchQuery.js`. + * - makeAPI: copied from `multichain-testing/tools/makeHttpClient.js`. + * + * These modifications were made to address the issue described in #10574. + */ + // @ts-check -/* global Buffer */ import { boardSlottingMarshaller, makeBoardRemote, } from '@agoric/internal/src/marshal.js'; +import { E, Far } from '@endo/far'; import { Fail } from '@endo/errors'; export { boardSlottingMarshaller }; +/** @type {(val: any) => string} */ export const boardValToSlot = val => { if ('getBoardId' in val) { return val.getBoardId(); } - Fail`unknown obj in boardSlottingMarshaller.valToSlot ${val}`; + throw Fail`unknown obj in boardSlottingMarshaller.valToSlot ${val}`; }; +/** @param {string} agoricNetSubdomain */ export const networkConfigUrl = agoricNetSubdomain => `https://${agoricNetSubdomain}.agoric.net/network-config`; +/** @param {string} agoricNetSubdomain */ export const rpcUrl = agoricNetSubdomain => `https://${agoricNetSubdomain}.rpc.agoric.net:443`; /** - * @typedef {{ rpcAddrs: string[], chainName: string }} MinimalNetworkConfig + * @typedef {{ rpcAddrs: string[], chainName: string, apiAddress: string }} MinimalNetworkConfig */ /** @type {MinimalNetworkConfig} */ const networkConfig = { rpcAddrs: ['http://0.0.0.0:26657'], chainName: 'agoriclocal', + apiAddress: 'http://localhost:1317', }; export { networkConfig }; // console.warn('networkConfig', networkConfig); /** - * @param {object} powers - * @param {typeof window.fetch} powers.fetch - * @param {MinimalNetworkConfig} config + * 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 makeVStorage = (powers, config = networkConfig) => { - /** @param {string} path */ - const getJSON = path => { - const url = config.rpcAddrs[0] + path; - // console.warn('fetching', url); - return powers.fetch(url, { keepalive: true }).then(res => res.json()); +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 */ + +/** + * @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 {LCD} 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 url = (path = 'published', { kind = 'children', height = 0 } = {}) => - `/abci_query?path=%22/custom/vstorage/${kind}/${path}%22&height=${height}`; + 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))); - const readStorage = (path = 'published', { kind = 'children', height = 0 }) => - getJSON(url(path, { kind, height })) - .catch(err => { - throw Error(`cannot read ${kind} of ${path}: ${err.message}`); - }) - .then(data => { - const { - result: { response }, - } = data; - if (response?.code !== 0) { - /** @type {any} */ - const err = Error( - `error code ${response?.code} reading ${kind} of ${path}: ${response.log}`, - ); - err.code = response?.code; - err.codespace = response?.codespace; - throw err; + /** + * 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; } - return data; - }); + 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 { - url, - decode({ result: { response } }) { - const { code } = response; - if (code !== 0) { - throw response; - } - const { value } = response; - return Buffer.from(value, 'base64').toString(); - }, - /** - * - * @param {string} path - * @returns {Promise} latest vstorage value at path - */ - async readLatest(path = 'published') { - const raw = await readStorage(path, { kind: 'data' }); - return this.decode(raw); - }, - async keys(path = 'published') { - const raw = await readStorage(path, { kind: 'children' }); - return JSON.parse(this.decode(raw)).children; - }, - /** - * @param {string} path - * @param {number} [height] default is highest - * @returns {Promise<{blockHeight: number, values: string[]}>} - */ - async readAt(path, height = undefined) { - const raw = await readStorage(path, { kind: 'data', height }); - const txt = this.decode(raw); - /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); - return JSON.parse(value); - }, - /** - * Read values going back as far as available - * - * @param {string} path - * @param {number | string} [minHeight] - * @returns {Promise} - */ - async readFully(path, minHeight = undefined) { - const parts = []; - // undefined the first iteration, to query at the highest - let blockHeight; - await null; - do { - // console.debug('READING', { blockHeight }); - let values; - try { - ({ blockHeight, values } = await this.readAt( - path, - blockHeight && Number(blockHeight) - 1, - )); - // console.debug('readAt returned', { blockHeight }); - } catch (err) { - if ( - // CosmosSDK ErrNotFound; there is no data at the path - (err.codespace === 'sdk' && err.code === 38) || - // CosmosSDK ErrUnknownRequest; misrepresentation of the same until - // https://github.com/Agoric/agoric-sdk/commit/dafc7c1708977aaa55e245dc09a73859cf1df192 - // TODO remove after upgrade-12 - err.message.match(/unknown request/) - ) { - // console.error(err); - break; - } - throw err; - } - parts.push(values); - // console.debug('PUSHED', values); - // console.debug('NEW', { blockHeight, minHeight }); - if (minHeight && Number(blockHeight) <= Number(minHeight)) break; - } while (blockHeight > 0); - return parts.flat(); - }, + lcd, + readLatest: readStorage, + readCell, + readHistory, + readHistoryBy, }; }; /** @typedef {ReturnType} VStorage */ export const makeFromBoard = () => { const cache = new Map(); + /** @type {(boardId: string, iface?: string) => ReturnType} */ const convertSlotToVal = (boardId, iface) => { if (cache.has(boardId)) { return cache.get(boardId); @@ -168,11 +200,10 @@ export const makeFromBoard = () => { /** @typedef {ReturnType} IdMap */ export const storageHelper = { - /** @param { string } txt */ parseCapData: txt => { - assert(typeof txt === 'string', typeof txt); /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); + const { value } = txt; + assert(typeof value === 'string', typeof value); const specimen = JSON.parse(value); const { blockHeight, values } = specimen; assert(values, `empty values in specimen ${value}`); @@ -211,6 +242,7 @@ harden(storageHelper); * @returns {Promise} */ export const makeAgoricNames = async (ctx, vstorage) => { + /** @type {Record} */ const reverse = {}; const entries = await Promise.all( ['brand', 'instance', 'vbankAsset'].map(async kind => { @@ -221,7 +253,7 @@ export const makeAgoricNames = async (ctx, vstorage) => { const parts = storageHelper.unserializeTxt(content, ctx).at(-1); for (const [name, remote] of parts) { if ('getBoardId' in remote) { - reverse[remote.getBoardId()] = name; + reverse[/** @type {string} */ (remote.getBoardId())] = name; } } return [kind, Object.fromEntries(parts)]; @@ -234,10 +266,12 @@ export const makeAgoricNames = async (ctx, vstorage) => { * @param {{ fetch: typeof window.fetch }} io * @param {MinimalNetworkConfig} config */ -export const makeRpcUtils = async ({ fetch }, config = networkConfig) => { +export const makeVstorageKit = async ({ fetch }, config = networkConfig) => { await null; try { - const vstorage = makeVStorage({ fetch }, config); + const lcd = await makeAPI(networkConfig.apiAddress, { fetch }); + const vstorage = makeVStorage(lcd); + const fromBoard = makeFromBoard(); const agoricNames = await makeAgoricNames(fromBoard, vstorage); @@ -263,4 +297,4 @@ export const makeRpcUtils = async ({ fetch }, config = networkConfig) => { throw Error(`RPC failure (${config.rpcAddrs}): ${err.message}`); } }; -/** @typedef {Awaited>} RpcUtils */ +/** @typedef {Awaited>} RpcUtils */ diff --git a/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.js b/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.js deleted file mode 100644 index dac2ba7e04f..00000000000 --- a/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.js +++ /dev/null @@ -1,272 +0,0 @@ -/* eslint-env node */ - -/** - * @file The purpose of this file is to bring together a set of tools that - * developers can use to synchronize operations they carry out in their tests. - * - * These operations include; - * - Making sure a core-eval resulted in successfully deploying a contract - * - Making sure a core-eval successfully sent zoe invitations to committee members for governance - * - Making sure an account is successfully funded with vbank assets like IST, BLD etc. - * - operation: query dest account's balance - * - condition: dest account has a balance >= sent token - * - Making sure an offer resulted successfully - * - */ - -/** - * @typedef {object} RetryOptions - * @property {number} [maxRetries] - * @property {number} [retryIntervalMs] - * @property {(...arg0: string[]) => void} [log] - * @property {(callback: Function, delay: number) => void} [setTimeout] - * - * @typedef {RetryOptions & {errorMessage: string}} WaitUntilOptions - * - * @typedef {object} CosmosBalanceThreshold - * @property {string} denom - * @property {number} value - */ - -const ambientSetTimeout = global.setTimeout; - -/** - * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L10 - * - * @param {number} ms - * @param {*} sleepOptions - */ -export const sleep = (ms, { log = () => {}, setTimeout = ambientSetTimeout }) => - new Promise(resolve => { - log(`Sleeping for ${ms}ms...`); - setTimeout(resolve, ms); - }); - -/** - * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L24 - * - * @param {() => Promise} operation - * @param {(result: any) => boolean} condition - * @param {string} message - * @param {RetryOptions} options - */ -export const retryUntilCondition = async ( - operation, - condition, - message, - { maxRetries = 6, retryIntervalMs = 3500, log = console.log, setTimeout }, -) => { - console.log({ maxRetries, retryIntervalMs, message }); - let retries = 0; - - while (retries < maxRetries) { - try { - const result = await operation(); - log('RESULT', result); - if (condition(result)) { - return result; - } - } catch (error) { - if (error instanceof Error) { - log(`Error: ${error.message}`); - } else { - log(`Unknown error: ${String(error)}`); - } - } - - retries += 1; - console.log( - `Retry ${retries}/${maxRetries} - Waiting for ${retryIntervalMs}ms for ${message}...`, - ); - await sleep(retryIntervalMs, { log, setTimeout }); - } - - throw Error(`${message} condition failed after ${maxRetries} retries.`); -}; - -/** - * @param {WaitUntilOptions} options - */ -const overrideDefaultOptions = options => { - const defaultValues = { - maxRetries: 6, - retryIntervalMs: 3500, - log: console.log, - errorMessage: 'Error', - }; - - return { ...defaultValues, ...options }; -}; - -/// ////////// Making sure a core-eval resulted successfully deploying a contract ///////////// - -const makeGetInstances = follow => async () => { - const instanceEntries = await follow( - '-lF', - `:published.agoricNames.instance`, - ); - - return Object.fromEntries(instanceEntries); -}; - -/** - * - * @param {string} contractName - * @param {{follow: () => object, setTimeout: (object) => void}} ambientAuthority - * @param {WaitUntilOptions} options - */ -export const waitUntilContractDeployed = ( - contractName, - ambientAuthority, - options, -) => { - const { follow, setTimeout } = ambientAuthority; - const getInstances = makeGetInstances(follow); - const { maxRetries, retryIntervalMs, errorMessage, log } = - overrideDefaultOptions(options); - - return retryUntilCondition( - getInstances, - instanceObject => Object.keys(instanceObject).includes(contractName), - errorMessage, - { maxRetries, retryIntervalMs, log, setTimeout }, - ); -}; - -/// ////////// Making sure an account is successfully funded with vbank assets like IST, BLD etc. /////////////// - -const makeQueryCosmosBalance = queryCb => async dest => { - const coins = await queryCb('bank', 'balances', dest); - return coins.balances; -}; - -/** - * - * @param {Array} balances - * @param {CosmosBalanceThreshold} threshold - * @returns {boolean} - */ -const checkCosmosBalance = (balances, threshold) => { - const balance = [...balances].find(({ denom }) => denom === threshold.denom); - return Number(balance.amount) >= threshold.value; -}; - -/** - * @param {string} destAcct - * @param {{query: () => Promise, setTimeout: (object) => void}} ambientAuthority - * @param {{denom: string, value: number}} threshold - * @param {WaitUntilOptions} options - */ -export const waitUntilAccountFunded = ( - destAcct, - ambientAuthority, - threshold, - options, -) => { - const { query, setTimeout } = ambientAuthority; - const queryCosmosBalance = makeQueryCosmosBalance(query); - const { maxRetries, retryIntervalMs, errorMessage, log } = - overrideDefaultOptions(options); - - return retryUntilCondition( - async () => queryCosmosBalance(destAcct), - balances => checkCosmosBalance(balances, threshold), - errorMessage, - { maxRetries, retryIntervalMs, log, setTimeout }, - ); -}; - -/// ////////// Making sure an offers get results ///////////// - -const makeQueryWallet = follow => async (/** @type {string} */ addr) => { - const update = await follow('-lF', `:published.wallet.${addr}`); - - return update; -}; - -/** - * - * @param {object} offerStatus - * @param {boolean} waitForPayouts - * @param {string} offerId - */ -const checkOfferState = (offerStatus, waitForPayouts, offerId) => { - const { updated, status } = offerStatus; - - if (updated !== 'offerStatus') return false; - if (!status) return false; - if (status.id !== offerId) return false; - if (!status.numWantsSatisfied || status.numWantsSatisfied !== 1) return false; - if (waitForPayouts && status.payouts) return true; - if (!waitForPayouts && status.result) return true; - - return false; -}; - -/** - * - * @param {string} addr - * @param {string} offerId - * @param {boolean} waitForPayouts - * @param {{follow: () => object, setTimeout: (callback: Function, delay: number) => void}} ambientAuthority - * @param {WaitUntilOptions} options - */ -export const waitUntilOfferResult = ( - addr, - offerId, - waitForPayouts, - ambientAuthority, - options, -) => { - const { follow, setTimeout } = ambientAuthority; - const queryWallet = makeQueryWallet(follow); - const { maxRetries, retryIntervalMs, errorMessage, log } = - overrideDefaultOptions(options); - - return retryUntilCondition( - async () => queryWallet(addr), - status => checkOfferState(status, waitForPayouts, offerId), - errorMessage, - { maxRetries, retryIntervalMs, log, setTimeout }, - ); -}; - -/// ////////// Making sure a core-eval successfully sent zoe invitations to committee members for governance ///////////// - -/** - * - * @param {{ updated: string, currentAmount: any }} update - * @returns {boolean} - */ -const checkForInvitation = update => { - const { updated, currentAmount } = update; - - if (updated !== 'balance') return false; - if (!currentAmount || !currentAmount.brand) return false; - - return currentAmount.brand.includes('Invitation'); -}; - -/** - * - * @param {string} addr - * @param {{follow: () => object, setTimeout: (object) => void}} ambientAuthority - * @param {WaitUntilOptions} options - */ -export const waitUntilInvitationReceived = ( - addr, - ambientAuthority, - options, -) => { - const { follow, setTimeout } = ambientAuthority; - const queryWallet = makeQueryWallet(follow); - const { maxRetries, retryIntervalMs, errorMessage, log } = - overrideDefaultOptions(options); - - return retryUntilCondition( - async () => queryWallet(addr), - checkForInvitation, - errorMessage, - { maxRetries, retryIntervalMs, log, setTimeout }, - ); -}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.test.js b/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.test.js deleted file mode 100644 index 2b0d3603c4b..00000000000 --- a/a3p-integration/proposals/z:acceptance/test-lib/sync-tools.test.js +++ /dev/null @@ -1,413 +0,0 @@ -/* eslint-env node */ -// @ts-check -import test from 'ava'; -import '@endo/init/debug.js'; -import { - waitUntilAccountFunded, - waitUntilContractDeployed, - waitUntilInvitationReceived, - waitUntilOfferResult, -} from './sync-tools.js'; - -const makeFakeFollow = () => { - let value = [[]]; - - const setValue = newValue => (value = newValue); - const follow = () => Promise.resolve(value); - - return { setValue, follow }; -}; - -const makeFakeBalanceQuery = () => { - let result = { - balances: [ - { - denom: 'ubld', - amount: '364095061', - }, - { - denom: 'uist', - amount: '2257215', - }, - ], - pagination: { - next_key: null, - total: '0', - }, - }; - - const setResult = newValue => (result = newValue); - const query = () => Promise.resolve(result); - - return { setResult, query }; -}; - -test.serial('wait until contract is deployed', async t => { - const { setValue, follow } = makeFakeFollow(); - const waitP = waitUntilContractDeployed( - 'name', - { - follow, - setTimeout, - }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'Contract not deployed yet', - }, - ); - - setTimeout(() => setValue([['name', true]]), 3000); // set desired value after third retry - - await t.notThrowsAsync(waitP); -}); - -test.serial('wait until account funded', async t => { - const { setResult, query } = makeFakeBalanceQuery(); - - const waitP = waitUntilAccountFunded( - 'agoric12345', - { query, setTimeout }, - { denom: 'ufake', value: 100_000 }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'Account not funded yet', - }, - ); - - const desiredResult = { - balances: [ - { - denom: 'ubld', - amount: '364095061', - }, - { - denom: 'uist', - amount: '2257215', - }, - { - denom: 'ufake', - amount: '100001', - }, - ], - pagination: { - next_key: null, - total: '0', - }, - }; - setTimeout(() => setResult(desiredResult), 3000); // set desired value after third retry - await t.notThrowsAsync(waitP); -}); - -test.serial('wait until account funded, insufficient balance', async t => { - const { setResult, query } = makeFakeBalanceQuery(); - - const waitP = waitUntilAccountFunded( - 'agoric12345', - { query, setTimeout }, - { denom: 'ufake', value: 100_000 }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'Account not funded yet', - }, - ); - - const desiredResult = { - balances: [ - { - denom: 'ubld', - amount: '364095061', - }, - { - denom: 'uist', - amount: '2257215', - }, - { - denom: 'ufake', - amount: '90000', - }, - ], - pagination: { - next_key: null, - total: '0', - }, - }; - setTimeout(() => setResult(desiredResult), 3000); // set desired value after third retry - await t.throwsAsync(waitP, { message: /Account not funded yet/ }); -}); - -test.serial( - 'wait until offer result, balance update - should throw', - async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ status: {}, updated: 'balance' }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - false, - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'Wrong update type', - }, - ); - - await t.throwsAsync(waitP, { message: /Wrong update type/ }); - }, -); - -test.serial('wait until offer result, wrong id - should throw', async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ status: { id: 'your-offer' }, updated: 'offerStatus' }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - false, - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'Wrong offer id', - }, - ); - - await t.throwsAsync(waitP, { message: /Wrong offer id/ }); -}); - -test.serial('wait until offer result, no "status" - should throw', async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ updated: 'offerStatus' }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - false, - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'No "status" object', - }, - ); - - await t.throwsAsync(waitP, { message: /No "status" object/ }); -}); - -test.serial( - 'wait until offer result, numWantsSatisfied not equals to 1 - should throw', - async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ - status: { id: 'my-offer', numWantsSatisfied: 0 }, - updated: 'offerStatus', - }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - false, - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: '"numWantsSatisfied" is not 1', - }, - ); - - await t.throwsAsync(waitP, { message: /"numWantsSatisfied" is not 1/ }); - }, -); - -test.serial('wait until offer result, do not wait for "payouts"', async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ status: { id: 'my-offer' }, updated: 'offerStatus' }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - false, - { follow, setTimeout }, - { - maxRetries: 7, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'offer not resulted on time', - }, - ); - - setTimeout( - () => - setValue({ - status: { id: 'my-offer', numWantsSatisfied: 1 }, - updated: 'offerStatus', - }), - 1000, - ); // First, offer is seated - setTimeout( - () => - setValue({ - status: { id: 'my-offer', numWantsSatisfied: 1, result: 'thank you' }, - updated: 'offerStatus', - }), - 3000, - ); // Then offer got results - - await t.notThrowsAsync(waitP); -}); - -test.serial('wait until offer result, wait for "payouts"', async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ status: { id: 'my-offer' }, updated: 'offerStatus' }); - - const waitP = waitUntilOfferResult( - 'agoric12345', - 'my-offer', - true, - { follow, setTimeout }, - { - maxRetries: 7, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'payouts not received on time', - }, - ); - - setTimeout( - () => - setValue({ - status: { id: 'my-offer', numWantsSatisfied: 1 }, - updated: 'offerStatus', - }), - 1000, - ); // First, offer is seated - setTimeout( - () => - setValue({ - status: { id: 'my-offer', numWantsSatisfied: 1, result: 'thank you' }, - updated: 'offerStatus', - }), - 3000, - ); // Now offer got results - setTimeout( - () => - setValue({ - status: { - id: 'my-offer', - numWantsSatisfied: 1, - result: 'thank you', - payouts: {}, - }, - updated: 'offerStatus', - }), - 4000, - ); // Payouts are received - - await t.notThrowsAsync(waitP); -}); - -test.serial( - 'wait until invitation recevied, wrong "updated" value', - async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ updated: 'offerStatus' }); - - const waitP = waitUntilInvitationReceived( - 'agoric12345', - { follow, setTimeout }, - { - maxRetries: 3, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'wrong "updated" value', - }, - ); - - await t.throwsAsync(waitP, { message: /wrong "updated" value/ }); - }, -); - -test.serial( - 'wait until invitation recevied, falty "currentAmount" object', - async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ updated: 'balance' }); - - const waitP = waitUntilInvitationReceived( - 'agoric12345', - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'faulty "currentAmount" object', - }, - ); - - setTimeout( - () => setValue({ updated: 'balance', currentAmount: { foo: true } }), - 2000, - ); - - await t.throwsAsync(waitP, { message: /faulty "currentAmount" object/ }); - }, -); - -test.serial( - 'wait until invitation recevied, brand string do not match', - async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({ updated: 'balance', currentAmount: { brand: 'foo bar foo' } }); - - const waitP = waitUntilInvitationReceived( - 'agoric12345', - { follow, setTimeout }, - { - maxRetries: 3, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'brand string do not match', - }, - ); - - await t.throwsAsync(waitP, { message: /brand string do not match/ }); - }, -); - -test.serial('wait until invitation recevied', async t => { - const { setValue, follow } = makeFakeFollow(); - setValue({}); - - const waitP = waitUntilInvitationReceived( - 'agoric12345', - { follow, setTimeout }, - { - maxRetries: 5, - retryIntervalMs: 1000, - log: t.log, - errorMessage: 'brand string do not match', - }, - ); - - setTimeout( - () => - setValue({ - updated: 'balance', - currentAmount: { brand: '[Alleged: SEVERED: Zoe Invitation brand {}]' }, - }), - 2000, - ); - - await t.notThrowsAsync(waitP); -}); diff --git a/a3p-integration/proposals/z:acceptance/test-lib/utils.js b/a3p-integration/proposals/z:acceptance/test-lib/utils.js index 2ea35ba4bae..603e7cb8d2c 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/utils.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/utils.js @@ -1,7 +1,21 @@ -import { makeAgd, agops } from '@agoric/synthetic-chain'; -import { execFileSync } from 'node:child_process'; +/* eslint-env node */ +import { + LOCAL_CONFIG, + makeStargateClient, + makeVstorageKit, + retryUntilCondition, +} from '@agoric/client-utils'; +import { evalBundles, getDetailsMatchingVats } from '@agoric/synthetic-chain'; import { readFile, writeFile } from 'node:fs/promises'; +export const stargateClientP = makeStargateClient(LOCAL_CONFIG, { fetch }); +export const vstorageKit = makeVstorageKit({ fetch }, LOCAL_CONFIG); + +/** + * @import {WalletUtils} from '@agoric/client-utils'; + * @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js'; + */ + /** * @param {string} fileName base file name without .tjs extension * @param {Record} replacements @@ -14,24 +28,17 @@ export const replaceTemplateValuesInFile = async (fileName, replacements) => { await writeFile(`${fileName}.js`, script); }; -const showAndExec = (file, args, opts) => { - console.log('$', file, ...args); - return execFileSync(file, args, opts); -}; - -// @ts-expect-error string is not assignable to Buffer -export const agd = makeAgd({ execFileSync: showAndExec }).withOpts({ - keyringBackend: 'test', -}); - +// FIXME this return type depends on its arguments in surprising ways /** * @param {string[]} addresses * @param {string} [targetDenom] + * @returns {Promise} */ export const getBalances = async (addresses, targetDenom = undefined) => { + const client = await stargateClientP; const balancesList = await Promise.all( addresses.map(async address => { - const { balances } = await agd.query(['bank', 'balances', address]); + const balances = await client.getAllBalances(address); if (targetDenom) { const balance = balances.find(({ denom }) => denom === targetDenom); @@ -45,8 +52,27 @@ export const getBalances = async (addresses, targetDenom = undefined) => { return addresses.length === 1 ? balancesList[0] : balancesList; }; -export const agopsVaults = addr => agops.vaults('list', '--from', addr); +// TODO move this out of testing. To inter-protocol? +// "vaults" is an Inter thing, but vstorage shape is a full chain (client) thing +// Maybe a plugin architecture where the truth is in inter-protocol and the +// client-lib rolls up the exports of many packages? +/** + * @param {string} addr + * @param {WalletUtils} walletUtils + * @returns {Promise} + */ +export const listVaults = async (addr, { getCurrentWalletRecord }) => { + const current = await getCurrentWalletRecord(addr); + const vaultStoragePaths = current.offerToPublicSubscriberPaths.map( + ([_offerId, pathmap]) => pathmap.vault, + ); + + return vaultStoragePaths; +}; +/** + * @param {{setTimeout: typeof setTimeout}} io + */ export const makeTimerUtils = ({ setTimeout }) => { /** * Resolve after a delay in milliseconds. @@ -56,9 +82,12 @@ export const makeTimerUtils = ({ setTimeout }) => { */ const delay = ms => new Promise(resolve => setTimeout(() => resolve(), ms)); - const waitUntil = async timestamp => { - const timeDelta = Math.floor(Date.now() / 1000) - Number(timestamp); - await delay(timeDelta); + /** @param {number | bigint} secondsSinceEpoch */ + const waitUntil = async secondsSinceEpoch => { + await null; + const waitMs = Number(secondsSinceEpoch) * 1000 - Date.now(); + if (waitMs <= 0) return; + await delay(waitMs); }; return { @@ -66,3 +95,29 @@ export const makeTimerUtils = ({ setTimeout }) => { waitUntil, }; }; + +/** + * This function solves the limitation of getIncarnation when multiple Vats + * are returned for the provided vatName and does not return the incarnation + * of the desired Vat (e.g. zcf-mintHolder-USDC) + * @param {string} vatName + * @returns {Promise} + */ +const getIncarnationFromDetails = async vatName => { + const matchingVats = await getDetailsMatchingVats(vatName); + const expectedVat = matchingVats.find(vat => vat.vatName === vatName); + assert(expectedVat, `No matching Vat was found for ${vatName}`); + return expectedVat.incarnation; +}; + +export const upgradeContract = async (submissionPath, vatName) => { + const incarnationBefore = await getIncarnationFromDetails(vatName); + await evalBundles(submissionPath); + + return retryUntilCondition( + async () => getIncarnationFromDetails(vatName), + value => value === incarnationBefore + 1, + `${vatName} upgrade not processed yet`, + { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); +}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/vaults.js b/a3p-integration/proposals/z:acceptance/test-lib/vaults.js new file mode 100644 index 00000000000..1dabb741e95 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/test-lib/vaults.js @@ -0,0 +1,262 @@ +/* eslint-env node */ + +import { makeAgoricNames, retryUntilCondition } from '@agoric/client-utils'; +import { AmountMath } from '@agoric/ertp'; +import { + agops, + agoric, + executeOffer, + getContractInfo, + GOV1ADDR, + GOV2ADDR, +} from '@agoric/synthetic-chain'; +import { + ceilMultiplyBy, + makeRatio, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import { smartWalletKit } from './index.js'; +import { listVaults, vstorageKit } from './utils.js'; + +/** + * @param {string} address + * @returns {Promise<{ vaultID: string, debt: bigint, collateral: bigint, state: string }>} + */ +export const getLastVaultFromAddress = async address => { + const activeVaults = await listVaults(address, smartWalletKit); + const vaultPath = activeVaults[activeVaults.length - 1]; + const vaultID = vaultPath.split('.').pop(); + + if (!vaultID) { + throw new Error(`No vaults found for ${address}`); + } + + const vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); + + const debt = vaultData.debtSnapshot.debt.value; + const collateral = vaultData.locked.value; + const state = vaultData.vaultState; + + return { vaultID, debt, collateral, state }; +}; + +/** + * @param {string} vaultManager + * @returns {Promise<{ availableDebtForMint: bigint, debtLimit: bigint, totalDebt: bigint }>} + */ +export const getAvailableDebtForMint = async vaultManager => { + const governancePath = `published.vaultFactory.managers.${vaultManager}.governance`; + const governance = await getContractInfo(governancePath, { + agoric, + prefix: '', + }); + + const metricsPath = `published.vaultFactory.managers.${vaultManager}.metrics`; + const metrics = await getContractInfo(metricsPath, { + agoric, + prefix: '', + }); + + const debtLimit = governance.current.DebtLimit.value; + const totalDebt = metrics.totalDebt; + // @ts-expect-error + const availableDebtForMint = (debtLimit.value - totalDebt.value) / 1_000_000n; + + return { + availableDebtForMint, + debtLimit: debtLimit.value, + totalDebt: totalDebt.value, + }; +}; + +/** + * @returns {Promise} + */ +export const getMinInitialDebt = async () => { + const governancePath = `published.vaultFactory.governance`; + const governance = await getContractInfo(governancePath, { + agoric, + prefix: '', + }); + + const minInitialDebt = governance.current.MinInitialDebt.value.value; + + return minInitialDebt / 1_000_000n; +}; + +/** + * @param {bigint} toMintValue + * @param {string} vaultManager + * @returns {Promise<{ mintFee: import('@agoric/ertp/src/types.js').NatAmount, adjustedToMintAmount: import('@agoric/ertp/src/types.js').NatAmount }>} + */ +export const calculateMintFee = async (toMintValue, vaultManager) => { + const { brand } = await makeAgoricNames( + vstorageKit.fromBoard, + vstorageKit.vstorage, + ); + /** @type {import('@agoric/ertp').Brand} */ + // @ts-expect-error let this BoardRemote masquerade as a Brand + const ISTBrand = brand.IST; + + const governancePath = `published.vaultFactory.managers.${vaultManager}.governance`; + const governance = await getContractInfo(governancePath, { + agoric, + prefix: '', + }); + + const mintFee = governance.current.MintFee; + const { numerator, denominator } = mintFee.value; + + const mintFeeRatio = makeRatio( + numerator.value, + ISTBrand, + denominator.value, + ISTBrand, + ); + + const toMintAmount = AmountMath.make(ISTBrand, toMintValue * 1_000_000n); + const expectedMintFee = ceilMultiplyBy(toMintAmount, mintFeeRatio); + const adjustedToMintAmount = AmountMath.add(toMintAmount, expectedMintFee); + + return { mintFee, adjustedToMintAmount }; +}; + +/** + * @param {Array} accounts + * @param {number} position + */ +const voteForNewParams = (accounts, position) => { + console.log('ACTIONS voting for position', position, 'using', accounts); + return Promise.all( + accounts.map(account => + agops.ec( + 'vote', + '--forPosition', + String(position), + '--send-from', + account, + ), + ), + ); +}; + +/** + * + * @param {string} previousOfferId + * @param {number} voteDur + * @param {number} debtLimit + */ +const paramChangeOfferGeneration = async ( + previousOfferId, + voteDur, + debtLimit, +) => { + const ISTunit = 1_000_000n; // aka displayInfo: { decimalPlaces: 6 } + + const agoricNames = await makeAgoricNames( + vstorageKit.fromBoard, + vstorageKit.vstorage, + ); + + const { brand } = agoricNames; + assert(brand.IST); + assert(brand.ATOM); + + const { instance } = agoricNames; + assert(instance.VaultFactory); + + const voteDurSec = BigInt(voteDur); + const debtLimitValue = BigInt(debtLimit) * ISTunit; + /** @type {(ms: number) => bigint} */ + const toSec = ms => BigInt(Math.round(ms / 1000)); + + const id = `propose-${Date.now()}`; + const deadline = toSec(Date.now()) + voteDurSec; + + const body = { + method: 'executeOffer', + offer: { + id, + invitationSpec: { + invitationMakerName: 'VoteOnParamChange', + previousOffer: previousOfferId, + source: 'continuing', + }, + offerArgs: { + deadline, + instance: instance.VaultFactory, + params: { + DebtLimit: { + brand: brand.IST, + value: debtLimitValue, + }, + }, + path: { + paramPath: { + key: { + collateralBrand: brand.ATOM, + }, + }, + }, + }, + proposal: {}, + }, + }; + + // @ts-expect-error tolerate BoardRemote instances with getBoardId methods + return JSON.stringify(vstorageKit.marshaller.toCapData(harden(body))); +}; + +/** + * + * @param {string} address + * @param {*} debtLimit + * @returns {Promise} + */ +export const proposeNewDebtCeiling = async (address, debtLimit) => { + const charterAcceptOfferId = await agops.ec( + 'find-continuing-id', + '--for', + `${'charter\\ member\\ invitation'}`, + '--from', + address, + ); + + return executeOffer( + address, + paramChangeOfferGeneration(charterAcceptOfferId, 30, debtLimit), + ); +}; + +export const GOV4ADDR = 'agoric1c9gyu460lu70rtcdp95vummd6032psmpdx7wdy'; + +/** + * + * @param {string} address + * @param {bigint} debtLimit + */ +export const setDebtLimit = async (address, debtLimit) => { + const govAccounts = [GOV1ADDR, GOV2ADDR, GOV4ADDR]; + + console.log('ACTIONS Setting debt limit'); + + await proposeNewDebtCeiling(address, debtLimit); + await voteForNewParams(govAccounts, 0); + + console.log('ACTIONS wait for the vote to pass'); + + const pushPriceRetryOpts = { + maxRetries: 10, // arbitrary + retryIntervalMs: 5000, // in ms + }; + + await retryUntilCondition( + () => getAvailableDebtForMint('manager0'), + res => res.debtLimit === debtLimit * 1_000_000n, + 'debt limit not set yet', + { + log: console.log, + setTimeout: global.setTimeout, + ...pushPriceRetryOpts, + }, + ); +}; diff --git a/a3p-integration/proposals/z:acceptance/test-lib/wallet.js b/a3p-integration/proposals/z:acceptance/test-lib/wallet.js index 366a988fc8f..fa8e8ca5112 100644 --- a/a3p-integration/proposals/z:acceptance/test-lib/wallet.js +++ b/a3p-integration/proposals/z:acceptance/test-lib/wallet.js @@ -1,145 +1,21 @@ -/** - * @file copied from packages/agoric-cli, - * removing polling and coalescing features whose dependencies cause import problems here - */ -// TODO DRY in https://github.com/Agoric/agoric-sdk/issues/9109 // @ts-check -/* global */ -import { E, Far } from '@endo/far'; +import { sendAction } from 'agoric/src/lib/index.js'; import { inspect } from 'util'; -import { execSwingsetTransaction, pollTx } from './chain.js'; -import { makeRpcUtils } from './rpc.js'; -import { makeTimerUtils } from './utils.js'; - -/** @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js' */ -/** @import {AgoricNamesRemotes} from '@agoric/vats/tools/board-utils.js' */ - -/** - * @template T - * @param follower - * @param [options] - */ -export const iterateReverse = (follower, options) => - // For now, just pass through the iterable. - Far('iterateReverse iterable', { - /** @returns {AsyncIterator} */ - [Symbol.asyncIterator]: () => { - const eachIterable = E(follower).getReverseIterable(options); - const iterator = E(eachIterable)[Symbol.asyncIterator](); - return Far('iterateEach iterator', { - next: () => E(iterator).next(), - }); - }, - }); - -/** @type {CurrentWalletRecord} */ -const emptyCurrentRecord = { - purses: [], - offerToUsedInvitation: [], - offerToPublicSubscriberPaths: [], - liveOffers: [], -}; - -/** - * @param {string} addr - * @param {Pick} io - * @returns {Promise} - */ -export const getCurrent = async (addr, { readLatestHead }) => { - // Partial because older writes may not have had all properties - // NB: assumes changes are only additions - let current = - /** @type {Partial | undefined} */ ( - await readLatestHead(`published.wallet.${addr}.current`) - ); - if (current === undefined) { - throw Error(`undefined current node for ${addr}`); - } - - // Repair a type misunderstanding seen in the wild. - // See https://github.com/Agoric/agoric-sdk/pull/7139 - let offerToUsedInvitation = current.offerToUsedInvitation; - if ( - offerToUsedInvitation && - typeof offerToUsedInvitation === 'object' && - !Array.isArray(offerToUsedInvitation) - ) { - offerToUsedInvitation = Object.entries(offerToUsedInvitation); - current = harden({ - ...current, - offerToUsedInvitation, - }); - } - - // override full empty record with defined values from published one - return { ...emptyCurrentRecord, ...current }; -}; /** - * @param {string} addr - * @param {Pick} io - * @returns {Promise} - */ -export const getLastUpdate = (addr, { readLatestHead }) => { - // @ts-expect-error cast - return readLatestHead(`published.wallet.${addr}`); -}; - -/** - * Sign and broadcast a wallet-action. + * Stop-gap using execFileSync until we have a pure JS signing client. * - * @throws { Error & { code: number } } if transaction fails - * @param {import('@agoric/smart-wallet/src/smartWallet.js').BridgeAction} bridgeAction - * @param {import('./rpc.js').MinimalNetworkConfig & { - * from: string, - * marshaller: import('@endo/marshal').Marshal<'string'>, - * fees?: string, - * verbose?: boolean, - * keyring?: {home?: string, backend: string}, - * stdout: Pick, - * execFileSync: typeof import('child_process').execFileSync, - * delay: (ms: number) => Promise, - * dryRun?: boolean, - * }} opts + * @param {object} root0 + * @param {import('child_process')['execFileSync']} root0.execFileSync + * @param {import('@agoric/client-utils').SmartWalletKit} root0.smartWalletKit + * @param {any} root0.delay + * @param {import('@agoric/client-utils').MinimalNetworkConfig} networkConfig */ -export const sendAction = async (bridgeAction, opts) => { - const { marshaller } = opts; - const offerBody = JSON.stringify(marshaller.toCapData(harden(bridgeAction))); - - // tryExit should not require --allow-spend - // https://github.com/Agoric/agoric-sdk/issues/7291 - const spendMethods = ['executeOffer', 'tryExitOffer']; - const spendArg = spendMethods.includes(bridgeAction.method) - ? ['--allow-spend'] - : []; - - const act = ['wallet-action', ...spendArg, offerBody]; - const out = execSwingsetTransaction([...act, '--output', 'json'], opts); - if (opts.dryRun) { - return; - } - - assert(out); // not dry run - const tx = JSON.parse(out); - if (tx.code !== 0) { - const err = Error(`failed to send tx: ${tx.raw_log} code: ${tx.code}`); - // @ts-expect-error XXX how to add properties to an error? - err.code = tx.code; - throw err; - } - - return pollTx(tx.txhash, opts); -}; - -export const makeWalletUtils = async ( - { setTimeout, execFileSync, fetch }, +export const makeAgdWalletKit = async ( + { execFileSync, smartWalletKit, delay }, networkConfig, ) => { - const { agoricNames, fromBoard, marshaller, readLatestHead, vstorage } = - await makeRpcUtils({ fetch }, networkConfig); - - const { delay } = await makeTimerUtils({ setTimeout }); /** * * @param {string} from @@ -152,17 +28,12 @@ export const makeWalletUtils = async ( delay, execFileSync, from, - marshaller, keyring: { backend: 'test' }, }); }; return { - agoricNames, + ...smartWalletKit, broadcastBridgeAction, - fromBoard, - networkConfig, - readLatestHead, - vstorage, }; }; diff --git a/a3p-integration/proposals/z:acceptance/test.sh b/a3p-integration/proposals/z:acceptance/test.sh index dce7152b5b7..78e9c2d09fa 100755 --- a/a3p-integration/proposals/z:acceptance/test.sh +++ b/a3p-integration/proposals/z:acceptance/test.sh @@ -10,30 +10,29 @@ yarn ava initial.test.js # XXX some of these tests have path dependencies so no globs yarn ava core-eval.test.js -npm install -g tsx -scripts/test-vaults.mts +scripts/test-vaults.ts echo ACCEPTANCE TESTING recorded instances yarn ava recorded-retired.test.js echo ACCEPTANCE TESTING kread -./create-kread-item-test.sh +yarn ava kread.test.js echo ACCEPTANCE TESTING valueVow yarn ava valueVow.test.js -echo ACCEPTANCE TESTING state sync -./state-sync-snapshots-test.sh -./genesis-test.sh - echo ACCEPTANCE TESTING wallet yarn ava wallet.test.js -echo ACCEPTANCE TESTING vaults -yarn ava vaults.test.js - echo ACCEPTANCE TESTING psm yarn ava psm.test.js +echo ACCEPTANCE TESTING vaults +yarn ava vaults.test.js + echo ACCEPTANCE TESTING governance yarn ava governance.test.js + +echo ACCEPTANCE TESTING state sync +./state-sync-snapshots-test.sh +./genesis-test.sh diff --git a/a3p-integration/proposals/z:acceptance/tsconfig.json b/a3p-integration/proposals/z:acceptance/tsconfig.json index bd1c45190fe..064d7a860d4 100644 --- a/a3p-integration/proposals/z:acceptance/tsconfig.json +++ b/a3p-integration/proposals/z:acceptance/tsconfig.json @@ -2,14 +2,20 @@ "compilerOptions": { "noEmit": true, "target": "esnext", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "esnext", + "moduleResolution": "bundler", "allowJs": true, "checkJs": true, + "allowImportingTsExtensions": true, "strict": false, "strictNullChecks": true, "noImplicitThis": true, // XXX synthetic-chain has some errors "skipLibCheck": true - } + }, + "exclude": [ + "restart-valueVow", + "start-valueVow", + "localchaintest-submission" + ] } diff --git a/a3p-integration/proposals/z:acceptance/valueVow.test.js b/a3p-integration/proposals/z:acceptance/valueVow.test.js index 1193740b541..8490351eb58 100644 --- a/a3p-integration/proposals/z:acceptance/valueVow.test.js +++ b/a3p-integration/proposals/z:acceptance/valueVow.test.js @@ -1,36 +1,27 @@ -/* global fetch setTimeout */ - // @ts-check +/* eslint-env node */ import test from 'ava'; import { inspect } from 'node:util'; -import { execFileSync } from 'node:child_process'; -import '@endo/init/debug.js'; +import { retryUntilCondition } from '@agoric/client-utils'; import { evalBundles, getIncarnation, - waitForBlock, GOV1ADDR as GETTER, // not particular to governance, just a handy wallet - GOV2ADDR as SETTER, // not particular to governance, just a handy wallet + GOV2ADDR as SETTER, } from '@agoric/synthetic-chain'; -import { makeWalletUtils } from './test-lib/wallet.js'; -import { networkConfig } from './test-lib/index.js'; +import { agdWalletUtils } from './test-lib/index.js'; const START_VALUEVOW_DIR = 'start-valueVow'; const RESTART_VALUEVOW_DIR = 'restart-valueVow'; test('vow survives restart', async t => { - const walletUtils = await makeWalletUtils( - { setTimeout, execFileSync, fetch }, - networkConfig, - ); - t.log('start valueVow'); await evalBundles(START_VALUEVOW_DIR); t.is(await getIncarnation('valueVow'), 0); t.log('use wallet to get a vow'); - await walletUtils.broadcastBridgeAction(GETTER, { + await agdWalletUtils.broadcastBridgeAction(GETTER, { method: 'executeOffer', offer: { id: 'get-value', @@ -44,21 +35,27 @@ test('vow survives restart', async t => { }); t.log('confirm the value is not in offer results'); - await waitForBlock(2); - { - /** @type {any} */ - const getterStatus = await walletUtils.readLatestHead( - `published.wallet.${GETTER}`, - ); - console.log('current: ', inspect(getterStatus, { depth: 10 })); - t.like(getterStatus, { - status: { - id: 'get-value', - }, - updated: 'offerStatus', - }); - t.false('result' in getterStatus.status, 'no result yet'); - } + let getterStatus = await retryUntilCondition( + /** @type {() => Promise} */ + async () => agdWalletUtils.readLatestHead(`published.wallet.${GETTER}`), + value => value.status.id === 'get-value' && value.updated === 'offerStatus', + 'Offer get-value not succeeded', + { + retryIntervalMs: 5000, + maxRetries: 15, + renderResult: status => inspect(status, { depth: 10 }), + log: t.log, + setTimeout, + }, + ); + + t.like(getterStatus, { + status: { + id: 'get-value', + }, + updated: 'offerStatus', + }); + t.false('result' in getterStatus.status, 'no result yet'); t.log('restart valueVow'); await evalBundles(RESTART_VALUEVOW_DIR); @@ -67,7 +64,7 @@ test('vow survives restart', async t => { const offerArgs = { value: 'Ciao, mondo!' }; t.log('use wallet to set value'); - await walletUtils.broadcastBridgeAction(SETTER, { + await agdWalletUtils.broadcastBridgeAction(SETTER, { method: 'executeOffer', offer: { id: 'set-value', @@ -82,11 +79,9 @@ test('vow survives restart', async t => { }); t.log('confirm the value is now in offer results'); - { - const getterStatus = await walletUtils.readLatestHead( - `published.wallet.${GETTER}`, - ); + getterStatus = await agdWalletUtils.readLatestHead( + `published.wallet.${GETTER}`, + ); - t.like(getterStatus, { status: { result: offerArgs.value } }); - } + t.like(getterStatus, { status: { result: offerArgs.value } }); }); diff --git a/a3p-integration/proposals/z:acceptance/vaults.test.js b/a3p-integration/proposals/z:acceptance/vaults.test.js index 73f6c9433a2..d99c8fe45e1 100644 --- a/a3p-integration/proposals/z:acceptance/vaults.test.js +++ b/a3p-integration/proposals/z:acceptance/vaults.test.js @@ -1,66 +1,93 @@ /* eslint-env node */ import test from 'ava'; + +import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; import { - agoric, - bankSend, - getUser, - openVault, adjustVault, + ATOM_DENOM, + bankSend, closeVault, + generateOracleMap, getISTBalance, - getContractInfo, - ATOM_DENOM, + getPriceQuote, + getUser, + getVaultPrices, + GOV1ADDR, + GOV2ADDR, + openVault, USER1ADDR, - waitForBlock, } from '@agoric/synthetic-chain'; -import { getBalances, agopsVaults } from './test-lib/utils.js'; - -export const scale6 = x => BigInt(x * 1_000_000); +import { agdWalletUtils } from './test-lib/index.js'; +import { + getPriceFeedRoundId, + verifyPushedPrice, +} from './test-lib/price-feed.js'; +import { bankSend as sendIST, tryISTBalances } from './test-lib/psm-lib.js'; +import { getBalances, listVaults } from './test-lib/utils.js'; +import { + calculateMintFee, + getAvailableDebtForMint, + getLastVaultFromAddress, + getMinInitialDebt, + setDebtLimit, +} from './test-lib/vaults.js'; + +const VAULT_MANAGER = 'manager0'; + +/** @type {(x: number) => number} */ +const scale6 = x => x * 1_000_000; + +// TODO produce this dynamically from an Offers object exported from a package clientSupport +const exec = { + vaults: { + // TODO decide how to handle defaults, whether CLI and this should have the same + /** + * @param {string} from + * @param {Parameters[1]['wantMinted']} wantMinted + * @param {Parameters[1]['giveCollateral']} giveCollateral + * @param {Parameters[1]['offerId']} offerId + * @param {Parameters[1]['collateralBrandKey']} collateralBrandKey + */ + OpenVault: ( + from, + wantMinted, + giveCollateral, + offerId = `openVault-${Date.now()}`, + collateralBrandKey = 'ATOM', + ) => { + const offer = Offers.vaults.OpenVault(agdWalletUtils.agoricNames, { + giveCollateral, + wantMinted, + offerId, + collateralBrandKey, + }); + return agdWalletUtils.broadcastBridgeAction(from, { + method: 'executeOffer', + offer, + }); + }, + }, +}; -test.serial('attempt to open vaults under the minimum amount', async t => { - const activeVaultsBefore = await agopsVaults(USER1ADDR); +test.serial('open new vault', async t => { await bankSend(USER1ADDR, `20000000${ATOM_DENOM}`); - t.log('active vaults before:', activeVaultsBefore); - - const mint = '3.0'; - const collateral = '5.0'; - await t.throwsAsync(() => openVault(USER1ADDR, mint, collateral), { - message: - /Vault creation requires a minInitialDebt of {"brand":"\[Alleged: IST brand\]","value":"\[5000000n\]"}/, - }); - - const activeVaultsAfter = await agopsVaults(USER1ADDR); - t.log('active vaults after:', activeVaultsAfter); - - t.is( - activeVaultsAfter.length, - activeVaultsBefore.length, - 'The number of active vaults should remain the same.', - ); -}); -test.serial('open new vault', async t => { const istBalanceBefore = await getISTBalance(USER1ADDR); - const activeVaultsBefore = await agopsVaults(USER1ADDR); - t.log('uist balance before:', istBalanceBefore); - t.log('active vaults before:', activeVaultsBefore); - - await bankSend(USER1ADDR, `20000000${ATOM_DENOM}`); + const activeVaultsBefore = await listVaults(USER1ADDR, agdWalletUtils); - const mint = '5.0'; - const collateral = '10.0'; - await openVault(USER1ADDR, mint, collateral); + const mint = 5.0; + const collateral = 10.0; + await exec.vaults.OpenVault(USER1ADDR, mint, collateral); const istBalanceAfter = await getISTBalance(USER1ADDR); - const activeVaultsAfter = await agopsVaults(USER1ADDR); - t.log('uist balance after:', istBalanceAfter); - t.log('active vaults after:', activeVaultsAfter); + const activeVaultsAfter = await listVaults(USER1ADDR, agdWalletUtils); - t.is( - istBalanceBefore + 5, - istBalanceAfter, - 'The IST balance should increase by the minted amount', + await tryISTBalances( + t, + scale6(istBalanceAfter), + scale6(istBalanceBefore + 5), ); + t.is( activeVaultsAfter.length, activeVaultsBefore.length + 1, @@ -69,21 +96,13 @@ test.serial('open new vault', async t => { }); test.serial('remove collateral', async t => { - const activeVaults = await agopsVaults(USER1ADDR); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); - - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const collateralBefore = vaultData.locked.value; - t.log('vault collateral before:', collateralBefore); + const { vaultID, collateral: collateralBefore } = + await getLastVaultFromAddress(USER1ADDR); await adjustVault(USER1ADDR, vaultID, { wantCollateral: 1.0 }); - await waitForBlock(); - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - - const collateralAfter = vaultData.locked.value; - t.log('vault collateral after:', collateralAfter); + const { collateral: collateralAfter } = + await getLastVaultFromAddress(USER1ADDR); t.is( collateralBefore, @@ -93,20 +112,12 @@ test.serial('remove collateral', async t => { }); test.serial('remove IST', async t => { - const activeVaults = await agopsVaults(USER1ADDR); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); - - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const debtBefore = vaultData.debtSnapshot.debt.value; - t.log('vault debt before:', debtBefore); + const { vaultID, debt: debtBefore } = + await getLastVaultFromAddress(USER1ADDR); await adjustVault(USER1ADDR, vaultID, { wantMinted: 1.0 }); - await waitForBlock(); - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const debtAfter = vaultData.debtSnapshot.debt.value; - t.log('vault debt after:', debtAfter); + const { debt: debtAfter } = await getLastVaultFromAddress(USER1ADDR); t.is( debtAfter, @@ -115,133 +126,290 @@ test.serial('remove IST', async t => { ); }); -test.serial('close vault', async t => { - const activeVaults = await agopsVaults(USER1ADDR); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); +test.serial('add collateral', async t => { + const { vaultID, collateral: collateralBefore } = + await getLastVaultFromAddress(USER1ADDR); + + await adjustVault(USER1ADDR, vaultID, { giveCollateral: 1.0 }); + + const { collateral: collateralAfter } = + await getLastVaultFromAddress(USER1ADDR); + + t.is( + collateralAfter, + collateralBefore + 1_000_000n, + 'The vault Collateral should increase after adding some ATOM', + ); +}); + +test.serial('add IST', async t => { + const { vaultID, debt: debtBefore } = + await getLastVaultFromAddress(USER1ADDR); + + await adjustVault(USER1ADDR, vaultID, { giveMinted: 1.0 }); + + const { debt: debtAfter } = await getLastVaultFromAddress(USER1ADDR); - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const vaultCollateral = vaultData.locked.value; - t.log('vault collateral:', vaultCollateral); + t.is( + debtAfter, + debtBefore - 1_000_000n, + 'The vault Debt should decrease after adding some IST', + ); +}); +test.serial('close vault', async t => { + const { vaultID, collateral } = await getLastVaultFromAddress(USER1ADDR); const atomBalanceBefore = await getBalances([USER1ADDR], ATOM_DENOM); - t.log('atom balance before', atomBalanceBefore); - await closeVault(USER1ADDR, vaultID, 6.03); - await waitForBlock(); + await closeVault(USER1ADDR, vaultID, 6.035); const atomBalanceAfter = await getBalances([USER1ADDR], ATOM_DENOM); - t.log('atom balance after', atomBalanceAfter); - - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const vaultState = vaultData.vaultState; - t.log('vault state:', vaultState); + const { state } = await getLastVaultFromAddress(USER1ADDR); t.is( atomBalanceAfter, - atomBalanceBefore + vaultCollateral, + atomBalanceBefore + collateral, 'The ATOM balance should increase by the vault collateral amount', ); - t.is(vaultState, 'closed', 'The vault should be in the "closed" state.'); + t.is(state, 'closed', 'The vault should be in the "closed" state.'); }); -test.serial('open second vault', async t => { - const user2Address = await getUser('user2'); - await bankSend(user2Address, `20000000${ATOM_DENOM}`); +test.serial( + 'user cannot open a vault under the minimum initial debt', + async t => { + await bankSend(GOV1ADDR, `200000000000000000${ATOM_DENOM}`); + const activeVaultsBefore = await listVaults(GOV1ADDR, agdWalletUtils); + + const minInitialDebt = await getMinInitialDebt(); + + const mint = minInitialDebt - 1n; + const collateral = mint * 2n; + + await t.throwsAsync( + () => openVault(GOV1ADDR, mint.toString(), collateral.toString()), + { + message: /Error: Vault creation requires a minInitialDebt/, + }, + ); + + const activeVaultsAfter = await listVaults(GOV1ADDR, agdWalletUtils); - const activeVaultsBefore = await agopsVaults(user2Address); - t.log('active vaults before:', activeVaultsBefore); + t.is( + activeVaultsAfter.length, + activeVaultsBefore.length, + 'The number of active vaults should remain the same.', + ); + }, +); - const mint = '7.0'; - const collateral = '11.0'; - await openVault(user2Address, mint, collateral); - await waitForBlock(); +test.serial('user cannot open a vault above debt limit', async t => { + const activeVaultsBefore = await listVaults(GOV1ADDR, agdWalletUtils); - const activeVaultsAfter = await agopsVaults(user2Address); - t.log('active vaults after:', activeVaultsAfter); + const { availableDebtForMint } = await getAvailableDebtForMint(VAULT_MANAGER); + + const mint = availableDebtForMint + 5n; + const collateral = mint * 2n; + + await t.throwsAsync( + () => openVault(GOV1ADDR, mint.toString(), collateral.toString()), + { + message: /Error: Minting.*would hit total debt limit/, + }, + ); + + const activeVaultsAfter = await listVaults(GOV1ADDR, agdWalletUtils); t.is( activeVaultsAfter.length, - activeVaultsBefore.length + 1, - `The number of active vaults should increase after opening a new vault.`, + activeVaultsBefore.length, + `The number of active vaults should stay the same.`, ); }); -test.serial('add collateral', async t => { - const user2Address = await getUser('user2'); - const activeVaults = await agopsVaults(user2Address); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); +test.serial('user can open a vault under debt limit', async t => { + const istBalanceBefore = await getISTBalance(GOV1ADDR); + const activeVaultsBefore = await listVaults(GOV1ADDR, agdWalletUtils); + + const { availableDebtForMint } = await getAvailableDebtForMint(VAULT_MANAGER); - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const collateralBefore = vaultData.locked.value; - t.log('vault collateral before:', collateralBefore); + const mint = availableDebtForMint - 1_000_000n; + const collateral = availableDebtForMint * 2n; - await adjustVault(user2Address, vaultID, { giveCollateral: 1.0 }); - await waitForBlock(); + await openVault(GOV1ADDR, mint.toString(), collateral.toString()); - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const collateralAfter = vaultData.locked.value; - t.log('vault collateral after:', collateralAfter); + const istBalanceAfter = await getISTBalance(GOV1ADDR); + const activeVaultsAfter = await listVaults(GOV1ADDR, agdWalletUtils); + + await tryISTBalances( + t, + scale6(istBalanceAfter), + scale6(istBalanceBefore + Number(mint)), + ); t.is( - collateralBefore, - collateralAfter - 1_000_000n, - 'The vault Collateral should increase after adding some ATOM', + activeVaultsAfter.length, + activeVaultsBefore.length + 1, + `The number of active vaults should increase after opening a new vault.`, ); }); -test.serial('add IST', async t => { - const user2Address = await getUser('user2'); - const activeVaults = await agopsVaults(user2Address); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); +test.serial('user cannot increased vault debt above debt limit', async t => { + const { vaultID, debt: debtBefore } = await getLastVaultFromAddress(GOV1ADDR); + + const { availableDebtForMint } = await getAvailableDebtForMint(VAULT_MANAGER); + + // The availableDebtForMint + mintFee will surpass the debt limit + const mint = Number(availableDebtForMint); + await t.throwsAsync( + () => + adjustVault(GOV1ADDR, vaultID, { + wantMinted: mint, + }), + { + message: /Error: Minting.*would hit total debt limit/, + }, + ); - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const debtBefore = vaultData.debtSnapshot.debt.value; - t.log('vault debt before:', debtBefore); + const { debt: debtAfter } = await getLastVaultFromAddress(GOV1ADDR); - await adjustVault(user2Address, vaultID, { giveMinted: 1.0 }); - await waitForBlock(); + t.is(debtAfter, debtBefore, 'The vault Debt should stay the same'); +}); + +test.serial( + 'Minting Fee is applied to users debt when creating a vault and minting more IST', + async t => { + const mint = 5n; + const collateral = mint * 2n; + await openVault(GOV1ADDR, mint.toString(), collateral.toString()); + + const { adjustedToMintAmount } = await calculateMintFee( + mint, + VAULT_MANAGER, + ); + + const { vaultID, debt: debtAfterOpenVault } = + await getLastVaultFromAddress(GOV1ADDR); + + t.is( + debtAfterOpenVault, + adjustedToMintAmount.value, + 'The vault Debt should be equal to mint + fee', + ); + + await adjustVault(GOV1ADDR, vaultID, { wantMinted: 1.0 }); + + const { adjustedToMintAmount: adjustedToMintAmountAfter } = + await calculateMintFee(1n, VAULT_MANAGER); + + const { debt: debtAfterAdjustVault } = + await getLastVaultFromAddress(GOV1ADDR); + + t.is( + debtAfterAdjustVault, + debtAfterOpenVault + adjustedToMintAmountAfter.value, + 'The vault Debt after adjusting should be equal to debt after open + wantMinted + fee', + ); + }, +); + +test.serial('confirm that Oracle prices are being received', async t => { + /* + * The Oracle for ATOM and stATOM brands are being registered in the offer made at file: + * a3p-integration/proposals/n:upgrade-next/verifyPushedPrice.js + * which is being executed during the use phase of upgrade-next proposal + */ + const ATOMManagerIndex = 0; + const BRANDS = ['ATOM']; + const BASE_ID = 'n-upgrade'; + const oraclesByBrand = generateOracleMap(BASE_ID, BRANDS); + + const latestRoundId = await getPriceFeedRoundId(BRANDS[0]); + const roundId = latestRoundId + 1; + + await verifyPushedPrice(oraclesByBrand, BRANDS[0], 10, roundId); + + const atomQuote = await getPriceQuote(BRANDS[0]); + t.is( + atomQuote, + '+10000000', + 'ATOM price quote does not match the expected value', + ); - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const debtAfter = vaultData.debtSnapshot.debt.value; - t.log('vault debt after:', debtAfter); + const vaultQuote = await getVaultPrices(ATOMManagerIndex); + t.true( + vaultQuote.value[0].amountIn.brand.includes(' ATOM '), + 'ATOM price quote not found', + ); t.is( - debtAfter, - debtBefore - 1_000_000n, - 'The vault Debt should decrease after adding some IST', + vaultQuote.value[0].amountOut.value, + atomQuote, + 'Vault price quote does not match the expected ATOM price quote', ); }); -test.serial('close second vault', async t => { - const user2Address = await getUser('user2'); - const activeVaults = await agopsVaults(user2Address); - const vaultPath = activeVaults[activeVaults.length - 1]; - const vaultID = vaultPath.split('.').pop(); +test.serial( + 'Confirm that vaults that existed before the most recent upgrade continue to be useable', + async t => { + /* + * The long-living-vault user is being created and used to open a vault in the n:upgrade-next proposal USE phase. + * The offer to open a vault is implemented in a3p-integration/proposals/n:upgrade-next/openVault.js + */ + const user = await getUser('long-living-vault'); - let vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const vaultCollateral = vaultData.locked.value; - t.log('vault collateral:', vaultCollateral); + const { vaultID, collateral: collateralBefore } = + await getLastVaultFromAddress(user); - const atomBalanceBefore = await getBalances([user2Address], ATOM_DENOM); - t.log('atom balance before', atomBalanceBefore); + await adjustVault(user, vaultID, { wantCollateral: 1.0 }); - await closeVault(user2Address, vaultID, 6.035); - await waitForBlock(); + const { collateral: collateralAfter } = await getLastVaultFromAddress(user); - const atomBalanceAfter = await getBalances([user2Address], ATOM_DENOM); - t.log('atom balance after', atomBalanceAfter); + t.is( + collateralBefore, + collateralAfter + 1_000_000n, + 'The vault Collateral should decrease after removing some ATOM', + ); - vaultData = await getContractInfo(vaultPath, { agoric, prefix: '' }); - const vaultState = vaultData.vaultState; - t.log('vault state:', vaultState); + await closeVault(user, vaultID, 6.03); - t.is( - atomBalanceAfter, - atomBalanceBefore + vaultCollateral, - 'The ATOM balance should increase by the vault collateral amount', - ); - t.is(vaultState, 'closed', 'The vault should be in the "closed" state.'); -}); + const { state } = await getLastVaultFromAddress(user); + + t.is(state, 'closed', 'The vault should be in the "closed" state.'); + }, +); + +test.serial( + 'User can pay off debt when totalDebt is above debtLimit', + async t => { + const mint = '5.0'; + const collateral = '10.0'; + await openVault(GOV1ADDR, mint, collateral); + + const { totalDebt: totalDebtBefore } = + await getAvailableDebtForMint(VAULT_MANAGER); + + // provision governance wallet to cover transaction fees + await sendIST(GOV2ADDR, `1000000uist`, GOV1ADDR); + + const limit = (totalDebtBefore - 10_000_000n) / 1_000_000n; + await setDebtLimit(GOV1ADDR, limit); + + const { debtLimit: debtLimitAfter, totalDebt: totalDebtAfter } = + await getAvailableDebtForMint(VAULT_MANAGER); + t.true( + debtLimitAfter < totalDebtAfter, + 'debtLimit should be less than totalDebt', + ); + + const { vaultID, debt: vaultDebtBefore } = + await getLastVaultFromAddress(GOV1ADDR); + + await adjustVault(GOV1ADDR, vaultID, { + giveMinted: Number(vaultDebtBefore) / 1_000_000, + }); + + const { debt: vaultDebtAfter } = await getLastVaultFromAddress(GOV1ADDR); + + t.is(vaultDebtAfter, 0n, 'The vault Debt should have been erased'); + }, +); diff --git a/a3p-integration/proposals/z:acceptance/wallet.test.js b/a3p-integration/proposals/z:acceptance/wallet.test.js index b41e46af13f..9a2e18d1395 100644 --- a/a3p-integration/proposals/z:acceptance/wallet.test.js +++ b/a3p-integration/proposals/z:acceptance/wallet.test.js @@ -1,18 +1,34 @@ +/* eslint-env node */ + import test from 'ava'; + +import { retryUntilCondition } from '@agoric/client-utils'; import { agoric, + CHAINID, evalBundles, GOV1ADDR, GOV2ADDR, - CHAINID, - waitForBlock, + makeAgd, } from '@agoric/synthetic-chain'; -import { $ } from 'execa'; -import { - agd, - getBalances, - replaceTemplateValuesInFile, -} from './test-lib/utils.js'; +import { execFileSync } from 'node:child_process'; +import { agdWalletUtils } from './test-lib/index.js'; +import { getBalances, replaceTemplateValuesInFile } from './test-lib/utils.js'; + +/** + * @param {string} file + * @param {string[]} args + * @param {Parameters[2]} [opts] + */ +const showAndExec = (file, args, opts) => { + console.log('$', file, ...args); + return execFileSync(file, args, opts); +}; + +// @ts-expect-error string is not assignable to Buffer +const agd = makeAgd({ execFileSync: showAndExec }).withOpts({ + keyringBackend: 'test', +}); test.serial(`send invitation via namesByAddress`, async t => { const SUBMISSION_DIR = 'invitation-test-submission'; @@ -41,21 +57,28 @@ test.serial(`send invitation via namesByAddress`, async t => { ); }); +// FIXME https://github.com/Agoric/agoric-sdk/issues/10565 test.skip('exitOffer tool reclaims stuck payment', async t => { - const offerId = 'bad-invitation-15'; // offer submitted on proposal upgrade-15 with an incorrect method name - const from = 'gov1'; + const istBalanceBefore = await getBalances([GOV1ADDR], 'uist'); + t.log('istBalanceBefore', istBalanceBefore); - const before = await getBalances([GOV1ADDR], 'uist'); - t.log('uist balance before:', before); + const offerId = 'bad-invitation-15'; // offer submitted on proposal upgrade-15 with an incorrect method name + await agdWalletUtils.broadcastBridgeAction(GOV1ADDR, { + method: 'tryExitOffer', + offerId, + }); - await $`node ./exitOffer.js --id ${offerId} --from ${from} `; - await waitForBlock(2); + const istBalanceAfter = await retryUntilCondition( + async () => getBalances([GOV1ADDR], 'uist'), + istBalance => istBalance > istBalanceBefore, + 'tryExitOffer failed to reclaim stuck payment ', + { log: t.log, setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, + ); - const after = await getBalances([GOV1ADDR], 'uist'); - t.log('uist balance after:', after); + t.log('istBalanceAfter', istBalanceAfter); t.true( - after > before, + istBalanceAfter > istBalanceBefore, 'The IST balance should increase after reclaiming the stuck payment', ); }); @@ -97,7 +120,6 @@ test.serial(`ante handler sends fee only to vbank/reserve`, async t => { { chainId: CHAINID, from: GOV1ADDR, yes: true }, ); - await waitForBlock(); t.like(result, { code: 0 }); const [feeCollectorEndBalances, vbankReserveEndBalances] = await getBalances([ @@ -113,6 +135,7 @@ test.serial(`ante handler sends fee only to vbank/reserve`, async t => { // The reserve balances should have increased by exactly the fee (possibly // from zero, in which case start balances wouldn't include its denomination). const feeDenomIndex = vbankReserveStartBalances.findIndex( + /** @param {{ denom: string }} balance */ ({ denom }) => denom === feeDenom, ); const preFeeAmount = diff --git a/a3p-integration/proposals/z:acceptance/yarn.lock b/a3p-integration/proposals/z:acceptance/yarn.lock index 9ce83592e4c..36384207a27 100644 --- a/a3p-integration/proposals/z:acceptance/yarn.lock +++ b/a3p-integration/proposals/z:acceptance/yarn.lock @@ -5,112 +5,354 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/base-zone@npm:0.1.1-dev-9c73ae4.0+9c73ae4": - version: 0.1.1-dev-9c73ae4.0 - resolution: "@agoric/base-zone@npm:0.1.1-dev-9c73ae4.0" +"@agoric/access-token@portal:../../agoric-sdk/packages/access-token::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/access-token@portal:../../agoric-sdk/packages/access-token::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@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/a924c8572c17d1e94a711e46a83dff409d37b8a00cd7e0899f091a64401ca981f31ce51cfa60ed00e5bee94d7b96dd5523fd88a1419f542c73d95e418a10c3b8 + n-readlines: "npm:^1.0.0" + proper-lockfile: "npm:^4.1.2" + tmp: "npm:^0.2.1" languageName: node - linkType: hard + linkType: soft -"@agoric/ertp@npm:dev": - version: 0.16.3-dev-9c73ae4.0 - resolution: "@agoric/ertp@npm:0.16.3-dev-9c73ae4.0" +"@agoric/babel-generator@npm:^7.17.6": + version: 7.17.6 + resolution: "@agoric/babel-generator@npm:7.17.6" dependencies: - "@agoric/notifier": "npm:0.6.3-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" - "@agoric/zone": "npm:0.2.3-dev-9c73ae4.0+9c73ae4" - "@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/0012ed9cc17d6338196cfdef0198fa16bba784e535a7845758db8f0d0ecb766bbdbb22efc5cedc3971a910d65956305f3d08c77a47c79268037cc6e53a6656b8 + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/59db151ae737bd9b1f21c1589df4c7da9cbf484de5b5cc8352052825c2d977283d975303f55acb54d0210c176cb405da263073ceba1d3a6db65c6e21cc6e663f languageName: node linkType: hard -"@agoric/internal@npm:0.3.3-dev-9c73ae4.0+9c73ae4, @agoric/internal@npm:dev": - version: 0.3.3-dev-9c73ae4.0 - resolution: "@agoric/internal@npm:0.3.3-dev-9c73ae4.0" +"@agoric/base-zone@portal:../../agoric-sdk/packages/base-zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/base-zone@portal:../../agoric-sdk/packages/base-zone::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" - "@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" + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/cache@portal:../../agoric-sdk/packages/cache::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/cache@portal:../../agoric-sdk/packages/cache::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + languageName: node + linkType: soft + +"@agoric/casting@portal:../../agoric-sdk/packages/casting::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/casting@portal:../../agoric-sdk/packages/casting::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@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.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/client-utils@portal:../../agoric-sdk/packages/client-utils::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/client-utils@portal:../../agoric-sdk/packages/client-utils::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/casting": "npm:^0.4.3-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/smart-wallet": "npm:^0.5.4-u18.4" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/cosmic-proto@portal:../../agoric-sdk/packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/cosmic-proto@portal:../../agoric-sdk/packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + bech32: "npm:^2.0.0" + query-string: "npm:^9.1.1" + languageName: node + linkType: soft + +"@agoric/ertp@portal:../../agoric-sdk/packages/ERTP::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/ertp@portal:../../agoric-sdk/packages/ERTP::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + languageName: node + linkType: soft + +"@agoric/governance@portal:../../agoric-sdk/packages/governance::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/governance@portal:../../agoric-sdk/packages/governance::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.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/zoe": "npm:^0.26.3-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + languageName: node + linkType: soft + +"@agoric/inter-protocol@portal:../../agoric-sdk/packages/inter-protocol::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/inter-protocol@portal:../../agoric-sdk/packages/inter-protocol::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-u18.0" + "@agoric/internal": "npm:^0.4.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.4" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + jessie.js: "npm:^0.3.4" + languageName: node + linkType: soft + +"@agoric/internal@portal:../../agoric-sdk/packages/internal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/internal@portal:../../agoric-sdk/packages/internal::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" anylogger: "npm:^0.21.0" jessie.js: "npm:^0.3.4" - checksum: 10c0/cebcf81f503e72cdb431e56d13af438275eaab407ea69512f94ca6ee8117ece71b291c2604e05264f61c31eac59fbd35bbced9227b14a4a37c5ee92f862044f6 languageName: node - linkType: hard + linkType: soft -"@agoric/notifier@npm:0.6.3-dev-9c73ae4.0+9c73ae4": - version: 0.6.3-dev-9c73ae4.0 - resolution: "@agoric/notifier@npm:0.6.3-dev-9c73ae4.0" +"@agoric/kmarshal@portal:../../agoric-sdk/packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/kmarshal@portal:../../agoric-sdk/packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/internal": "npm:0.3.3-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" - "@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/5c98617465aac5a32e69f18579e5650c8290cb3bb8643acb80a2c84d5d0cf4012df98de54ecc8c8c6cc09e4cae825818955fa61cd64d4ae2bbf6772f86c3c6d9 + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" languageName: node - linkType: hard + linkType: soft -"@agoric/store@npm:0.9.3-dev-9c73ae4.0+9c73ae4": - version: 0.9.3-dev-9c73ae4.0 - resolution: "@agoric/store@npm:0.9.3-dev-9c73ae4.0" +"@agoric/network@portal:../../agoric-sdk/packages/network::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/network@portal:../../agoric-sdk/packages/network::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/notifier@portal:../../agoric-sdk/packages/notifier::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/notifier@portal:../../agoric-sdk/packages/notifier::locator=root-workspace-0b6124%40workspace%3A." 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/7575dba675c9912968771aa92764fa2e7cb9118f9d8278e40096cdd266f6a035b37e5781f1ea80c41961fc820cc5f3c2174683bba5c0b56c35c98d1890192110 + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" languageName: node - linkType: hard + linkType: soft -"@agoric/swingset-liveslots@npm:0.10.3-dev-9c73ae4.0+9c73ae4": - version: 0.10.3-dev-9c73ae4.0 - resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-9c73ae4.0" +"@agoric/smart-wallet@portal:../../agoric-sdk/packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/smart-wallet@portal:../../agoric-sdk/packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@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/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/store@portal:../../agoric-sdk/packages/store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/store@portal:../../agoric-sdk/packages/store::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/internal": "npm:0.3.3-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@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/93ed5fb3373a05007bc372c84344d3c714561a027ca5a835364e3755ae8bb7a4caa639ebabda78a0062bf209ece1b3d582cc403d6d42235d75d13ab9ac59e656 + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" languageName: node - linkType: hard + linkType: soft -"@agoric/synthetic-chain@npm:^0.3.0": - version: 0.3.0 - resolution: "@agoric/synthetic-chain@npm:0.3.0" +"@agoric/swing-store@portal:../../agoric-sdk/packages/swing-store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swing-store@portal:../../agoric-sdk/packages/swing-store::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + better-sqlite3: "npm:^9.1.1" + languageName: node + linkType: soft + +"@agoric/swingset-liveslots@portal:../../agoric-sdk/packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-liveslots@portal:../../agoric-sdk/packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/swingset-vat@portal:../../agoric-sdk/packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-vat@portal:../../agoric-sdk/packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/kmarshal": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swing-store": "npm:^0.10.0-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-xsnap-supervisor": "npm:^0.10.3-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/xsnap-lockdown": "npm:^0.14.1-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" + 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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + languageName: node + linkType: soft + +"@agoric/swingset-xsnap-supervisor@portal:../../agoric-sdk/packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-xsnap-supervisor@portal:../../agoric-sdk/packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A." + languageName: node + linkType: soft + +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" dependencies: "@endo/zip": "npm:^1.0.7" better-sqlite3: "npm:^9.6.0" @@ -119,366 +361,770 @@ __metadata: execa: "npm:^9.3.1" bin: synthetic-chain: dist/cli/cli.js - checksum: 10c0/17c6241bdc48b8a2a7608c9d4d7c0a0c76fb10d4ee44a31a1150104a792bcd1133f4b1a7e8ab26673a07450b3ceabccd9911999117568221b49221b6ee4306a1 + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-dev-9c73ae4.0+9c73ae4": - version: 0.5.3-dev-9c73ae4.0 - resolution: "@agoric/vat-data@npm:0.5.3-dev-9c73ae4.0" +"@agoric/time@portal:../../agoric-sdk/packages/time::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/time@portal:../../agoric-sdk/packages/time::locator=root-workspace-0b6124%40workspace%3A." dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@agoric/swingset-liveslots": "npm:0.10.3-dev-9c73ae4.0+9c73ae4" - "@endo/errors": "npm:^1.2.7" - "@endo/exo": "npm:^1.5.6" - "@endo/patterns": "npm:^1.4.6" - checksum: 10c0/903940756aa8d38ca7f9aa5c35ac1e4df922f0a2efca4b7557ef96f560ac348117da16886894ef6a73ce3b9051067f6f80299c14f36c69c6c914ca0760c31305 + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/vat-data@portal:../../agoric-sdk/packages/vat-data::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vat-data@portal:../../agoric-sdk/packages/vat-data::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/vats@portal:../../agoric-sdk/packages/vats::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vats@portal:../../agoric-sdk/packages/vats::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-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/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@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/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + languageName: node + linkType: soft + +"@agoric/vow@portal:../../agoric-sdk/packages/vow::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vow@portal:../../agoric-sdk/packages/vow::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/xsnap-lockdown@portal:../../agoric-sdk/packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/xsnap-lockdown@portal:../../agoric-sdk/packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A." + languageName: node + linkType: soft + +"@agoric/zoe@portal:../../agoric-sdk/packages/zoe::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zoe@portal:../../agoric-sdk/packages/zoe::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + yargs-parser: "npm:^21.1.1" + languageName: node + linkType: soft + +"@agoric/zone@portal:../../agoric-sdk/packages/zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zone@portal:../../agoric-sdk/packages/zone::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + languageName: node + linkType: soft + +"@babel/code-frame@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@agoric/zone@npm:0.2.3-dev-9c73ae4.0+9c73ae4": - version: 0.2.3-dev-9c73ae4.0 - resolution: "@agoric/zone@npm:0.2.3-dev-9c73ae4.0" +"@babel/generator@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" - "@endo/errors": "npm:^1.2.7" - "@endo/far": "npm:^1.1.8" - "@endo/pass-style": "npm:^1.4.6" - checksum: 10c0/0c4da29f8422c4da27b2ee7abbc21c52f73f3f305c99ee39dcb2dfb9d62199d49aa306d60335b0f9dc3b0e8cf8b3470d95fddfa5e8152bee2ef47ffe2932a5ca + "@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:^3.0.2" + checksum: 10c0/167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c languageName: node linkType: hard -"@endo/base64@npm:^1.0.8": - version: 1.0.8 - resolution: "@endo/base64@npm:1.0.8" - checksum: 10c0/3501efbf866acc25b9ad0912ec2383e3b976c890a18dc67b5c6eb128433708db69e8ed1cc57190305266bdcbd132659aa87edfc6d02a9886b711e8b86adc21c0 +"@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 -"@endo/common@npm:^1.2.7": - version: 1.2.7 - resolution: "@endo/common@npm:1.2.7" +"@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/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@endo/errors": "npm:^1.2.7" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/2bd25ffc528afd6308b6168650583977139c64e56547b3ea2fee313e01650fb1a041d7b7ce54c6bb70f26c9e78345db2a50fbe3ebccabe9a5c5696eda2cca706 + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 languageName: node linkType: hard -"@endo/env-options@npm:^1.1.7": - version: 1.1.7 - resolution: "@endo/env-options@npm:1.1.7" - checksum: 10c0/5784bd68790041b08d9ead4f6c29cc7871d2e554c23fc44fff38cb20b6b4e55cdba2f78d844ba5ad4b0818185c32475ff318c1b77890d628690d7c7a6ede9475 +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@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 -"@endo/errors@npm:^1.2.2, @endo/errors@npm:^1.2.7": - version: 1.2.7 - resolution: "@endo/errors@npm:1.2.7" +"@babel/traverse@npm:^7.23.6": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - ses: "npm:^1.9.1" - checksum: 10c0/17eed5d01dd968d8e266db37ac44e76859d14894a2b70457d120f2f05021819671aaf1bdf7dc7c2506b84f6df616402e029695d62309fbdbdd13ed4ba34890dd + "@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/e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard -"@endo/eventual-send@npm:^1.2.7": - version: 1.2.7 - resolution: "@endo/eventual-send@npm:1.2.7" +"@babel/types@npm:^7.17.0, @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: - "@endo/env-options": "npm:^1.1.7" - checksum: 10c0/4a483169bcd9ead47a7a07d3f69bdebdc0d1e2a3198f35ad422b82c1646b64528234bdddc9e0544ac38c2ede84a50af1e126eb4086aa8b4ae4b0002895b55e86 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard -"@endo/exo@npm:^1.5.6": - version: 1.5.6 - resolution: "@endo/exo@npm:1.5.6" +"@colors/colors@npm:1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + +"@confio/ics23@npm:^0.6.8": + version: 0.6.8 + resolution: "@confio/ics23@npm:0.6.8" dependencies: - "@endo/common": "npm:^1.2.7" - "@endo/env-options": "npm:^1.1.7" - "@endo/errors": "npm:^1.2.7" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/far": "npm:^1.1.8" - "@endo/pass-style": "npm:^1.4.6" - "@endo/patterns": "npm:^1.4.6" - checksum: 10c0/280fe019ec6006f5649b40093453c4ecaa71dfdcbb9767efc9f0ed4fc23081b120818c4a12896e8ec2221444889031736b569229117834048d596ecb09a44057 + "@noble/hashes": "npm:^1.0.0" + protobufjs: "npm:^6.8.8" + checksum: 10c0/2f3f5032cd6a34c9b2fbd64bbf7e1cdec75ca71f348a770f7b5474b5027b12202bfbcd404eca931efddb5901f769af035a87cb8bddbf3f23d7e5d93c9d3d7f6f languageName: node linkType: hard -"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.5, @endo/far@npm:^1.1.8": - version: 1.1.8 - resolution: "@endo/far@npm:1.1.8" +"@confio/relayer@npm:^0.11.3": + version: 0.11.3 + resolution: "@confio/relayer@npm:0.11.3" dependencies: - "@endo/errors": "npm:^1.2.7" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/pass-style": "npm:^1.4.6" - checksum: 10c0/efb0f063e7a19fd67fe150e0a018a9e4b2abd5238b3c3d136830732aa3294bdb829c1a920607360c285eb6e3a3ae5337b6a1e9847cfcf5618247431af02c5a1e + "@cosmjs/cosmwasm-stargate": "npm:^0.32.1" + "@cosmjs/crypto": "npm:^0.32.1" + "@cosmjs/encoding": "npm:^0.32.1" + "@cosmjs/faucet-client": "npm:^0.32.1" + "@cosmjs/math": "npm:^0.32.1" + "@cosmjs/proto-signing": "npm:^0.32.1" + "@cosmjs/stargate": "npm:^0.32.1" + "@cosmjs/stream": "npm:^0.32.1" + "@cosmjs/tendermint-rpc": "npm:^0.32.1" + "@cosmjs/utils": "npm:^0.32.1" + ajv: "npm:7.1.1" + axios: "npm:^1.6.7" + commander: "npm:7.1.0" + cosmjs-types: "npm:^0.9.0" + fast-safe-stringify: "npm:2.0.4" + js-yaml: "npm:4.0.0" + lodash: "npm:4.17.21" + prom-client: "npm:13.1.0" + table: "npm:^6.7.1" + triple-beam: "npm:1.3.0" + winston: "npm:3.3.3" + bin: + ibc-relayer: build/binary/ibc-relayer/index.js + ibc-setup: build/binary/ibc-setup/index.js + checksum: 10c0/f6519a21a7e2b7d79835558305bbac6f6712b90f0e10f2c156ae74583ca170da0b97ec456272c25a2ffdcbe0343ad425e67886b792f2aed1f5303e34b93edf40 languageName: node linkType: hard -"@endo/init@npm:^1.1.4, @endo/init@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/init@npm:1.1.6" +"@cosmjs/amino@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/amino@npm:0.32.4" dependencies: - "@endo/base64": "npm:^1.0.8" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/lockdown": "npm:^1.0.12" - "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/1885429e475c780bb5b7ff0fd4fcd5d76bc3a5cb1c3c2f9f2dfc06152ff1c8c3be512b6760483c8c18598e1977129cb3dd766a32c9f6efb19d70b54a1844c683 + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + checksum: 10c0/cd8e215b0406f5c7b73ab0a21106d06b6f76b1da12f1ab7b612884e1dd8bc626966dc67d4e7580090ade131546cbec70000f854e6596935299d054b788929a7e languageName: node linkType: hard -"@endo/lockdown@npm:^1.0.12": - version: 1.0.12 - resolution: "@endo/lockdown@npm:1.0.12" +"@cosmjs/cosmwasm-stargate@npm:^0.32.1": + version: 0.32.4 + resolution: "@cosmjs/cosmwasm-stargate@npm:0.32.4" dependencies: - ses: "npm:^1.9.1" - checksum: 10c0/0b9d36f359ffe8eadd1e799aa0340ccb0680d48c9b6249c380c27724824c4d875dada9fbec096fb4e2ac76b32c7536955524d3eb6579451a618707602fb958f4 + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stargate": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + pako: "npm:^2.0.2" + checksum: 10c0/f7e285c51ef8b1098a9ea5ca2546a1e226b4fa0a990d95faa6f3b752f3638b6c55f36a56b6f4b11f0a66fd61e3ae8772921d8e99418218df0b2205efe1c82f37 languageName: node linkType: hard -"@endo/marshal@npm:^1.5.3, @endo/marshal@npm:^1.6.1": - version: 1.6.1 - resolution: "@endo/marshal@npm:1.6.1" +"@cosmjs/crypto@npm:^0.32.1, @cosmjs/crypto@npm:^0.32.3, @cosmjs/crypto@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/crypto@npm:0.32.4" dependencies: - "@endo/common": "npm:^1.2.7" - "@endo/errors": "npm:^1.2.7" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/nat": "npm:^5.0.12" - "@endo/pass-style": "npm:^1.4.6" - "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/e64983abccd833b2a7eb63547e8c5a629f073d3e422229475d470ace95c2640a89e9a9879c46e8389cca8c9e75823ea1c27e27cbeeb8c1c4005146b2c530c530 + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + "@noble/hashes": "npm:^1" + bn.js: "npm:^5.2.0" + elliptic: "npm:^6.5.4" + libsodium-wrappers-sumo: "npm:^0.7.11" + checksum: 10c0/94e742285eb8c7c5393055ba0635f10c06bf87710e953aedc71e3edc2b8e21a12a0d9b5e8eff37e326765f57c9eb3c7fd358f24f639efad4f1a6624eb8189534 languageName: node linkType: hard -"@endo/nat@npm:^5.0.12": - version: 5.0.12 - resolution: "@endo/nat@npm:5.0.12" - checksum: 10c0/deb792b6a0c9fe9c0e7cf74cc725d8bc36934571f4f06ac3b6def2a0622ac79b0278753c574f9b55a88b063d1186fd6971bbe63326077a7d37982c4c37a1a24c +"@cosmjs/encoding@npm:^0.32.1, @cosmjs/encoding@npm:^0.32.3, @cosmjs/encoding@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/encoding@npm:0.32.4" + dependencies: + base64-js: "npm:^1.3.0" + bech32: "npm:^1.1.4" + readonly-date: "npm:^1.0.0" + checksum: 10c0/4a30d5ae1a2d1247d44bda46101ce208c7666d8801ca9a33de94edc35cc22460c16b4834ec84d5a65ffef5e2a4b58605e0a0a056c46bc0a042979ec84acf20cd languageName: node linkType: hard -"@endo/pass-style@npm:^1.4.6": - version: 1.4.6 - resolution: "@endo/pass-style@npm:1.4.6" +"@cosmjs/faucet-client@npm:^0.32.1": + version: 0.32.4 + resolution: "@cosmjs/faucet-client@npm:0.32.4" dependencies: - "@endo/env-options": "npm:^1.1.7" - "@endo/errors": "npm:^1.2.7" - "@endo/eventual-send": "npm:^1.2.7" - "@endo/promise-kit": "npm:^1.1.7" - "@fast-check/ava": "npm:^1.1.5" - checksum: 10c0/fec9d21bb4c70314e92c72f7ae41ec147ac839a23d54f613d689b84f81206e49e657f3fb414db454cbd6ab67dd2a319b1ae25c42b3a1c881edd5de120496b8b4 + axios: "npm:^1.6.0" + checksum: 10c0/1651cb370eb5fa2b12b6f94e06d1dc9a6306e34cad3fc87d9263d8b8a225d500449e10a9f6e326534f65261778208dab7fada6a70efb63195589ad08f58e1008 languageName: node linkType: hard -"@endo/patterns@npm:^1.4.6": - version: 1.4.6 - resolution: "@endo/patterns@npm:1.4.6" +"@cosmjs/json-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/json-rpc@npm:0.32.4" dependencies: - "@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/promise-kit": "npm:^1.1.7" - checksum: 10c0/518cf4f88ff6aaf6c9df01fbe9f63570aaace763f2a169f986145b039cbd872802154b21736f751fc4cce497d3380aa6be41d2d51e169c8e63a1edb1751d1808 + "@cosmjs/stream": "npm:^0.32.4" + xstream: "npm:^11.14.0" + checksum: 10c0/b3ebd240f4fb21260e284d2e503ecc61bac898842187ab717f0efb9a5f21272f161f267cc145629caeb9735f80946844384e2bd410275a4744147a44518c0fa0 languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.7": - version: 1.1.7 - resolution: "@endo/promise-kit@npm:1.1.7" +"@cosmjs/math@npm:^0.32.1, @cosmjs/math@npm:^0.32.3, @cosmjs/math@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/math@npm:0.32.4" dependencies: - ses: "npm:^1.9.1" - checksum: 10c0/98a8d743c437f106f266871874acd811c0e028fc89553738bbd46a0fea5871b9ba7ef0449ec38e7e3768fc21684993ecdbbd06f5f3429cd69fbe4b867d4c2bd5 + bn.js: "npm:^5.2.0" + checksum: 10c0/91e47015be5634d27d71d14c5a05899fb4992b69db02cab1558376dedf8254f96d5e24f097c5601804ae18ed33c7c25d023653ac2bf9d20250fd3e5637f6b101 languageName: node linkType: hard -"@endo/stream@npm:^1.2.7": - version: 1.2.7 - resolution: "@endo/stream@npm:1.2.7" +"@cosmjs/proto-signing@npm:^0.32.1, @cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/proto-signing@npm:0.32.4" dependencies: - "@endo/eventual-send": "npm:^1.2.7" - "@endo/promise-kit": "npm:^1.1.7" - ses: "npm:^1.9.1" - checksum: 10c0/d96a2350200cc76ede5eed49e5d780d6d21f63007b42a83658bf5174e7b61e96bfe6b8f11ed2d33ad7f9eb6c3ec2db2a79079bc1679260ac7dac04a34a4a515e + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + checksum: 10c0/6915059d2e6dbe1abda4a747c3b1abd47a9eff4f8cb2cf9a5545f939b656b4a15bbde2bfc1364357f9b2a081a066280c3b469f6d13dd5fc51b429b0f90a54913 languageName: node linkType: hard -"@endo/zip@npm:^1.0.7": - version: 1.0.8 - resolution: "@endo/zip@npm:1.0.8" - checksum: 10c0/bb74862121932cd27eef59326325c4b61671ce0962033a2ad18e6d6978a9e94bfe604dbfa8c0b039a38fa7eefc495e6a69c583c0e75929cd267979b2c65b775b +"@cosmjs/socket@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/socket@npm:0.32.4" + dependencies: + "@cosmjs/stream": "npm:^0.32.4" + isomorphic-ws: "npm:^4.0.1" + ws: "npm:^7" + xstream: "npm:^11.14.0" + checksum: 10c0/2d94c1fb39016bea3c7c145f4565c8a0fed20c805ac569ea604cd3646c15147b82b8db18a4e3c832d6ae0c3dd14363d4db3d91bcacac922679efba164ed49386 languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/aix-ppc64@npm:0.23.1" - conditions: os=aix & cpu=ppc64 +"@cosmjs/stargate@npm:^0.32.1, @cosmjs/stargate@npm:^0.32.3, @cosmjs/stargate@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stargate@npm:0.32.4" + dependencies: + "@confio/ics23": "npm:^0.6.8" + "@cosmjs/amino": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/tendermint-rpc": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + cosmjs-types: "npm:^0.9.0" + xstream: "npm:^11.14.0" + checksum: 10c0/c30a3519516aaa7eae58ba827c80fcf74c7fe7a9d3aa5cc8138c3a2768f5f241f59c2f5cec27e9037b4df12b1c6605b4fac9eadb4de97bd84edddc3a80a02e24 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm64@npm:0.23.1" - conditions: os=android & cpu=arm64 +"@cosmjs/stream@npm:^0.32.1, @cosmjs/stream@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/stream@npm:0.32.4" + dependencies: + xstream: "npm:^11.14.0" + checksum: 10c0/c677c53f9101c2a36fa03a475d92dea2fa69c475f896751b5e18a5d07087eeecbf6bca2e62a8940003da53fa235a9b2dd78c8257bf19c3f96e3f69fa8d5f183d languageName: node linkType: hard -"@esbuild/android-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm@npm:0.23.1" - conditions: os=android & cpu=arm +"@cosmjs/tendermint-rpc@npm:^0.32.1, @cosmjs/tendermint-rpc@npm:^0.32.3, @cosmjs/tendermint-rpc@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/tendermint-rpc@npm:0.32.4" + dependencies: + "@cosmjs/crypto": "npm:^0.32.4" + "@cosmjs/encoding": "npm:^0.32.4" + "@cosmjs/json-rpc": "npm:^0.32.4" + "@cosmjs/math": "npm:^0.32.4" + "@cosmjs/socket": "npm:^0.32.4" + "@cosmjs/stream": "npm:^0.32.4" + "@cosmjs/utils": "npm:^0.32.4" + axios: "npm:^1.6.0" + readonly-date: "npm:^1.0.0" + xstream: "npm:^11.14.0" + checksum: 10c0/5fae7afcdf98cc7dd36922aa1586254cc8c202cf8fe66804e61d793d31dcff816f40d33f7a0eb72c1b9226c7c361d4848e4ff12d0489f6fa66f47f0c86ae18dd languageName: node linkType: hard -"@esbuild/android-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-x64@npm:0.23.1" - conditions: os=android & cpu=x64 +"@cosmjs/utils@npm:^0.32.1, @cosmjs/utils@npm:^0.32.4": + version: 0.32.4 + resolution: "@cosmjs/utils@npm:0.32.4" + checksum: 10c0/d5ff8b235094be1150853a715116049f73eb5cdfeea8ce8e22ecccc61ec99792db457404d4307782b1a2f935dcf438f5c485beabfcfbc1dc5df26eb6e6da9062 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-arm64@npm:0.23.1" - conditions: os=darwin & cpu=arm64 +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-x64@npm:0.23.1" - conditions: os=darwin & cpu=x64 +"@endo/base64@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/base64@npm:1.0.9" + checksum: 10c0/63e487cf59b50a080fab389a8ab24d66264910ecf375dc19677c2ee7421d92a4be9c85e435b216b4adc9983384073a7eb753223f85ba77aec8d9fd3e0c1fe090 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-arm64@npm:0.23.1" - conditions: os=freebsd & cpu=arm64 +"@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 -"@esbuild/freebsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-x64@npm:0.23.1" - conditions: os=freebsd & cpu=x64 +"@endo/captp@npm:^4.4.3": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" + dependencies: + "@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 -"@esbuild/linux-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm64@npm:0.23.1" - conditions: os=linux & cpu=arm64 +"@endo/check-bundle@npm:^1.0.12": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" + dependencies: + "@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 -"@esbuild/linux-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm@npm:0.23.1" - conditions: os=linux & cpu=arm +"@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 -"@esbuild/linux-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ia32@npm:0.23.1" - conditions: os=linux & cpu=ia32 +"@endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" + dependencies: + "@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 -"@esbuild/linux-loong64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-loong64@npm:0.23.1" - conditions: os=linux & cpu=loong64 +"@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 -"@esbuild/linux-mips64el@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-mips64el@npm:0.23.1" - conditions: os=linux & cpu=mips64el +"@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 -"@esbuild/linux-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ppc64@npm:0.23.1" - conditions: os=linux & cpu=ppc64 +"@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.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 + 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:^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:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" + dependencies: + "@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 -"@esbuild/linux-riscv64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-riscv64@npm:0.23.1" - conditions: os=linux & cpu=riscv64 +"@endo/far@npm:^1.0.0, @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/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 -"@esbuild/linux-s390x@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-s390x@npm:0.23.1" - conditions: os=linux & cpu=s390x +"@endo/import-bundle@npm:^1.3.2": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" + dependencies: + "@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 -"@esbuild/linux-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-x64@npm:0.23.1" - conditions: os=linux & cpu=x64 +"@endo/init@npm:^1.1.6, @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 -"@esbuild/netbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/netbsd-x64@npm:0.23.1" - conditions: os=netbsd & cpu=x64 +"@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 -"@esbuild/openbsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-arm64@npm:0.23.1" - conditions: os=openbsd & cpu=arm64 +"@endo/marshal@npm:^1.6.1, @endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" + dependencies: + "@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 -"@esbuild/openbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-x64@npm:0.23.1" - conditions: os=openbsd & cpu=x64 +"@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 -"@esbuild/sunos-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/sunos-x64@npm:0.23.1" - conditions: os=sunos & cpu=x64 +"@endo/nat@npm:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-arm64@npm:0.23.1" - conditions: os=win32 & cpu=arm64 +"@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.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/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-ia32@npm:0.23.1" - conditions: os=win32 & cpu=ia32 +"@endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" + dependencies: + "@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 -"@esbuild/win32-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-x64@npm:0.23.1" - conditions: os=win32 & cpu=x64 +"@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:^1.2.8": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" + dependencies: + "@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/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf + languageName: node + linkType: hard + +"@endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" + dependencies: + "@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 + +"@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:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 + languageName: node + linkType: hard + +"@endo/zip@npm:^1.0.7, @endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 languageName: node linkType: hard @@ -493,6 +1139,38 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@iarna/toml@npm:^2.2.3": + version: 2.2.5 + resolution: "@iarna/toml@npm:2.2.5" + checksum: 10c0/d095381ad4554aca233b7cf5a91f243ef619e5e15efd3157bc640feac320545450d14b394aebbf6f02a2047437ced778ae598d5879a995441ab7b6c0b2c2f201 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -507,6 +1185,48 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + 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 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.5": version: 1.0.11 resolution: "@mapbox/node-pre-gyp@npm:1.0.11" @@ -526,6 +1246,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -543,7 +1270,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -582,6 +1309,139 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@rollup/plugin-commonjs@npm:^19.0.0": + version: 19.0.2 + resolution: "@rollup/plugin-commonjs@npm:19.0.2" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.1" + glob: "npm:^7.1.6" + is-reference: "npm:^1.2.1" + magic-string: "npm:^0.25.7" + resolve: "npm:^1.17.0" + peerDependencies: + rollup: ^2.38.3 + checksum: 10c0/9adccf77ad835cbe565da4385212f1e54c3e0dca2be174b5c2cfe89cfaeb240f42c7673e97e49b21b7c66ed901cc1c711552b6727f60b43a953ce996eb2868a7 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^13.0.0": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + "@types/resolve": "npm:1.17.1" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.1.0" + is-module: "npm:^1.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + rollup: ^2.42.0 + checksum: 10c0/6caa32a8304a20f1c9953111b25e9543f4de7d254958d81ce0158ad909e4493946bc2060c4ace23d9748b560ebc84c920ee7bc1b7d50dbf8ba852ef13c91af58 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" + picomatch: "npm:^2.2.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^4.0.0": version: 4.2.1 resolution: "@rollup/pluginutils@npm:4.2.1" @@ -592,6 +1452,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.1.0": + 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:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + 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" @@ -613,6 +1489,59 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.1": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: 10c0/42ec66ade1f72ff9d143c5a519a65efc7c1c77be7b1ac5455c530ae9acd87baba065542f8847522af2e3ace2cc999f3ad464ef86e6b7352eece34daf88f8c924 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:>=13.7.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/resolve@npm:1.17.1": + version: 1.17.1 + resolution: "@types/resolve@npm:1.17.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + "@vercel/nft@npm:^0.27.5": version: 0.27.5 resolution: "@vercel/nft@npm:0.27.5" @@ -658,6 +1587,15 @@ __metadata: languageName: node linkType: hard +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + "acorn-walk@npm:^8.3.4": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" @@ -667,7 +1605,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.13.0, acorn@npm:^8.6.0": +"acorn@npm:^8.11.0, acorn@npm:^8.13.0, acorn@npm:^8.2.4, acorn@npm:^8.6.0, acorn@npm:^8.9.0": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -685,22 +1623,121 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"agoric@portal:../../agoric-sdk/packages/agoric-cli::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "agoric@portal:../../agoric-sdk/packages/agoric-cli::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/access-token": "npm:^0.4.22-u18.0" + "@agoric/cache": "npm:^0.3.3-u18.0" + "@agoric/casting": "npm:^0.4.3-u18.4" + "@agoric/client-utils": "npm:^0.1.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-u18.0" + "@agoric/inter-protocol": "npm:^0.17.0-u18.5" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/network": "npm:^0.2.0-u18.0" + "@agoric/smart-wallet": "npm:^0.5.4-u18.4" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@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.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:^12.1.0" + deterministic-json: "npm:^1.0.5" + esm: "agoric-labs/esm#Agoric-built" + inquirer: "npm:^8.2.2" + opener: "npm:^1.5.2" + tmp: "npm:^0.2.1" + ws: "npm:^7.2.0" + bin: + agops: src/bin-agops.js + agoric: src/entrypoint.js + languageName: node + linkType: soft + +"ajv@npm:7.1.1": + version: 7.1.1 + resolution: "ajv@npm:7.1.1" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: 10c0/328a86011a67dc10eff41e3e2ef412f88f5de546ad2288c8a3d2a563c203dd4dd479660c07f99fd9499e36c723afee212704b25f5599815991409528fd638329 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + 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" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 languageName: node linkType: hard @@ -718,7 +1755,16 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.0.0": +"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 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -767,6 +1813,23 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + 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" + dependencies: + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + languageName: node + linkType: hard + "array-find-index@npm:^1.0.1": version: 1.0.2 resolution: "array-find-index@npm:1.0.2" @@ -774,6 +1837,22 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + languageName: node + linkType: hard + "arrgv@npm:^1.0.2": version: 1.0.2 resolution: "arrgv@npm:1.0.2" @@ -788,6 +1867,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "async-sema@npm:^3.1.1": version: 3.1.1 resolution: "async-sema@npm:3.1.1" @@ -795,6 +1881,20 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.1.0": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "ava@npm:^6.1.2": version: 6.2.0 resolution: "ava@npm:6.2.0" @@ -850,6 +1950,26 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"axios@npm:^1.6.0, axios@npm:^1.6.7": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -857,14 +1977,28 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf languageName: node linkType: hard -"better-sqlite3@npm:^9.6.0": +"bech32@npm:^1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 10c0/5f62ca47b8df99ace9c0e0d8deb36a919d91bf40066700aaa9920a45f86bb10eb56d537d559416fd8703aa0fb60dddb642e58f049701e7291df678b2033e5ee5 + languageName: node + linkType: hard + +"bech32@npm:^2.0.0": + version: 2.0.0 + resolution: "bech32@npm:2.0.0" + checksum: 10c0/45e7cc62758c9b26c05161b4483f40ea534437cf68ef785abadc5b62a2611319b878fef4f86ddc14854f183b645917a19addebc9573ab890e19194bc8f521942 + languageName: node + linkType: hard + +"better-sqlite3@npm:^9.1.1, better-sqlite3@npm:^9.6.0": version: 9.6.0 resolution: "better-sqlite3@npm:9.6.0" dependencies: @@ -884,7 +2018,14 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.0.3": +"bintrees@npm:1.0.2": + version: 1.0.2 + resolution: "bintrees@npm:1.0.2" + checksum: 10c0/132944b20c93c1a8f97bf8aa25980a76c6eb4291b7f2df2dbcd01cb5b417c287d3ee0847c7260c9f05f3d5a4233aaa03dec95114e97f308abe9cc3f72bed4a44 + languageName: node + linkType: hard + +"bl@npm:^4.0.3, bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: @@ -902,6 +2043,20 @@ __metadata: languageName: node linkType: hard +"bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.0": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -930,6 +2085,13 @@ __metadata: languageName: node linkType: hard +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -940,6 +2102,13 @@ __metadata: languageName: node linkType: hard +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -960,6 +2129,26 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + "callsites@npm:^4.2.0": version: 4.2.0 resolution: "callsites@npm:4.2.0" @@ -976,13 +2165,41 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.3.0": +"chalk@npm:^2.4.1": + 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": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 languageName: node linkType: hard +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -1025,6 +2242,22 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + "cli-truncate@npm:^4.0.0": version: 4.0.0 resolution: "cli-truncate@npm:4.0.0" @@ -1035,6 +2268,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 10c0/125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -1046,6 +2286,13 @@ __metadata: languageName: node linkType: hard +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + "code-excerpt@npm:^4.0.0": version: 4.0.0 resolution: "code-excerpt@npm:4.0.0" @@ -1055,6 +2302,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -1064,13 +2320,30 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 languageName: node linkType: hard +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 + languageName: node + linkType: hard + "color-support@npm:^1.1.2": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -1080,6 +2353,49 @@ __metadata: languageName: node linkType: hard +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:7.1.0": + version: 7.1.0 + resolution: "commander@npm:7.1.0" + checksum: 10c0/1c114cc2e0c7c980068d7f2472f3fc9129ea5d6f2f0a8699671afe5a44a51d5707a6c73daff1aaa919424284dea9fca4017307d30647935a1116518699d54c9d + languageName: node + linkType: hard + +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" @@ -1087,6 +2403,13 @@ __metadata: languageName: node linkType: hard +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -1131,6 +2454,19 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/e05544722e9d7189b4292c66e42b7abeb21db0d07c91b785f4ae5fefceb1f89e626da2703744657b287e86dcd4af57b54567cef75159957ff7a8a761d9055012 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -1142,6 +2478,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.2": + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/aa82ce7ac0814a27e6f2b738c5a7cf1fa21a3558a1e42df449fc96541ba3ba731e4d3ecffa4435348808a86212f287c6f20a1ee551ef1ff95d01cfec5f434944 + languageName: node + linkType: hard + "currently-unhandled@npm:^0.4.1": version: 0.4.1 resolution: "currently-unhandled@npm:0.4.1" @@ -1151,6 +2498,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + 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" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + 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" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + languageName: node + linkType: hard + "date-time@npm:^3.1.0": version: 3.1.0 resolution: "date-time@npm:3.1.0" @@ -1160,7 +2540,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.4, debug@npm:^4.3.7": +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -1172,6 +2552,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" @@ -1188,6 +2575,58 @@ __metadata: languageName: node linkType: hard +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -1202,6 +2641,24 @@ __metadata: languageName: node linkType: hard +"deterministic-json@npm:^1.0.5": + version: 1.0.5 + resolution: "deterministic-json@npm:1.0.5" + dependencies: + json-stable-stringify: "npm:^1.0.1" + checksum: 10c0/e29679601cd3b05c73665529dcd0132b48797fd7dfbac6793238a479e82b5f3905114316fbb316332da58b4497e35df9aea77b41ff92fd74fe298a6f31b93d40 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -1209,6 +2666,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.4": + 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 + "emittery@npm:^1.0.3": version: 1.0.3 resolution: "emittery@npm:1.0.3" @@ -1237,6 +2709,13 @@ __metadata: languageName: node linkType: hard +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -1269,86 +2748,113 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:~0.23.0": - version: 0.23.1 - resolution: "esbuild@npm:0.23.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.23.1" - "@esbuild/android-arm": "npm:0.23.1" - "@esbuild/android-arm64": "npm:0.23.1" - "@esbuild/android-x64": "npm:0.23.1" - "@esbuild/darwin-arm64": "npm:0.23.1" - "@esbuild/darwin-x64": "npm:0.23.1" - "@esbuild/freebsd-arm64": "npm:0.23.1" - "@esbuild/freebsd-x64": "npm:0.23.1" - "@esbuild/linux-arm": "npm:0.23.1" - "@esbuild/linux-arm64": "npm:0.23.1" - "@esbuild/linux-ia32": "npm:0.23.1" - "@esbuild/linux-loong64": "npm:0.23.1" - "@esbuild/linux-mips64el": "npm:0.23.1" - "@esbuild/linux-ppc64": "npm:0.23.1" - "@esbuild/linux-riscv64": "npm:0.23.1" - "@esbuild/linux-s390x": "npm:0.23.1" - "@esbuild/linux-x64": "npm:0.23.1" - "@esbuild/netbsd-x64": "npm:0.23.1" - "@esbuild/openbsd-arm64": "npm:0.23.1" - "@esbuild/openbsd-x64": "npm:0.23.1" - "@esbuild/sunos-x64": "npm:0.23.1" - "@esbuild/win32-arm64": "npm:0.23.1" - "@esbuild/win32-ia32": "npm:0.23.1" - "@esbuild/win32-x64": "npm:0.23.1" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/08c2ed1105cc3c5e3a24a771e35532fe6089dd24a39c10097899072cef4a99f20860e41e9294e000d86380f353b04d8c50af482483d7f69f5208481cce61eec7 +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + 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": + 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" + 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" + 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" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + 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" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + 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" + 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 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 languageName: node linkType: hard @@ -1359,6 +2865,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -1366,6 +2879,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + "escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" @@ -1373,6 +2893,89 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"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 + languageName: node + linkType: hard + +"eslint@npm:^8.57.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"esm@agoric-labs/esm#Agoric-built": + version: 3.2.25 + resolution: "esm@https://github.com/agoric-labs/esm.git#commit=3603726ad4636b2f865f463188fcaade6375638e" + checksum: 10c0/fc1e112a3a681e7b4152d4f5c76dd5aa9e30496d2020490ffa0fb61aaf57d1e12dae0c1074fdd2e0f08949ab2df7e00e750262356781f072e4119955ee10b754 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + "esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -1383,23 +2986,75 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1": +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af languageName: node linkType: hard -"esutils@npm:^2.0.3": +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 languageName: node linkType: hard +"execa@npm:9.1.0": + version: 9.1.0 + resolution: "execa@npm:9.1.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^7.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^5.2.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/9a4810b93d098eb0bed48793b61c3aa3e5804867c2c5808cd2a597a6e71738151a74dc792909085ce1d38e89f4b0e078d93ffd165aaca2d9a6728f3616f8e5c0 + languageName: node + linkType: hard + "execa@npm:^9.3.1": - version: 9.5.0 - resolution: "execa@npm:9.5.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" @@ -1413,7 +3068,7 @@ __metadata: signal-exit: "npm:^4.1.0" strip-final-newline: "npm:^4.0.0" yoctocolors: "npm:^2.0.0" - checksum: 10c0/93bc077249a778accc019bce141e0ebdf85e1a19ea02eaa1ed00cb49436b0751a7983fee0c0d95434e81727808639c512eea8d1308104598859cac2f01336bb1 + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 languageName: node linkType: hard @@ -1431,6 +3086,17 @@ __metadata: languageName: node linkType: hard +"external-editor@npm:^3.0.3": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + "fast-check@npm:^3.0.0": version: 3.22.0 resolution: "fast-check@npm:3.22.0" @@ -1440,6 +3106,13 @@ __metadata: languageName: node linkType: hard +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + "fast-diff@npm:^1.2.0": version: 1.3.0 resolution: "fast-diff@npm:1.3.0" @@ -1460,6 +3133,34 @@ __metadata: languageName: node linkType: hard +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.0.4": + version: 2.0.4 + resolution: "fast-safe-stringify@npm:2.0.4" + checksum: 10c0/5e4fbafe8b8c4a1681c2ab259ed8ce6672fc209683a141876f020c36a2cbec73bfe25c417c269f439797020996d04ed2d7c4c6b2c5cf393d6febbf7f4d8a5f53 + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.17.1 resolution: "fastq@npm:1.17.1" @@ -1469,6 +3170,22 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + "figures@npm:^6.1.0": version: 6.1.0 resolution: "figures@npm:6.1.0" @@ -1478,6 +3195,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + "file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" @@ -1494,6 +3220,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-simple@npm:^1.0.0": version: 1.0.0 resolution: "find-up-simple@npm:1.0.0" @@ -1501,6 +3234,60 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + languageName: node + linkType: hard + "foreground-child@npm:^3.1.0": version: 3.3.0 resolution: "foreground-child@npm:3.3.0" @@ -1511,6 +3298,17 @@ __metadata: languageName: node linkType: hard +"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/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -1543,7 +3341,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -1553,7 +3351,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -1562,6 +3360,32 @@ __metadata: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + "gauge@npm:^3.0.0": version: 3.0.2 resolution: "gauge@npm:3.0.2" @@ -1593,6 +3417,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + "get-stream@npm:^9.0.0": version: 9.0.1 resolution: "get-stream@npm:9.0.1" @@ -1603,12 +3440,14 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": - version: 4.8.1 - resolution: "get-tsconfig@npm:4.8.1" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc languageName: node linkType: hard @@ -1628,6 +3467,15 @@ __metadata: languageName: node linkType: hard +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + "glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -1644,7 +3492,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3": +"glob@npm:^7.1.3, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -1658,6 +3506,32 @@ __metadata: languageName: node linkType: hard +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + "globby@npm:^14.0.2": version: 14.0.2 resolution: "globby@npm:14.0.2" @@ -1672,13 +3546,82 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b + 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" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -1686,6 +3629,43 @@ __metadata: languageName: node linkType: hard +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1723,6 +3703,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^7.0.0": + version: 7.0.0 + resolution: "human-signals@npm:7.0.0" + checksum: 10c0/ce0c6d62d2e9bfe529d48f7c7fdf4b8c70fce950eef7850719b4e3f5bc71795ae7d61a3699ce13262bed7847705822601cc81f1921ea6a2906852e16228a94ab + languageName: node + linkType: hard + "human-signals@npm:^8.0.0": version: 8.0.0 resolution: "human-signals@npm:8.0.0" @@ -1730,6 +3717,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + "iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -1753,10 +3749,27 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.4": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^2.2.1": + version: 2.2.2 + resolution: "import-meta-resolve@npm:2.2.2" + checksum: 10c0/80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5 languageName: node linkType: hard @@ -1805,6 +3818,40 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:^8.2.2": + version: 8.2.6 + resolution: "inquirer@npm:8.2.6" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^6.0.1" + checksum: 10c0/eb5724de1778265323f3a68c80acfa899378cb43c24cdcb58661386500e5696b6b0b6c700e046b7aa767fe7b4823c6f04e6ddc268173e3f84116112529016296 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -1822,6 +3869,92 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: "npm:^1.1.13" + checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -1843,7 +3976,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -1852,6 +3985,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -1859,6 +3999,29 @@ __metadata: languageName: node linkType: hard +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc + 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.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -1866,6 +4029,13 @@ __metadata: languageName: node linkType: hard +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -1887,6 +4057,41 @@ __metadata: languageName: node linkType: hard +"is-reference@npm:^1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 + 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" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + "is-stream@npm:^4.0.1": version: 4.0.1 resolution: "is-stream@npm:4.0.1" @@ -1894,6 +4099,40 @@ __metadata: languageName: node linkType: hard +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + "is-unicode-supported@npm:^2.0.0": version: 2.1.0 resolution: "is-unicode-supported@npm:2.1.0" @@ -1901,6 +4140,22 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -1915,6 +4170,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -1944,6 +4208,24 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:4.0.0": + version: 4.0.0 + resolution: "js-yaml@npm:4.0.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/ef8489b87d9796b45df9f0bf3eefbb343b5063e39a9911d7b8ddbd4518cafaf73b49150d1f5865f54ee68719642ff0ab86110b9a332ff88bb05cd3bcf3039de1 + languageName: node + linkType: hard + "js-yaml@npm:^3.14.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -1956,6 +4238,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -1963,6 +4256,132 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + 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" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json-stable-stringify@npm:^1.0.1": + version: 1.1.1 + resolution: "json-stable-stringify@npm:1.1.1" + dependencies: + call-bind: "npm:^1.0.5" + isarray: "npm:^2.0.5" + jsonify: "npm:^0.0.1" + object-keys: "npm:^1.1.1" + checksum: 10c0/3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 10c0/7f5499cdd59a0967ed35bda48b7cec43d850bbc8fb955cdd3a1717bb0efadbe300724d5646de765bb7a99fc1c3ab06eb80d93503c6faaf99b4ff50a3326692f6 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"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.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" + dependencies: + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + "load-json-file@npm:^7.0.1": version: 7.0.1 resolution: "load-json-file@npm:7.0.1" @@ -1970,13 +4389,67 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15": +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 10c0/4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 + languageName: node + linkType: hard + +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"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" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f + languageName: node + linkType: hard + +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 10c0/50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -1984,6 +4457,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.25.7": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: "npm:^1.4.8" + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 + languageName: node + linkType: hard + "make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -2040,6 +4522,13 @@ __metadata: languageName: node linkType: hard +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 + languageName: node + linkType: hard + "merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -2057,6 +4546,40 @@ __metadata: languageName: node linkType: hard +"microtime@npm:^3.1.0": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.4.0" + checksum: 10c0/02512993de914c6f71424d3b8b28ce53de44ba5895b904a213420fd4fc86a084c1d08ec0876ac60cdae6427022766e1b9b86d9b3442bf408701120bd61455e26 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + "mimic-function@npm:^5.0.0": version: 5.0.1 resolution: "mimic-function@npm:5.0.1" @@ -2071,7 +4594,21 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.1.1": +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -2196,13 +4733,27 @@ __metadata: languageName: node linkType: hard -"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 languageName: node linkType: hard +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 + languageName: node + linkType: hard + +"n-readlines@npm:^1.0.0": + version: 1.0.3 + resolution: "n-readlines@npm:1.0.3" + checksum: 10c0/436c27ac071409314093da35dc3a4c5198c94fb10ad12b1c4d2b3e44bdb634da0a7a8ab0c107c1f4815788cbf5e0c7c180e3037ba3d974f34637cab363a95a74 + languageName: node + linkType: hard + "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -2210,6 +4761,13 @@ __metadata: languageName: node linkType: hard +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + "negotiator@npm:^0.6.3": version: 0.6.4 resolution: "negotiator@npm:0.6.4" @@ -2217,6 +4775,13 @@ __metadata: languageName: node linkType: hard +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.71.0 resolution: "node-abi@npm:3.71.0" @@ -2226,6 +4791,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d + languageName: node + linkType: hard + "node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" @@ -2240,7 +4814,7 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.2.2": +"node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.4.0": version: 4.8.2 resolution: "node-gyp-build@npm:4.8.2" bin: @@ -2300,6 +4874,48 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: "npm:^3.2.1" + chalk: "npm:^2.4.1" + cross-spawn: "npm:^6.0.5" + memorystream: "npm:^0.3.1" + minimatch: "npm:^3.0.4" + pidtree: "npm:^0.3.0" + read-pkg: "npm:^3.0.0" + shell-quote: "npm:^1.6.1" + string.prototype.padend: "npm:^3.0.0" + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.2.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba + languageName: node + linkType: hard + "npm-run-path@npm:^6.0.0": version: 6.0.0 resolution: "npm-run-path@npm:6.0.0" @@ -2329,6 +4945,32 @@ __metadata: languageName: node linkType: hard +"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 + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -2338,6 +4980,89 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + 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" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -2371,6 +5096,32 @@ __metadata: languageName: node linkType: hard +"pako@npm:^2.0.2": + version: 2.1.0 + resolution: "pako@npm:2.1.0" + checksum: 10c0/8e8646581410654b50eb22a5dfd71159cae98145bd5086c9a7a816ec0370b5f72b4648d08674624b3870a521e6a3daffd6c2f7bc00fdefc7063c9d8232ff5116 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + "parse-ms@npm:^4.0.0": version: 4.0.0 resolution: "parse-ms@npm:4.0.0" @@ -2378,6 +5129,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -2385,6 +5143,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -2399,6 +5164,13 @@ __metadata: languageName: node linkType: hard +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + "path-scurry@npm:^1.11.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" @@ -2409,6 +5181,15 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: "npm:^3.0.0" + checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 + languageName: node + linkType: hard + "path-type@npm:^5.0.0": version: 5.0.0 resolution: "path-type@npm:5.0.0" @@ -2416,6 +5197,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + "picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -2430,6 +5218,22 @@ __metadata: languageName: node linkType: hard +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + "plur@npm:^5.1.0": version: 5.1.0 resolution: "plur@npm:5.1.0" @@ -2439,6 +5243,13 @@ __metadata: 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" + checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.2 resolution: "prebuild-install@npm:7.1.2" @@ -2461,6 +5272,13 @@ __metadata: languageName: node linkType: hard +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + "pretty-ms@npm:^9.0.0, pretty-ms@npm:^9.1.0": version: 9.1.0 resolution: "pretty-ms@npm:9.1.0" @@ -2477,6 +5295,15 @@ __metadata: languageName: node linkType: hard +"prom-client@npm:13.1.0": + version: 13.1.0 + resolution: "prom-client@npm:13.1.0" + dependencies: + tdigest: "npm:^0.1.1" + checksum: 10c0/0f117e044bdbc7e8fb3a926e16e0e76ff3fb308dbc98fdb084dfa16ad52a0b68cf6a79a31e907b1c4ac9009b1d50848e3e72fb36ed43893291148e1505844fc2 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -2487,6 +5314,48 @@ __metadata: languageName: node linkType: hard +"proper-lockfile@npm:^4.1.2": + version: 4.1.2 + resolution: "proper-lockfile@npm:4.1.2" + dependencies: + graceful-fs: "npm:^4.2.4" + retry: "npm:^0.12.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/2f265dbad15897a43110a02dae55105c04d356ec4ed560723dcb9f0d34bc4fb2f13f79bb930e7561be10278e2314db5aca2527d5d3dcbbdee5e6b331d1571f6d + languageName: node + linkType: hard + +"protobufjs@npm:^6.8.8": + version: 6.11.4 + resolution: "protobufjs@npm:6.11.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^4.0.0" + bin: + pbjs: bin/pbjs + pbts: bin/pbts + checksum: 10c0/c244d7b9b6d3258193da5c0d1e558dfb47f208ae345e209f90ec45c9dca911b90fa17e937892a9a39a4136ab9886981aae9efdf6039f7baff4f7225f5eeb9812 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.2 resolution: "pump@npm:3.0.2" @@ -2497,6 +5366,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + "pure-rand@npm:^6.1.0": version: 6.1.0 resolution: "pure-rand@npm:6.1.0" @@ -2504,6 +5380,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" @@ -2525,7 +5412,18 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 + languageName: node + linkType: hard + +"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: @@ -2536,6 +5434,25 @@ __metadata: languageName: node linkType: hard +"readonly-date@npm:^1.0.0": + version: 1.0.0 + resolution: "readonly-date@npm:1.0.0" + checksum: 10c0/7ab32bf19f6bfec102584a524fa79a289e6ede0bf20c80fd90ab309962e45b71d19dd0e3915dff6e81edf226f08fda65e890539b4aca74668921790b10471356 + languageName: node + linkType: hard + +"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.7" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -2543,6 +5460,13 @@ __metadata: languageName: node linkType: hard +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -2552,6 +5476,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + "resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" @@ -2559,10 +5490,39 @@ __metadata: languageName: node linkType: hard -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab +"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f languageName: node linkType: hard @@ -2591,24 +5551,51 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^2.79.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 + languageName: node + linkType: hard + "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: + "@agoric/client-utils": "npm:dev" "@agoric/ertp": "npm:dev" + "@agoric/inter-protocol": "npm:dev" "@agoric/internal": "npm:dev" - "@agoric/synthetic-chain": "npm:^0.3.0" - "@endo/errors": "npm:^1.2.2" - "@endo/far": "npm:^1.1.5" - "@endo/init": "npm:^1.1.4" - "@endo/marshal": "npm:^1.5.3" + "@agoric/store": "npm:dev" + "@agoric/synthetic-chain": "npm:^0.4.3" + "@agoric/zoe": "npm:dev" + "@endo/errors": "npm:^1.2.7" + "@endo/far": "npm:^1.1.8" + "@endo/init": "npm:^1.1.6" + "@endo/marshal": "npm:^1.6.1" + agoric: "npm:dev" ava: "npm:^6.1.2" - execa: "npm:^9.3.1" - tsx: "npm:^4.17.0" - typescript: "npm:^5.5.4" + eslint: "npm:^8.57.0" + execa: "npm:9.1.0" + npm-run-all: "npm:^4.1.5" + typescript: "npm:^5.6.3" languageName: unknown linkType: soft +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -2618,6 +5605,27 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.5.5": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 + languageName: node + linkType: hard + "safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -2625,14 +5633,41 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 languageName: node linkType: hard -"semver@npm:^6.0.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -2650,28 +5685,63 @@ __metadata: languageName: node linkType: hard -"serialize-error@npm:^7.0.1": - version: 7.0.1 - resolution: "serialize-error@npm:7.0.1" +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + 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 + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - type-fest: "npm:^0.13.1" - checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c languageName: node linkType: hard -"ses@npm:^1.9.1": - version: 1.9.1 - resolution: "ses@npm:1.9.1" +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" dependencies: - "@endo/env-options": "npm:^1.1.7" - checksum: 10c0/1e795542954f635aaee2749a1d548460f2978257cb29daaea76b814ef99ffa64ab5cca05fbc3d51a814a57cf9fc4563988ee93312cc53bae4eb63dfff0f0682a + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d languageName: node linkType: hard @@ -2684,6 +5754,13 @@ __metadata: languageName: node linkType: hard +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -2691,7 +5768,26 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0": +"shell-quote@npm:^1.6.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + 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 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -2723,6 +5819,15 @@ __metadata: languageName: node linkType: hard +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + languageName: node + linkType: hard + "slash@npm:^5.1.0": version: 5.1.0 resolution: "slash@npm:5.1.0" @@ -2730,6 +5835,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + "slice-ansi@npm:^5.0.0": version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" @@ -2768,6 +5884,68 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + 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 + "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -2791,6 +5969,13 @@ __metadata: languageName: node linkType: hard +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + "stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -2833,6 +6018,52 @@ __metadata: languageName: node linkType: hard +"string.prototype.padend@npm:^3.0.0": + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -2860,6 +6091,13 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + "strip-final-newline@npm:^4.0.0": version: 4.0.0 resolution: "strip-final-newline@npm:4.0.0" @@ -2867,6 +6105,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -2886,6 +6131,51 @@ __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" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"symbol-observable@npm:^2.0.3": + version: 2.0.3 + resolution: "symbol-observable@npm:2.0.3" + checksum: 10c0/03fb8766b75bfa65a3c7d68ae1e51a13a5ff71b40d6d53b17a0c9c77b1685c20a3bfbf45547ab36214a079665c3f551e250798f6b2f83a2a40762d864ed87f78 + languageName: node + linkType: hard + +"table@npm:^6.7.1": + version: 6.8.2 + resolution: "table@npm:6.8.2" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/f8b348af38ee34e419d8ce7306ba00671ce6f20e861ccff22555f491ba264e8416086063ce278a8d81abfa8d23b736ec2cca7ac4029b5472f63daa4b4688b803 + languageName: node + linkType: hard + "tar-fs@npm:^2.0.0": version: 2.1.1 resolution: "tar-fs@npm:2.1.1" @@ -2925,6 +6215,15 @@ __metadata: languageName: node linkType: hard +"tdigest@npm:^0.1.1": + version: 0.1.2 + resolution: "tdigest@npm:0.1.2" + dependencies: + bintrees: "npm:1.0.2" + checksum: 10c0/10187b8144b112fcdfd3a5e4e9068efa42c990b1e30cd0d4f35ee8f58f16d1b41bc587e668fa7a6f6ca31308961cbd06cd5d4a4ae1dc388335902ae04f7d57df + languageName: node + linkType: hard + "temp-dir@npm:^3.0.0": version: 3.0.0 resolution: "temp-dir@npm:3.0.0" @@ -2932,6 +6231,27 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + "time-zone@npm:^1.0.0": version: 1.0.0 resolution: "time-zone@npm:1.0.0" @@ -2939,6 +6259,22 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 + languageName: node + linkType: hard + +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -2955,19 +6291,33 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.17.0": - version: 4.19.2 - resolution: "tsx@npm:4.19.2" +"triple-beam@npm:1.3.0": + version: 1.3.0 + resolution: "triple-beam@npm:1.3.0" + checksum: 10c0/a6da96495f25b6c04b3629df5161c7eb84760927943f16665fd8dcd3a643daadf73d69eee78306b4b68d606937f22f8703afe763bc8d3723632ffb1f3a798493 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + languageName: node + linkType: hard + +"ts-blank-space@npm:^0.4.1": + version: 0.4.3 + resolution: "ts-blank-space@npm:0.4.3" dependencies: - esbuild: "npm:~0.23.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/63164b889b1d170403e4d8753a6755dec371f220f5ce29a8e88f1f4d6085a784a12d8dc2ee669116611f2c72757ac9beaa3eea5c452796f541bdd2dc11753721 + typescript: "npm:5.1.6 - 5.6.x" + checksum: 10c0/362feac2e19cf8f1936cefdc658463558e0ef88568fdb7267910c50eb20b27ab2e21b4cf8100890f9ff1568a4e185daa68947c00dd4bfe176d61f554010266e1 + languageName: node + linkType: hard + +"tslib@npm:^2.1.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard @@ -2980,6 +6330,15 @@ __metadata: languageName: node linkType: hard +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + "type-fest@npm:^0.13.1": version: 0.13.1 resolution: "type-fest@npm:0.13.1" @@ -2987,7 +6346,73 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.5.4": +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + 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" + dependencies: + call-bind: "npm:^1.0.7" + 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 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + 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/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + languageName: node + linkType: hard + +"typescript@npm:5.1.6 - 5.6.x, typescript@npm:^5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" bin: @@ -2997,13 +6422,32 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.5.4#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=b45daf" + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 languageName: node linkType: hard @@ -3039,6 +6483,15 @@ __metadata: languageName: node linkType: hard +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -3046,6 +6499,25 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -3070,6 +6542,43 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -3101,6 +6610,41 @@ __metadata: languageName: node linkType: hard +"winston-transport@npm:^4.4.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 + languageName: node + linkType: hard + +"winston@npm:3.3.3": + version: 3.3.3 + resolution: "winston@npm:3.3.3" + dependencies: + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.1.0" + is-stream: "npm:^2.0.0" + logform: "npm:^2.2.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.4.0" + checksum: 10c0/18205fa1e3ebb88dc910fbe5337e3c9d2dbd94310978adca5ab77444b854d5679dec0a70fed425e77cf93e237390c7670bb937f14c492b8415e594ab21540d3d + 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" @@ -3112,6 +6656,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.0.1": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -3140,6 +6695,31 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7, ws@npm:^7.2.0": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"xstream@npm:^11.14.0": + version: 11.14.0 + resolution: "xstream@npm:11.14.0" + dependencies: + globalthis: "npm:^1.0.1" + symbol-observable: "npm:^2.0.3" + checksum: 10c0/7a28baedc64385dc17597d04c7130ec3135db298e66d6dcf33821eb1953d5ad1b83c5fa08f1ce4d36e75fd219f2e9ef81ee0721aa8d4ccf619acc1760ba37f71 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -3176,6 +6756,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + "yoctocolors@npm:^2.0.0": version: 2.1.1 resolution: "yoctocolors@npm:2.1.1" diff --git a/a3p-integration/scripts/build-all-submissions.sh b/a3p-integration/scripts/build-all-submissions.sh index ad97a44d388..31ffc53dfe0 100755 --- a/a3p-integration/scripts/build-all-submissions.sh +++ b/a3p-integration/scripts/build-all-submissions.sh @@ -1,17 +1,24 @@ #!/bin/bash set -ueo pipefail -# cd prints its target, so without the redirect, we get two copies -SCRIPT_DIR=$(cd ${0%/*} > /dev/null && pwd -P) +# Look in the "proposals" subdirectory of the working directory for +# "$char:$name" subdirectories (cf. ../README.md#package-layering), and for each +# one, extract from its package.json "agoricProposal" section a list of +# "sdk-generate" entries corresponding to core-eval submission content that must +# be generated (cf ../README.md#generating-core-eval-submissions) and then use +# ./build-submission.sh to do so. + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) IFS=$'\n' for proposal in ./proposals/?:*; do + echo >&2 "Building $proposal ..." cd $proposal - # build submission if proposal specifies an sdk-generate while read -r line; do IFS=' ' parts=($line) - $SCRIPT_DIR/build-submission.sh $proposal ${parts[@]} + "$SCRIPT_DIR"/build-submission.sh ${parts[@]} done < <(jq -r '.agoricProposal["sdk-generate"][]?' < package.json) cd - + echo >&2 "Built $proposal" done diff --git a/a3p-integration/scripts/build-submission.sh b/a3p-integration/scripts/build-submission.sh index 3470c24cf52..757c7641907 100755 --- a/a3p-integration/scripts/build-submission.sh +++ b/a3p-integration/scripts/build-submission.sh @@ -1,23 +1,34 @@ #!/bin/bash set -ueo pipefail -sdkroot=$(git rev-parse --show-toplevel) +# Usage: $0 [submission directory name] [builder script arg]... +# Run the specified builder script from packages/builders/scripts and move the +# output into the specified submission directory (defaulting to "submission") +# relative to the working directory. +# Must be run from inside agoric-sdk. -cd "$sdkroot" +builderScript=$1 +shift +submissionDir=${1:-submission} +shift || true -a3pProposalDir=$1 -builderScript=$2 -submissionDirName=${3:-submission} -submissionDir="./a3p-integration/$a3pProposalDir/$submissionDirName" -extraParams=${4:-} +# Run the builder script in a subshell at agoric-sdk. +sdkroot=$(git rev-parse --show-toplevel) +( + cd "$sdkroot" + yarn agoric run "packages/builders/scripts/$builderScript" "$@" +) -yarn agoric run "packages/builders/scripts/$builderScript" $extraParams +# Create and populate the submission directory. mkdir -p "$submissionDir" +echo >&2 "Populating $(basename -- "$(pwd -P)")/$submissionDir ..." +ls "$sdkroot"/*-plan.json | while read plan; do + # Copy from the bundle cache. + cp $(grep -oh '/.*b1-.*.json' "$plan") "$submissionDir" + + # Move from the root directory. + prefix=${plan%-plan.json} + mv "$prefix"* "$submissionDir" -plans=*-plan.json -for plan in $plans; do - base=${plan%-plan.json} - cp $(grep -oh '/.*b1-.*.json' "$base"-plan.json) "$submissionDir" - mv "$base"* "$submissionDir" ls -oS "$submissionDir" done diff --git a/a3p-integration/yarn.lock b/a3p-integration/yarn.lock index a20e09369e8..9887f3863ba 100644 --- a/a3p-integration/yarn.lock +++ b/a3p-integration/yarn.lock @@ -5,9 +5,9 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/synthetic-chain@npm:^0.3.0": - version: 0.3.0 - resolution: "@agoric/synthetic-chain@npm:0.3.0" +"@agoric/synthetic-chain@npm:^0.4.3": + version: 0.4.3 + resolution: "@agoric/synthetic-chain@npm:0.4.3" dependencies: "@endo/zip": "npm:^1.0.7" better-sqlite3: "npm:^9.6.0" @@ -16,14 +16,14 @@ __metadata: execa: "npm:^9.3.1" bin: synthetic-chain: dist/cli/cli.js - checksum: 10c0/17c6241bdc48b8a2a7608c9d4d7c0a0c76fb10d4ee44a31a1150104a792bcd1133f4b1a7e8ab26673a07450b3ceabccd9911999117568221b49221b6ee4306a1 + checksum: 10c0/b904b531bf2d4066322e4b86b7653fa4fd88d52cce86d82d82ebaecedd526a83832488e1f82b5d0ece23cf5b13fa6bf4e49b4c25339a3c17a658c1302ef9321b languageName: node linkType: hard "@endo/zip@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/zip@npm:1.0.7" - checksum: 10c0/a1c0d155448ce877012b34c8fe8cd3a58de9eb807514c81cddeebb802ee8e552b27d8a9a40fab3f3e4c49e0cb7fea6902fa1dd12a23ff6f30b56161fc3edc1f8 + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc languageName: node linkType: hard @@ -1034,7 +1034,7 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: - "@agoric/synthetic-chain": "npm:^0.3.0" + "@agoric/synthetic-chain": "npm:^0.4.3" "@types/better-sqlite3": "npm:^7.6.11" languageName: unknown linkType: soft diff --git a/docs/env.md b/docs/env.md index 5b510c4ba3d..f7fd2b37640 100644 --- a/docs/env.md +++ b/docs/env.md @@ -164,55 +164,6 @@ for the Prometheus scrape endpoint to export telemetry. Lifetime: until we decide not to support Prometheus for metrics export -## SOLO_BRIDGE_TARGET - -Affects: solo - -This enables a proxy so that the solo bridge interface (/wallet-bridge.html) is backed by the smart wallet (/wallet/bridge.html). Dapps designed for the solo bridge can enable this until they connect to the smart wallet directly. - -```sh -BRIDGE_TARGET=http://localhost:3001 make BASE_PORT=8002 scenario3-run -``` - -Lifetime: smart wallet transition period - -## SOLO_MNEMONIC - -Affects: solo init - -Seed phrase for HD key derivation. - -## SOLO_OTEL_EXPORTER_PROMETHEUS_PORT - -Affects: solo - -Same as `OTEL_EXPORTER_PROMETHEUS_PORT`, but for solo instead of chain. - -Lifetime: ? - -## SOLO_SLOGFILE - -Same as `SLOGFILE`, but for solo instead of chain. - -Lifetime: ? - -## SOLO_SLOGSENDER - -Same as `SLOGSENDER`, but for solo instead of chain. - -Lifetime: ? - -## SOLO_MAX_DEBUG_LENGTH - -Affects: solo - -Purpose: reduce the size of each individual `console.debug` output - -Description: defaults to no limit, set to a decimal byte count to reduce the -output - -Lifetime: Until CI no longer balks on long output, or our source bundles aren't delivered via messages to the sim-chain - ## SLOGFILE Affects: cosmic-swingset @@ -265,6 +216,55 @@ have any unexpected errors. The default is `undefined`. +## SOLO_BRIDGE_TARGET + +Affects: solo + +This enables a proxy so that the solo bridge interface (/wallet-bridge.html) is backed by the smart wallet (/wallet/bridge.html). Dapps designed for the solo bridge can enable this until they connect to the smart wallet directly. + +```sh +BRIDGE_TARGET=http://localhost:3001 make BASE_PORT=8002 scenario3-run +``` + +Lifetime: smart wallet transition period + +## SOLO_MAX_DEBUG_LENGTH + +Affects: solo + +Purpose: reduce the size of each individual `console.debug` output + +Description: defaults to no limit, set to a decimal byte count to reduce the +output + +Lifetime: Until CI no longer balks on long output, or our source bundles aren't delivered via messages to the sim-chain + +## SOLO_MNEMONIC + +Affects: solo init + +Seed phrase for HD key derivation. + +## SOLO_OTEL_EXPORTER_PROMETHEUS_PORT + +Affects: solo + +Same as `OTEL_EXPORTER_PROMETHEUS_PORT`, but for solo instead of chain. + +Lifetime: ? + +## SOLO_SLOGFILE + +Same as `SLOGFILE`, but for solo instead of chain. + +Lifetime: ? + +## SOLO_SLOGSENDER + +Same as `SLOGSENDER`, but for solo instead of chain. + +Lifetime: ? + ## SWINGSET_WORKER_TYPE Affects: solo, unit tests diff --git a/golang/cosmos/ante/inbound_test.go b/golang/cosmos/ante/inbound_test.go index 34a2020d2cf..653c11fa8e6 100644 --- a/golang/cosmos/ante/inbound_test.go +++ b/golang/cosmos/ante/inbound_test.go @@ -215,7 +215,7 @@ func (msk mockSwingsetKeeper) GetBeansPerUnit(ctx sdk.Context) map[string]sdkmat return nil } -func (msk mockSwingsetKeeper) ChargeBeans(ctx sdk.Context, addr sdk.AccAddress, beans sdkmath.Uint) error { +func (msk mockSwingsetKeeper) ChargeBeans(ctx sdk.Context, beansPerUnit map[string]sdkmath.Uint, addr sdk.AccAddress, beans sdkmath.Uint) error { return fmt.Errorf("not implemented") } @@ -223,6 +223,6 @@ func (msk mockSwingsetKeeper) GetSmartWalletState(ctx sdk.Context, addr sdk.AccA panic(fmt.Errorf("not implemented")) } -func (msk mockSwingsetKeeper) ChargeForSmartWallet(ctx sdk.Context, addr sdk.AccAddress) error { +func (msk mockSwingsetKeeper) ChargeForSmartWallet(ctx sdk.Context, beansPerUnit map[string]sdkmath.Uint, addr sdk.AccAddress) error { return fmt.Errorf("not implemented") } diff --git a/golang/cosmos/app/app.go b/golang/cosmos/app/app.go index 19196732588..4aa507a68cc 100644 --- a/golang/cosmos/app/app.go +++ b/golang/cosmos/app/app.go @@ -137,13 +137,22 @@ import ( const appName = "agoric" -// FlagSwingStoreExportDir defines the config flag used to specify where a -// genesis swing-store export is expected. For start from genesis, the default -// value is config/swing-store in the home directory. For genesis export, the -// value is always a "swing-store" directory sibling to the exported -// genesis.json file. -// TODO: document this flag in config, likely alongside the genesis path -const FlagSwingStoreExportDir = "swing-store-export-dir" +const ( + // FlagSwingStoreExportDir defines the config flag used to specify where a + // genesis swing-store export is expected. For start from genesis, the default + // value is config/swing-store in the home directory. For genesis export, the + // value is always a "swing-store" directory sibling to the exported + // genesis.json file. + // TODO: document this flag in config, likely alongside the genesis path + FlagSwingStoreExportDir = "swing-store-export-dir" + // FlagSwingStoreExportMode defines the export mode for the swing store + // Alongside the default mode `operational`, there are two other modes + // + // 1- `skip` mode will skip the swing store export altogether + // + // 2- `debug` mode will export all the available store + FlagSwingStoreExportMode = "swing-store-export-mode" +) var ( // DefaultNodeHome default home directories for the application daemon @@ -673,6 +682,7 @@ func NewAgoricApp( app.EvidenceKeeper = *evidenceKeeper swingStoreExportDir := cast.ToString(appOpts.Get(FlagSwingStoreExportDir)) + swingStoreExportMode := cast.ToString(appOpts.Get(FlagSwingStoreExportMode)) // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. @@ -702,7 +712,14 @@ func NewAgoricApp( icaModule, packetforward.NewAppModule(app.PacketForwardKeeper), vstorage.NewAppModule(app.VstorageKeeper), - swingset.NewAppModule(app.SwingSetKeeper, &app.SwingStoreExportsHandler, setBootstrapNeeded, app.ensureControllerInited, swingStoreExportDir), + swingset.NewAppModule( + app.SwingSetKeeper, + &app.SwingStoreExportsHandler, + setBootstrapNeeded, + app.ensureControllerInited, + swingStoreExportDir, + swingStoreExportMode, + ), vibcModule, vbankModule, vtransferModule, diff --git a/golang/cosmos/app/upgrade.go b/golang/cosmos/app/upgrade.go index 7b7c3ffda01..da3407ecd40 100644 --- a/golang/cosmos/app/upgrade.go +++ b/golang/cosmos/app/upgrade.go @@ -3,6 +3,7 @@ package gaia import ( "encoding/json" "fmt" + "reflect" "strings" "text/template" @@ -79,14 +80,27 @@ func isFirstTimeUpgradeOfThisVersion(app *GaiaApp, ctx sdk.Context) bool { return true } -func buildProposalStepWithArgs(moduleName string, entrypoint string, opts map[string]any) (vm.CoreProposalStep, error) { +func buildProposalStepWithArgs(moduleName string, entrypoint string, extra any) (vm.CoreProposalStep, error) { t := template.Must(template.New("").Parse(`{ - "module": "{{.moduleName}}", - "entrypoint": "{{.entrypoint}}", - "args": [ {{.optsArg}} ] - }`)) + "module": "{{.moduleName}}", + "entrypoint": "{{.entrypoint}}", + "args": {{.args}} +}`)) - optsArg, err := json.Marshal(opts) + var args []byte + var err error + if extra == nil { + // The specified entrypoint will be called with no extra arguments after powers. + args = []byte(`[]`) + } else if reflect.TypeOf(extra).Kind() == reflect.Map && reflect.TypeOf(extra).Key().Kind() == reflect.String { + // The specified entrypoint will be called with this options argument after powers. + args, err = json.Marshal([]any{extra}) + } else if reflect.TypeOf(extra).Kind() == reflect.Slice { + // The specified entrypoint will be called with each of these arguments after powers. + args, err = json.Marshal(extra) + } else { + return nil, fmt.Errorf("proposal extra must be nil, array, or string map, not %v", extra) + } if err != nil { return nil, err } @@ -95,7 +109,7 @@ func buildProposalStepWithArgs(moduleName string, entrypoint string, opts map[st err = t.Execute(&result, map[string]any{ "moduleName": moduleName, "entrypoint": entrypoint, - "optsArg": string(optsArg), + "args": string(args), }) if err != nil { return nil, err @@ -158,6 +172,42 @@ func replacePriceFeedsCoreProposal(upgradeName string) (vm.CoreProposalStep, err ) } +func terminateGovernorCoreProposal(upgradeName string) (vm.CoreProposalStep, error) { + // targets is a slice of "$boardID:$instanceKitLabel" strings. + var targets []string + switch getVariantFromUpgradeName(upgradeName) { + case "MAINNET": + targets = []string{"board052184:stkATOM-USD_price_feed"} + case "A3P_INTEGRATION": + targets = []string{"board04091:stATOM-USD_price_feed"} + default: + return nil, nil + } + + return buildProposalStepWithArgs( + "@agoric/builders/scripts/vats/terminate-governor-instance.js", + // Request `defaultProposalBuilder(powers, targets)`. + "defaultProposalBuilder", + []any{targets}, + ) +} + +// func upgradeMintHolderCoreProposal(upgradeName string) (vm.CoreProposalStep, error) { +// variant := getVariantFromUpgradeName(upgradeName) + +// if variant == "" { +// return nil, nil +// } + +// return buildProposalStepWithArgs( +// "@agoric/builders/scripts/vats/upgrade-mintHolder.js", +// "defaultProposalBuilder", +// map[string]any{ +// "variant": variant, +// }, +// ) +// } + // upgrade18Handler performs standard upgrade actions plus custom actions for upgrade-18. func upgrade18Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) { @@ -213,7 +263,56 @@ func upgrade18Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgr // Upgrade to include a cleanup from https://github.com/Agoric/agoric-sdk/pull/10319 "@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js", ), + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/vats/upgrade-board.js", + ), + ) + + // Upgrade vats using Vows in Upgrade 18 in order to use a new liveslots that + // avoids a memory leak in watchPromise. + CoreProposalSteps = append(CoreProposalSteps, + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/vats/upgrade-orchestration.js", + ), ) + + // CoreProposals for Upgrade 19. These should not be introduced + // before upgrade 18 is done because they would be run in n:upgrade-next + // + // upgradeMintHolderStep, err := upgradeMintHolderCoreProposal(targetUpgrade) + // if err != nil { + // return nil, err + // } else if upgradeMintHolderStep != nil { + // CoreProposalSteps = append(CoreProposalSteps, upgradeMintHolderStep) + // } + // + // CoreProposalSteps = append(CoreProposalSteps, + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/inter-protocol/replace-feeDistributor.js", + // ), + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/vats/upgrade-paRegistry.js", + // ), + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/vats/upgrade-provisionPool.js", + // ), + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/vats/upgrade-bank.js", + // ), + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/vats/upgrade-agoricNames.js", + // ), + // vm.CoreProposalStepForModules( + // "@agoric/builders/scripts/vats/upgrade-asset-reserve.js", + // ), + // ) + + terminateOldGovernor, err := terminateGovernorCoreProposal(targetUpgrade) + if err != nil { + return nil, err + } else if terminateOldGovernor != nil { + CoreProposalSteps = append(CoreProposalSteps, terminateOldGovernor) + } } app.upgradeDetails = &upgradeDetails{ diff --git a/golang/cosmos/daemon/cmd/root.go b/golang/cosmos/daemon/cmd/root.go index 367cea44c07..07a46217348 100644 --- a/golang/cosmos/daemon/cmd/root.go +++ b/golang/cosmos/daemon/cmd/root.go @@ -386,6 +386,12 @@ const ( ExportedSwingStoreDirectoryName = "swing-store" ) +var allowedSwingSetExportModes = map[string]bool{ + swingset.SwingStoreExportModeDebug: true, + swingset.SwingStoreExportModeOperational: true, + swingset.SwingStoreExportModeSkip: true, +} + // extendCosmosExportCommand monkey-patches the "export" command added by // cosmos-sdk to add a required "export-dir" command-line flag, and create the // genesis export in the specified directory if the VM is running. @@ -396,31 +402,52 @@ func extendCosmosExportCommand(cmd *cobra.Command) { panic(err) } + var keys []string + for key := range allowedSwingSetExportModes { + keys = append(keys, key) + } + + cmd.Flags().String( + gaia.FlagSwingStoreExportMode, + swingset.SwingStoreExportModeOperational, + fmt.Sprintf( + "The mode for swingstore export (%s)", + strings.Join(keys, " | "), + ), + ) + originalRunE := cmd.RunE extendedRunE := func(cmd *cobra.Command, args []string) error { serverCtx := server.GetServerContextFromCmd(cmd) exportDir, _ := cmd.Flags().GetString(FlagExportDir) + swingStoreExportMode, _ := cmd.Flags().GetString(gaia.FlagSwingStoreExportMode) + err := os.MkdirAll(exportDir, os.ModePerm) if err != nil { return err } genesisPath := filepath.Join(exportDir, ExportedGenesisFileName) - swingStoreExportPath := filepath.Join(exportDir, ExportedSwingStoreDirectoryName) - err = os.MkdirAll(swingStoreExportPath, os.ModePerm) - if err != nil { - return err + // Since none mode doesn't perform any swing store export + // There is no point in creating the export directory + if swingStoreExportMode != swingset.SwingStoreExportModeSkip { + swingStoreExportPath := filepath.Join(exportDir, ExportedSwingStoreDirectoryName) + + err = os.MkdirAll(swingStoreExportPath, os.ModePerm) + if err != nil { + return err + } + // We unconditionally set FlagSwingStoreExportDir as for export, it makes + // little sense for users to control this location separately, and we don't + // want to override any swing-store artifacts that may be associated to the + // current genesis. + serverCtx.Viper.Set(gaia.FlagSwingStoreExportDir, swingStoreExportPath) } - // We unconditionally set FlagSwingStoreExportDir as for export, it makes - // little sense for users to control this location separately, and we don't - // want to override any swing-store artifacts that may be associated to the - // current genesis. - serverCtx.Viper.Set(gaia.FlagSwingStoreExportDir, swingStoreExportPath) - if hasVMController(serverCtx) { + if hasVMController(serverCtx) || swingStoreExportMode == swingset.SwingStoreExportModeSkip { // Capture the export in the genesisPath. // This will fail if a genesis.json already exists in the export-dir genesisFile, err := os.OpenFile( @@ -453,7 +480,16 @@ func (ac appCreator) appExport( jailAllowedAddrs []string, appOpts servertypes.AppOptions, ) (servertypes.ExportedApp, error) { - if OnExportHook != nil { + swingStoreExportMode, ok := appOpts.Get(gaia.FlagSwingStoreExportMode).(string) + if !(ok && allowedSwingSetExportModes[swingStoreExportMode]) { + return servertypes.ExportedApp{}, fmt.Errorf( + "export mode '%s' is not supported", + swingStoreExportMode, + ) + } + + // We don't have to launch VM in case the swing store export is not required + if swingStoreExportMode != swingset.SwingStoreExportModeSkip && OnExportHook != nil { if err := OnExportHook(ac.agdServer, logger, appOpts); err != nil { return servertypes.ExportedApp{}, err } @@ -464,10 +500,7 @@ func (ac appCreator) appExport( return servertypes.ExportedApp{}, errors.New("application home is not set") } - var loadLatest bool - if height == -1 { - loadLatest = true - } + loadLatest := height == -1 gaiaApp := gaia.NewAgoricApp( ac.sender, ac.agdServer, diff --git a/golang/cosmos/go.mod b/golang/cosmos/go.mod index 1c871ea598c..3f77ccaa3ec 100644 --- a/golang/cosmos/go.mod +++ b/golang/cosmos/go.mod @@ -198,7 +198,7 @@ replace ( // use cometbft // Use our fork at least until post-v0.34.14 is released with // https://github.com/tendermint/tendermint/issue/6899 resolved. - github.com/tendermint/tendermint => github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.1 + github.com/tendermint/tendermint => github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.2 // For testing against a local cosmos-sdk, ibc-go, or cometbft // github.com/cosmos/cosmos-sdk => ../../../forks/cosmos-sdk diff --git a/golang/cosmos/go.sum b/golang/cosmos/go.sum index de2b7576df7..ec4781ab64c 100644 --- a/golang/cosmos/go.sum +++ b/golang/cosmos/go.sum @@ -230,8 +230,8 @@ github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1: github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.1 h1:tqCNL72pQXdUmBzgv1md5SN2U3K/PaYQ4qZ5pFv8v6w= -github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.1/go.mod h1:myvkihZD8eg9jKE3WFaugkNoL5nvEqlP7Jbjg98pCek= +github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.2 h1:JxNpTyzHIGXcaSmdb5jtygGn7cRSbiceVa+dn8pN1BM= +github.com/agoric-labs/cometbft v0.34.30-alpha.agoric.2/go.mod h1:myvkihZD8eg9jKE3WFaugkNoL5nvEqlP7Jbjg98pCek= github.com/agoric-labs/cosmos-sdk v0.46.16-alpha.agoric.2.5 h1:cwbONQaVbGEPzfVqvTY9PGcLZptlR9LTPunZ9La0QCg= github.com/agoric-labs/cosmos-sdk v0.46.16-alpha.agoric.2.5/go.mod h1:Yny/YE+GJ+y/++UgvraITGzfLhXCnwETSWw3dAY5NDg= github.com/agoric-labs/cosmos-sdk/ics23/go v0.8.0-alpha.agoric.1 h1:2jvHI/2d+psWAZy6FQ0vXJCHUtfU3ZbbW+pQFL04arQ= diff --git a/golang/cosmos/proto/agoric/swingset/swingset.proto b/golang/cosmos/proto/agoric/swingset/swingset.proto index 7a7c7a16d14..fdfd5f722f4 100644 --- a/golang/cosmos/proto/agoric/swingset/swingset.proto +++ b/golang/cosmos/proto/agoric/swingset/swingset.proto @@ -82,6 +82,18 @@ message Params { repeated QueueSize queue_max = 5 [ (gogoproto.nullable) = false ]; + + // Vat cleanup budget values. + // These values are used by SwingSet to control the pace of removing data + // associated with a terminated vat as described at + // https://github.com/Agoric/agoric-sdk/blob/master/packages/SwingSet/docs/run-policy.md#terminated-vat-cleanup + // + // There is no required order to this list of entries, but all the chain + // nodes must all serialize and deserialize the existing order without + // permuting it. + repeated UintMapEntry vat_cleanup_budget = 6 [ + (gogoproto.nullable) = false + ]; } // The current state of the module. @@ -119,6 +131,7 @@ message PowerFlagFee { } // Map element of a string key to a size. +// TODO: Replace with UintMapEntry? message QueueSize { option (gogoproto.equal) = true; @@ -129,6 +142,18 @@ message QueueSize { int32 size = 2; } +// Map element of a string key to an unsigned integer. +// The value uses cosmos-sdk Uint rather than a native Go type to ensure that +// zeroes survive "omitempty" JSON serialization. +message UintMapEntry { + option (gogoproto.equal) = true; + string key = 1; + string value = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint", + (gogoproto.nullable) = false + ]; +} + // Egress is the format for a swingset egress. message Egress { option (gogoproto.equal) = false; diff --git a/golang/cosmos/proto/agoric/vbank/vbank.proto b/golang/cosmos/proto/agoric/vbank/vbank.proto index 7884abecc9a..4b47cf71c70 100644 --- a/golang/cosmos/proto/agoric/vbank/vbank.proto +++ b/golang/cosmos/proto/agoric/vbank/vbank.proto @@ -33,6 +33,13 @@ message Params { int64 reward_smoothing_blocks = 3 [ (gogoproto.moretags) = "yaml:\"reward_smoothing_blocks\"" ]; + + // allowed_monitoring_accounts is an array of account addresses that can be + // monitored for sends and receives. An element of `"*"` will permit any + // address. + repeated string allowed_monitoring_accounts = 4 [ + (gogoproto.moretags) = "yaml:\"allowed_monitoring_accounts\"" + ]; } // The current state of the module. diff --git a/golang/cosmos/types/address_hooks.go b/golang/cosmos/types/address_hooks.go new file mode 100644 index 00000000000..073e9d48cf4 --- /dev/null +++ b/golang/cosmos/types/address_hooks.go @@ -0,0 +1,213 @@ +package types + +import ( + "bytes" + "fmt" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/types/bech32" + + transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v6/modules/core/exported" +) + +type AddressRole string + +const ( + RoleSender AddressRole = "Sender" + RoleReceiver AddressRole = "Receiver" + + AddressHookVersion = 0 + BaseAddressLengthBytes = 2 +) + +// AddressHookBytePrefix is a magic prefix that identifies a hooked address. +// Chosen to make bech32 address hooks that look like "agoric10rch..." +var AddressHookBytePrefix = []byte{0x78, 0xf1, 0x70 /* | AddressHookVersion */} + +func init() { + if AddressHookVersion&0x0f != AddressHookVersion { + panic(fmt.Sprintf("AddressHookVersion must be less than 0x10, got 0x%x", AddressHookVersion)) + } +} + +// ExtractBaseAddress extracts the base address from an Address Hook. It +// returns addr verbatim if it is not an Address Hook. +func ExtractBaseAddress(addr string) (string, error) { + baseAddr, _, err := SplitHookedAddress(addr) + if err != nil { + return "", err + } + return baseAddr, nil +} + +// SplitHookedAddress splits a hooked address into its base address and hook data. +// For the JS implementation, look at @agoric/cosmic-proto/src/address-hooks.js. +func SplitHookedAddress(addr string) (string, []byte, error) { + prefix, payload, err := bech32.DecodeAndConvert(addr) + if err != nil { + return "", []byte{}, err + } + + lastPrefixHighNibble := AddressHookBytePrefix[len(AddressHookBytePrefix)-1] + bz := bytes.TrimPrefix(payload, AddressHookBytePrefix[:len(AddressHookBytePrefix)-1]) + if len(bz) == len(payload) || len(bz) == 0 || bz[0]&0xf0 != lastPrefixHighNibble { + // Return an unhooked address. + return addr, []byte{}, nil + } + + version := bz[0] & 0x0f + bz = bz[1:] + if version != AddressHookVersion { + return "", []byte{}, fmt.Errorf("unsupported address hook version %d", version) + } + + if len(bz) < BaseAddressLengthBytes { + return "", []byte{}, fmt.Errorf("hooked address must have at least %d bytes", BaseAddressLengthBytes) + } + + b := 0 + for i := BaseAddressLengthBytes - 1; i >= 0; i -= 1 { + byteVal := bz[len(bz)-1-i] + b <<= 8 + b |= int(byteVal) + } + + payloadEnd := len(bz) - BaseAddressLengthBytes + if b > payloadEnd { + return "", []byte{}, fmt.Errorf("base address length 0x%x is longer than payload end 0x%x", b, payloadEnd) + } + + baseAddressBuf := bz[0:b] + baseAddress, err := bech32.ConvertAndEncode(prefix, baseAddressBuf) + if err != nil { + return "", []byte{}, err + } + + return baseAddress, bz[b:payloadEnd], nil +} + +// JoinHookedAddress joins a base bech32 address with hook data to create a +// hooked bech32 address. +// For the JS implementation, look at @agoric/cosmic-proto/src/address-hooks.js +func JoinHookedAddress(baseAddr string, hookData []byte) (string, error) { + prefix, bz, err := bech32.DecodeAndConvert(baseAddr) + if err != nil { + return "", err + } + + b := len(bz) + maxB := 1<<(8*BaseAddressLengthBytes-1) + 1 + if b > maxB { + return "", fmt.Errorf("base address length 0x%x is longer than the maximum 0x%x", b, maxB) + } + + payload := make([]byte, 0, len(AddressHookBytePrefix)+b+len(hookData)+BaseAddressLengthBytes) + payload = append(payload, AddressHookBytePrefix...) + payload[len(payload)-1] |= byte(AddressHookVersion) + payload = append(payload, bz...) + payload = append(payload, hookData...) + baLen := make([]byte, BaseAddressLengthBytes) + for i := BaseAddressLengthBytes - 1; i >= 0; i -= 1 { + baLen[i] = byte(b) + b >>= 8 + } + payload = append(payload, baLen...) + + return bech32.ConvertAndEncode(prefix, payload) +} + +// extractBaseTransferData returns the base address from the transferData.Sender +// (if RoleSender) or transferData.Receiver (if RoleReceiver). Errors in +// determining the base address are ignored... we then assume the base address +// is exactly the original address. If newTransferData is not nil, it will be +// populated with a new FungibleTokenPacketData consisting of the role replaced +// with its base address. +func extractBaseTransferData(transferData transfertypes.FungibleTokenPacketData, role AddressRole, newTransferData *transfertypes.FungibleTokenPacketData) (string, error) { + var target string + sender := transferData.Sender + receiver := transferData.Receiver + + switch role { + case RoleSender: + baseSender, err := ExtractBaseAddress(sender) + if err == nil { + sender = baseSender + } + target = sender + + case RoleReceiver: + baseReceiver, err := ExtractBaseAddress(receiver) + if err == nil { + receiver = baseReceiver + } + target = receiver + + default: + err := fmt.Errorf("invalid address role: %s", role) + return target, err + } + + if newTransferData == nil { + return target, nil + } + + // Create the new transfer data. + *newTransferData = transfertypes.NewFungibleTokenPacketData( + transferData.Denom, + transferData.Amount, + sender, receiver, + transferData.Memo, + ) + + return target, nil +} + +// ExtractBaseAddressFromPacket returns the base address from a transfer +// packet's data, either Sender (if role is RoleSender) or Receiver (if role is +// RoleReceiver). +// Errors in determining the base address are ignored... we then assume the base +// address is exactly the original address. +// If newPacket is not nil, it is populated with a new transfer packet whose +// corresponding Sender or Receiver is replaced with the extracted base address. +func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, role AddressRole, newPacket *channeltypes.Packet) (string, error) { + transferData := transfertypes.FungibleTokenPacketData{} + if err := cdc.UnmarshalJSON(packet.GetData(), &transferData); err != nil { + return "", err + } + + var newTransferData *transfertypes.FungibleTokenPacketData + if newPacket != nil { + // Capture the transfer data for the new packet. + newTransferData = &transfertypes.FungibleTokenPacketData{} + } + target, err := extractBaseTransferData(transferData, role, newTransferData) + if err != nil { + return target, err + } + + if newPacket == nil { + return target, nil + } + + // Create a new packet with the new transfer packet data. + // Re-serialize the packet data with the base addresses. + newData, err := cdc.MarshalJSON(newTransferData) + if err != nil { + return target, err + } + + // Create the new packet. + th := packet.GetTimeoutHeight() + *newPacket = channeltypes.NewPacket( + newData, packet.GetSequence(), + packet.GetSourcePort(), packet.GetSourceChannel(), + packet.GetDestPort(), packet.GetDestChannel(), + clienttypes.NewHeight(th.GetRevisionNumber(), th.GetRevisionHeight()), + packet.GetTimeoutTimestamp(), + ) + + return target, nil +} diff --git a/golang/cosmos/types/address_hooks_test.go b/golang/cosmos/types/address_hooks_test.go new file mode 100644 index 00000000000..8dd7ed6c5b7 --- /dev/null +++ b/golang/cosmos/types/address_hooks_test.go @@ -0,0 +1,218 @@ +package types_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + codec "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + + transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" + + "github.com/Agoric/agoric-sdk/golang/cosmos/types" +) + +func TestSplitHookedAddress(t *testing.T) { + cases := []struct { + name string + hook string + baseAddr string + hookData []byte + err string + }{ + {"empty", "", "", []byte{}, "decoding bech32 failed: invalid bech32 string length 0"}, + {"no hook", "agoric1qqp0e5ys", "agoric1qqp0e5ys", []byte{}, ""}, + {"Fast USDC", "agoric10rchp4vc53apxn32q42c3zryml8xq3xshyzuhjk6405wtxy7tl3d7e0f8az423padaek6me38qekget2vdhx66mtvy6kg7nrw5uhsaekd4uhwufswqex6dtsv44hxv3cd4jkuqpqvduyhf", + "agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek", + []byte("?EUD=osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men"), + ""}, + {"version 0", + "agoric10rchqqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9qx0p9wp", + "agoric1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn3tn9p0", + []byte{4, 3, 2, 1}, + ""}, + {"version 1 reject", + "agoric10rchzqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q04n2fg", + "", + []byte{}, + "unsupported address hook version 1"}, + {"version 15 reject", + "agoric10rch7qqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q25ez2d", + "", + []byte{}, + "unsupported address hook version 15"}, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + baseAddr, hookData, err := types.SplitHookedAddress(tc.hook) + if len(tc.err) > 0 { + require.Error(t, err) + require.Equal(t, tc.err, err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tc.baseAddr, baseAddr) + require.Equal(t, string(tc.hookData), string(hookData)) + } + }) + } +} + +func TestExtractBaseAddress(t *testing.T) { + bases := []struct { + name string + addr string + }{ + {"agoric address", "agoric1qqp0e5ys"}, + {"cosmos address", "cosmos1qqxuevtt"}, + } + + suffixes := []struct { + hookStr string + baseIsWrong bool + isErr bool + }{ + {"", false, false}, + {"/", false, false}, + {"/sub/account", false, false}, + {"?query=something&k=v&k2=v2", false, false}, + {"?query=something&k=v&k2=v2#fragment", false, false}, + {"unexpected", false, false}, + {"\x01", false, false}, + } + + for _, b := range bases { + b := b + for _, s := range suffixes { + s := s + t.Run(b.name+" "+s.hookStr, func(t *testing.T) { + addrHook, err := types.JoinHookedAddress(b.addr, []byte(s.hookStr)) + require.NoError(t, err) + addr, err := types.ExtractBaseAddress(addrHook) + if s.isErr { + require.Error(t, err) + } else { + require.NoError(t, err) + if s.baseIsWrong { + require.NotEqual(t, b.addr, addr) + } else { + require.Equal(t, b.addr, addr) + addr, hookData, err := types.SplitHookedAddress(addrHook) + require.NoError(t, err) + require.Equal(t, b.addr, addr) + require.Equal(t, s.hookStr, string(hookData)) + } + } + }) + } + } +} + +func TestExtractBaseAddressFromPacket(t *testing.T) { + ir := cdctypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(ir) + transfertypes.RegisterInterfaces(ir) + channeltypes.RegisterInterfaces(ir) + clienttypes.RegisterInterfaces(ir) + + cosmosAddr := "cosmos1qqxuevtt" + cosmosHookStr := "?foo=bar&baz=bot#fragment" + cosmosHook, err := types.JoinHookedAddress(cosmosAddr, []byte(cosmosHookStr)) + require.NoError(t, err) + addr, hookData, err := types.SplitHookedAddress(cosmosHook) + require.NoError(t, err) + require.Equal(t, cosmosAddr, addr) + require.Equal(t, cosmosHookStr, string(hookData)) + + agoricAddr := "agoric1qqp0e5ys" + agoricHookStr := "?bingo=again" + agoricHook, err := types.JoinHookedAddress(agoricAddr, []byte(agoricHookStr)) + require.NoError(t, err) + addr, hookData, err = types.SplitHookedAddress(agoricHook) + require.NoError(t, err) + require.Equal(t, agoricAddr, addr) + require.Equal(t, agoricHookStr, string(hookData)) + + cases := []struct { + name string + addrs map[types.AddressRole]struct{ addr, baseAddr string } + }{ + {"sender has params", + map[types.AddressRole]struct{ addr, baseAddr string }{ + types.RoleSender: {cosmosHook, "cosmos1qqxuevtt"}, + types.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"}, + }, + }, + {"receiver has params", + map[types.AddressRole]struct{ addr, baseAddr string }{ + types.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"}, + types.RoleReceiver: {agoricHook, "agoric1qqp0e5ys"}, + }, + }, + {"both are base", + map[types.AddressRole]struct{ addr, baseAddr string }{ + types.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"}, + types.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"}, + }, + }, + {"both have params", + map[types.AddressRole]struct{ addr, baseAddr string }{ + types.RoleSender: {agoricHook, "agoric1qqp0e5ys"}, + types.RoleReceiver: {cosmosHook, "cosmos1qqxuevtt"}, + }, + }, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + ftPacketData := transfertypes.NewFungibleTokenPacketData("denom", "100", tc.addrs[types.RoleSender].addr, tc.addrs[types.RoleReceiver].addr, "my-favourite-memo") + packetBz, err := cdc.MarshalJSON(&ftPacketData) + require.NoError(t, err) + packet := channeltypes.NewPacket(packetBz, 1234, "my-port", "my-channel", "their-port", "their-channel", clienttypes.NewHeight(133, 445), 10999) + + for role, addrs := range tc.addrs { + addrs := addrs + role := role + + t.Run(string(role), func(t *testing.T) { + baseAddr, err := types.ExtractBaseAddress(addrs.addr) + require.NoError(t, err) + require.Equal(t, addrs.baseAddr, baseAddr) + + packetBaseAddr, err := types.ExtractBaseAddressFromPacket(cdc, packet, role, nil) + require.NoError(t, err) + require.Equal(t, addrs.baseAddr, packetBaseAddr) + + var newPacket channeltypes.Packet + packetBaseAddr2, err := types.ExtractBaseAddressFromPacket(cdc, packet, role, &newPacket) + require.NoError(t, err) + require.Equal(t, addrs.baseAddr, packetBaseAddr2) + + var basePacketData transfertypes.FungibleTokenPacketData + err = cdc.UnmarshalJSON(newPacket.GetData(), &basePacketData) + require.NoError(t, err) + + // Check that the only difference between the packet data is the baseAddr. + packetData := basePacketData + switch role { + case types.RoleSender: + require.Equal(t, addrs.baseAddr, basePacketData.Sender) + packetData.Sender = addrs.addr + case types.RoleReceiver: + require.Equal(t, addrs.baseAddr, basePacketData.Receiver) + packetData.Receiver = addrs.addr + default: + t.Fatal("unexpected role", role) + } + + require.Equal(t, ftPacketData, packetData) + }) + } + }) + } +} diff --git a/golang/cosmos/x/swingset/genesis.go b/golang/cosmos/x/swingset/genesis.go index 56c6e06e5ba..e8308e6e94e 100644 --- a/golang/cosmos/x/swingset/genesis.go +++ b/golang/cosmos/x/swingset/genesis.go @@ -1,13 +1,13 @@ package swingset import ( - // "os" "bytes" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "hash" + "io" "strings" agoric "github.com/Agoric/agoric-sdk/golang/cosmos/types" @@ -16,6 +16,20 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +const ( + // SwingStoreExportModeSkip indicates swing store data should be + // excluded from the export. + SwingStoreExportModeSkip = "skip" + + // SwingStoreExportModeOperational (default) indicates export should + // have the minimal set of artifacts needed to operate a node. + SwingStoreExportModeOperational = "operational" + + // SwingStoreExportModeDebug indicates export should have the maximal + // set of artifacts available in the JS swing-store. + SwingStoreExportModeDebug = "debug" +) + func ValidateGenesis(data *types.GenesisState) error { if data == nil { return fmt.Errorf("swingset genesis data cannot be nil") @@ -130,36 +144,59 @@ func InitGenesis(ctx sdk.Context, k Keeper, swingStoreExportsHandler *SwingStore return false } -func ExportGenesis(ctx sdk.Context, k Keeper, swingStoreExportsHandler *SwingStoreExportsHandler, swingStoreExportDir string) *types.GenesisState { +func ExportGenesis( + ctx sdk.Context, + k Keeper, + swingStoreExportsHandler *SwingStoreExportsHandler, + swingStoreExportDir string, + swingStoreExportMode string, +) *types.GenesisState { gs := &types.GenesisState{ Params: k.GetParams(ctx), State: k.GetState(ctx), SwingStoreExportData: nil, } + // This will only be used in non skip mode + artifactMode := swingStoreExportMode + exportDataMode := keeper.SwingStoreExportDataModeSkip + hasher := sha256.New() snapshotHeight := uint64(ctx.BlockHeight()) - eventHandler := swingStoreGenesisEventHandler{exportDir: swingStoreExportDir, snapshotHeight: snapshotHeight, swingStore: k.GetSwingStore(ctx), hasher: sha256.New()} - - err := swingStoreExportsHandler.InitiateExport( - // The export will fail if the export of a historical height was requested - snapshotHeight, - eventHandler, - keeper.SwingStoreExportOptions{ - ArtifactMode: keeper.SwingStoreArtifactModeOperational, - ExportDataMode: keeper.SwingStoreExportDataModeSkip, - }, - ) - if err != nil { - panic(err) + if swingStoreExportMode == SwingStoreExportModeDebug { + exportDataMode = keeper.SwingStoreExportDataModeAll + snapshotHeight = 0 } - err = keeper.WaitUntilSwingStoreExportDone() - if err != nil { - panic(err) + if swingStoreExportMode != SwingStoreExportModeSkip { + eventHandler := swingStoreGenesisEventHandler{ + exportDir: swingStoreExportDir, + snapshotHeight: snapshotHeight, + swingStore: k.GetSwingStore(ctx), + hasher: hasher, + exportMode: swingStoreExportMode, + } + + err := swingStoreExportsHandler.InitiateExport( + // The export will fail if the export of a historical height was requested outside of debug mode + snapshotHeight, + eventHandler, + keeper.SwingStoreExportOptions{ + ArtifactMode: artifactMode, + ExportDataMode: exportDataMode, + }, + ) + if err != nil { + panic(err) + } + + err = keeper.WaitUntilSwingStoreExportDone() + if err != nil { + panic(err) + } } - gs.SwingStoreExportDataHash = fmt.Sprintf("sha256:%x", eventHandler.hasher.Sum(nil)) + gs.SwingStoreExportDataHash = fmt.Sprintf("sha256:%x", hasher.Sum(nil)) return gs } @@ -169,6 +206,7 @@ type swingStoreGenesisEventHandler struct { snapshotHeight uint64 swingStore sdk.KVStore hasher hash.Hash + exportMode string } func (eventHandler swingStoreGenesisEventHandler) OnExportStarted(height uint64, retrieveSwingStoreExport func() error) error { @@ -176,10 +214,12 @@ func (eventHandler swingStoreGenesisEventHandler) OnExportStarted(height uint64, } func (eventHandler swingStoreGenesisEventHandler) OnExportRetrieved(provider keeper.SwingStoreExportProvider) error { - if eventHandler.snapshotHeight != provider.BlockHeight { + if eventHandler.exportMode != SwingStoreExportModeDebug && eventHandler.snapshotHeight != provider.BlockHeight { return fmt.Errorf("snapshot block height (%d) doesn't match requested height (%d)", provider.BlockHeight, eventHandler.snapshotHeight) } + artifactsEnded := false + artifactsProvider := keeper.SwingStoreExportProvider{ GetExportDataReader: func() (agoric.KVEntryReader, error) { exportDataIterator := eventHandler.swingStore.Iterator(nil, nil) @@ -194,7 +234,45 @@ func (eventHandler swingStoreGenesisEventHandler) OnExportRetrieved(provider kee return nil }), nil }, - ReadNextArtifact: provider.ReadNextArtifact, + ReadNextArtifact: func() (types.SwingStoreArtifact, error) { + var ( + artifact types.SwingStoreArtifact + err error + encodedExportData bytes.Buffer + ) + + if !artifactsEnded { + artifact, err = provider.ReadNextArtifact() + } else { + return types.SwingStoreArtifact{}, io.EOF + } + + if err == io.EOF { + artifactsEnded = true + if eventHandler.exportMode == SwingStoreExportModeDebug { + exportDataReader, _ := provider.GetExportDataReader() + + defer exportDataReader.Close() + + err = agoric.EncodeKVEntryReaderToJsonl( + exportDataReader, + &encodedExportData, + ) + if err == nil { + artifact = types.SwingStoreArtifact{ + Data: encodedExportData.Bytes(), + Name: keeper.UntrustedExportDataArtifactName, + } + } + } + } + + return artifact, err + }, + } + + if eventHandler.exportMode == SwingStoreExportModeDebug { + artifactsProvider.BlockHeight = provider.BlockHeight } return keeper.WriteSwingStoreExportToDirectory(artifactsProvider, eventHandler.exportDir) diff --git a/golang/cosmos/x/swingset/keeper/keeper.go b/golang/cosmos/x/swingset/keeper/keeper.go index dcd4790c445..28c7723b752 100644 --- a/golang/cosmos/x/swingset/keeper/keeper.go +++ b/golang/cosmos/x/swingset/keeper/keeper.go @@ -246,7 +246,10 @@ func (k Keeper) BlockingSend(ctx sdk.Context, action vm.Action) (string, error) } func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramSpace.GetParamSet(ctx, ¶ms) + // Note the use of "IfExists"... + // migration fills in missing data with defaults, + // so it is the only consumer that should ever see a nil pair. + k.paramSpace.GetParamSetIfExists(ctx, ¶ms) return params } @@ -304,9 +307,12 @@ func (k Keeper) SetBeansOwing(ctx sdk.Context, addr sdk.AccAddress, beans sdkmat // ChargeBeans charges the given address the given number of beans. It divides // the beans into the number to debit immediately vs. the number to store in the // beansOwing. -func (k Keeper) ChargeBeans(ctx sdk.Context, addr sdk.AccAddress, beans sdkmath.Uint) error { - beansPerUnit := k.GetBeansPerUnit(ctx) - +func (k Keeper) ChargeBeans( + ctx sdk.Context, + beansPerUnit map[string]sdkmath.Uint, + addr sdk.AccAddress, + beans sdkmath.Uint, +) error { wasOwing := k.GetBeansOwing(ctx, addr) nowOwing := wasOwing.Add(beans) @@ -339,10 +345,13 @@ func (k Keeper) ChargeBeans(ctx sdk.Context, addr sdk.AccAddress, beans sdkmath. } // ChargeForSmartWallet charges the fee for provisioning a smart wallet. -func (k Keeper) ChargeForSmartWallet(ctx sdk.Context, addr sdk.AccAddress) error { - beansPerUnit := k.GetBeansPerUnit(ctx) +func (k Keeper) ChargeForSmartWallet( + ctx sdk.Context, + beansPerUnit map[string]sdkmath.Uint, + addr sdk.AccAddress, +) error { beans := beansPerUnit[types.BeansPerSmartWalletProvision] - err := k.ChargeBeans(ctx, addr, beans) + err := k.ChargeBeans(ctx, beansPerUnit, addr, beans) if err != nil { return err } diff --git a/golang/cosmos/x/swingset/module.go b/golang/cosmos/x/swingset/module.go index c8c646313f6..6a3465e88bf 100644 --- a/golang/cosmos/x/swingset/module.go +++ b/golang/cosmos/x/swingset/module.go @@ -80,10 +80,18 @@ type AppModule struct { setBootstrapNeeded func() ensureControllerInited func(sdk.Context) swingStoreExportDir string + swingStoreExportMode string } // NewAppModule creates a new AppModule Object -func NewAppModule(k Keeper, swingStoreExportsHandler *SwingStoreExportsHandler, setBootstrapNeeded func(), ensureControllerInited func(sdk.Context), swingStoreExportDir string) AppModule { +func NewAppModule( + k Keeper, + swingStoreExportsHandler *SwingStoreExportsHandler, + setBootstrapNeeded func(), + ensureControllerInited func(sdk.Context), + swingStoreExportDir string, + swingStoreExportMode string, +) AppModule { am := AppModule{ AppModuleBasic: AppModuleBasic{}, keeper: k, @@ -91,6 +99,7 @@ func NewAppModule(k Keeper, swingStoreExportsHandler *SwingStoreExportsHandler, setBootstrapNeeded: setBootstrapNeeded, ensureControllerInited: ensureControllerInited, swingStoreExportDir: swingStoreExportDir, + swingStoreExportMode: swingStoreExportMode, } return am } @@ -173,6 +182,12 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { am.checkSwingStoreExportSetup() - gs := ExportGenesis(ctx, am.keeper, am.swingStoreExportsHandler, am.swingStoreExportDir) + gs := ExportGenesis( + ctx, + am.keeper, + am.swingStoreExportsHandler, + am.swingStoreExportDir, + am.swingStoreExportMode, + ) return cdc.MustMarshalJSON(gs) } diff --git a/golang/cosmos/x/swingset/types/default-params.go b/golang/cosmos/x/swingset/types/default-params.go index 46c7fe286d5..d267b48d659 100644 --- a/golang/cosmos/x/swingset/types/default-params.go +++ b/golang/cosmos/x/swingset/types/default-params.go @@ -22,13 +22,23 @@ const ( BeansPerXsnapComputron = "xsnapComputron" BeansPerSmartWalletProvision = "smartWalletProvision" + // PowerFlags. + PowerFlagSmartWallet = "SMART_WALLET" + // QueueSize keys. - // Keep up-to-date with updateQueueAllowed() in packanges/cosmic-swingset/src/launch-chain.js + // Keep up-to-date with updateQueueAllowed() in packages/cosmic-swingset/src/launch-chain.js QueueInbound = "inbound" QueueInboundMempool = "inbound_mempool" - // PowerFlags. - PowerFlagSmartWallet = "SMART_WALLET" + // Vat cleanup budget keys. + // Keep up-to-date with CleanupBudget in packages/cosmic-swingset/src/launch-chain.js + VatCleanupDefault = "default" + VatCleanupExports = "exports" + VatCleanupImports = "imports" + VatCleanupPromises = "promises" + VatCleanupKv = "kv" + VatCleanupSnapshots = "snapshots" + VatCleanupTranscripts = "transcripts" ) var ( @@ -62,10 +72,26 @@ var ( } DefaultInboundQueueMax = int32(1_000) - - DefaultQueueMax = []QueueSize{ + DefaultQueueMax = []QueueSize{ NewQueueSize(QueueInbound, DefaultInboundQueueMax), } + + DefaultVatCleanupDefault = sdk.NewUint(5) + // DefaultVatCleanupExports = DefaultVatCleanupDefault + // DefaultVatCleanupImports = DefaultVatCleanupDefault + // DefaultVatCleanupPromises = DefaultVatCleanupDefault + DefaultVatCleanupKv = sdk.NewUint(50) + // DefaultVatCleanupSnapshots = DefaultVatCleanupDefault + // DefaultVatCleanupTranscripts = DefaultVatCleanupDefault + DefaultVatCleanupBudget = []UintMapEntry{ + UintMapEntry{VatCleanupDefault, DefaultVatCleanupDefault}, + // UintMapEntry{VatCleanupExports, DefaultVatCleanupExports}, + // UintMapEntry{VatCleanupImports, DefaultVatCleanupImports}, + // UintMapEntry{VatCleanupPromises, DefaultVatCleanupPromises}, + UintMapEntry{VatCleanupKv, DefaultVatCleanupKv}, + // UintMapEntry{VatCleanupSnapshots, DefaultVatCleanupSnapshots}, + // UintMapEntry{VatCleanupTranscripts, DefaultVatCleanupTranscripts}, + } ) // move DefaultBeansPerUnit to a function to allow for boot overriding of the Default params diff --git a/golang/cosmos/x/swingset/types/expected_keepers.go b/golang/cosmos/x/swingset/types/expected_keepers.go index 3c20f7c3cf2..e8fdbf093b9 100644 --- a/golang/cosmos/x/swingset/types/expected_keepers.go +++ b/golang/cosmos/x/swingset/types/expected_keepers.go @@ -23,8 +23,8 @@ type AccountKeeper interface { type SwingSetKeeper interface { GetBeansPerUnit(ctx sdk.Context) map[string]sdkmath.Uint - ChargeBeans(ctx sdk.Context, addr sdk.AccAddress, beans sdkmath.Uint) error + ChargeBeans(ctx sdk.Context, beansPerUnit map[string]sdkmath.Uint, addr sdk.AccAddress, beans sdkmath.Uint) error IsHighPriorityAddress(ctx sdk.Context, addr sdk.AccAddress) (bool, error) GetSmartWalletState(ctx sdk.Context, addr sdk.AccAddress) SmartWalletState - ChargeForSmartWallet(ctx sdk.Context, addr sdk.AccAddress) error + ChargeForSmartWallet(ctx sdk.Context, beansPerUnit map[string]sdkmath.Uint, addr sdk.AccAddress) error } diff --git a/golang/cosmos/x/swingset/types/msgs.go b/golang/cosmos/x/swingset/types/msgs.go index 2a2ebeca465..9c8cd04d7d1 100644 --- a/golang/cosmos/x/swingset/types/msgs.go +++ b/golang/cosmos/x/swingset/types/msgs.go @@ -8,9 +8,12 @@ import ( "strings" sdkioerrors "cosmossdk.io/errors" - "github.com/Agoric/agoric-sdk/golang/cosmos/vm" + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + "github.com/Agoric/agoric-sdk/golang/cosmos/vm" ) const RouterKey = ModuleName // this was defined in your key.go file @@ -56,16 +59,26 @@ const ( // Charge an account address for the beans associated with given messages and storage. // See list of bean charges in default-params.go -func chargeAdmission(ctx sdk.Context, keeper SwingSetKeeper, addr sdk.AccAddress, msgs []string, storageLen uint64) error { - beansPerUnit := keeper.GetBeansPerUnit(ctx) +func chargeAdmission( + ctx sdk.Context, + keeper SwingSetKeeper, + beansPerUnit map[string]sdkmath.Uint, + addr sdk.AccAddress, + msgs []string, + storageLen uint64, +) error { + // A flat charge for each transaction. beans := beansPerUnit[BeansPerInboundTx] + // A charge for each message in the transaction. beans = beans.Add(beansPerUnit[BeansPerMessage].MulUint64((uint64(len(msgs))))) + // A charge for the total byte length of all messages. for _, msg := range msgs { beans = beans.Add(beansPerUnit[BeansPerMessageByte].MulUint64(uint64(len(msg)))) } + // A charge for persistent storage. beans = beans.Add(beansPerUnit[BeansPerStorageByte].MulUint64(storageLen)) - return keeper.ChargeBeans(ctx, addr, beans) + return keeper.ChargeBeans(ctx, beansPerUnit, addr, beans) } // checkSmartWalletProvisioned verifies if a smart wallet message (MsgWalletAction @@ -74,7 +87,12 @@ func chargeAdmission(ctx sdk.Context, keeper SwingSetKeeper, addr sdk.AccAddress // provisioning fee is charged successfully. // All messages for non-provisioned smart wallets allowed here will result in // an auto-provision action generated by the msg server. -func checkSmartWalletProvisioned(ctx sdk.Context, keeper SwingSetKeeper, addr sdk.AccAddress) error { +func checkSmartWalletProvisioned( + ctx sdk.Context, + keeper SwingSetKeeper, + beansPerUnit map[string]sdkmath.Uint, + addr sdk.AccAddress, +) error { walletState := keeper.GetSmartWalletState(ctx, addr) switch walletState { @@ -91,7 +109,7 @@ func checkSmartWalletProvisioned(ctx sdk.Context, keeper SwingSetKeeper, addr sd // This is a separate charge from the smart wallet action which triggered the check // TODO: Currently this call does not mark the smart wallet provisioning as // pending, resulting in multiple provisioning charges for the owner. - return keeper.ChargeForSmartWallet(ctx, addr) + return keeper.ChargeForSmartWallet(ctx, beansPerUnit, addr) } } @@ -118,7 +136,8 @@ func (msg MsgDeliverInbound) CheckAdmissibility(ctx sdk.Context, data interface{ } */ - return chargeAdmission(ctx, keeper, msg.Submitter, msg.Messages, 0) + beansPerUnit := keeper.GetBeansPerUnit(ctx) + return chargeAdmission(ctx, keeper, beansPerUnit, msg.Submitter, msg.Messages, 0) } // GetInboundMsgCount implements InboundMsgCarrier. @@ -184,12 +203,13 @@ func (msg MsgWalletAction) CheckAdmissibility(ctx sdk.Context, data interface{}) return sdkioerrors.Wrapf(sdkerrors.ErrInvalidRequest, "data must be a SwingSetKeeper, not a %T", data) } - err := checkSmartWalletProvisioned(ctx, keeper, msg.Owner) + beansPerUnit := keeper.GetBeansPerUnit(ctx) + err := checkSmartWalletProvisioned(ctx, keeper, beansPerUnit, msg.Owner) if err != nil { return err } - return chargeAdmission(ctx, keeper, msg.Owner, []string{msg.Action}, 0) + return chargeAdmission(ctx, keeper, beansPerUnit, msg.Owner, []string{msg.Action}, 0) } // GetInboundMsgCount implements InboundMsgCarrier. @@ -256,12 +276,13 @@ func (msg MsgWalletSpendAction) CheckAdmissibility(ctx sdk.Context, data interfa return sdkioerrors.Wrapf(sdkerrors.ErrInvalidRequest, "data must be a SwingSetKeeper, not a %T", data) } - err := checkSmartWalletProvisioned(ctx, keeper, msg.Owner) + beansPerUnit := keeper.GetBeansPerUnit(ctx) + err := checkSmartWalletProvisioned(ctx, keeper, beansPerUnit, msg.Owner) if err != nil { return err } - return chargeAdmission(ctx, keeper, msg.Owner, []string{msg.SpendAction}, 0) + return chargeAdmission(ctx, keeper, beansPerUnit, msg.Owner, []string{msg.SpendAction}, 0) } // GetInboundMsgCount implements InboundMsgCarrier. @@ -373,7 +394,8 @@ func (msg MsgInstallBundle) CheckAdmissibility(ctx sdk.Context, data interface{} if !ok { return sdkioerrors.Wrapf(sdkerrors.ErrInvalidRequest, "data must be a SwingSetKeeper, not a %T", data) } - return chargeAdmission(ctx, keeper, msg.Submitter, []string{msg.Bundle}, msg.ExpectedUncompressedSize()) + beansPerUnit := keeper.GetBeansPerUnit(ctx) + return chargeAdmission(ctx, keeper, beansPerUnit, msg.Submitter, []string{msg.Bundle}, msg.ExpectedUncompressedSize()) } // GetInboundMsgCount implements InboundMsgCarrier. diff --git a/golang/cosmos/x/swingset/types/params.go b/golang/cosmos/x/swingset/types/params.go index 9a18d03de8b..9b53ae58fbf 100644 --- a/golang/cosmos/x/swingset/types/params.go +++ b/golang/cosmos/x/swingset/types/params.go @@ -17,6 +17,7 @@ var ( ParamStoreKeyFeeUnitPrice = []byte("fee_unit_price") ParamStoreKeyPowerFlagFees = []byte("power_flag_fees") ParamStoreKeyQueueMax = []byte("queue_max") + ParamStoreKeyVatCleanupBudget = []byte("vat_cleanup_budget") ) func NewStringBeans(key string, beans sdkmath.Uint) StringBeans { @@ -53,6 +54,7 @@ func DefaultParams() Params { FeeUnitPrice: DefaultFeeUnitPrice, PowerFlagFees: DefaultPowerFlagFees, QueueMax: DefaultQueueMax, + VatCleanupBudget: DefaultVatCleanupBudget, } } @@ -69,6 +71,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(ParamStoreKeyBootstrapVatConfig, &p.BootstrapVatConfig, validateBootstrapVatConfig), paramtypes.NewParamSetPair(ParamStoreKeyPowerFlagFees, &p.PowerFlagFees, validatePowerFlagFees), paramtypes.NewParamSetPair(ParamStoreKeyQueueMax, &p.QueueMax, validateQueueMax), + paramtypes.NewParamSetPair(ParamStoreKeyVatCleanupBudget, &p.VatCleanupBudget, validateVatCleanupBudget), } } @@ -89,6 +92,9 @@ func (p Params) ValidateBasic() error { if err := validateQueueMax(p.QueueMax); err != nil { return err } + if err := validateVatCleanupBudget(p.VatCleanupBudget); err != nil { + return err + } return nil } @@ -165,20 +171,42 @@ func validateQueueMax(i interface{}) error { return nil } +func validateVatCleanupBudget(i interface{}) error { + entries, ok := i.([]UintMapEntry) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + hasDefault := false + for _, entry := range entries { + if entry.Key == VatCleanupDefault { + hasDefault = true + break + } + } + if len(entries) > 0 && !hasDefault { + return fmt.Errorf("`default` must be present in a non-empty vat cleanup budget") + } + return nil +} + // UpdateParams appends any missing params, configuring them to their defaults, // then returning the updated params or an error. Existing params are not // modified, regardless of their value, and they are not removed if they no // longer appear in the defaults. func UpdateParams(params Params) (Params, error) { - newBpu, err := appendMissingDefaultBeansPerUnit(params.BeansPerUnit, DefaultBeansPerUnit()) + newBpu, err := appendMissingDefaults(params.BeansPerUnit, DefaultBeansPerUnit()) if err != nil { return params, err } - newPff, err := appendMissingDefaultPowerFlagFees(params.PowerFlagFees, DefaultPowerFlagFees) + newPff, err := appendMissingDefaults(params.PowerFlagFees, DefaultPowerFlagFees) if err != nil { return params, err } - newQm, err := appendMissingDefaultQueueSize(params.QueueMax, DefaultQueueMax) + newQm, err := appendMissingDefaults(params.QueueMax, DefaultQueueMax) + if err != nil { + return params, err + } + newVcb, err := appendMissingDefaults(params.VatCleanupBudget, DefaultVatCleanupBudget) if err != nil { return params, err } @@ -186,55 +214,37 @@ func UpdateParams(params Params) (Params, error) { params.BeansPerUnit = newBpu params.PowerFlagFees = newPff params.QueueMax = newQm + params.VatCleanupBudget = newVcb return params, nil } -// appendMissingDefaultBeansPerUnit appends the default beans per unit entries -// not in the list of bean costs already, returning the possibly-updated list, -// or an error. -func appendMissingDefaultBeansPerUnit(bpu []StringBeans, defaultBpu []StringBeans) ([]StringBeans, error) { - existingBpu := make(map[string]struct{}, len(bpu)) - for _, ob := range bpu { - existingBpu[ob.Key] = struct{}{} - } - - for _, b := range defaultBpu { - if _, exists := existingBpu[b.Key]; !exists { - bpu = append(bpu, b) +// appendMissingDefaults appends to an input list any missing entries with their +// respective default values and returns the result. +func appendMissingDefaults[Entry StringBeans | PowerFlagFee | QueueSize | UintMapEntry](entries []Entry, defaults []Entry) ([]Entry, error) { + getKey := func(entry any) string { + switch e := entry.(type) { + case StringBeans: + return e.Key + case PowerFlagFee: + return e.PowerFlag + case QueueSize: + return e.Key + case UintMapEntry: + return e.Key } + panic("unreachable") } - return bpu, nil -} -// appendMissingDefaultPowerFlagFees appends the default power flag fee entries -// not in the list of power flags already, returning the possibly-updated list, -// or an error. -func appendMissingDefaultPowerFlagFees(pff []PowerFlagFee, defaultPff []PowerFlagFee) ([]PowerFlagFee, error) { - existingPff := make(map[string]struct{}, len(pff)) - for _, of := range pff { - existingPff[of.PowerFlag] = struct{}{} + existingKeys := make(map[string]bool, len(entries)) + for _, entry := range entries { + existingKeys[getKey(entry)] = true } - for _, f := range defaultPff { - if _, exists := existingPff[f.PowerFlag]; !exists { - pff = append(pff, f) + for _, defaultEntry := range defaults { + if exists := existingKeys[getKey(defaultEntry)]; !exists { + entries = append(entries, defaultEntry) } } - return pff, nil -} - -// appendMissingDefaultQueueSize appends the default queue size entries not in -// the list of sizes already, returning the possibly-updated list, or an error. -func appendMissingDefaultQueueSize(qs []QueueSize, defaultQs []QueueSize) ([]QueueSize, error) { - existingQs := make(map[string]struct{}, len(qs)) - for _, os := range qs { - existingQs[os.Key] = struct{}{} - } - for _, s := range defaultQs { - if _, exists := existingQs[s.Key]; !exists { - qs = append(qs, s) - } - } - return qs, nil + return entries, nil } diff --git a/golang/cosmos/x/swingset/types/params_test.go b/golang/cosmos/x/swingset/types/params_test.go index e75986736ad..ff3a7cbe149 100644 --- a/golang/cosmos/x/swingset/types/params_test.go +++ b/golang/cosmos/x/swingset/types/params_test.go @@ -80,7 +80,7 @@ func TestAddStorageBeanCost(t *testing.T) { }, } { t.Run(tt.name, func(t *testing.T) { - got, err := appendMissingDefaultBeansPerUnit(tt.in, []StringBeans{defaultStorageCost}) + got, err := appendMissingDefaults(tt.in, []StringBeans{defaultStorageCost}) if err != nil { t.Errorf("got error %v", err) } else if !reflect.DeepEqual(got, tt.want) { @@ -90,27 +90,93 @@ func TestAddStorageBeanCost(t *testing.T) { } } -func TestUpdateParams(t *testing.T) { - +func TestUpdateParamsFromEmpty(t *testing.T) { in := Params{ - BeansPerUnit: []beans{}, - BootstrapVatConfig: "baz", + BeansPerUnit: nil, + BootstrapVatConfig: "", FeeUnitPrice: sdk.NewCoins(sdk.NewInt64Coin("denom", 789)), - PowerFlagFees: []PowerFlagFee{}, - QueueMax: []QueueSize{}, + PowerFlagFees: nil, + QueueMax: nil, + VatCleanupBudget: nil, } want := Params{ BeansPerUnit: DefaultBeansPerUnit(), - BootstrapVatConfig: "baz", + BootstrapVatConfig: "", FeeUnitPrice: sdk.NewCoins(sdk.NewInt64Coin("denom", 789)), PowerFlagFees: DefaultPowerFlagFees, QueueMax: DefaultQueueMax, + VatCleanupBudget: DefaultVatCleanupBudget, + } + got, err := UpdateParams(in) + if err != nil { + t.Fatalf("UpdateParam error %v", err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("GOT\n%v\nWANTED\n%v", got, want) + } +} + +func TestUpdateParamsFromExisting(t *testing.T) { + defaultBeansPerUnit := DefaultBeansPerUnit() + customBeansPerUnit := NewStringBeans("foo", sdk.NewUint(1)) + customPowerFlagFee := NewPowerFlagFee("bar", sdk.NewCoins(sdk.NewInt64Coin("baz", 2))) + customQueueSize := NewQueueSize("qux", int32(3)) + customVatCleanup := UintMapEntry{"corge", sdk.NewUint(4)} + in := Params{ + BeansPerUnit: append([]StringBeans{customBeansPerUnit}, defaultBeansPerUnit[2:4]...), + BootstrapVatConfig: "", + FeeUnitPrice: sdk.NewCoins(sdk.NewInt64Coin("denom", 789)), + PowerFlagFees: []PowerFlagFee{customPowerFlagFee}, + QueueMax: []QueueSize{NewQueueSize(QueueInbound, int32(10)), customQueueSize}, + VatCleanupBudget: []UintMapEntry{customVatCleanup, UintMapEntry{VatCleanupDefault, sdk.NewUint(10)}}, + } + want := Params{ + BeansPerUnit: append(append(in.BeansPerUnit, defaultBeansPerUnit[0:2]...), defaultBeansPerUnit[4:]...), + BootstrapVatConfig: in.BootstrapVatConfig, + FeeUnitPrice: in.FeeUnitPrice, + PowerFlagFees: append(in.PowerFlagFees, DefaultPowerFlagFees...), + QueueMax: in.QueueMax, + VatCleanupBudget: append(in.VatCleanupBudget, DefaultVatCleanupBudget[1:]...), } got, err := UpdateParams(in) if err != nil { t.Fatalf("UpdateParam error %v", err) } if !reflect.DeepEqual(got, want) { - t.Errorf("got %v, want %v", got, want) + t.Errorf("GOT\n%v\nWANTED\n%v", got, want) + } +} + +func TestValidateParams(t *testing.T) { + params := Params{ + BeansPerUnit: DefaultBeansPerUnit(), + BootstrapVatConfig: "foo", + FeeUnitPrice: sdk.NewCoins(sdk.NewInt64Coin("denom", 789)), + PowerFlagFees: DefaultPowerFlagFees, + QueueMax: DefaultQueueMax, + VatCleanupBudget: DefaultVatCleanupBudget, + } + err := params.ValidateBasic() + if err != nil { + t.Errorf("unexpected ValidateBasic() error with default params: %v", err) + } + + customVatCleanup := UintMapEntry{"corge", sdk.NewUint(4)} + params.VatCleanupBudget = append(params.VatCleanupBudget, customVatCleanup) + err = params.ValidateBasic() + if err != nil { + t.Errorf("unexpected ValidateBasic() error with extended params: %v", err) + } + + params.VatCleanupBudget = params.VatCleanupBudget[1:] + err = params.ValidateBasic() + if err == nil { + t.Errorf("ValidateBasic() failed to reject VatCleanupBudget with missing `default` %v", params.VatCleanupBudget) + } + + params.VatCleanupBudget = []UintMapEntry{} + err = params.ValidateBasic() + if err != nil { + t.Errorf("unexpected ValidateBasic() error with empty VatCleanupBudget: %v", params.VatCleanupBudget) } } diff --git a/golang/cosmos/x/swingset/types/swingset.pb.go b/golang/cosmos/x/swingset/types/swingset.pb.go index 959c030f8d5..3fbbcccf06e 100644 --- a/golang/cosmos/x/swingset/types/swingset.pb.go +++ b/golang/cosmos/x/swingset/types/swingset.pb.go @@ -161,6 +161,15 @@ type Params struct { // nodes must all serialize and deserialize the existing order without // permuting it. QueueMax []QueueSize `protobuf:"bytes,5,rep,name=queue_max,json=queueMax,proto3" json:"queue_max"` + // Vat cleanup budget values. + // These values are used by SwingSet to control the pace of removing data + // associated with a terminated vat as described at + // https://github.com/Agoric/agoric-sdk/blob/master/packages/SwingSet/docs/run-policy.md#terminated-vat-cleanup + // + // There is no required order to this list of entries, but all the chain + // nodes must all serialize and deserialize the existing order without + // permuting it. + VatCleanupBudget []UintMapEntry `protobuf:"bytes,6,rep,name=vat_cleanup_budget,json=vatCleanupBudget,proto3" json:"vat_cleanup_budget"` } func (m *Params) Reset() { *m = Params{} } @@ -230,6 +239,13 @@ func (m *Params) GetQueueMax() []QueueSize { return nil } +func (m *Params) GetVatCleanupBudget() []UintMapEntry { + if m != nil { + return m.VatCleanupBudget + } + return nil +} + // The current state of the module. type State struct { // The allowed number of items to add to queues, as determined by SwingSet. @@ -379,6 +395,7 @@ func (m *PowerFlagFee) GetFee() github_com_cosmos_cosmos_sdk_types.Coins { } // Map element of a string key to a size. +// TODO: Replace with UintMapEntry? type QueueSize struct { // What the size is for. Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` @@ -433,6 +450,54 @@ func (m *QueueSize) GetSize_() int32 { return 0 } +// Map element of a string key to an unsigned integer. +// The value uses cosmos-sdk Uint rather than a native Go type to ensure that +// zeroes survive "omitempty" JSON serialization. +type UintMapEntry struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value github_com_cosmos_cosmos_sdk_types.Uint `protobuf:"bytes,2,opt,name=value,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Uint" json:"value"` +} + +func (m *UintMapEntry) Reset() { *m = UintMapEntry{} } +func (m *UintMapEntry) String() string { return proto.CompactTextString(m) } +func (*UintMapEntry) ProtoMessage() {} +func (*UintMapEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9c341e0de15f8b, []int{7} +} +func (m *UintMapEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UintMapEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UintMapEntry.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UintMapEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_UintMapEntry.Merge(m, src) +} +func (m *UintMapEntry) XXX_Size() int { + return m.Size() +} +func (m *UintMapEntry) XXX_DiscardUnknown() { + xxx_messageInfo_UintMapEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_UintMapEntry proto.InternalMessageInfo + +func (m *UintMapEntry) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + // Egress is the format for a swingset egress. type Egress struct { Nickname string `protobuf:"bytes,1,opt,name=nickname,proto3" json:"nickname" yaml:"nickname"` @@ -445,7 +510,7 @@ func (m *Egress) Reset() { *m = Egress{} } func (m *Egress) String() string { return proto.CompactTextString(m) } func (*Egress) ProtoMessage() {} func (*Egress) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9c341e0de15f8b, []int{7} + return fileDescriptor_ff9c341e0de15f8b, []int{8} } func (m *Egress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -508,7 +573,7 @@ func (m *SwingStoreArtifact) Reset() { *m = SwingStoreArtifact{} } func (m *SwingStoreArtifact) String() string { return proto.CompactTextString(m) } func (*SwingStoreArtifact) ProtoMessage() {} func (*SwingStoreArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9c341e0de15f8b, []int{8} + return fileDescriptor_ff9c341e0de15f8b, []int{9} } func (m *SwingStoreArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -559,6 +624,7 @@ func init() { proto.RegisterType((*StringBeans)(nil), "agoric.swingset.StringBeans") proto.RegisterType((*PowerFlagFee)(nil), "agoric.swingset.PowerFlagFee") proto.RegisterType((*QueueSize)(nil), "agoric.swingset.QueueSize") + proto.RegisterType((*UintMapEntry)(nil), "agoric.swingset.UintMapEntry") proto.RegisterType((*Egress)(nil), "agoric.swingset.Egress") proto.RegisterType((*SwingStoreArtifact)(nil), "agoric.swingset.SwingStoreArtifact") } @@ -566,60 +632,64 @@ func init() { func init() { proto.RegisterFile("agoric/swingset/swingset.proto", fileDescriptor_ff9c341e0de15f8b) } var fileDescriptor_ff9c341e0de15f8b = []byte{ - // 842 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0x49, 0x52, 0x9a, 0x97, 0x6c, 0xbb, 0x0c, 0x95, 0x36, 0x54, 0x6c, 0xa6, 0xf2, 0x85, - 0x4a, 0xab, 0x8d, 0xb7, 0x20, 0x84, 0x94, 0x15, 0x87, 0xb8, 0xea, 0x6a, 0x25, 0x04, 0x0a, 0x8e, - 0xca, 0x01, 0x81, 0xac, 0x89, 0x33, 0x31, 0xd3, 0x3a, 0x1e, 0xef, 0xcc, 0xf4, 0xd7, 0xfe, 0x03, - 0x70, 0x41, 0x42, 0x9c, 0x38, 0xf6, 0xcc, 0x5f, 0xb2, 0xc7, 0x3d, 0x22, 0x0e, 0x06, 0xb5, 0x17, - 0xd4, 0x63, 0x8e, 0x48, 0x48, 0x68, 0x66, 0x1c, 0xc7, 0xa2, 0x48, 0xf4, 0xc2, 0x29, 0xf3, 0x7e, - 0x7d, 0xef, 0x7d, 0xdf, 0x1b, 0x4f, 0xa0, 0x47, 0x62, 0x2e, 0x58, 0xe4, 0xc9, 0x33, 0x96, 0xc6, - 0x92, 0xaa, 0xf2, 0xd0, 0xcf, 0x04, 0x57, 0x1c, 0x6d, 0xda, 0x78, 0x7f, 0xe9, 0xde, 0xde, 0x8a, - 0x79, 0xcc, 0x4d, 0xcc, 0xd3, 0x27, 0x9b, 0xb6, 0xdd, 0x8b, 0xb8, 0x9c, 0x73, 0xe9, 0x4d, 0x88, - 0xa4, 0xde, 0xe9, 0xde, 0x84, 0x2a, 0xb2, 0xe7, 0x45, 0x9c, 0xa5, 0x36, 0xee, 0x7e, 0xeb, 0xc0, - 0xfd, 0x7d, 0x2e, 0xe8, 0xc1, 0x29, 0x49, 0x46, 0x82, 0x67, 0x5c, 0x92, 0x04, 0x6d, 0x41, 0x53, - 0x31, 0x95, 0xd0, 0xae, 0xb3, 0xe3, 0xec, 0xb6, 0x02, 0x6b, 0xa0, 0x1d, 0x68, 0x4f, 0xa9, 0x8c, - 0x04, 0xcb, 0x14, 0xe3, 0x69, 0xf7, 0x0d, 0x13, 0xab, 0xba, 0xd0, 0x87, 0xd0, 0xa4, 0xa7, 0x24, - 0x91, 0xdd, 0xfa, 0x4e, 0x7d, 0xb7, 0xfd, 0xfe, 0x3b, 0xfd, 0x7f, 0xcc, 0xd8, 0x5f, 0x76, 0xf2, - 0x1b, 0xaf, 0x72, 0x5c, 0x0b, 0x6c, 0xf6, 0xa0, 0xf1, 0xdd, 0x25, 0xae, 0xb9, 0x12, 0xd6, 0x97, - 0x61, 0x34, 0x80, 0xce, 0x91, 0xe4, 0x69, 0x98, 0x51, 0x31, 0x67, 0x4a, 0xda, 0x39, 0xfc, 0x07, - 0x8b, 0x1c, 0xbf, 0x7d, 0x41, 0xe6, 0xc9, 0xc0, 0xad, 0x46, 0xdd, 0xa0, 0xad, 0xcd, 0x91, 0xb5, - 0xd0, 0x23, 0x78, 0xf3, 0x48, 0x86, 0x11, 0x9f, 0x52, 0x3b, 0xa2, 0x8f, 0x16, 0x39, 0xde, 0x58, - 0x96, 0x99, 0x80, 0x1b, 0xac, 0x1d, 0xc9, 0x7d, 0x7d, 0xf8, 0xbe, 0x0e, 0x6b, 0x23, 0x22, 0xc8, - 0x5c, 0xa2, 0xe7, 0xb0, 0x31, 0xa1, 0x24, 0x95, 0x1a, 0x36, 0x3c, 0x49, 0x99, 0xea, 0x3a, 0x86, - 0xc5, 0xbb, 0xb7, 0x58, 0x8c, 0x95, 0x60, 0x69, 0xec, 0xeb, 0xe4, 0x82, 0x48, 0xc7, 0x54, 0x8e, - 0xa8, 0x38, 0x4c, 0x99, 0x42, 0x2f, 0x60, 0x63, 0x46, 0xa9, 0xc1, 0x08, 0x33, 0xc1, 0x22, 0x3d, - 0x88, 0xd5, 0xc3, 0x2e, 0xa3, 0xaf, 0x97, 0xd1, 0x2f, 0x96, 0xd1, 0xdf, 0xe7, 0x2c, 0xf5, 0x9f, - 0x68, 0x98, 0x9f, 0x7f, 0xc3, 0xbb, 0x31, 0x53, 0xdf, 0x9c, 0x4c, 0xfa, 0x11, 0x9f, 0x7b, 0xc5, - 0xe6, 0xec, 0xcf, 0x63, 0x39, 0x3d, 0xf6, 0xd4, 0x45, 0x46, 0xa5, 0x29, 0x90, 0x41, 0x67, 0x46, - 0xa9, 0xee, 0x36, 0xd2, 0x0d, 0xd0, 0x13, 0xd8, 0x9a, 0x70, 0xae, 0xa4, 0x12, 0x24, 0x0b, 0x4f, - 0x89, 0x0a, 0x23, 0x9e, 0xce, 0x58, 0xdc, 0xad, 0x9b, 0x25, 0xa1, 0x32, 0xf6, 0x05, 0x51, 0xfb, - 0x26, 0x82, 0x3e, 0x81, 0xcd, 0x8c, 0x9f, 0x51, 0x11, 0xce, 0x12, 0x12, 0x87, 0x33, 0x4a, 0x65, - 0xb7, 0x61, 0xa6, 0x7c, 0x78, 0x8b, 0xef, 0x48, 0xe7, 0x3d, 0x4b, 0x48, 0xfc, 0x8c, 0xd2, 0x82, - 0xf0, 0xbd, 0xac, 0xe2, 0x93, 0xe8, 0x63, 0x68, 0xbd, 0x38, 0xa1, 0x27, 0x34, 0x9c, 0x93, 0xf3, - 0x6e, 0xd3, 0xc0, 0x6c, 0xdf, 0x82, 0xf9, 0x5c, 0x67, 0x8c, 0xd9, 0xcb, 0x25, 0xc6, 0xba, 0x29, - 0xf9, 0x94, 0x9c, 0x0f, 0xd6, 0x7f, 0xba, 0xc4, 0xb5, 0x3f, 0x2e, 0xb1, 0xe3, 0x7e, 0x06, 0xcd, - 0xb1, 0x22, 0x8a, 0xa2, 0x03, 0xb8, 0x67, 0x11, 0x49, 0x92, 0xf0, 0x33, 0x3a, 0x2d, 0x96, 0xf1, - 0xdf, 0xa8, 0x1d, 0x53, 0x36, 0xb4, 0x55, 0x6e, 0x02, 0xed, 0xca, 0xb6, 0xd0, 0x7d, 0xa8, 0x1f, - 0xd3, 0x8b, 0xe2, 0x5a, 0xeb, 0x23, 0x3a, 0x80, 0xa6, 0xd9, 0x5d, 0x71, 0x57, 0x3c, 0x8d, 0xf1, - 0x6b, 0x8e, 0xdf, 0xbb, 0xc3, 0x1e, 0x0e, 0x59, 0xaa, 0x02, 0x5b, 0x3d, 0x68, 0x98, 0xe9, 0x7f, - 0x74, 0xa0, 0x53, 0x15, 0x0b, 0x3d, 0x04, 0x58, 0x89, 0x5c, 0xb4, 0x6d, 0x95, 0xd2, 0xa1, 0xaf, - 0xa1, 0x3e, 0xa3, 0xff, 0xcb, 0xed, 0xd0, 0xb8, 0xc5, 0x50, 0x1f, 0x41, 0xab, 0xd4, 0xe8, 0x5f, - 0x04, 0x40, 0xd0, 0x90, 0xec, 0xa5, 0xfd, 0x56, 0x9a, 0x81, 0x39, 0x17, 0x85, 0x7f, 0x39, 0xb0, - 0x76, 0x10, 0x0b, 0x2a, 0x25, 0x7a, 0x0a, 0xeb, 0x29, 0x8b, 0x8e, 0x53, 0x32, 0x2f, 0xde, 0x04, - 0x1f, 0xdf, 0xe4, 0xb8, 0xf4, 0x2d, 0x72, 0xbc, 0x69, 0x3f, 0xb0, 0xa5, 0xc7, 0x0d, 0xca, 0x20, - 0xfa, 0x0a, 0x1a, 0x19, 0xa5, 0xc2, 0x74, 0xe8, 0xf8, 0xcf, 0x6f, 0x72, 0x6c, 0xec, 0x45, 0x8e, - 0xdb, 0xb6, 0x48, 0x5b, 0xee, 0x9f, 0x39, 0x7e, 0x7c, 0x07, 0x7a, 0xc3, 0x28, 0x1a, 0x4e, 0xa7, - 0x7a, 0xa8, 0xc0, 0xa0, 0xa0, 0x00, 0xda, 0x2b, 0x89, 0xed, 0xcb, 0xd3, 0xf2, 0xf7, 0xae, 0x72, - 0x0c, 0xe5, 0x26, 0xe4, 0x4d, 0x8e, 0xa1, 0x54, 0x5d, 0x2e, 0x72, 0xfc, 0x56, 0xd1, 0xb8, 0xf4, - 0xb9, 0x41, 0x25, 0xc1, 0xf0, 0xaf, 0xb9, 0x0a, 0xd0, 0x58, 0xdf, 0xb2, 0xb1, 0xe2, 0x82, 0x0e, - 0x85, 0x62, 0x33, 0x12, 0x29, 0xf4, 0x08, 0x1a, 0x15, 0x19, 0x1e, 0x68, 0x36, 0x85, 0x04, 0x05, - 0x1b, 0x4b, 0xdf, 0x38, 0x75, 0xf2, 0x94, 0x28, 0x52, 0x50, 0x37, 0xc9, 0xda, 0x5e, 0x25, 0x6b, - 0xcb, 0x0d, 0x8c, 0xd3, 0x76, 0xf5, 0x0f, 0x5f, 0x5d, 0xf5, 0x9c, 0xd7, 0x57, 0x3d, 0xe7, 0xf7, - 0xab, 0x9e, 0xf3, 0xc3, 0x75, 0xaf, 0xf6, 0xfa, 0xba, 0x57, 0xfb, 0xe5, 0xba, 0x57, 0xfb, 0xf2, - 0x69, 0x45, 0x9e, 0xa1, 0xfd, 0x73, 0xb0, 0x1f, 0x83, 0x91, 0x27, 0xe6, 0x09, 0x49, 0xe3, 0xa5, - 0x6e, 0xe7, 0xab, 0xff, 0x0d, 0xa3, 0xdb, 0x64, 0xcd, 0x3c, 0xf7, 0x1f, 0xfc, 0x1d, 0x00, 0x00, - 0xff, 0xff, 0xee, 0x34, 0x5f, 0xf6, 0x57, 0x06, 0x00, 0x00, + // 897 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0x4d, 0x6f, 0xe3, 0x44, + 0x18, 0x8e, 0xc9, 0x07, 0xcd, 0x9b, 0x6c, 0x5b, 0x86, 0x4a, 0x1b, 0x2a, 0x36, 0xae, 0x7c, 0xa1, + 0xd2, 0x6a, 0x93, 0x2d, 0x08, 0x21, 0x65, 0xc5, 0x21, 0x8e, 0xb2, 0x5a, 0x09, 0x2d, 0xca, 0x3a, + 0x2a, 0x07, 0x04, 0xb2, 0x26, 0xce, 0xc4, 0x4c, 0xeb, 0x78, 0xbc, 0x9e, 0x49, 0xda, 0xee, 0x1f, + 0x80, 0x23, 0xe2, 0xc4, 0xb1, 0x67, 0x7e, 0xc9, 0x1e, 0xf7, 0x88, 0x38, 0x98, 0x55, 0x7b, 0x41, + 0x3d, 0xe6, 0x88, 0x84, 0x84, 0xe6, 0x23, 0xae, 0x45, 0x17, 0x51, 0x21, 0xed, 0xc9, 0xf3, 0x7e, + 0x3f, 0xef, 0xf3, 0x8c, 0x6d, 0x68, 0xe3, 0x90, 0xa5, 0x34, 0xe8, 0xf2, 0x13, 0x1a, 0x87, 0x9c, + 0x88, 0xfc, 0xd0, 0x49, 0x52, 0x26, 0x18, 0xda, 0xd2, 0xf1, 0xce, 0xda, 0xbd, 0xbb, 0x13, 0xb2, + 0x90, 0xa9, 0x58, 0x57, 0x9e, 0x74, 0xda, 0x6e, 0x3b, 0x60, 0x7c, 0xce, 0x78, 0x77, 0x82, 0x39, + 0xe9, 0x2e, 0x0f, 0x26, 0x44, 0xe0, 0x83, 0x6e, 0xc0, 0x68, 0xac, 0xe3, 0xce, 0xf7, 0x16, 0x6c, + 0x0f, 0x58, 0x4a, 0x86, 0x4b, 0x1c, 0x8d, 0x52, 0x96, 0x30, 0x8e, 0x23, 0xb4, 0x03, 0x55, 0x41, + 0x45, 0x44, 0x5a, 0xd6, 0x9e, 0xb5, 0x5f, 0xf7, 0xb4, 0x81, 0xf6, 0xa0, 0x31, 0x25, 0x3c, 0x48, + 0x69, 0x22, 0x28, 0x8b, 0x5b, 0xef, 0xa8, 0x58, 0xd1, 0x85, 0x3e, 0x85, 0x2a, 0x59, 0xe2, 0x88, + 0xb7, 0xca, 0x7b, 0xe5, 0xfd, 0xc6, 0xc7, 0x1f, 0x74, 0xfe, 0x81, 0xb1, 0xb3, 0x9e, 0xe4, 0x56, + 0x5e, 0x66, 0x76, 0xc9, 0xd3, 0xd9, 0xbd, 0xca, 0x0f, 0xe7, 0x76, 0xc9, 0xe1, 0xb0, 0xb1, 0x0e, + 0xa3, 0x1e, 0x34, 0x8f, 0x38, 0x8b, 0xfd, 0x84, 0xa4, 0x73, 0x2a, 0xb8, 0xc6, 0xe1, 0xde, 0x5d, + 0x65, 0xf6, 0xfb, 0x67, 0x78, 0x1e, 0xf5, 0x9c, 0x62, 0xd4, 0xf1, 0x1a, 0xd2, 0x1c, 0x69, 0x0b, + 0xdd, 0x87, 0x77, 0x8f, 0xb8, 0x1f, 0xb0, 0x29, 0xd1, 0x10, 0x5d, 0xb4, 0xca, 0xec, 0xcd, 0x75, + 0x99, 0x0a, 0x38, 0x5e, 0xed, 0x88, 0x0f, 0xe4, 0xe1, 0x75, 0x19, 0x6a, 0x23, 0x9c, 0xe2, 0x39, + 0x47, 0x4f, 0x60, 0x73, 0x42, 0x70, 0xcc, 0x65, 0x5b, 0x7f, 0x11, 0x53, 0xd1, 0xb2, 0xd4, 0x16, + 0x1f, 0xde, 0xd8, 0x62, 0x2c, 0x52, 0x1a, 0x87, 0xae, 0x4c, 0x36, 0x8b, 0x34, 0x55, 0xe5, 0x88, + 0xa4, 0x87, 0x31, 0x15, 0xe8, 0x39, 0x6c, 0xce, 0x08, 0x51, 0x3d, 0xfc, 0x24, 0xa5, 0x81, 0x04, + 0xa2, 0xf9, 0xd0, 0x62, 0x74, 0xa4, 0x18, 0x1d, 0x23, 0x46, 0x67, 0xc0, 0x68, 0xec, 0x3e, 0x94, + 0x6d, 0x7e, 0xf9, 0xdd, 0xde, 0x0f, 0xa9, 0xf8, 0x6e, 0x31, 0xe9, 0x04, 0x6c, 0xde, 0x35, 0xca, + 0xe9, 0xc7, 0x03, 0x3e, 0x3d, 0xee, 0x8a, 0xb3, 0x84, 0x70, 0x55, 0xc0, 0xbd, 0xe6, 0x8c, 0x10, + 0x39, 0x6d, 0x24, 0x07, 0xa0, 0x87, 0xb0, 0x33, 0x61, 0x4c, 0x70, 0x91, 0xe2, 0xc4, 0x5f, 0x62, + 0xe1, 0x07, 0x2c, 0x9e, 0xd1, 0xb0, 0x55, 0x56, 0x22, 0xa1, 0x3c, 0xf6, 0x15, 0x16, 0x03, 0x15, + 0x41, 0x5f, 0xc0, 0x56, 0xc2, 0x4e, 0x48, 0xea, 0xcf, 0x22, 0x1c, 0xfa, 0x33, 0x42, 0x78, 0xab, + 0xa2, 0x50, 0xde, 0xbb, 0xb1, 0xef, 0x48, 0xe6, 0x3d, 0x8e, 0x70, 0xf8, 0x98, 0x10, 0xb3, 0xf0, + 0x9d, 0xa4, 0xe0, 0xe3, 0xe8, 0x73, 0xa8, 0x3f, 0x5f, 0x90, 0x05, 0xf1, 0xe7, 0xf8, 0xb4, 0x55, + 0x55, 0x6d, 0x76, 0x6f, 0xb4, 0x79, 0x26, 0x33, 0xc6, 0xf4, 0xc5, 0xba, 0xc7, 0x86, 0x2a, 0x79, + 0x8a, 0x4f, 0xd1, 0x33, 0x40, 0x0a, 0x73, 0x44, 0x70, 0xbc, 0x48, 0xfc, 0xc9, 0x62, 0x1a, 0x12, + 0xd1, 0xaa, 0xfd, 0x0b, 0x9c, 0x43, 0x1a, 0x8b, 0xa7, 0x38, 0x19, 0xc6, 0x22, 0x3d, 0x33, 0xad, + 0xb6, 0x97, 0x58, 0x0c, 0x74, 0xb5, 0xab, 0x8a, 0x7b, 0x1b, 0x3f, 0x9f, 0xdb, 0xa5, 0x3f, 0xce, + 0x6d, 0xcb, 0xf9, 0x12, 0xaa, 0x63, 0x81, 0x05, 0x41, 0x43, 0xb8, 0xa3, 0x41, 0xe2, 0x28, 0x62, + 0x27, 0x64, 0x6a, 0xf4, 0xfd, 0x6f, 0xa0, 0x4d, 0x55, 0xd6, 0xd7, 0x55, 0x4e, 0x04, 0x8d, 0xc2, + 0x05, 0x40, 0xdb, 0x50, 0x3e, 0x26, 0x67, 0xe6, 0x4d, 0x91, 0x47, 0x34, 0x84, 0xaa, 0xba, 0x0e, + 0xe6, 0xfa, 0x75, 0x65, 0x8f, 0xdf, 0x32, 0xfb, 0xa3, 0x5b, 0x48, 0x2b, 0x57, 0xf3, 0x74, 0x75, + 0xaf, 0xa2, 0xd0, 0xff, 0x64, 0x41, 0xb3, 0xc8, 0x3f, 0xba, 0x07, 0x70, 0xad, 0x9b, 0x19, 0x5b, + 0xcf, 0xd5, 0x40, 0xdf, 0x42, 0x79, 0x46, 0xde, 0xca, 0x85, 0x93, 0x7d, 0x0d, 0xa8, 0xcf, 0xa0, + 0x9e, 0x73, 0xf4, 0x06, 0x02, 0x10, 0x54, 0x38, 0x7d, 0xa1, 0x5f, 0xbf, 0xaa, 0xa7, 0xce, 0xa6, + 0x70, 0x0e, 0xcd, 0xa2, 0x7a, 0x6f, 0x26, 0x6f, 0x89, 0xa3, 0x05, 0xf9, 0xdf, 0xe4, 0xa9, 0x6a, + 0x33, 0xee, 0x2f, 0x0b, 0x6a, 0xc3, 0x30, 0x25, 0x9c, 0xa3, 0x47, 0xb0, 0x11, 0xd3, 0xe0, 0x38, + 0xc6, 0x73, 0xf3, 0x55, 0x73, 0xed, 0xab, 0xcc, 0xce, 0x7d, 0xab, 0xcc, 0xde, 0xd2, 0x9f, 0x88, + 0xb5, 0xc7, 0xf1, 0xf2, 0x20, 0xfa, 0x06, 0x2a, 0x09, 0x21, 0xa9, 0xc2, 0xd4, 0x74, 0x9f, 0x5c, + 0x65, 0xb6, 0xb2, 0x57, 0x99, 0xdd, 0xd0, 0x45, 0xd2, 0x72, 0xfe, 0xcc, 0xec, 0x07, 0xb7, 0x80, + 0xd9, 0x0f, 0x82, 0xfe, 0x74, 0x2a, 0x41, 0x79, 0xaa, 0x0b, 0xf2, 0xa0, 0x71, 0xad, 0xa8, 0xfe, + 0x76, 0xd6, 0xdd, 0x83, 0x8b, 0xcc, 0x86, 0x5c, 0x78, 0x7e, 0x95, 0xd9, 0x90, 0x8b, 0xcc, 0x57, + 0x99, 0xfd, 0x9e, 0x19, 0x9c, 0xfb, 0x1c, 0xaf, 0x90, 0xa0, 0xf6, 0x2f, 0x39, 0x02, 0xd0, 0x58, + 0x5e, 0xea, 0xb1, 0x60, 0x29, 0xe9, 0xa7, 0x82, 0xce, 0x70, 0x20, 0xd0, 0x7d, 0xa8, 0x14, 0x68, + 0xb8, 0x2b, 0xb7, 0x31, 0x14, 0x98, 0x6d, 0xf4, 0xfa, 0xca, 0x29, 0x93, 0xa7, 0x58, 0x60, 0xb3, + 0xba, 0x4a, 0x96, 0xf6, 0x75, 0xb2, 0xb4, 0x1c, 0x4f, 0x39, 0xf5, 0x54, 0xf7, 0xf0, 0xe5, 0x45, + 0xdb, 0x7a, 0x75, 0xd1, 0xb6, 0x5e, 0x5f, 0xb4, 0xad, 0x1f, 0x2f, 0xdb, 0xa5, 0x57, 0x97, 0xed, + 0xd2, 0xaf, 0x97, 0xed, 0xd2, 0xd7, 0x8f, 0x0a, 0xf4, 0xf4, 0xf5, 0xef, 0x4d, 0xbf, 0x7b, 0x8a, + 0x9e, 0x90, 0x45, 0x38, 0x0e, 0xd7, 0xbc, 0x9d, 0x5e, 0xff, 0xf9, 0x14, 0x6f, 0x93, 0x9a, 0xfa, + 0x61, 0x7d, 0xf2, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xec, 0x66, 0x1a, 0x0f, 0x19, 0x07, 0x00, + 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -676,6 +746,14 @@ func (this *Params) Equal(that interface{}) bool { return false } } + if len(this.VatCleanupBudget) != len(that1.VatCleanupBudget) { + return false + } + for i := range this.VatCleanupBudget { + if !this.VatCleanupBudget[i].Equal(&that1.VatCleanupBudget[i]) { + return false + } + } return true } func (this *StringBeans) Equal(that interface{}) bool { @@ -764,6 +842,33 @@ func (this *QueueSize) Equal(that interface{}) bool { } return true } +func (this *UintMapEntry) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UintMapEntry) + if !ok { + that2, ok := that.(UintMapEntry) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Key != that1.Key { + return false + } + if !this.Value.Equal(that1.Value) { + return false + } + return true +} func (m *CoreEvalProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -872,6 +977,20 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.VatCleanupBudget) > 0 { + for iNdEx := len(m.VatCleanupBudget) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.VatCleanupBudget[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSwingset(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } if len(m.QueueMax) > 0 { for iNdEx := len(m.QueueMax) - 1; iNdEx >= 0; iNdEx-- { { @@ -1094,6 +1213,46 @@ func (m *QueueSize) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *UintMapEntry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UintMapEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UintMapEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintSwingset(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintSwingset(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Egress) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1262,6 +1421,12 @@ func (m *Params) Size() (n int) { n += 1 + l + sovSwingset(uint64(l)) } } + if len(m.VatCleanupBudget) > 0 { + for _, e := range m.VatCleanupBudget { + l = e.Size() + n += 1 + l + sovSwingset(uint64(l)) + } + } return n } @@ -1330,6 +1495,21 @@ func (m *QueueSize) Size() (n int) { return n } +func (m *UintMapEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovSwingset(uint64(l)) + } + l = m.Value.Size() + n += 1 + l + sovSwingset(uint64(l)) + return n +} + func (m *Egress) Size() (n int) { if m == nil { return 0 @@ -1835,6 +2015,40 @@ func (m *Params) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VatCleanupBudget", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSwingset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSwingset + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSwingset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VatCleanupBudget = append(m.VatCleanupBudget, UintMapEntry{}) + if err := m.VatCleanupBudget[len(m.VatCleanupBudget)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSwingset(dAtA[iNdEx:]) @@ -2273,6 +2487,122 @@ func (m *QueueSize) Unmarshal(dAtA []byte) error { } return nil } +func (m *UintMapEntry) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSwingset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UintMapEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UintMapEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSwingset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSwingset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSwingset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSwingset + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSwingset + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSwingset + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSwingset(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSwingset + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Egress) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/golang/cosmos/x/vbank/README.md b/golang/cosmos/x/vbank/README.md index 99aaee4d233..24e8ee2631b 100644 --- a/golang/cosmos/x/vbank/README.md +++ b/golang/cosmos/x/vbank/README.md @@ -13,6 +13,11 @@ entirely at the ERTP level. - `feeCollectorName`: the module which handles fee distribution to stakers. - `reward_epoch_duration_blocks`: the duration (in blocks) over which fees should be given to the fee collector. +- `per_epoch_reward_fraction`: a decimal of how much of the `GiveawayPool` is paid as validator rewards per epoch +- `allowed_monitoring_accounts`: an array of account addresses that can be + monitored for sends and receives, defaulting to + `[authtypes.NewModuleAddress(types.ProvisionPoolName)]`. An element of `"*"` + will permit any address. ## State @@ -22,7 +27,7 @@ The Vbank module maintains no significant state, but will access stored state th Purse operations which change the balance result in a downcall to this module to update the underlying account. A downcall is also made to query the account balance. -Upon an `EndBlock()` call, the module will scan the block for all `MsgSend` and `MsgMultiSend` events (see `cosmos-sdk/x/bank/spec/04_events.md`) and perform a `VBANK_BALANCE_UPDATE` upcall for all denominations held in *only the mentioned module accounts*. +Upon an `EndBlock()` call, the module will scan the block for all `MsgSend` and `MsgMultiSend` events (see `cosmos-sdk/x/bank/spec/04_events.md`) and perform a `VBANK_BALANCE_UPDATE` upcall for all denominations held in *only in the allowed_monitoring_accounts*. The following fields are common to the Vbank messages: - `"address"`, `"recipient"`, `"sender"`: account address as a bech32-encoded string diff --git a/golang/cosmos/x/vbank/keeper/keeper.go b/golang/cosmos/x/vbank/keeper/keeper.go index 6cdfb877674..4e2932d8bfd 100644 --- a/golang/cosmos/x/vbank/keeper/keeper.go +++ b/golang/cosmos/x/vbank/keeper/keeper.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/Agoric/agoric-sdk/golang/cosmos/x/vbank/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" vm "github.com/Agoric/agoric-sdk/golang/cosmos/vm" @@ -88,17 +87,13 @@ func (k Keeper) GetModuleAccountAddress(ctx sdk.Context, name string) sdk.AccAdd return acct.GetAddress() } -func (k Keeper) IsModuleAccount(ctx sdk.Context, addr sdk.AccAddress) bool { - acc := k.accountKeeper.GetAccount(ctx, addr) - if acc == nil { - return false - } - _, ok := acc.(authtypes.ModuleAccountI) - return ok +func (k Keeper) IsAllowedMonitoringAccount(ctx sdk.Context, addr sdk.AccAddress) bool { + params := k.GetParams(ctx) + return params.IsAllowedMonitoringAccount(addr.String()) } func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramSpace.GetParamSet(ctx, ¶ms) + k.paramSpace.GetParamSetIfExists(ctx, ¶ms) return params } diff --git a/golang/cosmos/x/vbank/keeper/migrations.go b/golang/cosmos/x/vbank/keeper/migrations.go new file mode 100644 index 00000000000..360d691bd61 --- /dev/null +++ b/golang/cosmos/x/vbank/keeper/migrations.go @@ -0,0 +1,30 @@ +package keeper + +import ( + "github.com/Agoric/agoric-sdk/golang/cosmos/x/vbank/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Migrator handles in-place store migrations. +type Migrator struct { + keeper Keeper +} + +// NewMigrator creates a new Migrator based on the keeper. +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} + +// Migrate1to2 migrates from version 1 to 2. +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + params := m.keeper.GetParams(ctx) + if params.AllowedMonitoringAccounts != nil { + return nil + } + + defaultParams := types.DefaultParams() + params.AllowedMonitoringAccounts = defaultParams.AllowedMonitoringAccounts + m.keeper.SetParams(ctx, params) + + return nil +} diff --git a/golang/cosmos/x/vbank/module.go b/golang/cosmos/x/vbank/module.go index 812b474eb86..0d755d6a60b 100644 --- a/golang/cosmos/x/vbank/module.go +++ b/golang/cosmos/x/vbank/module.go @@ -91,7 +91,7 @@ func (AppModule) Name() string { return ModuleName } -func (AppModule) ConsensusVersion() uint64 { return 1 } +func (AppModule) ConsensusVersion() uint64 { return 2 } // BeginBlock implements the AppModule interface func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { @@ -157,7 +157,7 @@ NextEvent: addressToUpdate = make(map[string]sdk.Coins, len(addressToUpdate)) for addr, denoms := range unfilteredAddresses { accAddr, err := sdk.AccAddressFromBech32(addr) - if err == nil && am.keeper.IsModuleAccount(ctx, accAddr) { + if err == nil && am.keeper.IsAllowedMonitoringAccount(ctx, accAddr) { // Pass through the module account. addressToUpdate[addr] = denoms } @@ -204,6 +204,12 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { tx := &types.UnimplementedMsgServer{} types.RegisterMsgServer(cfg.MsgServer(), tx) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + + m := keeper.NewMigrator(am.keeper) + err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + if err != nil { + panic(err) + } } // InitGenesis performs genesis initialization for the ibc-transfer module. It returns diff --git a/golang/cosmos/x/vbank/types/params.go b/golang/cosmos/x/vbank/types/params.go index 82398e9948d..010f8c954c1 100644 --- a/golang/cosmos/x/vbank/types/params.go +++ b/golang/cosmos/x/vbank/types/params.go @@ -6,14 +6,18 @@ import ( yaml "gopkg.in/yaml.v2" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) +const AllowAllMonitoringAccountsPattern = "*" + // Parameter keys var ( ParamStoreKeyRewardEpochDurationBlocks = []byte("reward_epoch_duration_blocks") ParamStoreKeyRewardSmoothingBlocks = []byte("reward_smoothing_blocks") ParamStoreKeyPerEpochRewardFraction = []byte("per_epoch_reward_fraction") + ParamStoreKeyAllowedMonitoringAccounts = []byte("allowed_monitoring_accounts") ) // ParamKeyTable returns the parameter key table. @@ -21,12 +25,14 @@ func ParamKeyTable() paramtypes.KeyTable { return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) } -// DefaultParams returns default distribution parameters +// DefaultParams returns default parameters func DefaultParams() Params { + provisionAddress := authtypes.NewModuleAddress(ProvisionPoolName) return Params{ RewardEpochDurationBlocks: 0, RewardSmoothingBlocks: 1, PerEpochRewardFraction: sdk.OneDec(), + AllowedMonitoringAccounts: []string{provisionAddress.String()}, } } @@ -67,12 +73,27 @@ func (p Params) RewardRate(pool sdk.Coins, blocks int64) sdk.Coins { return sdk.NewCoins(coins...) } +// IsAllowedMonitoringAccount checks to see if a given address is allowed to monitor its balance. +func (p Params) IsAllowedMonitoringAccount(addr string) bool { + for _, pat := range p.AllowedMonitoringAccounts { + switch pat { + case AllowAllMonitoringAccountsPattern, addr: + // Got an AllowAll pattern or an exact match. + return true + } + } + + // No match found. + return false +} + // ParamSetPairs returns the parameter set pairs. func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { return paramtypes.ParamSetPairs{ paramtypes.NewParamSetPair(ParamStoreKeyRewardEpochDurationBlocks, &p.RewardEpochDurationBlocks, validateRewardEpochDurationBlocks), paramtypes.NewParamSetPair(ParamStoreKeyRewardSmoothingBlocks, &p.RewardSmoothingBlocks, validateRewardSmoothingBlocks), paramtypes.NewParamSetPair(ParamStoreKeyPerEpochRewardFraction, &p.PerEpochRewardFraction, validatePerEpochRewardFraction), + paramtypes.NewParamSetPair(ParamStoreKeyAllowedMonitoringAccounts, &p.AllowedMonitoringAccounts, validateAllowedMonitoringAccounts), } } @@ -84,7 +105,12 @@ func (p Params) ValidateBasic() error { if err := validatePerEpochRewardFraction(p.PerEpochRewardFraction); err != nil { return err } - + if err := validateRewardSmoothingBlocks(p.RewardSmoothingBlocks); err != nil { + return err + } + if err := validateAllowedMonitoringAccounts(p.AllowedMonitoringAccounts); err != nil { + return err + } return nil } @@ -130,3 +156,18 @@ func validatePerEpochRewardFraction(i interface{}) error { return nil } + +func validateAllowedMonitoringAccounts(i interface{}) error { + v, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + for a, acc := range v { + if acc == "" { + return fmt.Errorf("allowed monitoring accounts element[%d] cannot be empty", a) + } + } + + return nil +} diff --git a/golang/cosmos/x/vbank/types/vbank.pb.go b/golang/cosmos/x/vbank/types/vbank.pb.go index 1b1e8b5d947..7c690f3dd8f 100644 --- a/golang/cosmos/x/vbank/types/vbank.pb.go +++ b/golang/cosmos/x/vbank/types/vbank.pb.go @@ -39,6 +39,10 @@ type Params struct { // an epoch's rewards. If zero, use the same value as // reward_epoch_duration_blocks. RewardSmoothingBlocks int64 `protobuf:"varint,3,opt,name=reward_smoothing_blocks,json=rewardSmoothingBlocks,proto3" json:"reward_smoothing_blocks,omitempty" yaml:"reward_smoothing_blocks"` + // allowed_monitoring_accounts is an array of account addresses that can be + // monitored for sends and receives. An element of `"*"` will permit any + // address. + AllowedMonitoringAccounts []string `protobuf:"bytes,4,rep,name=allowed_monitoring_accounts,json=allowedMonitoringAccounts,proto3" json:"allowed_monitoring_accounts,omitempty" yaml:"allowed_monitoring_accounts"` } func (m *Params) Reset() { *m = Params{} } @@ -87,6 +91,13 @@ func (m *Params) GetRewardSmoothingBlocks() int64 { return 0 } +func (m *Params) GetAllowedMonitoringAccounts() []string { + if m != nil { + return m.AllowedMonitoringAccounts + } + return nil +} + // The current state of the module. type State struct { // rewardPool is the current balance of rewards in the module account. @@ -170,42 +181,45 @@ func init() { func init() { proto.RegisterFile("agoric/vbank/vbank.proto", fileDescriptor_5e89b3b9e5e671b4) } var fileDescriptor_5e89b3b9e5e671b4 = []byte{ - // 550 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x31, 0x6f, 0xd3, 0x40, - 0x14, 0xc7, 0x73, 0x49, 0xa8, 0xe0, 0x5a, 0x06, 0x4c, 0x01, 0x27, 0x20, 0x3b, 0x32, 0x02, 0xc2, - 0x80, 0xad, 0xc2, 0x82, 0x22, 0x31, 0xd4, 0x84, 0x8e, 0xa8, 0x72, 0x06, 0xa4, 0x2e, 0xd1, 0xd9, - 0x39, 0x1c, 0x2b, 0xb6, 0x9f, 0xb9, 0xbb, 0x14, 0xba, 0xf2, 0x09, 0x10, 0x13, 0x6c, 0x9d, 0xf9, - 0x24, 0x1d, 0x3b, 0x22, 0x24, 0x0c, 0x4a, 0x16, 0x16, 0x96, 0x7c, 0x02, 0xe4, 0xbb, 0x8b, 0x9a, - 0x20, 0x54, 0x60, 0x49, 0x7c, 0xfe, 0xbd, 0xf7, 0xfc, 0x7f, 0xff, 0x77, 0x0f, 0x9b, 0x24, 0x06, - 0x96, 0x44, 0xde, 0x61, 0x48, 0xf2, 0x89, 0xfa, 0x75, 0x0b, 0x06, 0x02, 0x8c, 0x2d, 0x45, 0x5c, - 0xf9, 0xae, 0xbd, 0x1d, 0x43, 0x0c, 0x12, 0x78, 0xd5, 0x93, 0x8a, 0x69, 0x5b, 0x11, 0xf0, 0x0c, - 0xb8, 0x17, 0x12, 0x4e, 0xbd, 0xc3, 0x9d, 0x90, 0x0a, 0xb2, 0xe3, 0x45, 0x90, 0xe4, 0x8a, 0x3b, - 0x3f, 0xeb, 0x78, 0x63, 0x9f, 0x30, 0x92, 0x71, 0x63, 0x8c, 0x6f, 0x31, 0xfa, 0x9a, 0xb0, 0xd1, - 0x90, 0x16, 0x10, 0x8d, 0x87, 0xa3, 0x29, 0x23, 0x22, 0x81, 0x7c, 0x18, 0xa6, 0x10, 0x4d, 0xb8, - 0x89, 0x3a, 0xa8, 0xdb, 0xf0, 0xef, 0x2d, 0x4a, 0xfb, 0xf6, 0x11, 0xc9, 0xd2, 0x9e, 0x73, 0x5e, - 0xb4, 0x13, 0xb4, 0x14, 0x7e, 0x56, 0xd1, 0xbe, 0x86, 0xbe, 0x64, 0xc6, 0x7b, 0x84, 0x5b, 0x05, - 0x65, 0x3a, 0x53, 0x97, 0x79, 0xc9, 0x48, 0x54, 0xc5, 0x98, 0xf5, 0x0e, 0xea, 0x5e, 0xf2, 0x5f, - 0x9c, 0x94, 0x76, 0xed, 0x4b, 0x69, 0xdf, 0x8d, 0x13, 0x31, 0x9e, 0x86, 0x6e, 0x04, 0x99, 0xa7, - 0x7b, 0x51, 0x7f, 0x0f, 0xf8, 0x68, 0xe2, 0x89, 0xa3, 0x82, 0x72, 0xb7, 0x4f, 0xa3, 0x45, 0x69, - 0xdf, 0x51, 0xaa, 0x46, 0x09, 0x8f, 0x18, 0x15, 0xf4, 0xcf, 0xd5, 0x9d, 0xe0, 0x7a, 0x41, 0x99, - 0x14, 0x15, 0x48, 0xb2, 0xa7, 0x81, 0x71, 0x80, 0x6f, 0xe8, 0x58, 0x9e, 0x01, 0x88, 0x71, 0x92, - 0xc7, 0xcb, 0xce, 0x1b, 0xb2, 0x73, 0x67, 0x51, 0xda, 0xd6, 0x5a, 0xe7, 0xbf, 0x07, 0x3a, 0xc1, - 0x35, 0x45, 0x06, 0x4b, 0xa0, 0x1a, 0xee, 0x5d, 0xfc, 0x70, 0x6c, 0xd7, 0x7e, 0x1c, 0xdb, 0xc8, - 0xf9, 0xda, 0xc0, 0x17, 0x06, 0x82, 0x08, 0x6a, 0xbc, 0x45, 0x78, 0x53, 0xd7, 0x29, 0x00, 0x52, - 0x13, 0x75, 0x1a, 0xdd, 0xcd, 0x87, 0x2d, 0x57, 0x75, 0xe7, 0x56, 0x03, 0x73, 0xf5, 0xc0, 0xdc, - 0xa7, 0x90, 0xe4, 0xfe, 0x5e, 0xe5, 0xc8, 0xa2, 0xb4, 0x8d, 0x35, 0x0d, 0x55, 0xae, 0xf3, 0xe9, - 0x9b, 0xdd, 0xfd, 0x07, 0x9f, 0xaa, 0x32, 0x3c, 0xc0, 0x2a, 0x73, 0x1f, 0x20, 0x35, 0x3e, 0x22, - 0x7c, 0x55, 0x17, 0x92, 0x2d, 0x0c, 0x49, 0x06, 0xd3, 0x5c, 0x98, 0xf5, 0xbf, 0x89, 0x79, 0xae, - 0xc5, 0xb4, 0xd7, 0xc4, 0xac, 0xd6, 0xf8, 0x3f, 0x51, 0x57, 0x54, 0x05, 0xe9, 0xd7, 0xae, 0xcc, - 0x37, 0x9e, 0xe0, 0xcb, 0x29, 0xe1, 0x62, 0xc8, 0xe9, 0xab, 0x29, 0xcd, 0x23, 0x2a, 0xc7, 0xd0, - 0xf4, 0xcd, 0x45, 0x69, 0x6f, 0xab, 0xaf, 0xae, 0x61, 0x27, 0xd8, 0xaa, 0xce, 0x03, 0x7d, 0x34, - 0x72, 0x6c, 0x49, 0xae, 0xa5, 0x8d, 0x12, 0x2e, 0x58, 0x12, 0x4e, 0xcf, 0xee, 0xa8, 0xd9, 0x94, - 0x63, 0xbd, 0x7f, 0x76, 0x75, 0xce, 0x8f, 0x77, 0x82, 0x9b, 0x55, 0x80, 0xba, 0x36, 0xfd, 0x15, - 0x2c, 0x45, 0xf7, 0x9a, 0xd5, 0x7c, 0xfd, 0xe0, 0x64, 0x66, 0xa1, 0xd3, 0x99, 0x85, 0xbe, 0xcf, - 0x2c, 0xf4, 0x6e, 0x6e, 0xd5, 0x4e, 0xe7, 0x56, 0xed, 0xf3, 0xdc, 0xaa, 0x1d, 0x3c, 0x5e, 0xf1, - 0x62, 0x57, 0xad, 0xb4, 0xda, 0x5f, 0xe9, 0x45, 0x0c, 0x29, 0xc9, 0xe3, 0xa5, 0x49, 0x6f, 0xf4, - 0xb6, 0x4b, 0x87, 0xc2, 0x0d, 0xb9, 0xaa, 0x8f, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x95, - 0x56, 0xb1, 0x0a, 0x04, 0x00, 0x00, + // 597 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x3f, 0x6f, 0xd3, 0x4e, + 0x18, 0xc7, 0xe3, 0x26, 0xbf, 0xea, 0xd7, 0x6b, 0x19, 0x30, 0x05, 0x9c, 0x16, 0xd9, 0xd1, 0x21, + 0x4a, 0x18, 0xb0, 0x55, 0x58, 0x50, 0x25, 0x86, 0x9a, 0xd2, 0x0d, 0x54, 0xb9, 0x03, 0x52, 0x97, + 0xe8, 0x7c, 0xb9, 0x3a, 0x56, 0x6d, 0x3f, 0xe1, 0xee, 0xd2, 0xd2, 0x95, 0x57, 0x80, 0x98, 0x60, + 0xeb, 0xcc, 0x2b, 0xe9, 0xd8, 0x05, 0x09, 0x21, 0x61, 0x50, 0xbb, 0x30, 0xe7, 0x15, 0xa0, 0xfb, + 0x53, 0xda, 0x20, 0x14, 0x60, 0x49, 0xe2, 0x7c, 0xbe, 0xcf, 0x93, 0xef, 0xf3, 0x27, 0x0f, 0xf2, + 0x48, 0x06, 0x3c, 0xa7, 0xd1, 0x7e, 0x4a, 0xaa, 0x3d, 0xf3, 0x1a, 0x0e, 0x39, 0x48, 0x70, 0x17, + 0x0c, 0x09, 0xf5, 0x77, 0x4b, 0x8b, 0x19, 0x64, 0xa0, 0x41, 0xa4, 0x3e, 0x19, 0xcd, 0x92, 0x4f, + 0x41, 0x94, 0x20, 0xa2, 0x94, 0x08, 0x16, 0xed, 0xaf, 0xa6, 0x4c, 0x92, 0xd5, 0x88, 0x42, 0x5e, + 0x19, 0x8e, 0x3f, 0x36, 0xd1, 0xec, 0x16, 0xe1, 0xa4, 0x14, 0xee, 0x00, 0xdd, 0xe2, 0xec, 0x80, + 0xf0, 0x7e, 0x8f, 0x0d, 0x81, 0x0e, 0x7a, 0xfd, 0x11, 0x27, 0x32, 0x87, 0xaa, 0x97, 0x16, 0x40, + 0xf7, 0x84, 0xe7, 0x74, 0x9c, 0x6e, 0x33, 0xbe, 0x3b, 0xae, 0x83, 0xdb, 0x87, 0xa4, 0x2c, 0xd6, + 0xf0, 0x34, 0x35, 0x4e, 0xda, 0x06, 0x3f, 0x55, 0x74, 0xc3, 0xc2, 0x58, 0x33, 0xf7, 0xad, 0x83, + 0xda, 0x43, 0xc6, 0x6d, 0xa4, 0x4d, 0xb3, 0xcb, 0x09, 0x55, 0x1a, 0x6f, 0xa6, 0xe3, 0x74, 0xe7, + 0xe2, 0x17, 0xc7, 0x75, 0xd0, 0xf8, 0x5c, 0x07, 0x2b, 0x59, 0x2e, 0x07, 0xa3, 0x34, 0xa4, 0x50, + 0x46, 0xb6, 0x16, 0xf3, 0x76, 0x5f, 0xf4, 0xf7, 0x22, 0x79, 0x38, 0x64, 0x22, 0xdc, 0x60, 0x74, + 0x5c, 0x07, 0x77, 0x8c, 0xab, 0x7e, 0x2e, 0x28, 0x67, 0x92, 0xfd, 0x3e, 0x3b, 0x4e, 0x6e, 0x0c, + 0x19, 0xd7, 0xa6, 0x12, 0x4d, 0x36, 0x2d, 0x70, 0x77, 0xd0, 0x4d, 0xab, 0x15, 0x25, 0x80, 0x1c, + 0xe4, 0x55, 0x76, 0x5e, 0x79, 0x53, 0x57, 0x8e, 0xc7, 0x75, 0xe0, 0x4f, 0x54, 0xfe, 0xab, 0x10, + 0x27, 0xd7, 0x0d, 0xd9, 0x3e, 0x07, 0xb6, 0xe0, 0x5d, 0xb4, 0x4c, 0x8a, 0x02, 0x0e, 0x58, 0xbf, + 0x57, 0x42, 0x95, 0x4b, 0xe0, 0x2a, 0x88, 0x50, 0x0a, 0xa3, 0x4a, 0x0a, 0xaf, 0xd5, 0x69, 0x76, + 0xe7, 0xe2, 0x95, 0x71, 0x1d, 0x60, 0x93, 0x7f, 0x8a, 0x18, 0x27, 0x6d, 0x4b, 0x9f, 0xfd, 0x84, + 0xeb, 0x96, 0xad, 0xfd, 0xff, 0xee, 0x28, 0x68, 0x7c, 0x3f, 0x0a, 0x1c, 0xfc, 0xa5, 0x89, 0xfe, + 0xdb, 0x96, 0x44, 0x32, 0xf7, 0xb5, 0x83, 0xe6, 0xad, 0xdf, 0x21, 0x40, 0xe1, 0x39, 0x9d, 0x66, + 0x77, 0xfe, 0x41, 0x3b, 0x34, 0x5d, 0x0c, 0xd5, 0x62, 0x84, 0x76, 0x31, 0xc2, 0x27, 0x90, 0x57, + 0xf1, 0xa6, 0xea, 0xfc, 0xb8, 0x0e, 0xdc, 0x89, 0x5a, 0x55, 0x2c, 0xfe, 0xf0, 0x35, 0xe8, 0xfe, + 0xc5, 0x3c, 0x54, 0x1a, 0x91, 0x20, 0x13, 0xb9, 0x05, 0x50, 0xb8, 0xef, 0x1d, 0x74, 0xcd, 0x26, + 0xd2, 0xad, 0xea, 0x91, 0x52, 0x39, 0xf6, 0x66, 0xfe, 0x64, 0xe6, 0xb9, 0x35, 0xb3, 0x34, 0x61, + 0xe6, 0x72, 0x8e, 0x7f, 0x33, 0x75, 0xd5, 0x64, 0xd0, 0x73, 0x59, 0xd7, 0xf1, 0xee, 0x63, 0x74, + 0xa5, 0x20, 0x42, 0xf6, 0x04, 0x7b, 0x39, 0x62, 0x15, 0x65, 0x7a, 0xdc, 0xad, 0xd8, 0x1b, 0xd7, + 0xc1, 0xa2, 0xf9, 0xd5, 0x09, 0x8c, 0x93, 0x05, 0xf5, 0xbc, 0x6d, 0x1f, 0xdd, 0x0a, 0xf9, 0x9a, + 0x5b, 0x6b, 0xfd, 0x5c, 0x48, 0x9e, 0xa7, 0xa3, 0x8b, 0xff, 0x82, 0xd7, 0xd2, 0xeb, 0x73, 0xef, + 0x62, 0x45, 0xa7, 0xeb, 0x71, 0xb2, 0xac, 0x04, 0x66, 0x3d, 0x37, 0x2e, 0x61, 0x6d, 0x7a, 0xad, + 0xa5, 0xe6, 0x1b, 0x27, 0xc7, 0xa7, 0xbe, 0x73, 0x72, 0xea, 0x3b, 0xdf, 0x4e, 0x7d, 0xe7, 0xcd, + 0x99, 0xdf, 0x38, 0x39, 0xf3, 0x1b, 0x9f, 0xce, 0xfc, 0xc6, 0xce, 0xa3, 0x4b, 0xbd, 0x58, 0x37, + 0xa7, 0xc3, 0xdc, 0x09, 0xdd, 0x8b, 0x0c, 0x0a, 0x52, 0x65, 0xe7, 0x4d, 0x7a, 0x65, 0xaf, 0x8a, + 0xee, 0x50, 0x3a, 0xab, 0x4f, 0xc2, 0xc3, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x60, 0x18, 0x80, + 0x8f, 0x72, 0x04, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -236,6 +250,14 @@ func (this *Params) Equal(that interface{}) bool { if this.RewardSmoothingBlocks != that1.RewardSmoothingBlocks { return false } + if len(this.AllowedMonitoringAccounts) != len(that1.AllowedMonitoringAccounts) { + return false + } + for i := range this.AllowedMonitoringAccounts { + if this.AllowedMonitoringAccounts[i] != that1.AllowedMonitoringAccounts[i] { + return false + } + } return true } func (this *State) Equal(that interface{}) bool { @@ -301,6 +323,15 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AllowedMonitoringAccounts) > 0 { + for iNdEx := len(m.AllowedMonitoringAccounts) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedMonitoringAccounts[iNdEx]) + copy(dAtA[i:], m.AllowedMonitoringAccounts[iNdEx]) + i = encodeVarintVbank(dAtA, i, uint64(len(m.AllowedMonitoringAccounts[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if m.RewardSmoothingBlocks != 0 { i = encodeVarintVbank(dAtA, i, uint64(m.RewardSmoothingBlocks)) i-- @@ -410,6 +441,12 @@ func (m *Params) Size() (n int) { if m.RewardSmoothingBlocks != 0 { n += 1 + sovVbank(uint64(m.RewardSmoothingBlocks)) } + if len(m.AllowedMonitoringAccounts) > 0 { + for _, s := range m.AllowedMonitoringAccounts { + l = len(s) + n += 1 + l + sovVbank(uint64(l)) + } + } return n } @@ -547,6 +584,38 @@ func (m *Params) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedMonitoringAccounts", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVbank + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthVbank + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthVbank + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedMonitoringAccounts = append(m.AllowedMonitoringAccounts, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipVbank(dAtA[iNdEx:]) diff --git a/golang/cosmos/x/vbank/vbank_test.go b/golang/cosmos/x/vbank/vbank_test.go index a308eada914..9a64b016e45 100644 --- a/golang/cosmos/x/vbank/vbank_test.go +++ b/golang/cosmos/x/vbank/vbank_test.go @@ -439,6 +439,7 @@ func Test_Receive_GiveToRewardDistributor(t *testing.T) { params := types.DefaultParams() params.RewardEpochDurationBlocks = 0 params.RewardSmoothingBlocks = tt.duration + params.AllowedMonitoringAccounts = []string{"*"} keeper.SetParams(ctx, params) keeper.SetState(ctx, types.State{RewardPool: tt.rewardPool}) @@ -524,7 +525,7 @@ func Test_EndBlock_Events(t *testing.T) { } keeper, ctx := makeTestKit(acct, bank) // Turn off rewards. - keeper.SetParams(ctx, types.Params{PerEpochRewardFraction: sdk.ZeroDec()}) + keeper.SetParams(ctx, types.Params{PerEpochRewardFraction: sdk.ZeroDec(), AllowedMonitoringAccounts: []string{"*"}}) msgsSent := []string{} keeper.PushAction = func(ctx sdk.Context, action vm.Action) error { bz, err := json.Marshal(action) @@ -804,15 +805,19 @@ func Test_Module_Account(t *testing.T) { } modAddr := sdk.MustAccAddressFromBech32(moduleBech32) - if !keeper.IsModuleAccount(ctx, modAddr) { - t.Errorf("got IsModuleAccount modAddr = false, want true") + if keeper.IsAllowedMonitoringAccount(ctx, modAddr) { + t.Errorf("got IsAllowedMonitoringAccount modAddr = true, want false") + } + provisionPool := authtypes.NewModuleAddress("vbank/provision") + if !keeper.IsAllowedMonitoringAccount(ctx, provisionPool) { + t.Errorf("got IsAllowedMonitoringAccount provisionPool = false, want true") } notModAddr := sdk.MustAccAddressFromBech32(addr1) - if keeper.IsModuleAccount(ctx, notModAddr) { - t.Errorf("got IsModuleAccount notModAddr = true, want false") + if keeper.IsAllowedMonitoringAccount(ctx, notModAddr) { + t.Errorf("got IsAllowedMonitoringAccount notModAddr = true, want false") } missingAddr := sdk.MustAccAddressFromBech32(addr2) - if keeper.IsModuleAccount(ctx, missingAddr) { - t.Errorf("got IsModuleAccount missingAddr = false, want true") + if keeper.IsAllowedMonitoringAccount(ctx, missingAddr) { + t.Errorf("got IsAllowedMonitoringAccount missingAddr = false, want true") } } diff --git a/golang/cosmos/x/vstorage/testing/queue.go b/golang/cosmos/x/vstorage/testing/queue.go index 14f52bf0f1c..c0cd8350ae8 100644 --- a/golang/cosmos/x/vstorage/testing/queue.go +++ b/golang/cosmos/x/vstorage/testing/queue.go @@ -8,11 +8,12 @@ import ( ) func GetQueueItems(ctx sdk.Context, vstorageKeeper keeper.Keeper, queuePath string) ([]string, error) { - head, err := vstorageKeeper.GetIntValue(ctx, queuePath+".head") + unlimitedCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) + head, err := vstorageKeeper.GetIntValue(unlimitedCtx, queuePath+".head") if err != nil { return nil, err } - tail, err := vstorageKeeper.GetIntValue(ctx, queuePath+".tail") + tail, err := vstorageKeeper.GetIntValue(unlimitedCtx, queuePath+".tail") if err != nil { return nil, err } @@ -21,7 +22,7 @@ func GetQueueItems(ctx sdk.Context, vstorageKeeper keeper.Keeper, queuePath stri var i int64 for i = 0; i < length; i++ { path := fmt.Sprintf("%s.%s", queuePath, head.Add(sdk.NewInt(i)).String()) - values[i] = vstorageKeeper.GetEntry(ctx, path).StringValue() + values[i] = vstorageKeeper.GetEntry(unlimitedCtx, path).StringValue() } return values, nil } diff --git a/golang/cosmos/x/vtransfer/ibc_middleware_test.go b/golang/cosmos/x/vtransfer/ibc_middleware_test.go index ab82e14e09d..ee9c80ebb56 100644 --- a/golang/cosmos/x/vtransfer/ibc_middleware_test.go +++ b/golang/cosmos/x/vtransfer/ibc_middleware_test.go @@ -16,6 +16,7 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" + "github.com/Agoric/agoric-sdk/golang/cosmos/types" swingsettesting "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/testing" swingsettypes "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/types" vibckeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc/keeper" @@ -331,18 +332,21 @@ func (s *IntegrationTestSuite) TestTransferFromAgdToAgd() { s.Run("TransferFromAgdToAgd", func() { // create a transfer packet's data contents + baseReceiver := s.chainB.SenderAccounts[1].SenderAccount.GetAddress().String() + receiverHook, err := types.JoinHookedAddress(baseReceiver, []byte("?what=arbitrary-data&why=to-test-bridge-targets")) + s.Require().NoError(err) transferData := ibctransfertypes.NewFungibleTokenPacketData( "uosmo", "1000000", s.chainA.SenderAccount.GetAddress().String(), - s.chainB.SenderAccounts[1].SenderAccount.GetAddress().String(), + receiverHook, `"This is a JSON memo"`, ) // Register the sender and receiver as bridge targets on their specific // chain. s.RegisterBridgeTarget(s.chainA, transferData.Sender) - s.RegisterBridgeTarget(s.chainB, transferData.Receiver) + s.RegisterBridgeTarget(s.chainB, baseReceiver) s.mintToAddress(s.chainA, s.chainA.SenderAccount.GetAddress(), transferData.Denom, transferData.Amount) @@ -384,7 +388,7 @@ func (s *IntegrationTestSuite) TestTransferFromAgdToAgd() { BlockTime: writeAcknowledgementTime, }, Event: "writeAcknowledgement", - Target: transferData.Receiver, + Target: baseReceiver, Packet: packet, Acknowledgement: ack.Acknowledgement(), }, diff --git a/golang/cosmos/x/vtransfer/keeper/keeper.go b/golang/cosmos/x/vtransfer/keeper/keeper.go index 36701a544e7..ed5b0f57cba 100644 --- a/golang/cosmos/x/vtransfer/keeper/keeper.go +++ b/golang/cosmos/x/vtransfer/keeper/keeper.go @@ -13,10 +13,11 @@ import ( capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/Agoric/agoric-sdk/golang/cosmos/types" "github.com/Agoric/agoric-sdk/golang/cosmos/vm" "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc" vibctypes "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc/types" - transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types" host "github.com/cosmos/ibc-go/v6/modules/core/24-host" @@ -106,7 +107,13 @@ func (k Keeper) GetReceiverImpl() vibctypes.ReceiverImpl { // to tell the IBC system that acknowledgment is async (i.e., that WriteAcknowledgement // will be called later, after the VM has dealt with the packet). func (k Keeper) InterceptOnRecvPacket(ctx sdk.Context, ibcModule porttypes.IBCModule, packet channeltypes.Packet, relayer sdk.AccAddress) ibcexported.Acknowledgement { - ack := ibcModule.OnRecvPacket(ctx, packet, relayer) + // Pass every (stripped-receiver) inbound packet to the wrapped IBC module. + var strippedPacket channeltypes.Packet + _, err := types.ExtractBaseAddressFromPacket(k.cdc, packet, types.RoleReceiver, &strippedPacket) + if err != nil { + return channeltypes.NewErrorAcknowledgement(err) + } + ack := ibcModule.OnRecvPacket(ctx, strippedPacket, relayer) if ack == nil { // Already declared to be an async ack. @@ -136,17 +143,21 @@ func (k Keeper) InterceptOnAcknowledgementPacket( acknowledgement []byte, relayer sdk.AccAddress, ) error { - // Pass every acknowledgement to the wrapped IBC module. - modErr := ibcModule.OnAcknowledgementPacket(ctx, packet, acknowledgement, relayer) + // Pass every (stripped-sender) acknowledgement to the wrapped IBC module. + var strippedPacket channeltypes.Packet + baseSender, err := types.ExtractBaseAddressFromPacket(k.cdc, packet, types.RoleSender, &strippedPacket) + if err != nil { + return err + } + modErr := ibcModule.OnAcknowledgementPacket(ctx, strippedPacket, acknowledgement, relayer) - // If the sender is not a targeted account, we're done. - sender, _, err := k.parseTransfer(ctx, packet) - if err != nil || sender == "" { + // If the sender is not a watched account, we're done. + if !k.targetIsWatched(ctx, baseSender) { return modErr } - // Trigger VM, regardless of errors in the ibcModule. - vmErr := k.vibcKeeper.TriggerOnAcknowledgementPacket(ctx, sender, packet, acknowledgement, relayer) + // Trigger VM with the original packet, regardless of errors in the ibcModule. + vmErr := k.vibcKeeper.TriggerOnAcknowledgementPacket(ctx, baseSender, packet, acknowledgement, relayer) // Any error from the VM is trumped by one from the wrapped IBC module. if modErr != nil { @@ -163,17 +174,21 @@ func (k Keeper) InterceptOnTimeoutPacket( packet channeltypes.Packet, relayer sdk.AccAddress, ) error { - // Pass every timeout to the wrapped IBC module. - modErr := ibcModule.OnTimeoutPacket(ctx, packet, relayer) + // Pass every (stripped-sender) timeout to the wrapped IBC module. + var strippedPacket channeltypes.Packet + baseSender, err := types.ExtractBaseAddressFromPacket(k.cdc, packet, types.RoleSender, &strippedPacket) + if err != nil { + return err + } + modErr := ibcModule.OnTimeoutPacket(ctx, strippedPacket, relayer) - // If the sender is not a targeted account, we're done. - sender, _, err := k.parseTransfer(ctx, packet) - if err != nil || sender == "" { + // If the sender is not a watched account, we're done. + if !k.targetIsWatched(ctx, baseSender) { return modErr } - // Trigger VM, regardless of errors in the app. - vmErr := k.vibcKeeper.TriggerOnTimeoutPacket(ctx, sender, packet, relayer) + // Trigger VM with the original packet, regardless of errors in the app. + vmErr := k.vibcKeeper.TriggerOnTimeoutPacket(ctx, baseSender, packet, relayer) // Any error from the VM is trumped by one from the wrapped IBC module. if modErr != nil { @@ -185,14 +200,15 @@ func (k Keeper) InterceptOnTimeoutPacket( // InterceptWriteAcknowledgement checks to see if the packet's receiver is a // targeted account, and if so, delegates to the VM. func (k Keeper) InterceptWriteAcknowledgement(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, ack ibcexported.Acknowledgement) error { - _, receiver, err := k.parseTransfer(ctx, packet) - if err != nil || receiver == "" { - // We can't parse, but that means just to ack directly. + // Get the base baseReceiver from the packet, without computing a stripped packet. + baseReceiver, err := types.ExtractBaseAddressFromPacket(k.cdc, packet, types.RoleReceiver, nil) + if err != nil || !k.targetIsWatched(ctx, baseReceiver) { + // We can't parse, or not watching, but that means just to ack directly. return k.WriteAcknowledgement(ctx, chanCap, packet, ack) } - // Trigger VM - if err = k.vibcKeeper.TriggerWriteAcknowledgement(ctx, receiver, packet, ack); err != nil { + // Trigger VM with the original packet. + if err = k.vibcKeeper.TriggerWriteAcknowledgement(ctx, baseReceiver, packet, ack); err != nil { errAck := channeltypes.NewErrorAcknowledgement(err) return k.WriteAcknowledgement(ctx, chanCap, packet, errAck) } @@ -200,27 +216,13 @@ func (k Keeper) InterceptWriteAcknowledgement(ctx sdk.Context, chanCap *capabili return nil } -// parseTransfer checks if a packet's sender and/or receiver are targeted accounts. -func (k Keeper) parseTransfer(ctx sdk.Context, packet ibcexported.PacketI) (string, string, error) { - var transferData transfertypes.FungibleTokenPacketData - err := k.cdc.UnmarshalJSON(packet.GetData(), &transferData) - if err != nil { - return "", "", err - } - - var sender string - var receiver string +// targetIsWatched checks if a target address has been watched by the VM. +func (k Keeper) targetIsWatched(ctx sdk.Context, target string) bool { prefixStore := prefix.NewStore( ctx.KVStore(k.key), []byte(watchedAddressStoreKeyPrefix), ) - if prefixStore.Has([]byte(transferData.Sender)) { - sender = transferData.Sender - } - if prefixStore.Has([]byte(transferData.Receiver)) { - receiver = transferData.Receiver - } - return sender, receiver, nil + return prefixStore.Has([]byte(target)) } // GetWatchedAdresses returns the watched addresses from the keeper as a slice diff --git a/golang/cosmos/x/vtransfer/types/genesis.pb.go b/golang/cosmos/x/vtransfer/types/genesis.pb.go index 69f088dbb80..5d0fdbd3249 100644 --- a/golang/cosmos/x/vtransfer/types/genesis.pb.go +++ b/golang/cosmos/x/vtransfer/types/genesis.pb.go @@ -26,6 +26,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // The initial and exported module state. type GenesisState struct { + // The list of account addresses that are being watched by the VM. WatchedAddresses []github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,rep,name=watched_addresses,json=watchedAddresses,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"watched_addresses" yaml:"watched_addresses"` } diff --git a/multichain-testing/.gitignore b/multichain-testing/.gitignore index c556e728ded..1d6079098c9 100644 --- a/multichain-testing/.gitignore +++ b/multichain-testing/.gitignore @@ -1,8 +1,10 @@ -.tsimp .yarn/* !.yarn/patches/* # fetched chain info from running starship -starship-chain-info* -# output of build script to get update running chain info -revise-chain-info* +starship-chain-info.js +# builder prefix for contract starters start* +# builder prefix for core evals +eval-* +# ci logs for archive upload +logs/ diff --git a/multichain-testing/Makefile b/multichain-testing/Makefile index 3fe90607fed..0f2bd61450d 100644 --- a/multichain-testing/Makefile +++ b/multichain-testing/Makefile @@ -5,7 +5,7 @@ FILE = config.yaml HELM_REPO = starship HELM_CHART = devnet -HELM_VERSION = v0.2.10 +HELM_VERSION = v0.2.20 ############################################################################### ### All commands ### @@ -26,14 +26,14 @@ clean: stop clean-kind .PHONY: check setup-deps: - bash $(CURDIR)/scripts/dev-setup.sh + $(CURDIR)/scripts/dev-setup.sh ############################################################################### ### Helm Charts ### ############################################################################### install: - bash $(CURDIR)/scripts/install.sh --config $(FILE) --name $(NAME) --version $(HELM_VERSION) + $(CURDIR)/scripts/install.sh --config $(FILE) --name $(NAME) --version $(HELM_VERSION) delete: -helm delete $(NAME) @@ -44,7 +44,7 @@ delete: .PHONY: port-forward port-forward: - bash $(CURDIR)/scripts/port-forward.sh --config=$(FILE) + $(CURDIR)/scripts/port-forward.sh --config=$(FILE) .PHONY: stop-forward stop-forward: @@ -76,8 +76,13 @@ fund-provision-pool: kubectl exec -i agoriclocal-genesis-0 -c validator -- agd tx bank send faucet $(PROVISION_POOL_ADDR) 1000000000uist -y -b block override-chain-registry: - node_modules/.bin/tsx scripts/fetch-starship-chain-info.ts && \ - node_modules/.bin/tsx scripts/deploy-cli.ts src/revise-chain-info.builder.js + scripts/fetch-starship-chain-info.ts && \ + scripts/deploy-cli.ts src/revise-chain-info.builder.js + +register-bank-assets: + scripts/fetch-starship-chain-info.ts && \ + scripts/deploy-cli.ts src/register-interchain-bank-assets.builder.js \ + assets="$$(scripts/make-bank-asset-info.ts)" ADDR=agoric1ldmtatp24qlllgxmrsjzcpe20fvlkp448zcuce COIN=1000000000uist @@ -98,8 +103,8 @@ tail-slog: .PHONY: wait-for-pods wait-for-pods: - node_modules/.bin/tsx scripts/pod-readiness.ts + scripts/pod-readiness.ts .PHONY: start -start: install wait-for-pods port-forward fund-provision-pool override-chain-registry +start: install wait-for-pods port-forward fund-provision-pool override-chain-registry register-bank-assets diff --git a/multichain-testing/README.md b/multichain-testing/README.md index cb090092cde..949b1aeab8d 100644 --- a/multichain-testing/README.md +++ b/multichain-testing/README.md @@ -21,6 +21,8 @@ Install the relevant dependencies: yarn install ``` +(Note that the '@agoric/*' deps will come from the parent directory due to `yarn link --relative .. --all`) + Ensure you have Kubernetes available. See https://docs.cosmology.zone/starship/get-started/step-2. The following will install `kubectl`, `kind`, `helm`, and `yq` as needed: @@ -59,7 +61,7 @@ make wait-for-pods make port-forward # set up Agoric testing environment -make fund-provision-pool override-chain-registry +make fund-provision-pool override-chain-registry register-bank-assets ``` If you get an error like "connection refused", you need to wait longer, until all the pods are Running. diff --git a/multichain-testing/ava.fusdc.config.js b/multichain-testing/ava.fusdc.config.js new file mode 100644 index 00000000000..10571c74d84 --- /dev/null +++ b/multichain-testing/ava.fusdc.config.js @@ -0,0 +1,6 @@ +import mainConfig from './ava.main.config.js'; + +export default { + ...mainConfig, + files: ['test/fast-usdc/**/*.test.ts'], +}; diff --git a/multichain-testing/ava.main.config.js b/multichain-testing/ava.main.config.js new file mode 100644 index 00000000000..da0d373e10c --- /dev/null +++ b/multichain-testing/ava.main.config.js @@ -0,0 +1,13 @@ +export default { + extensions: { + ts: 'module', + }, + // Each test imports `@endo/ses-ava/prepare-endo.js` which does its own @endo/init + // require: ['@endo/init/debug.js'], + nodeArguments: ['--import=ts-blank-space/register'], + files: ['test/**/*.test.ts', '!test/fast-usdc/**/*.test.ts'], + concurrency: 1, + serial: true, + timeout: '125s', + failFast: true, +}; diff --git a/multichain-testing/config.fusdc.yaml b/multichain-testing/config.fusdc.yaml new file mode 100644 index 00000000000..c542d208386 --- /dev/null +++ b/multichain-testing/config.fusdc.yaml @@ -0,0 +1,110 @@ +name: agoric-multichain-testing-fusdc +version: 0.2.20 + +chains: + - id: agoriclocal + name: agoric + image: ghcr.io/agoric/agoric-sdk:dev + numValidators: 1 + env: + - name: DEBUG + value: SwingSet:vat,SwingSet:ls + genesis: + app_state: + staking: + params: + unbonding_time: '2m' + swingset: + params: + bootstrap_vat_config: '@agoric/vm-config/decentral-itest-orchestration-config.json' + scripts: + updateConfig: + file: scripts/update-config.sh + faucet: + enabled: false + ports: + rest: 1317 + rpc: 26657 + exposer: 38087 + grpc: 9090 + resources: + cpu: 1 + memory: 4Gi + - id: osmosislocal + name: osmosis + numValidators: 1 + genesis: + app_state: + staking: + params: + unbonding_time: '2m' + interchain_accounts: + host_genesis_state: + params: + host_enabled: true + allow_messages: ['*'] + interchainquery: + host_port: 'icqhost' + params: + host_enabled: true + allow_queries: + - /cosmos.bank.v1beta1.Query/Balance + - /cosmos.bank.v1beta1.Query/AllBalances + faucet: + enabled: true + type: starship + ports: + rest: 1315 + rpc: 26655 + grpc: 9093 + faucet: 8084 + resources: + cpu: 1 + memory: 1Gi + - id: noblelocal + name: noble + numValidators: 1 + genesis: + app_state: + staking: + params: + unbonding_time: '2m' + faucet: + enabled: true + type: starship + ports: + rest: 1314 + rpc: 26654 + grpc: 9092 + faucet: 8083 + resources: + cpu: 1 + memory: 1Gi + +relayers: + - name: osmosis-noble + type: hermes + replicas: 1 + chains: + - osmosislocal + - noblelocal + - name: agoric-osmosis + type: hermes + replicas: 1 + chains: + - agoriclocal + - osmosislocal + - name: agoric-noble + type: hermes + replicas: 1 + chains: + - agoriclocal + - noblelocal + +explorer: + enabled: false + +registry: + enabled: true + ports: + rest: 8081 diff --git a/multichain-testing/config.yaml b/multichain-testing/config.yaml index 8bb75beeeb4..b16d3daf89c 100644 --- a/multichain-testing/config.yaml +++ b/multichain-testing/config.yaml @@ -1,3 +1,6 @@ +name: agoric-multichain-testing +version: 0.2.20 + chains: - id: agoriclocal name: agoric diff --git a/multichain-testing/package.json b/multichain-testing/package.json index 4da3c745934..f73af9bbeb5 100644 --- a/multichain-testing/package.json +++ b/multichain-testing/package.json @@ -4,62 +4,92 @@ "type": "module", "scripts": { "build": "exit 0", - "lint": "yarn lint:eslint", - "lint:eslint": "eslint .", - "lint:types": "tsc --noEmit", + "lint": "yarn tsc && yarn eslint .", "lint-fix": "yarn lint:eslint --fix", - "test": "ava", + "test": "echo 'Run specific test suites:\nyarn test:main (needs `make start`)\nyarn test:fast-usdc (needs `make start FILE=config.fusdc.yaml`)'", + "test:main": "ava --config ava.main.config.js", + "test:fast-usdc": "FILE=config.fusdc.yaml ava --config ava.fusdc.config.js", "starship:setup": "make setup-deps setup-kind", "starship:install": "make install", "starship:port-forward": "make port-forward", "starship:stop": "make stop", "postinstall": "patch-package" }, - "packageManager": "yarn@4.1.1", + "packageManager": "yarn@4.5.3", "devDependencies": { - "@agoric/cosmic-proto": "0.4.1-dev-08f8549.0", + "@agoric/cosmic-proto": "dev", + "@agoric/fast-usdc": "dev", "@cosmjs/crypto": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "^0.32.4", - "@endo/errors": "^1.2.5", - "@endo/far": "^1.1.5", - "@endo/nat": "^5.0.10", - "@endo/ses-ava": "^1.2.5", + "@endo/errors": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/nat": "^5.0.13", + "@endo/ses-ava": "^1.2.8", "@types/eslint": "^8", "@types/fs-extra": "^11", - "@types/node": "^20.11.13", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "@typescript-eslint/parser": "^6.20.0", - "ava": "^6.1.3", + "@types/node": "^22.0.0", + "@typescript-eslint/eslint-plugin": "^8.17.0", + "@typescript-eslint/parser": "^8.17.0", + "ava": "^6.2.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", - "execa": "^9.2.0", + "execa": "9.1.0", "fs-extra": "^11.2.0", "patch-package": "^8.0.0", "starshipjs": "2.4.1", - "tsimp": "^2.0.10", - "tsx": "^4.15.6", - "typescript": "^5.3.3" + "ts-blank-space": "^0.4.4", + "typescript": "~5.7.2" }, "resolutions": { - "axios": "1.6.7" - }, - "ava": { - "extensions": { - "ts": "module" - }, - "require": [ - "@endo/init/debug.js" - ], - "nodeArguments": [ - "--import=tsimp/import" - ], - "files": [ - "**/*.test.ts" - ], - "concurrency": 1, - "serial": true, - "timeout": "125s" + "axios": "1.6.7", + "@agoric/cosmos": "portal:../golang/cosmos", + "@agoric/ertp": "portal:../packages/ERTP", + "@agoric/swingset-vat": "portal:../packages/SwingSet", + "@agoric/access-token": "portal:../packages/access-token", + "agoric": "portal:../packages/agoric-cli", + "@agoric/async-flow": "portal:../packages/async-flow", + "@agoric/base-zone": "portal:../packages/base-zone", + "@agoric/builders": "portal:../packages/builders", + "@agoric/cache": "portal:../packages/cache", + "@agoric/casting": "portal:../packages/casting", + "@agoric/client-utils": "portal:../packages/client-utils", + "@agoric/cosmic-proto": "portal:../packages/cosmic-proto", + "@agoric/cosmic-swingset": "portal:../packages/cosmic-swingset", + "@agoric/create-dapp": "portal:../packages/create-dapp", + "@agoric/deploy-script-support": "portal:../packages/deploy-script-support", + "@agoric/eslint-config": "portal:../packages/eslint-config", + "@agoric/fast-usdc": "portal:../packages/fast-usdc", + "@agoric/governance": "portal:../packages/governance", + "@agoric/import-manager": "portal:../packages/import-manager", + "@agoric/inter-protocol": "portal:../packages/inter-protocol", + "@agoric/internal": "portal:../packages/internal", + "@agoric/kmarshal": "portal:../packages/kmarshal", + "@agoric/network": "portal:../packages/network", + "@agoric/notifier": "portal:../packages/notifier", + "@agoric/orchestration": "portal:../packages/orchestration", + "@agoric/pegasus": "portal:../packages/pegasus", + "@agoric/smart-wallet": "portal:../packages/smart-wallet", + "@agoric/solo": "portal:../packages/solo", + "@agoric/sparse-ints": "portal:../packages/sparse-ints", + "@agoric/spawner": "portal:../packages/spawner", + "@agoric/stat-logger": "portal:../packages/stat-logger", + "@agoric/store": "portal:../packages/store", + "@agoric/swing-store": "portal:../packages/swing-store", + "@agoric/swingset-liveslots": "portal:../packages/swingset-liveslots", + "@agoric/swingset-xsnap-supervisor": "portal:../packages/swingset-xsnap-supervisor", + "@agoric/telemetry": "portal:../packages/telemetry", + "@agoric/time": "portal:../packages/time", + "@agoric/vat-data": "portal:../packages/vat-data", + "@agoric/vats": "portal:../packages/vats", + "@agoric/vm-config": "portal:../packages/vm-config", + "@agoric/vow": "portal:../packages/vow", + "@agoric/wallet": "portal:../packages/wallet", + "@agoric/wallet-backend": "portal:../packages/wallet/api", + "@agoric/xsnap": "portal:../packages/xsnap", + "@agoric/xsnap-lockdown": "portal:../packages/xsnap-lockdown", + "@agoric/zoe": "portal:../packages/zoe", + "@agoric/zone": "portal:../packages/zone" }, "eslintConfig": { "root": true, diff --git a/multichain-testing/scripts/deploy-cli.ts b/multichain-testing/scripts/deploy-cli.ts old mode 100644 new mode 100755 index 7f032606e23..65e2320da71 --- a/multichain-testing/scripts/deploy-cli.ts +++ b/multichain-testing/scripts/deploy-cli.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env -S node --import ts-blank-space/register import '@endo/init/debug.js'; import { execa } from 'execa'; @@ -9,17 +9,28 @@ import { makeAgdTools } from '../tools/agd-tools.js'; import { makeDeployBuilder } from '../tools/deploy.js'; async function main() { - const builder = process.argv[2]; + const [builder, ...rawArgs] = process.argv.slice(2); + + // Parse builder options from command line arguments + const builderOpts: Record = {}; + for (const arg of rawArgs) { + const [key, value] = arg.split('='); + if (key && value) { + builderOpts[key] = value; + } + } if (!builder) { - console.error('USAGE: deploy-cli.ts '); + console.error( + 'USAGE: deploy-cli.ts [key1=value1] [key2=value2]', + ); process.exit(1); } try { const agdTools = await makeAgdTools(console.log, childProcess); const deployBuilder = makeDeployBuilder(agdTools, fse.readJSON, execa); - await deployBuilder(builder); + await deployBuilder(builder, builderOpts); } catch (err) { console.error(err); process.exit(1); diff --git a/multichain-testing/scripts/dev-setup.sh b/multichain-testing/scripts/dev-setup.sh old mode 100644 new mode 100755 diff --git a/multichain-testing/scripts/fetch-starship-chain-info.ts b/multichain-testing/scripts/fetch-starship-chain-info.ts index e660039cad2..b51da77c566 100755 --- a/multichain-testing/scripts/fetch-starship-chain-info.ts +++ b/multichain-testing/scripts/fetch-starship-chain-info.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env -S node --import ts-blank-space/register /* eslint-env node */ import fsp from 'node:fs/promises'; diff --git a/multichain-testing/scripts/install.sh b/multichain-testing/scripts/install.sh old mode 100644 new mode 100755 index 930212af9e4..2f1181aeaca --- a/multichain-testing/scripts/install.sh +++ b/multichain-testing/scripts/install.sh @@ -24,7 +24,7 @@ NAMESPACE="" HELM_REPO="starship" HELM_CHART="starship/devnet" HELM_REPO_URL="https://cosmology-tech.github.io/starship/" -HELM_CHART_VERSION="0.2.8" +HELM_CHART_VERSION="0.2.20" HELM_NAME="agoric-multichain-testing" # check_helm function verifies the helm binary is installed diff --git a/multichain-testing/scripts/make-bank-asset-info.ts b/multichain-testing/scripts/make-bank-asset-info.ts new file mode 100755 index 00000000000..257a81986b1 --- /dev/null +++ b/multichain-testing/scripts/make-bank-asset-info.ts @@ -0,0 +1,30 @@ +#!/usr/bin/env -S node --import ts-blank-space/register +/* eslint-env node */ + +import '@endo/init'; +import starshipChainInfo from '../starship-chain-info.js'; +import { makeAssetInfo } from '../tools/asset-info.ts'; + +const main = () => { + if (!starshipChainInfo) { + throw new Error( + 'starshipChainInfo not found. run `./scripts/fetch-starship-chain-info.ts` first.', + ); + } + + const assetInfo = makeAssetInfo(starshipChainInfo) + .filter( + ([_, { chainName, baseName }]) => + chainName === 'agoric' && baseName !== 'agoric', + ) + .map(([denom, { baseDenom }]) => ({ + denom, + issuerName: baseDenom.replace(/^u/, '').toUpperCase(), + decimalPlaces: 6, // TODO do not assume 6 + })); + + // Directly output JSON string for proposal builder options + process.stdout.write(JSON.stringify(assetInfo)); +}; + +main(); diff --git a/multichain-testing/scripts/pod-readiness.ts b/multichain-testing/scripts/pod-readiness.ts old mode 100644 new mode 100755 index 315980e0ffc..087fd5bb040 --- a/multichain-testing/scripts/pod-readiness.ts +++ b/multichain-testing/scripts/pod-readiness.ts @@ -1,3 +1,4 @@ +#!/usr/bin/env -S node --import ts-blank-space/register import { execa } from 'execa'; import { sleep } from '../tools/sleep.js'; diff --git a/multichain-testing/scripts/port-forward.sh b/multichain-testing/scripts/port-forward.sh old mode 100644 new mode 100755 diff --git a/multichain-testing/scripts/update-config.sh b/multichain-testing/scripts/update-config.sh old mode 100644 new mode 100755 diff --git a/multichain-testing/src/register-interchain-bank-assets.builder.js b/multichain-testing/src/register-interchain-bank-assets.builder.js new file mode 100644 index 00000000000..0417c2b92d5 --- /dev/null +++ b/multichain-testing/src/register-interchain-bank-assets.builder.js @@ -0,0 +1,51 @@ +/* global harden */ +/// +import { makeHelpers } from '@agoric/deploy-script-support'; +import { parseArgs } from 'node:util'; + +/** + * @import {ParseArgsConfig} from 'node:util'; + * @import {CoreEvalBuilder, DeployScriptFunction} from '@agoric/deploy-script-support/src/externalTypes.js'; + */ + +/** @type {ParseArgsConfig['options']} */ +const parserOpts = { + assets: { type: 'string' }, +}; + +/** @type {CoreEvalBuilder} */ +export const defaultProposalBuilder = async (_, options) => { + return harden({ + sourceSpec: + '@agoric/builders/scripts/testing/register-interchain-bank-assets.js', + getManifestCall: ['getManifestCall', options], + }); +}; + +/** @type {DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + + const { + values: { assets }, + } = parseArgs({ + args: scriptArgs, + options: parserOpts, + }); + + const parseAssets = () => { + if (typeof assets !== 'string') { + throw Error( + 'must provide --assets=JSON.stringify({ denom: Denom; issuerName: string; decimalPlaces: number; }[])', + ); + } + return JSON.parse(assets); + }; + + const opts = harden({ assets: parseAssets() }); + + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('eval-register-interchain-bank-assets', utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/multichain-testing/src/revise-chain-info.builder.js b/multichain-testing/src/revise-chain-info.builder.js index 10673129466..1269350a491 100644 --- a/multichain-testing/src/revise-chain-info.builder.js +++ b/multichain-testing/src/revise-chain-info.builder.js @@ -19,5 +19,5 @@ export const defaultProposalBuilder = async () => /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ export default async (homeP, endowments) => { const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval('revise-chain-info', defaultProposalBuilder); + await writeCoreEval('eval-revise-chain-info', defaultProposalBuilder); }; diff --git a/multichain-testing/starship-chain-info.d.ts b/multichain-testing/starship-chain-info.d.ts new file mode 100644 index 00000000000..a7f7a9719c0 --- /dev/null +++ b/multichain-testing/starship-chain-info.d.ts @@ -0,0 +1,2 @@ +/* @file types so linting works when the real info hasn't been fetched */ +export default {} as Record; diff --git a/multichain-testing/test/account-balance-queries.test.ts b/multichain-testing/test/account-balance-queries.test.ts index 6707d9b102e..c067ced9446 100644 --- a/multichain-testing/test/account-balance-queries.test.ts +++ b/multichain-testing/test/account-balance-queries.test.ts @@ -20,7 +20,7 @@ const contractBuilder = test.before(async t => { const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; const { startContract } = rest; diff --git a/multichain-testing/test/auto-stake-it.test.ts b/multichain-testing/test/auto-stake-it.test.ts index 5aee9d6fa15..10e3bac8db8 100644 --- a/multichain-testing/test/auto-stake-it.test.ts +++ b/multichain-testing/test/auto-stake-it.test.ts @@ -1,13 +1,8 @@ -import type { CosmosChainInfo } from '@agoric/orchestration'; import anyTest from '@endo/ses-ava/prepare-endo.js'; -import type { ExecutionContext, TestFn } from 'ava'; -import { useChain } from 'starshipjs'; -import chainInfo from '../starship-chain-info.js'; +import type { TestFn } from 'ava'; +import starshipChainInfo from '../starship-chain-info.js'; import { makeDoOffer } from '../tools/e2e-tools.js'; -import { - createFundedWalletAndClient, - makeIBCTransferMsg, -} from '../tools/ibc-transfer.js'; +import { makeFundAndTransfer } from '../tools/ibc-transfer.js'; import { makeQueryClient } from '../tools/query.js'; import type { SetupContextWithWallets } from './support.js'; import { chainConfig, commonSetup } from './support.js'; @@ -19,15 +14,15 @@ const accounts = ['agoricAdmin', 'cosmoshub', 'osmosis']; const contractName = 'autoAutoStakeIt'; const contractBuilder = - '../packages/builders/scripts/testing/start-auto-stake-it.js'; + '../packages/builders/scripts/testing/init-auto-stake-it.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, startContract } = common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); }); test.after(async t => { @@ -35,51 +30,6 @@ test.after(async t => { deleteTestKeys(accounts); }); -const makeFundAndTransfer = (t: ExecutionContext) => { - const { retryUntilCondition } = t.context; - return async (chainName: string, agoricAddr: string, amount = 100n) => { - const { staking } = useChain(chainName).chainInfo.chain; - const denom = staking?.staking_tokens?.[0].denom; - if (!denom) throw Error(`no denom for ${chainName}`); - - const { client, address, wallet } = await createFundedWalletAndClient( - t, - chainName, - ); - const balancesResult = await retryUntilCondition( - () => client.getAllBalances(address), - coins => !!coins?.length, - `Faucet balances found for ${address}`, - ); - - console.log('Balances:', balancesResult); - - const transferArgs = makeIBCTransferMsg( - { denom, value: amount }, - { address: agoricAddr, chainName: 'agoric' }, - { address: address, chainName }, - Date.now(), - ); - console.log('Transfer Args:', transferArgs); - // TODO #9200 `sendIbcTokens` does not support `memo` - // @ts-expect-error spread argument for concise code - const txRes = await client.sendIbcTokens(...transferArgs); - if (txRes && txRes.code !== 0) { - console.error(txRes); - throw Error(`failed to ibc transfer funds to ${chainName}`); - } - const { events: _events, ...txRest } = txRes; - console.log(txRest); - t.is(txRes.code, 0, `Transaction succeeded`); - t.log(`Funds transferred to ${agoricAddr}`); - return { - client, - address, - wallet, - }; - }; -}; - const autoStakeItScenario = test.macro({ title: (_, chainName: string) => `auto-stake-it on ${chainName}`, exec: async (t, chainName: string) => { @@ -89,14 +39,17 @@ const autoStakeItScenario = test.macro({ vstorageClient, provisionSmartWallet, retryUntilCondition, + useChain, } = t.context; - const fundAndTransfer = makeFundAndTransfer(t); + const fundAndTransfer = makeFundAndTransfer( + t, + retryUntilCondition, + useChain, + ); // 2. Find 'stakingDenom' denom on agoric - const remoteChainInfo = (chainInfo as Record)[ - chainName - ]; + const remoteChainInfo = starshipChainInfo[chainName]; const stakingDenom = remoteChainInfo?.stakingTokens?.[0].denom; if (!stakingDenom) throw Error(`staking denom found for ${chainName}`); diff --git a/multichain-testing/test/basic-flows.test.ts b/multichain-testing/test/basic-flows.test.ts index 8db6ef7c84e..1d53b4aae8d 100644 --- a/multichain-testing/test/basic-flows.test.ts +++ b/multichain-testing/test/basic-flows.test.ts @@ -16,12 +16,12 @@ const contractBuilder = '../packages/builders/scripts/orchestration/init-basic-flows.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, startContract } = common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); }); test.after(async t => { diff --git a/multichain-testing/test/chain-queries.test.ts b/multichain-testing/test/chain-queries.test.ts index a9b91c97fe3..56673742582 100644 --- a/multichain-testing/test/chain-queries.test.ts +++ b/multichain-testing/test/chain-queries.test.ts @@ -28,7 +28,7 @@ const contractBuilder = test.before(async t => { const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; const { startContract } = rest; diff --git a/multichain-testing/test/deposit-withdraw-lca.test.ts b/multichain-testing/test/deposit-withdraw-lca.test.ts index 9ba574dff56..7d1cbafa97c 100644 --- a/multichain-testing/test/deposit-withdraw-lca.test.ts +++ b/multichain-testing/test/deposit-withdraw-lca.test.ts @@ -14,12 +14,12 @@ const contractBuilder = '../packages/builders/scripts/orchestration/init-basic-flows.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, startContract } = common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); }); test.after(async t => { diff --git a/multichain-testing/test/deposit-withdraw-portfolio.test.ts b/multichain-testing/test/deposit-withdraw-portfolio.test.ts index 24bb5277a80..49b7f3d8ad7 100644 --- a/multichain-testing/test/deposit-withdraw-portfolio.test.ts +++ b/multichain-testing/test/deposit-withdraw-portfolio.test.ts @@ -14,12 +14,12 @@ const contractBuilder = '../packages/builders/scripts/orchestration/init-basic-flows.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, startContract } = common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); }); test.after(async t => { diff --git a/multichain-testing/test/fast-usdc/README.md b/multichain-testing/test/fast-usdc/README.md new file mode 100644 index 00000000000..c63d3635d97 --- /dev/null +++ b/multichain-testing/test/fast-usdc/README.md @@ -0,0 +1,20 @@ +## Start Chains + +Runs agoric, noble, and osmosis with hermes relayers. + +```sh +# start starship with fusdc configuration +make start FILE=config.fusdc.yaml +``` + +## Run Tests + +```sh +yarn test:fast-usdc +``` + +## Stop Chains + +```sh +make stop +``` diff --git a/multichain-testing/test/fast-usdc/config.ts b/multichain-testing/test/fast-usdc/config.ts new file mode 100644 index 00000000000..c7b1833ec6d --- /dev/null +++ b/multichain-testing/test/fast-usdc/config.ts @@ -0,0 +1,28 @@ +import type { IBCChannelID } from '@agoric/vats'; + +export const oracleMnemonics = { + oracle1: + 'cause eight cattle slot course mail more aware vapor slab hobby match', + oracle2: + 'flower salute inspire label latin cattle believe sausage match total bless refuse', + oracle3: + 'surge magnet typical drive cement artist stay latin chief obey word always', +}; +harden(oracleMnemonics); + +export const makeFeedPolicy = (nobleAgoricChannelId: IBCChannelID) => { + return { + nobleAgoricChannelId, + nobleDomainId: 4, + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: + '0xe298b93ffB5eA1FB628e0C0D55A43aeaC268e347', + cctpTokenMessengerAddress: '0x19330d10D9Cc8751218eaf51E8885D058642E08A', + chainId: 42161, + confirmations: 2, + }, + }, + }; +}; +harden(makeFeedPolicy); diff --git a/multichain-testing/test/fast-usdc/fast-usdc.test.ts b/multichain-testing/test/fast-usdc/fast-usdc.test.ts new file mode 100644 index 00000000000..1b0958a3441 --- /dev/null +++ b/multichain-testing/test/fast-usdc/fast-usdc.test.ts @@ -0,0 +1,477 @@ +import anyTest from '@endo/ses-ava/prepare-endo.js'; + +import type { TestFn } from 'ava'; +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { AmountMath } from '@agoric/ertp'; +import type { Denom } from '@agoric/orchestration'; +import { divideBy, multiplyBy } from '@agoric/zoe/src/contractSupport/ratio.js'; +import type { IBCChannelID } from '@agoric/vats'; +import { makeDoOffer, type WalletDriver } from '../../tools/e2e-tools.js'; +import { makeDenomTools } from '../../tools/asset-info.js'; +import { createWallet } from '../../tools/wallet.js'; +import { makeQueryClient } from '../../tools/query.js'; +import { commonSetup, type SetupContextWithWallets } from '../support.js'; +import { makeFeedPolicy, oracleMnemonics } from './config.js'; +import { makeRandomDigits } from '../../tools/random.js'; +import { makeTracer } from '@agoric/internal'; +import type { + CctpTxEvidence, + EvmAddress, + PoolMetrics, +} from '@agoric/fast-usdc/src/types.js'; +import type { CurrentWalletRecord } from '@agoric/smart-wallet/src/smartWallet.js'; +import type { QueryBalanceResponseSDKType } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import type { USDCProposalShapes } from '@agoric/fast-usdc/src/pool-share-math.js'; + +const log = makeTracer('MCFU'); + +const { keys, values, fromEntries } = Object; +const { isGTE, isEmpty, make, subtract } = AmountMath; + +const makeRandomNumber = () => Math.random(); + +const test = anyTest as TestFn< + SetupContextWithWallets & { + lpUser: WalletDriver; + oracleWds: WalletDriver[]; + nobleAgoricChannelId: IBCChannelID; + usdcOnOsmosis: Denom; + /** usdc on agoric */ + usdcDenom: Denom; + } +>; + +const accounts = [...keys(oracleMnemonics), 'lp']; +const contractName = 'fastUsdc'; +const contractBuilder = + '../packages/builders/scripts/fast-usdc/init-fast-usdc.js'; +const LP_DEPOSIT_AMOUNT = 8_000n * 10n ** 6n; + +test.before(async t => { + const { setupTestKeys, ...common } = await commonSetup(t); + const { + chainInfo, + commonBuilderOpts, + deleteTestKeys, + faucetTools, + provisionSmartWallet, + startContract, + } = common; + await deleteTestKeys(accounts).catch(); + const wallets = await setupTestKeys(accounts, values(oracleMnemonics)); + + // provision oracle wallets first so invitation deposits don't fail + const oracleWds = await Promise.all( + keys(oracleMnemonics).map(n => + provisionSmartWallet(wallets[n], { + BLD: 100n, + }), + ), + ); + + // calculate denomHash and channelId for privateArgs / builder opts + const { getTransferChannelId, toDenomHash } = makeDenomTools(chainInfo); + const usdcDenom = toDenomHash('uusdc', 'noblelocal', 'agoric'); + const usdcOnOsmosis = toDenomHash('uusdc', 'noblelocal', 'osmosis'); + const nobleAgoricChannelId = getTransferChannelId('agoriclocal', 'noble'); + if (!nobleAgoricChannelId) throw new Error('nobleAgoricChannelId not found'); + t.log('nobleAgoricChannelId', nobleAgoricChannelId); + t.log('usdcDenom', usdcDenom); + + await startContract(contractName, contractBuilder, { + oracle: keys(oracleMnemonics).map(n => `${n}:${wallets[n]}`), + usdcDenom, + feedPolicy: JSON.stringify(makeFeedPolicy(nobleAgoricChannelId)), + ...commonBuilderOpts, + }); + + // provide faucet funds for LPs + await faucetTools.fundFaucet([['noble', 'uusdc']]); + + // save an LP in test context + const lpUser = await provisionSmartWallet(wallets['lp'], { + USDC: 8_000n, + BLD: 100n, + }); + + t.context = { + ...common, + lpUser, + oracleWds, + nobleAgoricChannelId, + usdcOnOsmosis, + usdcDenom, + wallets, + }; +}); + +test.after(async t => { + const { deleteTestKeys } = t.context; + deleteTestKeys(accounts); +}); + +type VStorageClient = Awaited>['vstorageClient']; +const agoricNamesQ = (vsc: VStorageClient) => + harden({ + brands: (_assetKind: K) => + vsc + .queryData('published.agoricNames.brand') + .then(pairs => fromEntries(pairs) as Record>), + }); +const walletQ = (vsc: VStorageClient) => { + const self = harden({ + current: (addr: string) => + vsc.queryData( + `published.wallet.${addr}.current`, + ) as Promise, + findInvitationDetail: async (addr: string, description: string) => { + const { Invitation } = await agoricNamesQ(vsc).brands('set'); + const current = await self.current(addr); + const { purses } = current; + const { value: details } = purses.find(p => p.brand === Invitation)! + .balance as Amount<'set', InvitationDetails>; + const detail = details.find(x => x.description === description); + return { current, detail }; + }, + }); + return self; +}; + +const fastLPQ = (vsc: VStorageClient) => + harden({ + metrics: () => + vsc.queryData(`published.fastUsdc.poolMetrics`) as Promise, + info: () => + vsc.queryData(`published.${contractName}`) as Promise<{ + poolAccount: string; + settlementAccount: string; + }>, + }); + +const toOracleOfferId = (idx: number) => `oracle${idx + 1}-accept`; + +test.serial('oracles accept', async t => { + const { oracleWds, retryUntilCondition, vstorageClient, wallets } = t.context; + + const description = 'oracle operator invitation'; + + // ensure we have an unused (or used) oracle invitation in each purse + let hasAccepted = false; + for (const name of keys(oracleMnemonics)) { + const { + current: { offerToUsedInvitation }, + detail, + } = await walletQ(vstorageClient).findInvitationDetail( + wallets[name], + description, + ); + const hasInvitation = !!detail; + const usedInvitation = offerToUsedInvitation?.[0]?.[0] === `${name}-accept`; + t.log({ name, hasInvitation, usedInvitation }); + t.true(hasInvitation || usedInvitation, 'has or accepted invitation'); + if (usedInvitation) hasAccepted = true; + } + // if the oracles have already accepted, skip the rest of the test this is + // primarily to facilitate active development but could support testing on + // images where operator invs are already accepted + if (hasAccepted) return t.pass(); + + // accept oracle operator invitations + const instance = fromEntries( + await vstorageClient.queryData('published.agoricNames.instance'), + )[contractName]; + await Promise.all( + oracleWds.map(makeDoOffer).map((doOffer, i) => + doOffer({ + id: toOracleOfferId(i), + invitationSpec: { + source: 'purse', + instance, + description, + }, + proposal: {}, + }), + ), + ); + + for (const name of keys(oracleMnemonics)) { + const addr = wallets[name]; + await t.notThrowsAsync(() => + retryUntilCondition( + () => vstorageClient.queryData(`published.wallet.${addr}.current`), + ({ offerToUsedInvitation }) => { + return offerToUsedInvitation[0][0] === `${name}-accept`; + }, + `${name} invitation used`, + { log }, + ), + ); + } +}); + +const toAmt = ( + brand: Brand<'nat'>, + balance: QueryBalanceResponseSDKType['balance'], +) => make(brand, BigInt(balance?.amount || 0)); + +test.serial('lp deposits', async t => { + const { lpUser, retryUntilCondition, vstorageClient, wallets } = t.context; + + const lpDoOffer = makeDoOffer(lpUser); + + const { USDC, FastLP } = await agoricNamesQ(vstorageClient).brands('nat'); + + const give = { USDC: make(USDC, LP_DEPOSIT_AMOUNT) }; + + const metricsPre = await fastLPQ(vstorageClient).metrics(); + const want = { PoolShare: divideBy(give.USDC, metricsPre.shareWorth) }; + + const proposal: USDCProposalShapes['deposit'] = harden({ give, want }); + await lpDoOffer({ + id: `lp-deposit-${Date.now()}`, + invitationSpec: { + source: 'agoricContract', + instancePath: [contractName], + callPipe: [['makeDepositInvitation']], + }, + proposal, + }); + + await t.notThrowsAsync(() => + retryUntilCondition( + () => fastLPQ(vstorageClient).metrics(), + ({ shareWorth }) => + !isGTE(metricsPre.shareWorth.numerator, shareWorth.numerator), + 'share worth numerator increases from deposit', + { log }, + ), + ); + + const { useChain } = t.context; + const queryClient = makeQueryClient( + await useChain('agoric').getRestEndpoint(), + ); + + await t.notThrowsAsync(() => + retryUntilCondition( + () => queryClient.queryBalance(wallets['lp'], 'ufastlp'), + ({ balance }) => isGTE(toAmt(FastLP, balance), want.PoolShare), + 'lp has pool shares', + { log }, + ), + ); +}); + +const advanceAndSettleScenario = test.macro({ + title: (_, mintAmt: bigint, eudChain: string) => + `advance ${mintAmt} uusdc to ${eudChain} and settle`, + exec: async (t, mintAmt: bigint, eudChain: string) => { + const { + nobleTools, + nobleAgoricChannelId, + oracleWds, + retryUntilCondition, + smartWalletKit, + useChain, + usdcOnOsmosis, + vstorageClient, + } = t.context; + + // EUD wallet on the specified chain + const eudWallet = await createWallet( + useChain(eudChain).chain.bech32_prefix, + ); + const EUD = (await eudWallet.getAccounts())[0].address; + t.log(`EUD wallet created: ${EUD}`); + + // parameterize agoric address + const { settlementAccount } = await vstorageClient.queryData( + `published.${contractName}`, + ); + t.log('settlementAccount address', settlementAccount); + + const recipientAddress = encodeAddressHook(settlementAccount, { EUD }); + t.log('recipientAddress', recipientAddress); + + // register forwarding address on noble + const txRes = nobleTools.registerForwardingAcct( + nobleAgoricChannelId, + recipientAddress, + ); + t.is(txRes?.code, 0, 'registered forwarding account'); + + const { address: userForwardingAddr } = nobleTools.queryForwardingAddress( + nobleAgoricChannelId, + recipientAddress, + ); + t.log('got forwardingAddress', userForwardingAddr); + + const evidence: CctpTxEvidence = harden({ + blockHash: + '0x90d7343e04f8160892e94f02d6a9b9f255663ed0ac34caca98544c8143fee665', + blockNumber: 21037663n, + txHash: `0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff3875527617${makeRandomDigits(makeRandomNumber(), 2n)}`, + tx: { + amount: mintAmt, + forwardingAddress: userForwardingAddr, + sender: '0x9a9eE9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9' as EvmAddress, + }, + aux: { + forwardingChannel: nobleAgoricChannelId, + recipientAddress, + }, + chainId: 42161, + }); + + log('User initiates evm mint:', evidence.txHash); + + // submit evidences + await Promise.all( + oracleWds.map(makeDoOffer).map((doOffer, i) => + doOffer({ + id: `${Date.now()}-evm-evidence`, + invitationSpec: { + source: 'continuing', + previousOffer: toOracleOfferId(i), + invitationMakerName: 'SubmitEvidence', + invitationArgs: [evidence], + }, + proposal: {}, + }), + ), + ); + + const queryClient = makeQueryClient( + await useChain(eudChain).getRestEndpoint(), + ); + + await t.notThrowsAsync(() => + retryUntilCondition( + () => queryClient.queryBalance(EUD, usdcOnOsmosis), + ({ balance }) => !!balance?.amount && BigInt(balance.amount) < mintAmt, + `${EUD} advance available from fast-usdc`, + // this resolves quickly, so _decrease_ the interval so the timing is more apparent + { retryIntervalMs: 500 }, + ), + ); + + const queryTxStatus = async () => { + const record = await smartWalletKit.readPublished( + `fastUsdc.txns.${evidence.txHash}`, + ); + if (!record) { + throw new Error(`no record for ${evidence.txHash}`); + } + // @ts-expect-error unknown may not have 'status' + if (!record.status) { + throw new Error(`no status for ${evidence.txHash}`); + } + // @ts-expect-error still unknown? + return record.status; + }; + + const assertTxStatus = async (status: string) => + t.notThrowsAsync(() => + retryUntilCondition( + () => queryTxStatus(), + txStatus => { + log('tx status', txStatus); + return txStatus === status; + }, + `${evidence.txHash} is ${status}`, + ), + ); + + await assertTxStatus('ADVANCED'); + log('Advance completed, waiting for mint...'); + + nobleTools.mockCctpMint(mintAmt, userForwardingAddr); + await t.notThrowsAsync(() => + retryUntilCondition( + () => fastLPQ(vstorageClient).metrics(), + ({ encumberedBalance }) => + encumberedBalance && isEmpty(encumberedBalance), + 'encumberedBalance returns to 0', + ), + ); + + await assertTxStatus('DISBURSED'); + }, +}); + +test.serial(advanceAndSettleScenario, LP_DEPOSIT_AMOUNT / 4n, 'osmosis'); +test.serial(advanceAndSettleScenario, LP_DEPOSIT_AMOUNT / 8n, 'noble'); +test.serial(advanceAndSettleScenario, LP_DEPOSIT_AMOUNT / 5n, 'agoric'); + +test.serial('lp withdraws', async t => { + const { + lpUser, + retryUntilCondition, + useChain, + usdcDenom, + vstorageClient, + wallets, + } = t.context; + const queryClient = makeQueryClient( + await useChain('agoric').getRestEndpoint(), + ); + const lpDoOffer = makeDoOffer(lpUser); + const { FastLP } = await agoricNamesQ(vstorageClient).brands('nat'); + t.log('FastLP brand', FastLP); + + const metricsPre = await fastLPQ(vstorageClient).metrics(); + + const { balance: lpCoins } = await queryClient.queryBalance( + wallets['lp'], + 'ufastlp', + ); + const give = { PoolShare: toAmt(FastLP, lpCoins) }; + t.log('give', give, lpCoins); + + const { balance: usdcCoinsPre } = await queryClient.queryBalance( + wallets['lp'], + usdcDenom, + ); + t.log('usdc coins pre', usdcCoinsPre); + + const want = { USDC: multiplyBy(give.PoolShare, metricsPre.shareWorth) }; + t.log('want', want); + + const proposal: USDCProposalShapes['withdraw'] = harden({ give, want }); + await lpDoOffer({ + id: `lp-withdraw-${Date.now()}`, + invitationSpec: { + source: 'agoricContract', + instancePath: [contractName], + callPipe: [['makeWithdrawInvitation']], + }, + proposal, + }); + + await t.notThrowsAsync(() => + retryUntilCondition( + () => queryClient.queryBalance(wallets['lp'], 'ufastlp'), + ({ balance }) => isEmpty(toAmt(FastLP, balance)), + 'lp no longer has pool shares', + { log }, + ), + ); + + const USDC = want.USDC.brand; + await t.notThrowsAsync(() => + retryUntilCondition( + () => queryClient.queryBalance(wallets['lp'], usdcDenom), + ({ balance }) => + !isGTE( + make(USDC, LP_DEPOSIT_AMOUNT), + subtract(toAmt(USDC, balance), toAmt(USDC, usdcCoinsPre)), + ), + "lp's USDC balance increases", + { log }, + ), + ); +}); + +test.todo('insufficient LP funds; forward path'); +test.todo('mint while Advancing; still Disbursed'); +test.todo('transfer failed (e.g. to cosmos, not in env)'); diff --git a/multichain-testing/test/fast-usdc/noble-forwarding.test.ts b/multichain-testing/test/fast-usdc/noble-forwarding.test.ts new file mode 100644 index 00000000000..84ce4f3ae95 --- /dev/null +++ b/multichain-testing/test/fast-usdc/noble-forwarding.test.ts @@ -0,0 +1,88 @@ +import anyTest from '@endo/ses-ava/prepare-endo.js'; +import type { TestFn } from 'ava'; +import { commonSetup, type SetupContext } from '../support.js'; +import { createWallet } from '../../tools/wallet.js'; +import type { IBCConnectionInfo } from '@agoric/orchestration'; +import { makeQueryClient } from '../../tools/query.js'; + +const test = anyTest as TestFn; + +test('noble forwarding', async t => { + const { nobleTools, retryUntilCondition, useChain, vstorageClient } = + await commonSetup(t); + + const agoricWallet = await createWallet('agoric'); + const agoricAddr = (await agoricWallet.getAccounts())[0].address; + t.log('Made agoric wallet:', agoricAddr); + + const agoricChainId = useChain('agoric').chain.chain_id; + const nobleChainId = useChain('noble').chain.chain_id; + + const connInfoPath = `published.agoricNames.chainConnection.${agoricChainId}_${nobleChainId}`; + const { + transferChannel: { counterPartyChannelId, channelId }, + }: IBCConnectionInfo = await vstorageClient.queryData(connInfoPath); + + t.regex( + counterPartyChannelId, + /^channel-/, + 'counterPartyChannelId retrieved from vstorage', + ); + t.log(`Found noble->agoric channelId in vstorage: ${counterPartyChannelId}`); + + t.log( + `Registering forwarding account for ${counterPartyChannelId} ${agoricAddr}...`, + ); + const registerFwdAcctTx = nobleTools.registerForwardingAcct( + counterPartyChannelId, + agoricAddr, + ); + t.is(registerFwdAcctTx?.code, 0, 'registered forwarding account'); + t.log('Register forwarding account tx:', { + code: registerFwdAcctTx?.code, + height: registerFwdAcctTx?.height, + txhash: registerFwdAcctTx?.txhash, + }); + + const { address: nobleForwardingAddr, exists } = + nobleTools.queryForwardingAddress(counterPartyChannelId, agoricAddr); + t.regex(nobleForwardingAddr, /^noble1/, 'noble forwarding address'); + t.true(exists, 'forwarding address exists'); + t.log(`Got forwarding address: ${nobleForwardingAddr}`); + + const qty = 10_000_000n; + t.log( + `Initiating mock cctp mint for ${qty} uusdc to ${nobleForwardingAddr}...`, + ); + const cctpMintTx = nobleTools.mockCctpMint(qty, nobleForwardingAddr); + t.is(cctpMintTx?.code, 0, 'mocked cctp mint'); + t.log('Mocked CCTP Mint tx:', { + code: cctpMintTx?.code, + height: cctpMintTx?.height, + txhash: cctpMintTx?.txhash, + }); + + const apiUrl = await useChain('agoric').getRestEndpoint(); + const queryClient = makeQueryClient(apiUrl); + + const { balances } = await retryUntilCondition( + () => queryClient.queryBalances(agoricAddr), + ({ balances }) => !!balances.length, + `${agoricAddr} received forwarded funds from noble`, + ); + t.is(BigInt(balances[0]?.amount), qty, 'got tokens'); + t.log('Received forwarded funds from noble:', balances); + + const { hash: expectedHash } = await queryClient.queryDenom( + `transfer/${channelId}`, + 'uusdc', + ); + t.log('Expected denom hash:', expectedHash); + + t.regex(balances[0]?.denom, /^ibc/); + t.is( + balances[0]?.denom.split('ibc/')[1], + expectedHash, + 'got expected ibc denom hash', + ); +}); diff --git a/multichain-testing/test/ica-channel-close.test.ts b/multichain-testing/test/ica-channel-close.test.ts index 9e844fa903b..6ee59dc825f 100644 --- a/multichain-testing/test/ica-channel-close.test.ts +++ b/multichain-testing/test/ica-channel-close.test.ts @@ -22,12 +22,12 @@ const contractBuilder = '../packages/builders/scripts/orchestration/init-basic-flows.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, startContract } = common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); }); test.after(async t => { diff --git a/multichain-testing/test/scripts/make-bank-asset-info.test.ts b/multichain-testing/test/scripts/make-bank-asset-info.test.ts new file mode 100644 index 00000000000..d04adf4dbe8 --- /dev/null +++ b/multichain-testing/test/scripts/make-bank-asset-info.test.ts @@ -0,0 +1,30 @@ +import test from 'ava'; +import { execFileSync } from 'node:child_process'; + +test('make-bank-asset-info', async t => { + const stdout = execFileSync('./scripts/make-bank-asset-info.ts', { + encoding: 'utf8', + }); + + const assetInfo = JSON.parse(stdout); + + t.like(assetInfo, [ + { + issuerName: 'ATOM', + decimalPlaces: 6, + }, + { + issuerName: 'OSMO', + decimalPlaces: 6, + }, + { + issuerName: 'ION', + decimalPlaces: 6, + }, + ]); + + for (const { denom } of assetInfo) { + t.regex(denom, /^ibc\//); + t.is(denom.length, 68); + } +}); diff --git a/multichain-testing/test/send-anywhere.test.ts b/multichain-testing/test/send-anywhere.test.ts index 717e1b5282e..df4bbdca8d6 100644 --- a/multichain-testing/test/send-anywhere.test.ts +++ b/multichain-testing/test/send-anywhere.test.ts @@ -17,15 +17,21 @@ const accounts = ['osmosis1', 'osmosis2', 'cosmoshub1', 'cosmoshub2']; const contractName = 'sendAnywhere'; const contractBuilder = - '../packages/builders/scripts/testing/start-send-anywhere.js'; + '../packages/builders/scripts/testing/init-send-anywhere.js'; test.before(async t => { - const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); - deleteTestKeys(accounts).catch(); + const { setupTestKeys, ...common } = await commonSetup(t); + const { commonBuilderOpts, deleteTestKeys, faucetTools, startContract } = + common; + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); - t.context = { ...rest, wallets, deleteTestKeys }; - const { startContract } = rest; - await startContract(contractName, contractBuilder); + t.context = { ...common, wallets }; + await startContract(contractName, contractBuilder, commonBuilderOpts); + + await faucetTools.fundFaucet([ + ['cosmoshub', 'uatom'], + ['osmosis', 'uosmo'], + ]); }); test.after(async t => { @@ -33,12 +39,14 @@ test.after(async t => { deleteTestKeys(accounts); }); +type BrandKW = 'IST' | 'OSMO' | 'ATOM'; + const sendAnywhereScenario = test.macro({ - title: (_, chainName: string, acctIdx: number) => - `send-anywhere ${chainName}${acctIdx}`, - exec: async (t, chainName: string, acctIdx: number) => { - const config = chainConfig[chainName]; - if (!config) return t.fail(`Unknown chain: ${chainName}`); + title: (_, destChainName: string, acctIdx: number, brandKw: BrandKW) => + `send-anywhere ${brandKw} from agoric to ${destChainName}${acctIdx}`, + exec: async (t, destChainName: string, acctIdx: number, brandKw: BrandKW) => { + const config = chainConfig[destChainName]; + if (!config) return t.fail(`Unknown chain: ${destChainName}`); const { wallets, @@ -49,13 +57,13 @@ const sendAnywhereScenario = test.macro({ } = t.context; t.log('Create a receiving wallet for the send-anywhere transfer'); - const chain = useChain(chainName).chain; + const chain = useChain(destChainName).chain; t.log('Create an agoric smart wallet to initiate send-anywhere transfer'); - const agoricAddr = wallets[`${chainName}${acctIdx}`]; + const agoricAddr = wallets[`${destChainName}${acctIdx}`]; const wdUser1 = await provisionSmartWallet(agoricAddr, { - BLD: 100_000n, - IST: 100_000n, + BLD: 1_000n, + [brandKw]: 1_000n, }); t.log(`provisioning agoric smart wallet for ${agoricAddr}`); @@ -64,11 +72,11 @@ const sendAnywhereScenario = test.macro({ const brands = await vstorageClient.queryData( 'published.agoricNames.brand', ); - const istBrand = Object.fromEntries(brands).IST; + const brand = Object.fromEntries(brands)[brandKw]; - const apiUrl = await useChain(chainName).getRestEndpoint(); + const apiUrl = await useChain(destChainName).getRestEndpoint(); const queryClient = makeQueryClient(apiUrl); - t.log(`Made ${chainName} query client`); + t.log(`Made ${destChainName} query client`); const doSendAnywhere = async (amount: Amount) => { t.log(`Sending ${amount.value} ${amount.brand}.`); @@ -79,8 +87,8 @@ const sendAnywhereScenario = test.macro({ encoding: 'bech32', }; t.log('Will send payment to:', receiver); - t.log(`${chainName} offer`); - const offerId = `${chainName}-makeSendInvitation-${Date.now()}`; + t.log(`${destChainName} offer`); + const offerId = `${destChainName}-makeSendInvitation-${Date.now()}`; await doOffer({ id: offerId, invitationSpec: { @@ -88,7 +96,7 @@ const sendAnywhereScenario = test.macro({ instancePath: [contractName], callPipe: [['makeSendInvitation']], }, - offerArgs: { destAddr: receiver.value, chainName }, + offerArgs: { destAddr: receiver.value, chainName: destChainName }, proposal: { give: { Send: amount } }, }); @@ -119,12 +127,12 @@ const sendAnywhereScenario = test.macro({ console.log(`${agoricAddr} offer amounts:`, offerAmounts); for (const value of offerAmounts) { - await doSendAnywhere(AmountMath.make(istBrand, value)); + await doSendAnywhere(AmountMath.make(brand, value)); } }, }); -test.serial(sendAnywhereScenario, 'osmosis', 1); -test.serial(sendAnywhereScenario, 'osmosis', 2); -test.serial(sendAnywhereScenario, 'cosmoshub', 1); -test.serial(sendAnywhereScenario, 'cosmoshub', 2); +test.serial(sendAnywhereScenario, 'osmosis', 1, 'IST'); +test.serial(sendAnywhereScenario, 'osmosis', 2, 'ATOM'); // exercises PFM (agoric -> cosmoshub -> osmosis) +test.serial(sendAnywhereScenario, 'cosmoshub', 1, 'IST'); +test.serial(sendAnywhereScenario, 'cosmoshub', 2, 'OSMO'); // exercises PFM (agoric -> osmosis -> cosmoshub) diff --git a/multichain-testing/test/stake-ica.test.ts b/multichain-testing/test/stake-ica.test.ts index af73531bf61..7ef65ad33eb 100644 --- a/multichain-testing/test/stake-ica.test.ts +++ b/multichain-testing/test/stake-ica.test.ts @@ -18,7 +18,7 @@ test.before(async t => { const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); // XXX not necessary for CI, but helpful for unexpected failures in // active development (test.after cleanup doesn't run). - deleteTestKeys(accounts).catch(); + await deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; }); diff --git a/multichain-testing/test/support.ts b/multichain-testing/test/support.ts index 2267b813436..f71e2c112cc 100644 --- a/multichain-testing/test/support.ts +++ b/multichain-testing/test/support.ts @@ -3,13 +3,22 @@ import { dirname, join } from 'path'; import { execa } from 'execa'; import fse from 'fs-extra'; import childProcess from 'node:child_process'; +import { withChainCapabilities } from '@agoric/orchestration'; import { makeAgdTools } from '../tools/agd-tools.js'; import { type E2ETools } from '../tools/e2e-tools.js'; -import { makeGetFile, makeSetupRegistry } from '../tools/registry.js'; +import { + makeGetFile, + makeSetupRegistry, + type MultichainRegistry, +} from '../tools/registry.js'; import { generateMnemonic } from '../tools/wallet.js'; import { makeRetryUntilCondition } from '../tools/sleep.js'; import { makeDeployBuilder } from '../tools/deploy.js'; import { makeHermes } from '../tools/hermes-tools.js'; +import { makeNobleTools } from '../tools/noble-tools.js'; +import { makeAssetInfo } from '../tools/asset-info.js'; +import starshipChainInfo from '../starship-chain-info.js'; +import { makeFaucetTools } from '../tools/faucet-tools.js'; export const FAUCET_POUR = 10_000n * 1_000_000n; @@ -32,13 +41,19 @@ const makeKeyring = async ( e2eTools: Pick, ) => { let _keys = ['user1']; - const setupTestKeys = async (keys = ['user1']) => { + const setupTestKeys = async ( + keys = ['user1'], + mnemonics?: (string | undefined)[], + ) => { _keys = keys; const wallets: Record = {}; - for (const name of keys) { - const res = await e2eTools.addKey(name, generateMnemonic()); + for (const i in keys) { + const res = await e2eTools.addKey( + keys[i], + mnemonics?.[i] || generateMnemonic(), + ); const { address } = JSON.parse(res); - wallets[name] = address; + wallets[keys[i]] = address; } return wallets; }; @@ -54,7 +69,16 @@ const makeKeyring = async ( }; export const commonSetup = async (t: ExecutionContext) => { - const { useChain } = await setupRegistry(); + let useChain: MultichainRegistry['useChain']; + try { + const registry = await setupRegistry({ + config: `../${process.env.FILE || 'config.yaml'}`, + }); + useChain = registry.useChain; + } catch (e) { + console.error('setupRegistry failed', e); + throw e; + } const tools = await makeAgdTools(t.log, childProcess); const keyring = await makeKeyring(tools); const deployBuilder = makeDeployBuilder(tools, fse.readJSON, execa); @@ -63,6 +87,19 @@ export const commonSetup = async (t: ExecutionContext) => { setTimeout: globalThis.setTimeout, }); const hermes = makeHermes(childProcess); + const nobleTools = makeNobleTools(childProcess); + const assetInfo = makeAssetInfo(starshipChainInfo); + const chainInfo = withChainCapabilities(starshipChainInfo); + const faucetTools = makeFaucetTools( + t, + tools.agd, + retryUntilCondition, + useChain, + ); + const commonBuilderOpts = harden({ + assetInfo: JSON.stringify(assetInfo), + chainInfo: JSON.stringify(chainInfo), + }); /** * Starts a contract if instance not found. Takes care of installing @@ -74,6 +111,7 @@ export const commonSetup = async (t: ExecutionContext) => { const startContract = async ( contractName: string, contractBuilder: string, + builderOpts?: Record, ) => { const { vstorageClient } = tools; const instances = Object.fromEntries( @@ -83,7 +121,7 @@ export const commonSetup = async (t: ExecutionContext) => { return t.log('Contract found. Skipping installation...'); } t.log('bundle and install contract', contractName); - await deployBuilder(contractBuilder); + await deployBuilder(contractBuilder, builderOpts); await retryUntilCondition( () => vstorageClient.queryData(`published.agoricNames.instance`), res => contractName in Object.fromEntries(res), @@ -98,7 +136,12 @@ export const commonSetup = async (t: ExecutionContext) => { retryUntilCondition, deployBuilder, hermes, + nobleTools, startContract, + assetInfo, + chainInfo, + commonBuilderOpts, + faucetTools, }; }; diff --git a/multichain-testing/test/tools/asset-info.test.ts b/multichain-testing/test/tools/asset-info.test.ts new file mode 100644 index 00000000000..1806a3c4e26 --- /dev/null +++ b/multichain-testing/test/tools/asset-info.test.ts @@ -0,0 +1,171 @@ +import test from '@endo/ses-ava/prepare-endo.js'; +import type { Denom, DenomDetail } from '@agoric/orchestration'; +import { makeAssetInfo } from '../../tools/asset-info.js'; + +const minChainInfo = { + agoric: { + chainId: 'agoriclocal', + connections: { + gaialocal: { + transferChannel: { + channelId: 'channel-1', + }, + }, + osmosislocal: { + transferChannel: { + channelId: 'channel-0', + }, + }, + }, + }, + cosmoshub: { + chainId: 'gaialocal', + connections: { + agoriclocal: { + transferChannel: { + channelId: 'channel-1', + }, + }, + osmosislocal: { + transferChannel: { + channelId: 'channel-0', + }, + }, + }, + }, + osmosis: { + chainId: 'osmosislocal', + connections: { + agoriclocal: { + transferChannel: { + channelId: 'channel-1', + }, + }, + gaialocal: { + transferChannel: { + channelId: 'channel-0', + }, + }, + }, + }, +}; + +const minTokenMap = { + agoric: ['ubld', 'uist'], + cosmoshub: ['uatom'], + osmosis: ['uosmo'], +}; + +test('makeAssetInfo', async t => { + const byDenom = (assetInfo: [Denom, DenomDetail][]) => + assetInfo.sort(([a], [b]) => a.localeCompare(b) * -1); + + const assetInfo = makeAssetInfo( + /** @ts-expect-error minified mock */ + minChainInfo, + minTokenMap, + ); + + t.deepEqual(byDenom([...assetInfo]), [ + [ + 'uosmo', + { + baseDenom: 'uosmo', + baseName: 'osmosis', + chainName: 'osmosis', + }, + ], + [ + 'uist', + { + baseDenom: 'uist', + baseName: 'agoric', + brandKey: 'IST', + chainName: 'agoric', + }, + ], + [ + 'ubld', + { + baseDenom: 'ubld', + baseName: 'agoric', + brandKey: 'BLD', + chainName: 'agoric', + }, + ], + [ + 'uatom', + { + baseDenom: 'uatom', + baseName: 'cosmoshub', + chainName: 'cosmoshub', + }, + ], + [ + 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', + { + baseDenom: 'uosmo', + baseName: 'osmosis', + brandKey: 'OSMO', + chainName: 'agoric', + }, + ], + [ + 'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', + { + baseDenom: 'uosmo', + baseName: 'osmosis', + chainName: 'cosmoshub', + }, + ], + [ + 'ibc/E7827844CB818EE9C4DB2C159F1543FF62B26213B44CE8029D5CEFE52F0EE596', + { + baseDenom: 'ubld', + baseName: 'agoric', + chainName: 'cosmoshub', + }, + ], + [ + 'ibc/E7827844CB818EE9C4DB2C159F1543FF62B26213B44CE8029D5CEFE52F0EE596', + { + baseDenom: 'ubld', + baseName: 'agoric', + chainName: 'osmosis', + }, + ], + [ + 'ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9', + { + baseDenom: 'uatom', + baseName: 'cosmoshub', + brandKey: 'ATOM', + chainName: 'agoric', + }, + ], + [ + 'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2', + { + baseDenom: 'uatom', + baseName: 'cosmoshub', + chainName: 'osmosis', + }, + ], + [ + 'ibc/16CD81E12F05F5397CA2D580B4BA786A12A8F48B6FB3823D82EBE95D80B5287B', + { + baseDenom: 'uist', + baseName: 'agoric', + chainName: 'cosmoshub', + }, + ], + [ + 'ibc/16CD81E12F05F5397CA2D580B4BA786A12A8F48B6FB3823D82EBE95D80B5287B', + { + baseDenom: 'uist', + baseName: 'agoric', + chainName: 'osmosis', + }, + ], + ]); +}); diff --git a/multichain-testing/tools/agd-lib.js b/multichain-testing/tools/agd-lib.js index a301945f148..71ed0f69cbd 100644 --- a/multichain-testing/tools/agd-lib.js +++ b/multichain-testing/tools/agd-lib.js @@ -16,7 +16,7 @@ const binaryArgs = [ ]; /** - * @param {Record} record - e.g. { color: 'blue' } + * @param {Record} record - e.g. { color: 'blue' } * @returns {string[]} - e.g. ['--color', 'blue'] */ export const flags = record => { @@ -25,7 +25,12 @@ export const flags = record => { /** @type {[string, string][]} */ // @ts-expect-error undefined is filtered out const skipUndef = Object.entries(record).filter(([_k, v]) => v !== undefined); - return skipUndef.map(([k, v]) => [`--${k}`, v]).flat(); + return skipUndef.flatMap(([key, value]) => { + if (Array.isArray(value)) { + return value.flatMap(v => [`--${key}`, v]); + } + return [`--${key}`, value]; + }); }; /** @@ -164,6 +169,19 @@ export const makeAgd = ({ execFileSync }) => { }, ).toString(); }, + /** @param {string} name key name in keyring */ + showAddress: name => { + return execFileSync( + kubectlBinary, + [...binaryArgs, 'keys', 'show', name, '-a', ...keyringArgs], + { + encoding: 'utf-8', + stdio: ['pipe', 'pipe', 'ignore'], + }, + ) + .toString() + .trim(); + }, /** @param {string} name */ delete: name => { return exec([...keyringArgs, 'keys', 'delete', name, '-y'], { @@ -181,7 +199,7 @@ export const makeAgd = ({ execFileSync }) => { return make(); }; -/** @typedef {ReturnType} Agd */ +/** @typedef {ReturnType} Agd */ /** @param {{ execFileSync: typeof import('child_process').execFileSync, log: typeof console.log }} powers */ export const makeCopyFiles = ( diff --git a/multichain-testing/tools/asset-info.ts b/multichain-testing/tools/asset-info.ts new file mode 100644 index 00000000000..568cf6019c3 --- /dev/null +++ b/multichain-testing/tools/asset-info.ts @@ -0,0 +1,97 @@ +import { + denomHash, + type CosmosChainInfo, + type Denom, + type DenomDetail, +} from '@agoric/orchestration'; +import type { IBCChannelID } from '@agoric/vats'; + +export const makeDenomTools = (chainInfo: Record) => { + const getTransferChannelId = ( + destChainId: string, + fromChainName: string, + ): IBCChannelID | undefined => + chainInfo[fromChainName]?.connections?.[destChainId]?.transferChannel + .channelId; + + const toDenomHash = ( + denom: Denom, + destChainId: string, + fromChainName: string, + ): Denom => { + const channelId = getTransferChannelId(destChainId, fromChainName); + if (!channelId) { + throw new Error( + `No channel found for ${destChainId} -> ${fromChainName}`, + ); + } + return `ibc/${denomHash({ denom, channelId })}`; + }; + + return harden({ getTransferChannelId, toDenomHash }); +}; + +/** + * Make asset info for the current environment. + * + * until #10580, the contract's `issuerKeywordRecord` must include 'ATOM', + * 'OSMO', 'IST', etc. for the local `chainHub` to know about brands. + */ +export const makeAssetInfo = ( + chainInfo: Record, + tokenMap: Record = { + agoric: ['ubld', 'uist'], + cosmoshub: ['uatom'], + noble: ['uusdc'], + osmosis: ['uosmo', 'uion'], + }, +): [Denom, DenomDetail][] => { + const { toDenomHash } = makeDenomTools(chainInfo); + + // only include chains present in `chainInfo` + const tokens = Object.entries(tokenMap) + .filter(([chain]) => chain in chainInfo) + .flatMap(([chain, denoms]) => denoms.map(denom => ({ denom, chain }))); + + const assetInfo: [Denom, DenomDetail][] = []; + for (const { denom, chain } of tokens) { + const baseDetails = { + baseName: chain, + baseDenom: denom, + }; + + // Add native token entry + assetInfo.push([ + denom, + { + ...baseDetails, + chainName: chain, + ...(chain === 'agoric' && { + // `brandKey` instead of `brand` until #10580 + // assumes issuerKeywordRecord includes brand keywords like `IST`, `OSMO` + brandKey: denom.replace(/^u/, '').toUpperCase(), + }), + }, + ]); + + // Add IBC entries for non-issuing chains + const issuingChainId = chainInfo[chain].chainId; + for (const holdingChain of Object.keys(chainInfo)) { + if (holdingChain === chain) continue; + assetInfo.push([ + toDenomHash(denom, issuingChainId, holdingChain), + { + ...baseDetails, + chainName: holdingChain, + ...(holdingChain === 'agoric' && { + // `brandKey` instead of `brand` until #10580 + // assumes issuerKeywordRecord includes brand keywords like `IST`, `OSMO` + brandKey: denom.replace(/^u/, '').toUpperCase(), + }), + }, + ]); + } + } + + return harden(assetInfo); +}; diff --git a/multichain-testing/tools/batchQuery.js b/multichain-testing/tools/batchQuery.js index 64c1d1855b5..3d26c6037ad 100644 --- a/multichain-testing/tools/batchQuery.js +++ b/multichain-testing/tools/batchQuery.js @@ -1,3 +1,4 @@ +// @ts-check import { assert } from '@endo/errors'; import { E } from '@endo/far'; diff --git a/multichain-testing/tools/deploy.ts b/multichain-testing/tools/deploy.ts index 17b70cf5bb4..289c4d971e9 100755 --- a/multichain-testing/tools/deploy.ts +++ b/multichain-testing/tools/deploy.ts @@ -2,6 +2,7 @@ import { createRequire } from 'module'; import type { AgdTools } from './agd-tools.js'; import type { CoreEvalPlan } from '@agoric/deploy-script-support/src/writeCoreEvalParts.js'; +import { flags } from './agd-lib.js'; const nodeRequire = createRequire(import.meta.url); @@ -10,10 +11,16 @@ export const makeDeployBuilder = ( readJSON: typeof import('fs-extra').readJSON, execa: typeof import('execa').execa, ) => - async function deployBuilder(builder: string) { + async function deployBuilder( + builder: string, + builderOpts?: Record, + ) { console.log(`building plan: ${builder}`); - // build the plan - const { stdout } = await execa`agoric run ${builder}`; + const args = ['run', builder]; + if (builderOpts) { + args.push(...flags(builderOpts)); + } + const { stdout } = await execa('agoric', args); const match = stdout.match(/ (?[-\w]+)-permit.json/); if (!(match && match.groups)) { throw Error('no permit found'); diff --git a/multichain-testing/tools/e2e-tools.js b/multichain-testing/tools/e2e-tools.js index df46fbd65b0..448f8b81895 100644 --- a/multichain-testing/tools/e2e-tools.js +++ b/multichain-testing/tools/e2e-tools.js @@ -1,4 +1,6 @@ +// @ts-check /** global harden */ +import { makeSmartWalletKit, LOCAL_CONFIG } from '@agoric/client-utils'; import { assert } from '@endo/errors'; import { E, Far } from '@endo/far'; import { Nat } from '@endo/nat'; @@ -7,8 +9,16 @@ import { flags, makeAgd, makeCopyFiles } from './agd-lib.js'; import { makeHttpClient, makeAPI } from './makeHttpClient.js'; import { dedup, makeQueryKit, poll } from './queryKit.js'; import { makeVStorage } from './batchQuery.js'; +import { makeRetryUntilCondition } from './sleep.js'; +import { makeTracer } from '@agoric/internal'; -/** @import { EnglishMnemonic } from '@cosmjs/crypto'; */ +/** + * @import {OfferSpec} from '@agoric/smart-wallet/src/offers.js'; + * @import { EnglishMnemonic } from '@cosmjs/crypto'; + * @import { RetryUntilCondition } from './sleep.js'; + */ + +const trace = makeTracer('E2ET'); const BLD = '000000ubld'; @@ -120,9 +130,11 @@ const installBundle = async (fullPath, opts) => { * blockTool: BlockTool; * lcd: import('./makeHttpClient.js').LCD; * delay: (ms: number) => Promise; + * retryUntilCondition: RetryUntilCondition; * chainId?: string; * whale?: string; * progress?: typeof console.log; + * q?: import('./queryKit.js').QueryTool; * }} opts */ export const provisionSmartWallet = async ( @@ -137,12 +149,17 @@ export const provisionSmartWallet = async ( whale = 'faucet', progress = console.log, q = makeQueryKit(makeVStorage(lcd)).query, + retryUntilCondition, }, ) => { // TODO: skip this query if balances is {} const vbankEntries = await q.queryData('published.agoricNames.vbankAsset'); const byName = Object.fromEntries( - vbankEntries.map(([_denom, info]) => [info.issuerName, info]), + // reverse entries, so we get the latest view on the denom since there are + // multiple entries in the testing environment + [...vbankEntries].reverse().map(([_, info]) => { + return [info.issuerName, info]; + }), ); progress({ send: balances, to: address }); @@ -167,7 +184,7 @@ export const provisionSmartWallet = async ( for await (const [name, qty] of Object.entries(balances)) { const info = byName[name]; if (!info) { - throw Error(name); + throw Error(`${name} not found in vbank assets`); } const { denom, displayInfo } = info; const { decimalPlaces } = displayInfo; @@ -181,7 +198,12 @@ export const provisionSmartWallet = async ( { chainId, from: address, yes: true }, ); - const info = await q.queryData(`published.wallet.${address}.current`); + const info = await retryUntilCondition( + () => q.queryData(`published.wallet.${address}.current`), + result => !!result, + `wallet in vstorage ${address}`, + { log: () => {} }, // suppress logs as this is already noisy + ); progress({ provisioned: address, purses: info.purses.length, @@ -206,7 +228,7 @@ export const provisionSmartWallet = async ( const txInfo = await sendAction({ method: 'executeOffer', offer }); console.debug('spendAction', txInfo); for await (const update of updates) { - // console.log('update', address, update); + trace('update', address, update); if (update.updated !== 'offerStatus' || update.status.id !== offer.id) { continue; } @@ -291,6 +313,8 @@ export const provisionSmartWallet = async ( return { offers, deposit, peek, query: q }; }; +/** @typedef {Awaited>} WalletDriver */ + /** * @param {{ * agd: import('./agd-lib.js').Agd; @@ -336,13 +360,13 @@ const voteLatestProposalAndWait = async ({ await blockTool.waitForBlock(1, { step: `voting`, on: lastProposalId }) ) { info = await agd.query(['gov', 'proposal', lastProposalId]); - console.log( + trace( `Waiting for proposal ${lastProposalId} to pass (status=${info.status})`, ); } // @ts-expect-error cast - return info; + return { ...info, proposal_id: lastProposalId }; }; /** @@ -379,7 +403,7 @@ const runCoreEval = async ( const evalPaths = evals.map(e => [e.permit, e.code]).flat(); log(evalPaths); - console.log('await tx', evalPaths); + trace('await tx', evalPaths); const result = await agd.tx( [ 'gov', @@ -394,18 +418,23 @@ const runCoreEval = async ( // FIXME TypeError#1: unrecognized details 0 // assert(result.code, 0); - console.log('await voteLatestProposalAndWait', evalPaths); + trace('await voteLatestProposalAndWait', evalPaths); const detail = await voteLatestProposalAndWait({ agd, blockTool }); log(detail.proposal_id, detail.voting_end_time, detail.status); // TODO: how long is long enough? poll? - await blockTool.waitForBlock(5, { step: 'run', propsal: detail.proposal_id }); + await blockTool.waitForBlock(5, { + step: 'run', + proposal: detail.proposal_id, + }); assert(detail.status, 'PROPOSAL_STATUS_PASSED'); return detail; }; /** + * @deprecated use `@agoric/client-utils` instead + * * @param {typeof console.log} log * @param {import('@agoric/swingset-vat/tools/bundleTool.js').BundleCache} bundleCache * @param {object} io @@ -417,6 +446,7 @@ const runCoreEval = async ( * @param {string} [io.rpcAddress] * @param {string} [io.apiAddress] * @param {(...parts: string[]) => string} [io.join] + * * @param {RetryUntilCondition} [io.retryUntilCondition] */ export const makeE2ETools = async ( log, @@ -427,6 +457,7 @@ export const makeE2ETools = async ( setTimeout, rpcAddress = 'http://localhost:26657', apiAddress = 'http://localhost:1317', + retryUntilCondition = makeRetryUntilCondition({ log, setTimeout }), }, ) => { const agd = makeAgd({ execFileSync }).withOpts({ keyringBackend: 'test' }); @@ -438,7 +469,7 @@ export const makeE2ETools = async ( if (typeof info === 'object' && Object.keys(info).length > 0) { // XXX normally we have the caller pass in the log function // later, but the way blockTool is factored, we have to supply it early. - console.log({ ...info, delay: ms / 1000 }, '...'); + trace({ ...info, delay: ms / 1000 }, '...'); } return delay(ms); }; @@ -471,6 +502,7 @@ export const makeE2ETools = async ( // name, id: fullPath, installHeight: tx.height, + // @ts-expect-error confirm is a boolean? installed: confirm.installed, }); } @@ -506,10 +538,23 @@ export const makeE2ETools = async ( const copyFiles = makeCopyFiles({ execFileSync, log }); + /** + * @deprecated use `@agoric/client-utils` instead + */ const vstorageClient = makeQueryKit(vstorage).query; + /** @type {import('@agoric/client-utils').SmartWalletKit} */ + const smartWalletKit = await makeSmartWalletKit( + { + fetch, + delay, + }, + LOCAL_CONFIG, + ); + return { vstorageClient, + smartWalletKit, installBundles, runCoreEval: buildAndRunCoreEval, /** @@ -523,6 +568,7 @@ export const makeE2ETools = async ( lcd, delay, q: vstorageClient, + retryUntilCondition, }), /** * @param {string} name @@ -537,6 +583,7 @@ export const makeE2ETools = async ( /** @param {string} name */ deleteKey: async name => agd.keys.delete(name), copyFiles, + agd, }; }; @@ -578,8 +625,9 @@ export const seatLike = updates => { }); }; -/** @param {Awaited>} wallet */ +/** @param {Awaited>} wallet */ export const makeDoOffer = wallet => { + /** @type {(offer: OfferSpec) => Promise} */ const doOffer = async offer => { const updates = wallet.offers.executeOffer(offer); // const seat = seatLike(updates); diff --git a/multichain-testing/tools/faucet-tools.ts b/multichain-testing/tools/faucet-tools.ts new file mode 100644 index 00000000000..272dd464cae --- /dev/null +++ b/multichain-testing/tools/faucet-tools.ts @@ -0,0 +1,39 @@ +import type { ExecutionContext } from 'ava'; +import type { Denom } from '@agoric/orchestration'; +import { makeFundAndTransfer } from './ibc-transfer.js'; +import type { MultichainRegistry } from './registry.js'; +import type { RetryUntilCondition } from './sleep.js'; +import type { AgdTools } from './agd-tools.js'; + +type ChainName = string; + +// 90% of default faucet pour +const DEFAULT_QTY = (10_000_000_000n * 9n) / 10n; + +/** + * Determines the agoric `faucet` address and sends funds to it. + * + * Allows use of brands like OSMO, ATOM, etc. with `provisionSmartWallet`. + */ +export const makeFaucetTools = ( + t: ExecutionContext, + agd: AgdTools['agd'], + retryUntilCondition: RetryUntilCondition, + useChain: MultichainRegistry['useChain'], +) => { + const fundAndTransfer = makeFundAndTransfer(t, retryUntilCondition, useChain); + return { + /** + * @param assets denom on the issuing chain + * @param [qty] number of tokens + */ + fundFaucet: async (assets: [ChainName, Denom][], qty = DEFAULT_QTY) => { + const faucetAddr = agd.keys.showAddress('faucet'); + console.log(`Faucet address: ${faucetAddr}`); + + for (const [chainName, denom] of assets) { + await fundAndTransfer(chainName, faucetAddr, qty, denom); + } + }, + }; +}; diff --git a/multichain-testing/tools/ibc-transfer.ts b/multichain-testing/tools/ibc-transfer.ts index bdabf473b3e..3437080afd3 100644 --- a/multichain-testing/tools/ibc-transfer.ts +++ b/multichain-testing/tools/ibc-transfer.ts @@ -2,7 +2,6 @@ import type { ExecutionContext } from 'ava'; import type { StdFee } from '@cosmjs/amino'; import { coins } from '@cosmjs/proto-signing'; import { SigningStargateClient } from '@cosmjs/stargate'; -import { useChain } from 'starshipjs'; import type { CosmosChainInfo, DenomAmount, @@ -16,6 +15,8 @@ import { import { MsgTransfer } from '@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js'; import { createWallet } from './wallet.js'; import chainInfo from '../starship-chain-info.js'; +import type { MultichainRegistry } from './registry.js'; +import type { RetryUntilCondition } from './sleep.js'; interface MakeFeeObjectArgs { denom?: string; @@ -61,6 +62,7 @@ export const makeIBCTransferMsg = ( destination: SimpleChainAddress, sender: SimpleChainAddress, currentTime: number, + useChain: MultichainRegistry['useChain'], opts: IBCMsgTransferOptions = {}, ) => { const { timeoutHeight, timeoutTimestamp, memo = '' } = opts; @@ -117,13 +119,15 @@ export const makeIBCTransferMsg = ( }; export const createFundedWalletAndClient = async ( - t: ExecutionContext, + log: (...args: unknown[]) => void, chainName: string, + useChain: MultichainRegistry['useChain'], + mnemonic?: string, ) => { const { chain, creditFromFaucet, getRpcEndpoint } = useChain(chainName); - const wallet = await createWallet(chain.bech32_prefix); + const wallet = await createWallet(chain.bech32_prefix, mnemonic); const address = (await wallet.getAccounts())[0].address; - t.log(`Requesting faucet funds for ${address}`); + log(`Requesting faucet funds for ${address}`); await creditFromFaucet(address); // TODO use telescope generated rpc client from @agoric/cosmic-proto // https://github.com/Agoric/agoric-sdk/issues/9200 @@ -133,3 +137,57 @@ export const createFundedWalletAndClient = async ( ); return { client, wallet, address }; }; + +export const makeFundAndTransfer = ( + t: ExecutionContext, + retryUntilCondition: RetryUntilCondition, + useChain: MultichainRegistry['useChain'], +) => { + return async ( + chainName: string, + agoricAddr: string, + amount = 100n, + denom?: string, + ) => { + const { staking } = useChain(chainName).chainInfo.chain; + const denomToTransfer = denom || staking?.staking_tokens?.[0].denom; + if (!denomToTransfer) throw Error(`no denom for ${chainName}`); + + const { client, address, wallet } = await createFundedWalletAndClient( + t.log, + chainName, + useChain, + ); + const balancesResult = await retryUntilCondition( + () => client.getAllBalances(address), + coins => !!coins?.length, + `Faucet balances found for ${address}`, + ); + console.log('Balances:', balancesResult); + + const transferArgs = makeIBCTransferMsg( + { denom: denomToTransfer, value: amount }, + { address: agoricAddr, chainName: 'agoric' }, + { address: address, chainName }, + Date.now(), + useChain, + ); + console.log('Transfer Args:', transferArgs); + // TODO #9200 `sendIbcTokens` does not support `memo` + // @ts-expect-error spread argument for concise code + const txRes = await client.sendIbcTokens(...transferArgs); + if (txRes && txRes.code !== 0) { + console.error(txRes); + throw Error(`failed to ibc transfer funds to ${chainName}`); + } + const { events: _events, ...txRest } = txRes; + console.log(txRest); + t.is(txRes.code, 0, `Transaction succeeded`); + t.log(`Funds transferred to ${agoricAddr}`); + return { + client, + address, + wallet, + }; + }; +}; diff --git a/multichain-testing/tools/makeHttpClient.js b/multichain-testing/tools/makeHttpClient.js index 37344419946..3219a8f147e 100644 --- a/multichain-testing/tools/makeHttpClient.js +++ b/multichain-testing/tools/makeHttpClient.js @@ -1,3 +1,4 @@ +// @ts-check import { assert } from '@endo/errors'; import { Far } from '@endo/far'; diff --git a/multichain-testing/tools/marshalTables.js b/multichain-testing/tools/marshalTables.js index 827bd230cc3..ac06ed20f5d 100644 --- a/multichain-testing/tools/marshalTables.js +++ b/multichain-testing/tools/marshalTables.js @@ -1,3 +1,4 @@ +// @ts-check /** * @file marshal tools for vstorage clients * diff --git a/multichain-testing/tools/noble-tools.ts b/multichain-testing/tools/noble-tools.ts new file mode 100644 index 00000000000..cd72a332857 --- /dev/null +++ b/multichain-testing/tools/noble-tools.ts @@ -0,0 +1,108 @@ +import type { IBCChannelID } from '@agoric/vats'; +import type { ExecSync } from './agd-lib.js'; +import type { ChainAddress } from '@agoric/orchestration'; +import type { NobleAddress } from '@agoric/fast-usdc/src/types.js'; + +const kubectlBinary = 'kubectl'; +const noblePod = 'noblelocal-genesis-0'; +const nobleBinary = 'nobled'; + +const makeKubeArgs = () => { + return [ + 'exec', + '-i', + noblePod, + '-c', + 'validator', + '--tty=false', + '--', + nobleBinary, + ]; +}; + +export const makeNobleTools = ( + { + execFileSync, + }: { + execFileSync: ExecSync; + }, + log: (...args: unknown[]) => void = console.log, +) => { + const exec = ( + args: string[], + opts = { encoding: 'utf-8' as const, stdio: ['ignore', 'pipe', 'ignore'] }, + ) => execFileSync(kubectlBinary, [...makeKubeArgs(), ...args], opts); + + const checkEnv = () => { + if (process.env.FILE !== 'config.fusdc.yaml') { + console.error('Warning: Noble chain must be running for this to work'); + } + }; + + const registerForwardingAcct = ( + channelId: IBCChannelID, + address: ChainAddress['value'], + ): { txhash: string; code: number; data: string; height: string } => { + checkEnv(); + log('creating forwarding address', address, channelId); + return JSON.parse( + exec([ + 'tx', + 'forwarding', + 'register-account', + channelId, + address, + '--from=genesis', + '-y', + '-b', + 'block', + ]), + ); + }; + + const mockCctpMint = (amount: bigint, destination: ChainAddress['value']) => { + checkEnv(); + const denomAmount = `${Number(amount)}uusdc`; + log('mock cctp mint', destination, denomAmount); + return JSON.parse( + exec([ + 'tx', + 'bank', + 'send', + 'faucet', + destination, + denomAmount, + '--from=faucet', + '-y', + '-b', + 'block', + ]), + ); + }; + + const queryForwardingAddress = ( + channelId: IBCChannelID, + address: ChainAddress['value'], + ): { address: NobleAddress; exists: boolean } => { + checkEnv(); + log('querying forwarding address', address, channelId); + return JSON.parse( + exec([ + 'query', + 'forwarding', + 'address', + channelId, + address, + '--output=json', + ]), + ); + }; + + return { + mockCctpMint, + queryForwardingAddress, + registerForwardingAcct, + }; +}; + +export type NobleTools = ReturnType; diff --git a/multichain-testing/tools/queryKit.js b/multichain-testing/tools/queryKit.js index 44bf5ac7f7a..3acdfb62f7f 100644 --- a/multichain-testing/tools/queryKit.js +++ b/multichain-testing/tools/queryKit.js @@ -1,3 +1,4 @@ +// @ts-check import { E, Far } from '@endo/far'; import { batchVstorageQuery } from './batchQuery.js'; import { makeClientMarshaller } from './marshalTables.js'; diff --git a/multichain-testing/tools/random.ts b/multichain-testing/tools/random.ts new file mode 100644 index 00000000000..1928bb1ebd3 --- /dev/null +++ b/multichain-testing/tools/random.ts @@ -0,0 +1,11 @@ +/** + * @param randomN pseudorandom number between 0 and 1, e.g. Math.random() + * @param digits number of digits to generate + * @returns a string of digits + */ +export function makeRandomDigits(randomN: number, digits = 2n) { + if (digits < 1n) throw new Error('digits must be positive'); + const maxValue = Math.pow(10, Number(digits)) - 1; + const num = Math.floor(randomN * (maxValue + 1)); + return num.toString().padStart(Number(digits), '0'); +} diff --git a/multichain-testing/tools/registry.ts b/multichain-testing/tools/registry.ts index d4b15c5b8b7..b61fd2fee72 100644 --- a/multichain-testing/tools/registry.ts +++ b/multichain-testing/tools/registry.ts @@ -7,6 +7,10 @@ export const makeGetFile = type GetFilePathFn = ReturnType; +export type MultichainRegistry = Awaited< + ReturnType> +>; + export const makeSetupRegistry = (getFile: GetFilePathFn) => { let initialized = false; /** diff --git a/multichain-testing/tools/sleep.ts b/multichain-testing/tools/sleep.ts index 66251a87dca..eca0392c1b7 100644 --- a/multichain-testing/tools/sleep.ts +++ b/multichain-testing/tools/sleep.ts @@ -28,11 +28,11 @@ const retryUntilCondition = async ( { maxRetries = 6, retryIntervalMs = 3500, - log = () => {}, + log = console.log, setTimeout = ambientSetTimeout, }: RetryOptions = {}, ): Promise => { - console.log({ maxRetries, retryIntervalMs, message }); + log({ maxRetries, retryIntervalMs, message }); let retries = 0; while (retries < maxRetries) { @@ -50,7 +50,7 @@ const retryUntilCondition = async ( } retries++; - console.log( + log( `Retry ${retries}/${maxRetries} - Waiting for ${retryIntervalMs}ms for ${message}...`, ); await sleep(retryIntervalMs, { log, setTimeout }); @@ -75,3 +75,5 @@ export const makeRetryUntilCondition = (defaultOptions: RetryOptions = {}) => { ...options, }); }; + +export type RetryUntilCondition = ReturnType; diff --git a/multichain-testing/tsconfig.json b/multichain-testing/tsconfig.json index d08285caec4..c0b1b588fec 100644 --- a/multichain-testing/tsconfig.json +++ b/multichain-testing/tsconfig.json @@ -1,10 +1,8 @@ { "extends": "../tsconfig.json", "include": [ - "tools", - "test" - ], - "compilerOptions": { - "checkJs": false - } + "src", + "tools", + "test" + ] } diff --git a/multichain-testing/yarn.lock b/multichain-testing/yarn.lock index 43128e1d183..dd151813436 100644 --- a/multichain-testing/yarn.lock +++ b/multichain-testing/yarn.lock @@ -5,18 +5,555 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/cosmic-proto@npm:0.4.1-dev-08f8549.0": - version: 0.4.1-dev-08f8549.0 - resolution: "@agoric/cosmic-proto@npm:0.4.1-dev-08f8549.0" +"@adraffy/ens-normalize@npm:1.10.1": + version: 1.10.1 + resolution: "@adraffy/ens-normalize@npm:1.10.1" + checksum: 10c0/fdd647604e8fac6204921888aaf5a6bc65eabf0d2921bc5f93b64d01f4bc33ead167c1445f7de05468d05cd92ac31b74c68d2be840c62b79d73693308f885c06 + languageName: node + linkType: hard + +"@agoric/async-flow@portal:../packages/async-flow::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/async-flow@portal:../packages/async-flow::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/babel-generator@npm:^7.17.6": + version: 7.17.6 + resolution: "@agoric/babel-generator@npm:7.17.6" dependencies: - "@cosmjs/amino": "npm:^0.32.3" - "@cosmjs/math": "npm:^0.32.3" + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/59db151ae737bd9b1f21c1589df4c7da9cbf484de5b5cc8352052825c2d977283d975303f55acb54d0210c176cb405da263073ceba1d3a6db65c6e21cc6e663f + languageName: node + linkType: hard + +"@agoric/base-zone@portal:../packages/base-zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/base-zone@portal:../packages/base-zone::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/casting@portal:../packages/casting::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/casting@portal:../packages/casting::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@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/base64": "npm:^1.0.5" - "@endo/init": "npm:^1.1.2" - checksum: 10c0/556544ec6e4d433c1866f7890ba62a37d278d402bd6567d4e1205a8715df0364ee836c865e09e9214be856026f9a9c5ba1fa47635ac7b0522f3963b0dbc741bb + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/init": "npm:^1.1.7" + "@endo/lockdown": "npm:^1.0.13" + "@endo/marshal": "npm:^1.6.2" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/client-utils@portal:../packages/client-utils::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/client-utils@portal:../packages/client-utils::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/casting": "npm:^0.4.3-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/smart-wallet": "npm:^0.5.4-u18.4" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@cosmjs/stargate": "npm:^0.32.3" + "@cosmjs/tendermint-rpc": "npm:^0.32.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/cosmic-proto@portal:../packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/cosmic-proto@portal:../packages/cosmic-proto::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@endo/base64": "npm:^1.0.9" + "@endo/init": "npm:^1.1.7" + bech32: "npm:^2.0.0" + query-string: "npm:^9.1.1" + languageName: node + linkType: soft + +"@agoric/ertp@portal:../packages/ERTP::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/ertp@portal:../packages/ERTP::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@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" + languageName: node + linkType: soft + +"@agoric/fast-usdc@portal:../packages/fast-usdc::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/fast-usdc@portal:../packages/fast-usdc::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/client-utils": "npm:^0.1.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/orchestration": "npm:^0.2.0-u18.4" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zoe": "npm:^0.26.3-u18.0" + "@cosmjs/proto-signing": "npm:^0.32.4" + "@cosmjs/stargate": "npm:^0.32.4" + "@endo/base64": "npm:^1.0.9" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@nick134-bit/noblejs": "npm:0.0.2" + bech32: "npm:^2.0.0" + commander: "npm:^12.1.0" + ethers: "npm:^6.13.4" + bin: + fast-usdc: ./src/cli/bin.js + languageName: node + linkType: soft + +"@agoric/governance@portal:../packages/governance::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/governance@portal:../packages/governance::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.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/zoe": "npm:^0.26.3-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + languageName: node + linkType: soft + +"@agoric/internal@portal:../packages/internal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/internal@portal:../packages/internal::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@endo/common": "npm:^1.2.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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/stream": "npm:^1.2.8" + anylogger: "npm:^0.21.0" + jessie.js: "npm:^0.3.4" + languageName: node + linkType: soft + +"@agoric/kmarshal@portal:../packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/kmarshal@portal:../packages/kmarshal::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + languageName: node + linkType: soft + +"@agoric/network@portal:../packages/network::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/network@portal:../packages/network::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/notifier@portal:../packages/notifier::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/notifier@portal:../packages/notifier::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/orchestration@portal:../packages/orchestration::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/orchestration@portal:../packages/orchestration::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/async-flow": "npm:^0.2.0-u18.0" + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@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.4" + "@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.9" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/patterns": "npm:^1.4.7" + "@noble/hashes": "npm:^1.5.0" + languageName: node + linkType: soft + +"@agoric/smart-wallet@portal:../packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/smart-wallet@portal:../packages/smart-wallet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vats": "npm:^0.16.0-u18.4" + "@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/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/store@portal:../packages/store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/store@portal:../packages/store::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/swing-store@portal:../packages/swing-store::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swing-store@portal:../packages/swing-store::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + better-sqlite3: "npm:^9.1.1" + languageName: node + linkType: soft + +"@agoric/swingset-liveslots@portal:../packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-liveslots@portal:../packages/swingset-liveslots::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@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/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/swingset-vat@portal:../packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-vat@portal:../packages/SwingSet::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/kmarshal": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swing-store": "npm:^0.10.0-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-xsnap-supervisor": "npm:^0.10.3-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/xsnap-lockdown": "npm:^0.14.1-u18.0" + "@endo/base64": "npm:^1.0.9" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/check-bundle": "npm:^1.0.12" + "@endo/compartment-mapper": "npm:^1.4.0" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/init": "npm:^1.1.7" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + "@endo/ses-ava": "npm:^1.2.8" + "@endo/stream": "npm:^1.2.8" + "@endo/zip": "npm:^1.0.9" + 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: + "@agoric/xsnap": ^0.14.2 + ava: ^5.3.0 + bin: + vat: bin/vat + languageName: node + linkType: soft + +"@agoric/swingset-xsnap-supervisor@portal:../packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/swingset-xsnap-supervisor@portal:../packages/swingset-xsnap-supervisor::locator=root-workspace-0b6124%40workspace%3A." + languageName: node + linkType: soft + +"@agoric/time@portal:../packages/time::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/time@portal:../packages/time::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/store": "npm:^0.9.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/nat": "npm:^5.0.13" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/vat-data@portal:../packages/vat-data::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vat-data@portal:../packages/vat-data::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/patterns": "npm:^1.4.7" + languageName: node + linkType: soft + +"@agoric/vats@portal:../packages/vats::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vats@portal:../packages/vats::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/cosmic-proto": "npm:^0.5.0-u18.4" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/governance": "npm:^0.10.4-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/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@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/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + import-meta-resolve: "npm:^2.2.1" + jessie.js: "npm:^0.3.4" + languageName: node + linkType: soft + +"@agoric/vow@portal:../packages/vow::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/vow@portal:../packages/vow::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@endo/env-options": "npm:^1.1.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + languageName: node + linkType: soft + +"@agoric/xsnap-lockdown@portal:../packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/xsnap-lockdown@portal:../packages/xsnap-lockdown::locator=root-workspace-0b6124%40workspace%3A." + languageName: node + linkType: soft + +"@agoric/zoe@portal:../packages/zoe::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zoe@portal:../packages/zoe::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/ertp": "npm:^0.16.3-u18.0" + "@agoric/internal": "npm:^0.4.0-u18.0" + "@agoric/notifier": "npm:^0.7.0-u18.0" + "@agoric/store": "npm:^0.9.3-u18.0" + "@agoric/swingset-liveslots": "npm:^0.10.3-u18.0" + "@agoric/swingset-vat": "npm:^0.33.0-u18.0" + "@agoric/time": "npm:^0.3.3-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@agoric/vow": "npm:^0.2.0-u18.0" + "@agoric/zone": "npm:^0.3.0-u18.0" + "@endo/bundle-source": "npm:^3.5.0" + "@endo/captp": "npm:^4.4.3" + "@endo/common": "npm:^1.2.8" + "@endo/errors": "npm:^1.2.8" + "@endo/eventual-send": "npm:^1.2.8" + "@endo/exo": "npm:^1.5.7" + "@endo/far": "npm:^1.1.9" + "@endo/import-bundle": "npm:^1.3.2" + "@endo/marshal": "npm:^1.6.2" + "@endo/nat": "npm:^5.0.13" + "@endo/pass-style": "npm:^1.4.7" + "@endo/patterns": "npm:^1.4.7" + "@endo/promise-kit": "npm:^1.1.8" + yargs-parser: "npm:^21.1.1" + languageName: node + linkType: soft + +"@agoric/zone@portal:../packages/zone::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@agoric/zone@portal:../packages/zone::locator=root-workspace-0b6124%40workspace%3A." + dependencies: + "@agoric/base-zone": "npm:^0.1.1-u18.0" + "@agoric/vat-data": "npm:^0.5.3-u18.0" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/pass-style": "npm:^1.4.7" + languageName: node + linkType: soft + +"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" + dependencies: + "@babel/parser": "npm:^7.26.3" + "@babel/types": "npm:^7.26.3" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/54f260558e3e4ec8942da3cde607c35349bb983c3a7c5121243f96893fba3e8cd62e1f1773b2051f936f8c8a10987b758d5c7d76dbf2784e95bb63ab4843fa00 + languageName: node + linkType: hard + +"@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-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/parser@npm:^7.23.6, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": "npm:^7.26.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/48f736374e61cfd10ddbf7b80678514ae1f16d0e88bc793d2b505d73d9b987ea786fc8c2f7ee8f8b8c467df062030eb07fd0eb2168f0f541ca1f542775852cad languageName: node linkType: hard @@ -29,6 +566,42 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@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.23.6": + version: 7.26.4 + resolution: "@babel/traverse@npm:7.26.4" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.3" + "@babel/parser": "npm:^7.26.3" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.3" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/cf25d0eda9505daa0f0832ad786b9e28c9d967e823aaf7fbe425250ab198c656085495aa6bed678b27929e095c84eea9fd778b851a31803da94c9bc4bf4eaef7 + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/966c5242c5e55c8704bf7a7418e7be2703a0afa4d19a8480999d5a4ef13d095dd60686615fe5983cb7593b4b06ba3a7de8d6ca501c1d78bdd233a10d90be787b + languageName: node + linkType: hard + "@chain-registry/client@npm:1.18.1": version: 1.18.1 resolution: "@chain-registry/client@npm:1.18.1" @@ -79,6 +652,18 @@ __metadata: languageName: node linkType: hard +"@cosmjs/amino@npm:0.32.3": + version: 0.32.3 + resolution: "@cosmjs/amino@npm:0.32.3" + dependencies: + "@cosmjs/crypto": "npm:^0.32.3" + "@cosmjs/encoding": "npm:^0.32.3" + "@cosmjs/math": "npm:^0.32.3" + "@cosmjs/utils": "npm:^0.32.3" + checksum: 10c0/6f3da2ba6d88257d6717898af798aad9f2a51bb2c0d0b61cd40cf103c86a1431f4fa5086df350f81371d3282b8a28bcbc4f97c6d9eb83a9831fad473ae1ab492 + languageName: node + linkType: hard + "@cosmjs/amino@npm:^0.32.3, @cosmjs/amino@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/amino@npm:0.32.4" @@ -91,22 +676,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/crypto@npm:^0.32.3": - version: 0.32.3 - resolution: "@cosmjs/crypto@npm:0.32.3" - dependencies: - "@cosmjs/encoding": "npm:^0.32.3" - "@cosmjs/math": "npm:^0.32.3" - "@cosmjs/utils": "npm:^0.32.3" - "@noble/hashes": "npm:^1" - bn.js: "npm:^5.2.0" - elliptic: "npm:^6.5.4" - libsodium-wrappers-sumo: "npm:^0.7.11" - checksum: 10c0/6925ee15c31d2ed6dfbda666834b188f81706d9c83b9afef27d88e4330cf516addcfcb7f9374dc4513bfea27c5fc717ff49679de9c45b282e601c93b67ac7c98 - languageName: node - linkType: hard - -"@cosmjs/crypto@npm:^0.32.4": +"@cosmjs/crypto@npm:^0.32.3, @cosmjs/crypto@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/crypto@npm:0.32.4" dependencies: @@ -121,6 +691,17 @@ __metadata: languageName: node linkType: hard +"@cosmjs/encoding@npm:0.32.3": + version: 0.32.3 + resolution: "@cosmjs/encoding@npm:0.32.3" + dependencies: + base64-js: "npm:^1.3.0" + bech32: "npm:^1.1.4" + readonly-date: "npm:^1.0.0" + checksum: 10c0/3c3d4b610093c2c8ca13437664e4736d60cdfb309bf2671f492388c59a9bca20f1a75ab4686a7b73d48aa6208f454bee56c84c0fe780015473ea53353a70266a + languageName: node + linkType: hard + "@cosmjs/encoding@npm:^0.32.3, @cosmjs/encoding@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/encoding@npm:0.32.4" @@ -142,6 +723,15 @@ __metadata: languageName: node linkType: hard +"@cosmjs/math@npm:0.32.3": + version: 0.32.3 + resolution: "@cosmjs/math@npm:0.32.3" + dependencies: + bn.js: "npm:^5.2.0" + checksum: 10c0/cad8b13a0db739ef4a416b334e39ea9f55874315ebdf91dc38772676c2ead6caccaf8a28b9e8803fc48680a72cf5a9fde97564f5efbfbe9a9073c95665f31294 + languageName: node + linkType: hard + "@cosmjs/math@npm:^0.32.3, @cosmjs/math@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/math@npm:0.32.4" @@ -151,7 +741,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/proto-signing@npm:^0.32.3": +"@cosmjs/proto-signing@npm:0.32.3": version: 0.32.3 resolution: "@cosmjs/proto-signing@npm:0.32.3" dependencies: @@ -165,7 +755,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/proto-signing@npm:^0.32.4": +"@cosmjs/proto-signing@npm:^0.32.3, @cosmjs/proto-signing@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/proto-signing@npm:0.32.4" dependencies: @@ -191,7 +781,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stargate@npm:^0.32.3": +"@cosmjs/stargate@npm:0.32.3": version: 0.32.3 resolution: "@cosmjs/stargate@npm:0.32.3" dependencies: @@ -209,7 +799,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stargate@npm:^0.32.4": +"@cosmjs/stargate@npm:^0.32.3, @cosmjs/stargate@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/stargate@npm:0.32.4" dependencies: @@ -227,16 +817,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stream@npm:^0.32.3": - version: 0.32.3 - resolution: "@cosmjs/stream@npm:0.32.3" - dependencies: - xstream: "npm:^11.14.0" - checksum: 10c0/963abad76c044265e6961add2a66060134dd610ced9397edcd331669e5aca2a157cc08db658590110233038c38fc5812a9e8d156babbf524eb291200a3708b3a - languageName: node - linkType: hard - -"@cosmjs/stream@npm:^0.32.4": +"@cosmjs/stream@npm:^0.32.3, @cosmjs/stream@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/stream@npm:0.32.4" dependencies: @@ -263,284 +844,305 @@ __metadata: languageName: node linkType: hard -"@cosmjs/utils@npm:^0.32.3": - version: 0.32.3 - resolution: "@cosmjs/utils@npm:0.32.3" - checksum: 10c0/e21cb0387d135142fdebe64fadfe2f7c9446b8b974b9d0dff7a02f04e17e79fcfc3946258ad79af1db35b252058d97c38e1f90f2f14e903a37d85316f31efde6 - languageName: node - linkType: hard - -"@cosmjs/utils@npm:^0.32.4": +"@cosmjs/utils@npm:^0.32.3, @cosmjs/utils@npm:^0.32.4": version: 0.32.4 resolution: "@cosmjs/utils@npm:0.32.4" checksum: 10c0/d5ff8b235094be1150853a715116049f73eb5cdfeea8ce8e22ecccc61ec99792db457404d4307782b1a2f935dcf438f5c485beabfcfbc1dc5df26eb6e6da9062 languageName: node linkType: hard -"@endo/base64@npm:^1.0.5, @endo/base64@npm:^1.0.7": - version: 1.0.7 - resolution: "@endo/base64@npm:1.0.7" - checksum: 10c0/aab10f433f8ea588ebd1786188b6660c0be3a743c119ef2df52ee23afd4ce3844b1d954028952569a747f6657287aeced875afe8e136ea8bff4ba146a60578bd +"@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/env-options@npm:^1.1.6": - version: 1.1.6 - resolution: "@endo/env-options@npm:1.1.6" - checksum: 10c0/0001b1cba6954cccfa40104f819378f2f5c8babc89103213a8a5da4f8f94248c8389bfa06ec37cecae81edabe570428558399313d649c64ad7c90743f563dea2 +"@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/errors@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/errors@npm:1.2.5" +"@endo/captp@npm:^4.4.3": + version: 4.4.3 + resolution: "@endo/captp@npm:4.4.3" dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/32eac3b332139ddec8a85a0013645482541e4f3cc0c484073dde430087f27bb683cde8b0a6e399c5b7f07af007c3b6aa589cf31935a8b8d69e5f869bf71a1662 + "@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/eventual-send@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/eventual-send@npm:1.2.5" +"@endo/check-bundle@npm:^1.0.12": + version: 1.0.12 + resolution: "@endo/check-bundle@npm:1.0.12" dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/7eaa30628582f768920659e4894b871c1056da4252b82b8ad70ed49a24c4559efb8d1655a6845984a0eae83d328179e4272b0917007a2f147dc8b15ecb0ecc52 + "@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/far@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/far@npm:1.1.5" - 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/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/init@npm:^1.1.2, @endo/init@npm:^1.1.4": - version: 1.1.4 - resolution: "@endo/init@npm:1.1.4" +"@endo/common@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/common@npm:1.2.8" 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 + "@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/lockdown@npm:^1.0.10": - version: 1.0.10 - resolution: "@endo/lockdown@npm:1.0.10" +"@endo/compartment-mapper@npm:^1.4.0": + version: 1.4.0 + resolution: "@endo/compartment-mapper@npm:1.4.0" dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/94be0c1b14cacb2d8088dcc17998e901159a028c51170d78a8cc6a820ae76cabc7d2694f1a1956cb4eab70a8c9a0c8254d88ea4c3f3d9725b739aacf6db83d5b + "@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/nat@npm:^5.0.10": - version: 5.0.10 - resolution: "@endo/nat@npm:5.0.10" - checksum: 10c0/7ad2aa2d216d517409c771aebb465aceb6ea8b88ec808c2dc030d7ffc7fe7d601d8401572f3866384a63ff2aa74209a22f29e1561e773d91d7ad2d81fa13fc7e +"@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/pass-style@npm:^1.4.3": - version: 1.4.3 - resolution: "@endo/pass-style@npm:1.4.3" +"@endo/errors@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/errors@npm:1.2.8" 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" - "@fast-check/ava": "npm:^1.1.5" - checksum: 10c0/f24c528b1219f5aa122f9a04e80459dec3e9664e7849019b172ad8354870b849b643c8dfc79104857827457d66b2bb09bade9b2c6ea717a97e613ecf6d53c1f9 + ses: "npm:^1.10.0" + checksum: 10c0/3f33fc7119ab840ad0f5bdfb70e73cc99630f09593c31928e30de4d9c8e898c85397c5170964d54c819a757a74d3b005f6275480ff8d0f1aa2aa8ef872852e97 languageName: node linkType: hard -"@endo/promise-kit@npm:^1.1.5": - version: 1.1.5 - resolution: "@endo/promise-kit@npm:1.1.5" +"@endo/evasive-transform@npm:^1.3.3": + version: 1.3.3 + resolution: "@endo/evasive-transform@npm:1.3.3" dependencies: - ses: "npm:^1.8.0" - checksum: 10c0/3a9fb59546507dbbb8c83ada4de664ca4f6085ffcb56c9e3e07789e002e717454b1ee5ae1273549935a7e77ac42be7ae8ddca94ff6d4f16914210d31159ce1a4 + "@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/ses-ava@npm:^1.2.5": - version: 1.2.5 - resolution: "@endo/ses-ava@npm:1.2.5" +"@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.6" - "@endo/init": "npm:^1.1.4" - ses: "npm:^1.8.0" - peerDependencies: - ava: ^5.3.0 || ^6.1.2 - checksum: 10c0/cabde169f565d9a61f5d41040599c43b5675f6220f66d4d6a56d351e1465434e94b52b1d664444fbd57d4b8700fa97ac9886fc806f5172552c3318269347c376 - languageName: node - linkType: hard - -"@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 - -"@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 - -"@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 - -"@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 - -"@esbuild/darwin-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-arm64@npm:0.21.5" - conditions: os=darwin & cpu=arm64 + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/d7c16c935441b67d029fcb6785f425a1194fb7f936e4b20dde21eb393266cb7366edf7a95d3fdfa96cd4a3246a3659a06d0dbb3c1217045e1718e1cf34c7a3bd languageName: node linkType: hard -"@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 - -"@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 - -"@esbuild/freebsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-x64@npm:0.21.5" - conditions: os=freebsd & cpu=x64 +"@endo/exo@npm:^1.5.7": + version: 1.5.7 + resolution: "@endo/exo@npm:1.5.7" + dependencies: + "@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 -"@esbuild/linux-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm64@npm:0.21.5" - conditions: os=linux & cpu=arm64 +"@endo/far@npm:^1.0.0, @endo/far@npm:^1.1.9": + version: 1.1.9 + resolution: "@endo/far@npm:1.1.9" + dependencies: + "@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 -"@esbuild/linux-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm@npm:0.21.5" - conditions: os=linux & cpu=arm +"@endo/import-bundle@npm:^1.3.2": + version: 1.3.2 + resolution: "@endo/import-bundle@npm:1.3.2" + dependencies: + "@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 -"@esbuild/linux-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ia32@npm:0.21.5" - conditions: os=linux & cpu=ia32 +"@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 -"@esbuild/linux-loong64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-loong64@npm:0.21.5" - conditions: os=linux & cpu=loong64 +"@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 -"@esbuild/linux-mips64el@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-mips64el@npm:0.21.5" - conditions: os=linux & cpu=mips64el +"@endo/marshal@npm:^1.6.2": + version: 1.6.2 + resolution: "@endo/marshal@npm:1.6.2" + dependencies: + "@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 -"@esbuild/linux-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ppc64@npm:0.21.5" - conditions: os=linux & cpu=ppc64 +"@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 -"@esbuild/linux-riscv64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-riscv64@npm:0.21.5" - conditions: os=linux & cpu=riscv64 +"@endo/nat@npm:^5.0.13": + version: 5.0.13 + resolution: "@endo/nat@npm:5.0.13" + checksum: 10c0/78578de4567c9bc4c6f50638c688886c07c38177a8d44192230d344221da06ccffc6d9ef8d423e27198d864ed7c57ef5ced9b1d05922eaa4e40bf82856b1aa11 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-s390x@npm:0.21.5" - conditions: os=linux & cpu=s390x +"@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.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/ee30e011fb08c292718a315f2ebd5ee2da6d918bf2cdaf2b269e123207c642fa1525493c41180db8c941e1a1959369730114b116656c99e8bb107ca5917f3f4e languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-x64@npm:0.21.5" - conditions: os=linux & cpu=x64 +"@endo/patterns@npm:^1.4.7": + version: 1.4.7 + resolution: "@endo/patterns@npm:1.4.7" + dependencies: + "@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 -"@esbuild/netbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/netbsd-x64@npm:0.21.5" - conditions: os=netbsd & cpu=x64 +"@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 -"@esbuild/openbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/openbsd-x64@npm:0.21.5" - conditions: os=openbsd & cpu=x64 +"@endo/ses-ava@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/ses-ava@npm:1.2.8" + dependencies: + "@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/c1ef65d182f3bfa1ec0d5d0434da9d28bb0925f485629fcd5c42dc89db99e65a5b44e352e1fd2a577778b2905d6f36b009e4f2953aa0257ec1b049019e37b2cf languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/sunos-x64@npm:0.21.5" - conditions: os=sunos & cpu=x64 +"@endo/stream@npm:^1.2.8": + version: 1.2.8 + resolution: "@endo/stream@npm:1.2.8" + dependencies: + "@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 -"@esbuild/win32-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-arm64@npm:0.21.5" - conditions: os=win32 & cpu=arm64 +"@endo/trampoline@npm:^1.0.3": + version: 1.0.3 + resolution: "@endo/trampoline@npm:1.0.3" + checksum: 10c0/be0c3784b17f422ae04e28a6722e2abd193a5585a82acf5eb388476094c026aa5e76a383db887bdf6a032ccf0a12c38a967f5f1e71cef44a4659606be789b548 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-ia32@npm:0.21.5" - conditions: os=win32 & cpu=ia32 +"@endo/where@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/where@npm:1.0.9" + checksum: 10c0/dd8f8fb601fb54e7cef64d7b32f91595d01151acf1e63c46257c905afb75760d80f2eec5d71cfb1f9251e435990256d56f35d6f8b4851f5e6fbe6b393b535028 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-x64@npm:0.21.5" - conditions: os=win32 & cpu=x64 +"@endo/zip@npm:^1.0.9": + version: 1.0.9 + resolution: "@endo/zip@npm:1.0.9" + checksum: 10c0/3fccea31bd5dad938a3b5f531454d3c49513892d6d5aba1f0af1034ff0ae54c3e28a346a9df08bd9e5201354acccd631e45c9c0e68fa2848a876a3919f3830dc languageName: node linkType: hard @@ -555,10 +1157,10 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.1 - resolution: "@eslint-community/regexpp@npm:4.10.1" - checksum: 10c0/f59376025d0c91dd9fdf18d33941df499292a3ecba3e9889c360f3f6590197d30755604588786cdca0f9030be315a26b206014af4b65c0ff85b4ec49043de780 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard @@ -622,37 +1224,72 @@ __metadata: languageName: node linkType: hard -"@isaacs/cached@npm:^1.0.1": - version: 1.0.1 - resolution: "@isaacs/cached@npm:1.0.1" +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" dependencies: - "@isaacs/catcher": "npm:^1.0.0" - checksum: 10c0/1c15dc2a60873f2c73f4b04ed59ecfc8d9679976ff09af1b5b45e7273a590a4f86a339cc4c785c2d22309277ca47293611af20dd7d41550cdcfb53e06a04ac65 + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e languageName: node linkType: hard -"@isaacs/catcher@npm:^1.0.0, @isaacs/catcher@npm:^1.0.4": - version: 1.0.4 - resolution: "@isaacs/catcher@npm:1.0.4" - checksum: 10c0/d8b77e2c6b84a6301d390d0b2badea1b4a321f2e8ba662645b045efc42f20a54a6c760f3181fab4ed0d90da58f2cb084a93490a892c53b4da21ec05278b8ba4f +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@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/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 languageName: node linkType: hard -"@mapbox/node-pre-gyp@npm:^1.0.5": +"@mapbox/node-pre-gyp@npm:^1.0.11": version: 1.0.11 resolution: "@mapbox/node-pre-gyp@npm:1.0.11" dependencies: @@ -671,6 +1308,36 @@ __metadata: languageName: node linkType: hard +"@nick134-bit/noblejs@npm:0.0.2": + version: 0.0.2 + resolution: "@nick134-bit/noblejs@npm:0.0.2" + dependencies: + "@cosmjs/amino": "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" + typescript: "npm:^5.4.5" + checksum: 10c0/93a0d28459caf9649722d085f8a06f828ad878c2a2948beeb38eb583ebcb305ba15bff5f66ccc712e6068df93fb0cbd1b09bdf7681cc72ef37138f8c5484c287 + languageName: node + linkType: hard + +"@noble/curves@npm:1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": "npm:1.3.2" + checksum: 10c0/0bac7d1bbfb3c2286910b02598addd33243cb97c3f36f987ecc927a4be8d7d88e0fcb12b0f0ef8a044e7307d1844dd5c49bb724bfa0a79c8ec50ba60768c97f6 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: 10c0/2482cce3bce6a596626f94ca296e21378e7a5d4c09597cbc46e65ffacc3d64c8df73111f2265444e36a3168208628258bbbaccba2ef24f65f58b2417638a20e7 + languageName: node + linkType: hard + "@noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.2.0": version: 1.4.0 resolution: "@noble/hashes@npm:1.4.0" @@ -678,6 +1345,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:^1.5.0": + version: 1.6.1 + resolution: "@noble/hashes@npm:1.6.1" + checksum: 10c0/27643cd8b551bc933b57cc29aa8c8763d586552fc4c3e06ecf7897f55be3463c0c9dff7f6ebacd88e5ce6d0cdb5415ca4874d0cf4359b5ea4a85be21ada03aab + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -705,25 +1379,25 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" +"@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/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 languageName: node linkType: hard @@ -807,13 +1481,79 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^4.0.0": - version: 4.2.1 - resolution: "@rollup/pluginutils@npm:4.2.1" +"@rollup/plugin-commonjs@npm:^19.0.0": + version: 19.0.2 + resolution: "@rollup/plugin-commonjs@npm:19.0.2" dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + commondir: "npm:^1.0.1" estree-walker: "npm:^2.0.1" + glob: "npm:^7.1.6" + is-reference: "npm:^1.2.1" + magic-string: "npm:^0.25.7" + resolve: "npm:^1.17.0" + peerDependencies: + rollup: ^2.38.3 + checksum: 10c0/9adccf77ad835cbe565da4385212f1e54c3e0dca2be174b5c2cfe89cfaeb240f42c7673e97e49b21b7c66ed901cc1c711552b6727f60b43a953ce996eb2868a7 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": "npm:^5.1.0" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^13.0.0": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": "npm:^3.1.0" + "@types/resolve": "npm:1.17.1" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.1.0" + is-module: "npm:^1.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + rollup: ^2.42.0 + checksum: 10c0/6caa32a8304a20f1c9953111b25e9543f4de7d254958d81ce0158ad909e4493946bc2060c4ace23d9748b560ebc84c920ee7bc1b7d50dbf8ba852ef13c91af58 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" picomatch: "npm:^2.2.2" - checksum: 10c0/3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48 + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.1.0, @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" + 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/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb languageName: node linkType: hard @@ -848,10 +1588,17 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 languageName: node linkType: hard @@ -865,7 +1612,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12": +"@types/json-schema@npm:*": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -888,151 +1635,151 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 20.14.5 - resolution: "@types/node@npm:20.14.5" +"@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.0.0": + version: 22.7.8 + resolution: "@types/node@npm:22.7.8" dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/06a8c304b5f7f190d4497807dc67ad09ee7b14ea2996bfdc823553c624698d8cab1ef9d16f8b764f20cb9eb11caa0e832787741e9ef70e1c89d620797ab28436 + undici-types: "npm:~6.19.2" + checksum: 10c0/3d3b3a2ec5a57ca4fd37b34dce415620993ca5f87cea2c728ffe73aa31446dbfe19c53171c478447bd7d78011ef4845a46ab2f0dc38e699cc75b3d100a60c690 languageName: node linkType: hard -"@types/node@npm:>=13.7.0, @types/node@npm:^20.11.13": - version: 20.14.2 - resolution: "@types/node@npm:20.14.2" +"@types/node@npm:22.7.5": + version: 22.7.5 + resolution: "@types/node@npm:22.7.5" dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/2d86e5f2227aaa42212e82ea0affe72799111b888ff900916376450b02b09b963ca888b20d9c332d8d2b833ed4781987867a38eaa2e4863fa8439071468b0a6f + undici-types: "npm:~6.19.2" + checksum: 10c0/cf11f74f1a26053ec58066616e3a8685b6bcd7259bc569738b8f752009f9f0f7f85a1b2d24908e5b0f752482d1e8b6babdf1fbb25758711ec7bb9500bfcd6e60 languageName: node linkType: hard -"@types/semver@npm:^7.5.0": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa +"@types/resolve@npm:1.17.1": + version: 1.17.1 + resolution: "@types/resolve@npm:1.17.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.20.0": - version: 6.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" +"@typescript-eslint/eslint-plugin@npm:^8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.17.0" dependencies: - "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/type-utils": "npm:6.21.0" - "@typescript-eslint/utils": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" - debug: "npm:^4.3.4" + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/type-utils": "npm:8.17.0" + "@typescript-eslint/utils": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.4" + ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/f911a79ee64d642f814a3b6cdb0d324b5f45d9ef955c5033e78903f626b7239b4aa773e464a38c3e667519066169d983538f2bf8e5d00228af587c9d438fb344 + checksum: 10c0/d78778173571a9a1370345bc2aa3e850235a489d16b8a8b5ba3086b988bbef7549bdae38e509d7a679ba3179c688cc5a408376b158be402770836e94ffc9602d languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.20.0": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" +"@typescript-eslint/parser@npm:^8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/parser@npm:8.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/typescript-estree": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a8f99820679decd0d115c0af61903fb1de3b1b5bec412dc72b67670bf636de77ab07f2a68ee65d6da7976039bbf636907f9d5ca546db3f0b98a31ffbc225bc7d + checksum: 10c0/2543deadf01302a92d3b6f58a4c14f98d8936c4d976e7da05e3bb65608f19d8de93b25282e343c304eca3e3f37f2ac23e97fa9c11c6edff36dd2d4f6b601a630 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" +"@typescript-eslint/scope-manager@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/scope-manager@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" - checksum: 10c0/eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526 + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" + checksum: 10c0/0c08d14240bad4b3f6874f08ba80b29db1a6657437089a6f109db458c544d835bcdc06ba9140bb4f835233ba4326d9a86e6cf6bdb5209960d2f7025aa3191f4f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/type-utils@npm:6.21.0" +"@typescript-eslint/type-utils@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/type-utils@npm:8.17.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.21.0" - "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" + "@typescript-eslint/utils": "npm:8.17.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.0.1" + ts-api-utils: "npm:^1.3.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/7409c97d1c4a4386b488962739c4f1b5b04dc60cf51f8cd88e6b12541f84d84c6b8b67e491a147a2c95f9ec486539bf4519fb9d418411aef6537b9c156468117 + checksum: 10c0/6138ec71b5692d4b5e0bf3d7f66a6fa4e91ddea7031907b0ac45a7693df0a2f4cc5bca7218311e0639620d636ceb7efec83a137dfcd5938304d873b774fcc8bd languageName: node linkType: hard -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 10c0/020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d +"@typescript-eslint/types@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/types@npm:8.17.0" + checksum: 10c0/26b1bf9dfc3ee783c85c6f354b84c28706d5689d777f3ff2de2cb496e45f9d0189c0d561c03ccbc8b24712438be17cf63dd0871ff3ca2083e7f48749770d1893 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" +"@typescript-eslint/typescript-estree@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/visitor-keys": "npm:6.21.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/visitor-keys": "npm:8.17.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f + checksum: 10c0/523013f9b5cf2c58c566868e4c3b0b9ac1b4807223a6d64e2a7c58e01e53b6587ba61f1a8241eade361f3f426d6057657515473176141ef8aebb352bc0d223ce languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" +"@typescript-eslint/utils@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/utils@npm:8.17.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@types/json-schema": "npm:^7.0.12" - "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.21.0" - "@typescript-eslint/types": "npm:6.21.0" - "@typescript-eslint/typescript-estree": "npm:6.21.0" - semver: "npm:^7.5.4" + "@typescript-eslint/scope-manager": "npm:8.17.0" + "@typescript-eslint/types": "npm:8.17.0" + "@typescript-eslint/typescript-estree": "npm:8.17.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 10c0/ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/a9785ae5f7e7b51d521dc3f48b15093948e4fcd03352c0b60f39bae366cbc935947d215f91e2ae3182d52fa6affb5ccbb50feff487bd1209011f3e0da02cdf07 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@typescript-eslint/visitor-keys@npm:8.17.0": + version: 8.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.17.0" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf + "@typescript-eslint/types": "npm:8.17.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/9144c4e4a63034fb2031a0ee1fc77e80594f30cab3faafa9a1f7f83782695774dd32fac8986f260698b4e150b4dd52444f2611c07e4c101501f08353eb47c82c languageName: node linkType: hard @@ -1043,25 +1790,25 @@ __metadata: languageName: node linkType: hard -"@vercel/nft@npm:^0.26.2": - version: 0.26.5 - resolution: "@vercel/nft@npm:0.26.5" +"@vercel/nft@npm:^0.27.5": + version: 0.27.7 + resolution: "@vercel/nft@npm:0.27.7" dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.5" - "@rollup/pluginutils": "npm:^4.0.0" + "@mapbox/node-pre-gyp": "npm:^1.0.11" + "@rollup/pluginutils": "npm:^5.1.3" acorn: "npm:^8.6.0" - acorn-import-attributes: "npm:^1.9.2" + acorn-import-attributes: "npm:^1.9.5" async-sema: "npm:^3.1.1" bindings: "npm:^1.4.0" estree-walker: "npm:2.0.2" glob: "npm:^7.1.3" graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.2" + micromatch: "npm:^4.0.8" node-gyp-build: "npm:^4.2.2" resolve-from: "npm:^5.0.0" bin: nft: out/cli.js - checksum: 10c0/b7034b2f851384f26316c856a731c0973a99bd02f6bb349916a750328a4919944ed6fd12c321b38ec6535d29dfb627d7fa8ab0f1e8c1c3cabd71e3350bd77548 + checksum: 10c0/bf6c1572e436e46e83d38c837fd715603b816fdfc5109f55f9898ed25011dfaba6c1cc979457db81238021854db5ba60c3b5bb263b843e24c4ebedb02b6ec2fe languageName: node linkType: hard @@ -1086,7 +1833,7 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.2": +"acorn-import-attributes@npm:^1.9.5": version: 1.9.5 resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: @@ -1104,19 +1851,28 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.3.2": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 +"acorn-walk@npm:^8.3.4": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.6.0, acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.11.0, acorn@npm:^8.13.0, acorn@npm:^8.2.4, acorn@npm:^8.6.0, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"aes-js@npm:4.0.0-beta.5": + version: 4.0.0-beta.5 + resolution: "aes-js@npm:4.0.0-beta.5" + checksum: 10c0/444f4eefa1e602cbc4f2a3c644bc990f93fd982b148425fee17634da510586fc09da940dcf8ace1b2d001453c07ff042e55f7a0482b3cc9372bf1ef75479090c languageName: node linkType: hard @@ -1129,22 +1885,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 languageName: node linkType: hard @@ -1190,6 +1934,13 @@ __metadata: languageName: node linkType: hard +"anylogger@npm:^0.21.0": + version: 0.21.0 + resolution: "anylogger@npm:0.21.0" + checksum: 10c0/1ca7fcf5bc2b78d1e1d9b8c8cc7ce50b5c6cc67a8da5a28c9c975b7b46fff255a04abab02de38a5139190c9d8b34b3d6c59af6724521b077f7d7dfbad9b47a9c + languageName: node + linkType: hard + "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -1230,13 +1981,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 - languageName: node - linkType: hard - "arrgv@npm:^1.0.2": version: 1.0.2 resolution: "arrgv@npm:1.0.2" @@ -1272,18 +2016,18 @@ __metadata: languageName: node linkType: hard -"ava@npm:^6.1.3": - version: 6.1.3 - resolution: "ava@npm:6.1.3" +"ava@npm:^6.2.0": + version: 6.2.0 + resolution: "ava@npm:6.2.0" dependencies: - "@vercel/nft": "npm:^0.26.2" - acorn: "npm:^8.11.3" - acorn-walk: "npm:^8.3.2" + "@vercel/nft": "npm:^0.27.5" + acorn: "npm:^8.13.0" + acorn-walk: "npm:^8.3.4" ansi-styles: "npm:^6.2.1" arrgv: "npm:^1.0.2" arrify: "npm:^3.0.0" - callsites: "npm:^4.1.0" - cbor: "npm:^9.0.1" + callsites: "npm:^4.2.0" + cbor: "npm:^9.0.2" chalk: "npm:^5.3.0" chunkd: "npm:^2.0.1" ci-info: "npm:^4.0.0" @@ -1293,10 +2037,10 @@ __metadata: common-path-prefix: "npm:^3.0.0" concordance: "npm:^5.0.4" currently-unhandled: "npm:^0.4.1" - debug: "npm:^4.3.4" - emittery: "npm:^1.0.1" - figures: "npm:^6.0.1" - globby: "npm:^14.0.0" + debug: "npm:^4.3.7" + emittery: "npm:^1.0.3" + figures: "npm:^6.1.0" + globby: "npm:^14.0.2" ignore-by-default: "npm:^2.1.0" indent-string: "npm:^5.0.0" is-plain-object: "npm:^5.0.0" @@ -1304,17 +2048,17 @@ __metadata: matcher: "npm:^5.0.0" memoize: "npm:^10.0.0" ms: "npm:^2.1.3" - p-map: "npm:^7.0.1" + p-map: "npm:^7.0.2" package-config: "npm:^5.0.0" - picomatch: "npm:^3.0.1" + picomatch: "npm:^4.0.2" plur: "npm:^5.1.0" - pretty-ms: "npm:^9.0.0" + pretty-ms: "npm:^9.1.0" resolve-cwd: "npm:^3.0.0" stack-utils: "npm:^2.0.6" strip-ansi: "npm:^7.1.0" supertap: "npm:^3.0.1" temp-dir: "npm:^3.0.0" - write-file-atomic: "npm:^5.0.1" + write-file-atomic: "npm:^6.0.0" yargs: "npm:^17.7.2" peerDependencies: "@ava/typescript": "*" @@ -1323,7 +2067,7 @@ __metadata: optional: true bin: ava: entrypoints/cli.mjs - checksum: 10c0/108b28aceb0dfdb077bcf4c96109d736667999c2ce9f564489c4747482ea0e0c455d4d96fdfaad610b1125b74129b7b1d2ce570ec4903e767f6950d7f722f2cd + checksum: 10c0/25a37413c9ee1b5322dc5a266f546236ea4b52e5c04ae4b52a7b26db9263eebe2dbcda687bf4d464867e558e9148e4567aa09a7ec91d46e3218ab93204e3c653 languageName: node linkType: hard @@ -1345,7 +2089,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.0": +"base64-js@npm:^1.3.0, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf @@ -1359,6 +2103,24 @@ __metadata: languageName: node linkType: hard +"bech32@npm:^2.0.0": + version: 2.0.0 + resolution: "bech32@npm:2.0.0" + checksum: 10c0/45e7cc62758c9b26c05161b4483f40ea534437cf68ef785abadc5b62a2611319b878fef4f86ddc14854f183b645917a19addebc9573ab890e19194bc8f521942 + languageName: node + linkType: hard + +"better-sqlite3@npm:^9.1.1": + version: 9.6.0 + resolution: "better-sqlite3@npm:9.6.0" + dependencies: + bindings: "npm:^1.5.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + checksum: 10c0/8db9b38f414e26a56d4c40fc16e94a253118491dae0e2c054338a9e470f1a883c7eb4cb330f2f5737db30f704d4f2e697c59071ca04e03364ee9fe04375aa9c8 + languageName: node + linkType: hard + "bfs-path@npm:^1.0.2": version: 1.0.2 resolution: "bfs-path@npm:1.0.2" @@ -1373,7 +2135,7 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.4.0": +"bindings@npm:^1.4.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -1391,6 +2153,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + "blueimp-md5@npm:^2.10.0": version: 2.19.0 resolution: "blueimp-md5@npm:2.19.0" @@ -1447,11 +2220,28 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": "npm:^3.1.0" + "@npmcli/fs": "npm:^4.0.0" fs-minipass: "npm:^3.0.0" glob: "npm:^10.2.2" lru-cache: "npm:^10.0.1" @@ -1459,11 +2249,11 @@ __metadata: minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c languageName: node linkType: hard @@ -1487,14 +2277,14 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^4.1.0": - version: 4.1.0 - resolution: "callsites@npm:4.1.0" - checksum: 10c0/91700844127a6dcd4792d231a12dd8e9ec10525eb9962180a8558417d7e3f443e52a4f14746ad2838eaf14f79431ee1539d13bd188da280f720a06a91bd1157a +"callsites@npm:^4.2.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 languageName: node linkType: hard -"cbor@npm:^9.0.1": +"cbor@npm:^9.0.2": version: 9.0.2 resolution: "cbor@npm:9.0.2" dependencies: @@ -1520,6 +2310,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -1527,6 +2324,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + "chunkd@npm:^2.0.1": version: 2.0.1 resolution: "chunkd@npm:2.0.1" @@ -1555,13 +2359,6 @@ __metadata: languageName: node linkType: hard -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - "cli-truncate@npm:^4.0.0": version: 4.0.0 resolution: "cli-truncate@npm:4.0.0" @@ -1626,6 +2423,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" @@ -1633,6 +2437,13 @@ __metadata: languageName: node linkType: hard +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -1687,13 +2498,13 @@ __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 @@ -1715,15 +2526,38 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.5 - resolution: "debug@npm:4.3.5" +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + 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" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 languageName: node linkType: hard @@ -1734,6 +2568,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" @@ -1777,15 +2618,6 @@ __metadata: languageName: node linkType: hard -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c - languageName: node - linkType: hard - "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -1817,7 +2649,7 @@ __metadata: languageName: node linkType: hard -"emittery@npm:^1.0.1": +"emittery@npm:^1.0.3": version: 1.0.3 resolution: "emittery@npm:1.0.3" checksum: 10c0/91605d044f3891dd1f8ab731aeb94b520488b21e707f7064dcbcf5303bac3b4e7133dfa23c343ede1fc970340bd78a9b1aed522b805bc15104606bba630dd71e @@ -1854,6 +2686,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -1884,86 +2725,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:~0.21.4": - 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 - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de - languageName: node - linkType: hard - "escalade@npm:^3.1.1": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -2020,6 +2781,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + "eslint@npm:^8.56.0": version: 8.57.0 resolution: "eslint@npm:8.57.0" @@ -2114,13 +2882,20 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1": +"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af languageName: node linkType: hard +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + "esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -2128,9 +2903,24 @@ __metadata: languageName: node linkType: hard -"execa@npm:^9.2.0": - version: 9.2.0 - resolution: "execa@npm:9.2.0" +"ethers@npm:^6.13.4": + version: 6.13.4 + resolution: "ethers@npm:6.13.4" + dependencies: + "@adraffy/ens-normalize": "npm:1.10.1" + "@noble/curves": "npm:1.2.0" + "@noble/hashes": "npm:1.3.2" + "@types/node": "npm:22.7.5" + aes-js: "npm:4.0.0-beta.5" + tslib: "npm:2.7.0" + ws: "npm:8.17.1" + checksum: 10c0/efcf9f39f841e38af68ec23cdbd745432c239c256aac4929842d1af04e55d7be0ff65e462f1cf3e93586f43f7bdcc0098fd56f2f7234f36d73e466521a5766ce + languageName: node + linkType: hard + +"execa@npm:9.1.0": + version: 9.1.0 + resolution: "execa@npm:9.1.0" dependencies: "@sindresorhus/merge-streams": "npm:^4.0.0" cross-spawn: "npm:^7.0.3" @@ -2144,7 +2934,14 @@ __metadata: signal-exit: "npm:^4.1.0" strip-final-newline: "npm:^4.0.0" yoctocolors: "npm:^2.0.0" - checksum: 10c0/339e69bd01bfdc032122ef18d412ccda4386c7752b864607c2e8683a1531b4aab436744aeacee548e1be239adb2b52888da64ffd761e7e22f56f8f14cf66e4a7 + checksum: 10c0/9a4810b93d098eb0bed48793b61c3aa3e5804867c2c5808cd2a597a6e71738151a74dc792909085ce1d38e89f4b0e078d93ffd165aaca2d9a6728f3616f8e5c0 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 languageName: node linkType: hard @@ -2178,7 +2975,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -2214,7 +3011,7 @@ __metadata: languageName: node linkType: hard -"figures@npm:^6.0.1, figures@npm:^6.1.0": +"figures@npm:^6.1.0": version: 6.1.0 resolution: "figures@npm:6.1.0" dependencies: @@ -2248,6 +3045,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-simple@npm:^1.0.0": version: 1.0.0 resolution: "find-up-simple@npm:1.0.0" @@ -2302,13 +3106,13 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.1.1": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 languageName: node linkType: hard @@ -2323,6 +3127,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -2371,7 +3182,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -2381,7 +3192,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -2451,12 +3262,10 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": - version: 4.7.5 - resolution: "get-tsconfig@npm:4.7.5" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 languageName: node linkType: hard @@ -2479,21 +3288,22 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.4.1 - resolution: "glob@npm:10.4.1" + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" minimatch: "npm:^9.0.4" minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/77f2900ed98b9cc2a0e1901ee5e476d664dae3cd0f1b662b8bfd4ccf00d0edc31a11595807706a274ca10e1e251411bbf2e8e976c82bed0d879a9b89343ed379 + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e languageName: node linkType: hard -"glob@npm:^7.1.3": +"glob@npm:^7.1.3, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -2507,6 +3317,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -2526,23 +3343,9 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 - languageName: node - linkType: hard - -"globby@npm:^14.0.0": - version: 14.0.1 - resolution: "globby@npm:14.0.1" +"globby@npm:^14.0.2": + version: 14.0.2 + resolution: "globby@npm:14.0.2" dependencies: "@sindresorhus/merge-streams": "npm:^2.1.0" fast-glob: "npm:^3.3.2" @@ -2550,7 +3353,7 @@ __metadata: path-type: "npm:^5.0.0" slash: "npm:^5.1.0" unicorn-magic: "npm:^0.1.0" - checksum: 10c0/749a6be91cf455c161ebb5c9130df3991cb9fd7568425db850a8279a6cf45acd031c5069395beb7aeb4dd606b64f0d6ff8116c93726178d8e6182fee58c2736d + checksum: 10c0/3f771cd683b8794db1e7ebc8b6b888d43496d93a82aad4e9d974620f578581210b6c5a6e75ea29573ed16a1345222fab6e9b877a8d1ed56eeb147e09f69c6f78 languageName: node linkType: hard @@ -2624,7 +3427,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -2672,12 +3475,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac languageName: node linkType: hard @@ -2697,6 +3500,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore-by-default@npm:^2.1.0": version: 2.1.0 resolution: "ignore-by-default@npm:2.1.0" @@ -2704,10 +3514,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -2721,6 +3531,13 @@ __metadata: languageName: node linkType: hard +"import-meta-resolve@npm:^2.2.1": + version: 2.2.2 + resolution: "import-meta-resolve@npm:2.2.2" + checksum: 10c0/80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -2728,13 +3545,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - "indent-string@npm:^5.0.0": version: 5.0.0 resolution: "indent-string@npm:5.0.0" @@ -2759,6 +3569,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -2776,6 +3593,24 @@ __metadata: languageName: node linkType: hard +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-core-module@npm:^2.16.0": + version: 2.16.0 + resolution: "is-core-module@npm:2.16.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/57e3b4bf3503a5ace3e61ef030a2eefa03d27827647b22968456e3e4befffed7c7aa849eea2e029f4f74a119a2d53cc391d5bad59c9352ecc9b79be3fd2acf79 + languageName: node + linkType: hard + "is-docker@npm:^2.0.0": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -2815,10 +3650,10 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc languageName: node linkType: hard @@ -2857,6 +3692,15 @@ __metadata: languageName: node linkType: hard +"is-reference@npm:^1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + "is-stream@npm:^4.0.1": version: 4.0.1 resolution: "is-stream@npm:4.0.1" @@ -2911,15 +3755,24 @@ __metadata: linkType: hard "jackspeak@npm:^3.1.2": - version: 3.4.0 - resolution: "jackspeak@npm:3.4.0" + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10c0/7e42d1ea411b4d57d43ea8a6afbca9224382804359cb72626d0fc45bb8db1de5ad0248283c3db45fe73e77210750d4fcc7c2b4fe5d24fda94aaa24d658295c5f + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jessie.js@npm:^0.3.4": + version: 0.3.4 + resolution: "jessie.js@npm:0.3.4" + dependencies: + "@endo/far": "npm:^1.0.0" + checksum: 10c0/853ab3f8a0e30df11742882f5e11479d1303033a5a203a247d8ffbf4c6f3f3d4bcbefa53084ae4632e6ab106e348f23dc988280486cbeaaf5d16487fa3d40e96 languageName: node linkType: hard @@ -2930,6 +3783,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + "js-yaml@npm:^3.14.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -2960,6 +3820,24 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -3095,9 +3973,18 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"magic-string@npm:^0.25.7": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: "npm:^1.4.8" + checksum: 10c0/37f5e01a7e8b19a072091f0b45ff127cda676232d373ce2c551a162dd4053c575ec048b9cbb4587a1f03adb6c5d0fd0dd49e8ab070cd2c83a4992b2182d9cb56 languageName: node linkType: hard @@ -3110,23 +3997,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" + minipass-fetch: "npm:^4.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 languageName: node linkType: hard @@ -3157,20 +4043,31 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": +"merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"microtime@npm:^3.1.0": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.4.0" + checksum: 10c0/02512993de914c6f71424d3b8b28ce53de44ba5895b904a213420fd4fc86a084c1d08ec0876ac60cdae6427022766e1b9b86d9b3442bf408701120bd61455e26 languageName: node linkType: hard @@ -3197,6 +4094,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -3211,15 +4115,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac - languageName: node - linkType: hard - "minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -3230,15 +4125,15 @@ __metadata: linkType: hard "minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed languageName: node linkType: hard -"minimist@npm:^1.2.6": +"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" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -3254,18 +4149,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" + minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b languageName: node linkType: hard @@ -3312,14 +4207,14 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": +"minizlib@npm:^2.1.1": version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: @@ -3329,6 +4224,23 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -3347,13 +4259,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - "ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -3361,6 +4266,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10c0/37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -3368,10 +4280,28 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f + languageName: node + linkType: hard + +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d languageName: node linkType: hard @@ -3389,34 +4319,34 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.2.2": - version: 4.8.1 - resolution: "node-gyp-build@npm:4.8.1" +"node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.4.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/e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7 + checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 languageName: node linkType: hard "node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 languageName: node linkType: hard @@ -3438,14 +4368,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" dependencies: abbrev: "npm:^2.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f languageName: node linkType: hard @@ -3484,7 +4414,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -3542,16 +4472,7 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - -"p-map@npm:^7.0.1": +"p-map@npm:^7.0.2": version: 7.0.2 resolution: "p-map@npm:7.0.2" checksum: 10c0/e10548036648d1c043153f9997112fe5a7de54a319210238628f8ea22ee36587fd6ee740811f88b60bbf29d932e23ae35df7fced40df477116c84c18e797047e @@ -3568,6 +4489,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -3637,6 +4565,13 @@ __metadata: languageName: node linkType: hard +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + "path-scurry@npm:^1.11.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" @@ -3647,13 +4582,6 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c - languageName: node - linkType: hard - "path-type@npm:^5.0.0": version: 5.0.0 resolution: "path-type@npm:5.0.0" @@ -3661,6 +4589,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + "picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -3668,17 +4603,10 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^3.0.1": - version: 3.0.1 - resolution: "picomatch@npm:3.0.1" - checksum: 10c0/70ec738569f1864658378b7abdab8939d15dae0718c1df994eae3346fd33daf6a3c1ff4e0c1a0cd1e2c0319130985b63a2cff34d192f2f2acbb78aca76111736 - languageName: node - linkType: hard - -"pirates@npm:^4.0.6": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc languageName: node linkType: hard @@ -3691,6 +4619,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -3698,26 +4648,19 @@ __metadata: languageName: node linkType: hard -"pretty-ms@npm:^9.0.0": - version: 9.0.0 - resolution: "pretty-ms@npm:9.0.0" +"pretty-ms@npm:^9.0.0, 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/ba4a2acd1fe92a1c629e5cdeb555d7fa344ae9920e20fa00e8ac1db61b8d3dff8638ffc70c7569f681e375df68c9f31291c2c1912cefd02ef1b1bdd0861a4aed - languageName: node - linkType: hard - -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb languageName: node linkType: hard -"proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 languageName: node linkType: hard @@ -3762,6 +4705,16 @@ __metadata: languageName: node linkType: hard +"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/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -3776,6 +4729,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" @@ -3783,7 +4747,21 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.0": +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -3838,10 +4816,29 @@ __metadata: languageName: node linkType: hard -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab +"resolve@npm:^1.17.0, resolve@npm:^1.19.0": + version: 1.22.9 + resolution: "resolve@npm:1.22.9" + dependencies: + 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/314cea2c47f956743f106256854203bd43a60a3ec6fb85ee6894e75cf4b16004952e4280319bfeb4c6fb1246e3ecd27f2699abb2e2b316b7c5727ec6491505c9 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": + version: 1.22.9 + resolution: "resolve@patch:resolve@npm%3A1.22.9#optional!builtin::version=1.22.9&hash=c3c19d" + dependencies: + 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/dadd8c85040784fdc18d6edc0cc27f7f35776c5d904b030ea67485ab9a5607568187afcfaf157e6fa9db9274481d155356bc42ca578c5578be25965b880d1e80 languageName: node linkType: hard @@ -3882,13 +4879,27 @@ __metadata: linkType: hard "rimraf@npm:^5.0.5": - version: 5.0.7 - resolution: "rimraf@npm:5.0.7" + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" dependencies: glob: "npm:^10.3.7" bin: rimraf: dist/esm/bin.mjs - checksum: 10c0/bd6dbfaa98ae34ce1e54d1e06045d2d63e8859d9a1979bb4a4628b652b459a2d17b17dc20ee072b034bd2d09bd691e801d24c4d9cfe94e16fdbcc8470a1d4807 + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + +"rollup@npm:^2.79.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 languageName: node linkType: hard @@ -3896,29 +4907,29 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: - "@agoric/cosmic-proto": "npm:0.4.1-dev-08f8549.0" + "@agoric/cosmic-proto": "npm:dev" + "@agoric/fast-usdc": "npm:dev" "@cosmjs/crypto": "npm:^0.32.4" "@cosmjs/proto-signing": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" - "@endo/errors": "npm:^1.2.5" - "@endo/far": "npm:^1.1.5" - "@endo/nat": "npm:^5.0.10" - "@endo/ses-ava": "npm:^1.2.5" + "@endo/errors": "npm:^1.2.8" + "@endo/far": "npm:^1.1.9" + "@endo/nat": "npm:^5.0.13" + "@endo/ses-ava": "npm:^1.2.8" "@types/eslint": "npm:^8" "@types/fs-extra": "npm:^11" - "@types/node": "npm:^20.11.13" - "@typescript-eslint/eslint-plugin": "npm:^6.20.0" - "@typescript-eslint/parser": "npm:^6.20.0" - ava: "npm:^6.1.3" + "@types/node": "npm:^22.0.0" + "@typescript-eslint/eslint-plugin": "npm:^8.17.0" + "@typescript-eslint/parser": "npm:^8.17.0" + ava: "npm:^6.2.0" eslint: "npm:^8.56.0" eslint-config-prettier: "npm:^9.1.0" - execa: "npm:^9.2.0" + execa: "npm:9.1.0" fs-extra: "npm:^11.2.0" patch-package: "npm:^8.0.0" starshipjs: "npm:2.4.1" - tsimp: "npm:^2.0.10" - tsx: "npm:^4.15.6" - typescript: "npm:^5.3.3" + ts-blank-space: "npm:^0.4.4" + typescript: "npm:~5.7.2" languageName: unknown linkType: soft @@ -3945,7 +4956,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0": +"semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -3954,12 +4965,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.6.0": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf languageName: node linkType: hard @@ -3972,12 +4983,12 @@ __metadata: languageName: node linkType: hard -"ses@npm:^1.8.0": - version: 1.8.0 - resolution: "ses@npm:1.8.0" +"ses@npm:^1.10.0": + version: 1.10.0 + resolution: "ses@npm:1.10.0" dependencies: - "@endo/env-options": "npm:^1.1.6" - checksum: 10c0/4b2114e586a547dd2a71477e0a42e8ea5d0ea9c3ff135d0dbfb63569eeda19c7152db76b82bcad12a2969d3f5fb09e5fa52e921b5a2831560e6876ca1f9ba207 + "@endo/env-options": "npm:^1.1.8" + checksum: 10c0/83b92bc49e27af04eeb7ee01a2196a0c4b0906e4de51e70403aa9ffc82be1d27a0c3506f2d54da8d6d260be0855f2123a13a7e2c6896e81ec85899df1a428609 languageName: node linkType: hard @@ -4044,6 +5055,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + "slash@npm:^2.0.0": version: 2.0.0 resolution: "slash@npm:2.0.0" @@ -4051,13 +5080,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b - languageName: node - linkType: hard - "slash@npm:^5.1.0": version: 5.1.0 resolution: "slash@npm:5.1.0" @@ -4082,36 +5104,18 @@ __metadata: languageName: node linkType: hard -"sock-daemon@npm:^1.4.2": - version: 1.4.2 - resolution: "sock-daemon@npm:1.4.2" - dependencies: - rimraf: "npm:^5.0.5" - signal-exit: "npm:^4.1.0" - socket-post-message: "npm:^1.0.3" - checksum: 10c0/1b5e0b02fdd8cd5454fc7de80557c11aac5d88085d0cee80ead08b8f4df5e3c0a4b50ebb2ae2113dab94f36dc88b5d3b7d4b1c2c8e53bbcfbddfc741abf3bd00 - languageName: node - linkType: hard - -"socket-post-message@npm:^1.0.3": - version: 1.0.3 - resolution: "socket-post-message@npm:1.0.3" - checksum: 10c0/d3ffb51dad97754856aaa6709e036196f4b8b674f00366b71591ead122bcdbc073827f67d17c8b03c9a28c921b2c7cb277c581f6ca318d472034eae7afc169d1 - languageName: node - linkType: hard - "socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 languageName: node linkType: hard -"socks@npm:^2.7.1": +"socks@npm:^2.8.3": version: 2.8.3 resolution: "socks@npm:2.8.3" dependencies: @@ -4121,6 +5125,34 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.0": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: 10c0/f099279fdaae070ff156df7414bbe39aad69cdd615454947ed3e19136bfdfcb4544952685ee73f56e17038f4578091e12b17b283ed8ac013882916594d95b9e6 + 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 + "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -4135,12 +5167,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d languageName: node linkType: hard @@ -4239,6 +5271,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + "supertap@npm:^3.0.1": version: 3.0.1 resolution: "supertap@npm:3.0.1" @@ -4260,6 +5299,13 @@ __metadata: languageName: node linkType: hard +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + "symbol-observable@npm:^2.0.3": version: 2.0.3 resolution: "symbol-observable@npm:2.0.3" @@ -4267,7 +5313,32 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar@npm:^6.1.11": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -4281,6 +5352,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + "temp-dir@npm:^3.0.0": version: 3.0.0 resolution: "temp-dir@npm:3.0.0" @@ -4311,6 +5396,13 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -4327,49 +5419,37 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" +"ts-api-utils@npm:^1.3.0": + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" peerDependencies: typescript: ">=4.2.0" - checksum: 10c0/f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c + checksum: 10c0/e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a languageName: node linkType: hard -"tsimp@npm:^2.0.10": - version: 2.0.11 - resolution: "tsimp@npm:2.0.11" +"ts-blank-space@npm:^0.4.1, ts-blank-space@npm:^0.4.4": + version: 0.4.4 + resolution: "ts-blank-space@npm:0.4.4" 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" - signal-exit: "npm:^4.1.0" - sock-daemon: "npm:^1.4.2" - walk-up-path: "npm:^3.0.1" - peerDependencies: - typescript: ^5.1.0 - bin: - tsimp: dist/esm/bin.mjs - checksum: 10c0/20743dc21ce31678050582903bfcd2d600fa17305f70162cb4127f2fd208116354549a921574f6c26cdfca5cb07c24526094e5519bb294f2ddd13c06cd2f43eb + typescript: "npm:5.1.6 - 5.7.x" + checksum: 10c0/31b8d9b7c814dfccd41f26871d93560fcb1396c290852064a5cb604c552840540cc1c9d18732c5d918d08209ccc945774de4bbeaf32b49bf6a3019bee2809a07 + languageName: node + linkType: hard + +"tslib@npm:2.7.0": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 languageName: node linkType: hard -"tsx@npm:^4.15.6": - version: 4.15.6 - resolution: "tsx@npm:4.15.6" +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" dependencies: - esbuild: "npm:~0.21.4" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/c44e489d35b8b4795d68164572eb9e322a707290aa0786c2aac0f5c7782a884dfec38d557d74471b981a8314b2c7f6612078451d0429db028a23cb54a37e83a0 + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a languageName: node linkType: hard @@ -4396,30 +5476,30 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.3.3": - version: 5.4.5 - resolution: "typescript@npm:5.4.5" +"typescript@npm:5.1.6 - 5.7.x, typescript@npm:^5.4.5, typescript@npm:~5.7.2": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e + checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": - version: 5.4.5 - resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" +"typescript@patch:typescript@npm%3A5.1.6 - 5.7.x#optional!builtin, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin, typescript@patch:typescript@npm%3A~5.7.2#optional!builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 + checksum: 10c0/f3b8082c9d1d1629a215245c9087df56cb784f9fb6f27b5d55577a20e68afe2a889c040aacff6d27e35be165ecf9dca66e694c42eb9a50b3b2c451b36b5675cb languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 languageName: node linkType: hard @@ -4430,21 +5510,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 languageName: node linkType: hard @@ -4471,13 +5551,6 @@ __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 - languageName: node - linkType: hard - "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -4513,14 +5586,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b languageName: node linkType: hard @@ -4569,13 +5642,28 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^5.0.1": - version: 5.0.1 - resolution: "write-file-atomic@npm:5.0.1" +"write-file-atomic@npm:^6.0.0": + version: 6.0.0 + resolution: "write-file-atomic@npm:6.0.0" dependencies: imurmurhash: "npm:^0.1.4" signal-exit: "npm:^4.0.1" - checksum: 10c0/e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d + checksum: 10c0/ae2f1c27474758a9aca92037df6c1dd9cb94c4e4983451210bd686bfe341f142662f6aa5913095e572ab037df66b1bfe661ed4ce4c0369ed0e8219e28e141786 + languageName: node + linkType: hard + +"ws@npm:8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe languageName: node linkType: hard @@ -4618,6 +5706,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yaml@npm:^2.2.2": version: 2.4.5 resolution: "yaml@npm:2.4.5" diff --git a/package.json b/package.json index 981b20e9eb3..bf32fcc3094 100644 --- a/package.json +++ b/package.json @@ -10,38 +10,39 @@ "type": "module", "packageManager": "yarn@1.22.22", "devDependencies": { - "@endo/eslint-plugin": "^2.2.2", + "@endo/eslint-plugin": "^2.2.3", + "@google-cloud/monitoring": "^4.1.0", "@jessie.js/eslint-plugin": "^0.4.1", "@types/express": "^4.17.17", - "@types/node": "^22.0.0", + "@types/node": "^22.9.0", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "conventional-changelog-conventionalcommits": "^4.6.0", - "eslint": "^8.57.0", + "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-jessie": "^0.0.6", "eslint-config-prettier": "^9.1.0", "eslint-plugin-ava": "^14.0.0", - "eslint-plugin-github": "^4.10.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-github": "^5.1.4", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsdoc": "^48.5.2", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-require-extensions": "^0.1.3", "lerna": "^5.6.2", "npm-run-all": "^4.1.5", - "prettier": "^3.3.3", + "prettier": "^3.4.2", "prettier-plugin-jsdoc": "^1.3.0", "prettier-plugin-sh": "^0.14.0", "type-coverage": "^2.27.1", "typedoc": "^0.26.7", "typedoc-plugin-markdown": "^4.2.1", - "typescript": "^5.6.2", - "typescript-eslint": "^7.18.0" + "typescript": "~5.7.1", + "typescript-eslint": "^8.17.0" }, "resolutions": { "**/protobufjs": "^7.2.6", "**/@types/estree": "^1.0.0", - "@endo/eslint-plugin/typescript-eslint": "^7.18.0" + "@endo/eslint-plugin/typescript-eslint": "^8.17.0" }, "engines": { "node": "^18.12 || ^20.9" @@ -64,7 +65,6 @@ "lint": "run-s --continue-on-error lint:*", "lint:packages": "yarn lerna run --no-bail lint", "test": "yarn lerna run --no-bail test", - "test:c8-all": "rm -rf coverage/tmp && C8_OPTIONS=\"--clean=false --temp-directory=$PWD/coverage/tmp\" lerna run test:c8", "test:xs": "yarn workspaces run test:xs", "build": "yarn workspaces run build && scripts/agd-builder.sh stamp yarn-built", "postinstall": "patch-package && scripts/agd-builder.sh stamp yarn-installed", diff --git a/packages/ERTP/package.json b/packages/ERTP/package.json index c2912099704..cd8d58b2484 100644 --- a/packages/ERTP/package.json +++ b/packages/ERTP/package.json @@ -12,7 +12,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "yarn test:xs-worker", "test:xs-unit": "exit 0", "test:xs-worker": "SWINGSET_WORKER_TYPE=xs-worker ava -c 2 test/swingsetTests", @@ -39,21 +39,21 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/notifier": "^0.7.0-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/bundle-source": "^3.4.2", + "@endo/bundle-source": "^3.5.0", "@fast-check/ava": "^1.1.5", "ava": "^5.3.0", "tsd": "^0.31.1" @@ -77,6 +77,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 91.23 + "atLeast": 91.77 } } diff --git a/packages/ERTP/src/amountStore.js b/packages/ERTP/src/amountStore.js index 8b611f9b11c..344a0f85386 100644 --- a/packages/ERTP/src/amountStore.js +++ b/packages/ERTP/src/amountStore.js @@ -1,6 +1,6 @@ import { AmountMath } from './amountMath.js'; -/** @import {Amount, AssetKind, AmountValue, AssetKindForValue, AssetValueForKind, Brand, MathHelpers} from './types.js' */ +/** @import {Amount, AssetKind} from './types.js' */ /** * @template {AssetKind} [K=AssetKind] diff --git a/packages/ERTP/src/index.js b/packages/ERTP/src/index.js index f6bdf75eb53..54834a01b7f 100644 --- a/packages/ERTP/src/index.js +++ b/packages/ERTP/src/index.js @@ -5,12 +5,5 @@ export * from './amountMath.js'; export * from './issuerKit.js'; export * from './typeGuards.js'; -/** - * Importing Baggage from `@agoric/ertp` is deprecated. Import Baggage from - * `@agoric/vat-data` instead - * - * @import {Baggage} from '@agoric/vat-data' - */ - // eslint-disable-next-line import/export export * from './types-index.js'; diff --git a/packages/ERTP/src/legacy-payment-helpers.js b/packages/ERTP/src/legacy-payment-helpers.js index bb8f22749a3..8b3520bc001 100644 --- a/packages/ERTP/src/legacy-payment-helpers.js +++ b/packages/ERTP/src/legacy-payment-helpers.js @@ -7,7 +7,7 @@ import { AmountMath } from './amountMath.js'; /** * @import {ERef} from '@endo/far'; - * @import {Amount, AssetKind, AmountValue, AssetKindForValue, Payment, Brand, Purse} from './types.js'; + * @import {Amount, AssetKind, Payment, Purse} from './types.js'; */ /** diff --git a/packages/ERTP/src/paymentLedger.js b/packages/ERTP/src/paymentLedger.js index 45835366b5d..adc03ce9b7e 100644 --- a/packages/ERTP/src/paymentLedger.js +++ b/packages/ERTP/src/paymentLedger.js @@ -2,7 +2,6 @@ /// -/* eslint-disable no-use-before-define */ import { X, q, Fail, annotateError } from '@endo/errors'; import { isPromise } from '@endo/promise-kit'; import { mustMatch, M, keyEQ } from '@agoric/store'; diff --git a/packages/ERTP/src/purse.js b/packages/ERTP/src/purse.js index 323b7c8d24a..183a4dbd909 100644 --- a/packages/ERTP/src/purse.js +++ b/packages/ERTP/src/purse.js @@ -4,7 +4,7 @@ import { AmountMath } from './amountMath.js'; import { makeTransientNotifierKit } from './transientNotifier.js'; import { makeAmountStore } from './amountStore.js'; -/** @import {Amount, AssetKind, AmountValue, AssetKindForValue, RecoverySetsOption, Brand, Payment} from './types.js' */ +/** @import {AssetKind, RecoverySetsOption, Brand, Payment} from './types.js' */ const EMPTY_COPY_SET = makeCopySet([]); diff --git a/packages/ERTP/src/transientNotifier.js b/packages/ERTP/src/transientNotifier.js index 112c358a5a2..a445a365e66 100644 --- a/packages/ERTP/src/transientNotifier.js +++ b/packages/ERTP/src/transientNotifier.js @@ -6,7 +6,7 @@ import { makeNotifierKit } from '@agoric/notifier'; /** * @import {Purse} from './types.js'; - * @import {LatestTopic, NotifierRecord} from '@agoric/notifier'; + * @import {NotifierRecord} from '@agoric/notifier'; */ // Note: Virtual for high cardinality, but *not* durable, and so diff --git a/packages/ERTP/src/typeGuards.js b/packages/ERTP/src/typeGuards.js index 4e4f38f7f04..f66267ec0d2 100644 --- a/packages/ERTP/src/typeGuards.js +++ b/packages/ERTP/src/typeGuards.js @@ -1,7 +1,10 @@ // @jessie-check import { M, matches, getInterfaceGuardPayload } from '@endo/patterns'; -/** @import {AmountValue, AssetKindForValue, AssetValueForKind, Brand, MathHelpers} from './types.js' */ +/** + * @import {AmountValue, Ratio} from './types.js' + * @import {TypedPattern} from '@agoric/internal' + */ export const BrandShape = M.remotable('Brand'); export const IssuerShape = M.remotable('Issuer'); @@ -72,10 +75,8 @@ const AmountValueShape = M.or( CopyBagValueShape, ); -export const AmountShape = harden({ - brand: BrandShape, - value: AmountValueShape, -}); +export const AmountShape = { brand: BrandShape, value: AmountValueShape }; +harden(AmountShape); /** * To be used to guard an amount pattern argument, i.e., an argument which is a @@ -90,10 +91,9 @@ export const AmountShape = harden({ */ export const AmountPatternShape = M.pattern(); -export const RatioShape = harden({ - numerator: AmountShape, - denominator: AmountShape, -}); +/** @type {TypedPattern} */ +export const RatioShape = { numerator: AmountShape, denominator: AmountShape }; +harden(RatioShape); /** * Returns true if value is a Nat bigint. @@ -154,13 +154,14 @@ export const DisplayInfoShape = M.splitRecord( }, ); -export const IssuerKitShape = harden({ +export const IssuerKitShape = { brand: BrandShape, mint: MintShape, mintRecoveryPurse: PurseShape, issuer: IssuerShape, displayInfo: DisplayInfoShape, -}); +}; +harden(IssuerKitShape); // //////////////////////// Interfaces ///////////////////////////////////////// @@ -231,10 +232,11 @@ export const makeIssuerInterfaces = ( receive: getInterfaceGuardPayload(PurseI).methodGuards.deposit, }); - const PurseIKit = harden({ + const PurseIKit = { purse: PurseI, depositFacet: DepositFacetI, - }); + }; + harden(PurseIKit); return harden({ IssuerI, diff --git a/packages/ERTP/src/types.ts b/packages/ERTP/src/types.ts index 458370a4f70..5195da07f12 100644 --- a/packages/ERTP/src/types.ts +++ b/packages/ERTP/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { LatestTopic } from '@agoric/notifier'; import type { ERef } from '@endo/far'; import type { RemotableObject } from '@endo/pass-style'; @@ -99,6 +98,9 @@ export type AssetKindForValue = V extends NatValue : V extends import('@endo/patterns').CopyBag ? 'copyBag' : never; + +export type Ratio = { numerator: Amount<'nat'>; denominator: Amount<'nat'> }; + /** @deprecated */ export type DisplayInfo = { /** diff --git a/packages/SwingSet/package.json b/packages/SwingSet/package.json index be01ddb4324..0fa9cea10b0 100644 --- a/packages/SwingSet/package.json +++ b/packages/SwingSet/package.json @@ -27,6 +27,7 @@ "@types/yargs-parser": "^21.0.0" }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/kmarshal": "^0.1.1-u18.0", "@agoric/store": "^0.9.3-u18.0", @@ -35,26 +36,24 @@ "@agoric/swingset-xsnap-supervisor": "^0.10.3-u18.0", "@agoric/time": "^0.3.3-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", - "@agoric/xsnap": "^0.14.3-u18.0", "@agoric/xsnap-lockdown": "^0.14.1-u18.0", - "@endo/base64": "^1.0.8", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/check-bundle": "^1.0.11", - "@endo/compartment-mapper": "^1.3.1", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/import-bundle": "^1.3.1", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", - "@endo/ses-ava": "^1.2.7", - "@endo/stream": "^1.2.7", - "@endo/zip": "^1.0.8", + "@endo/base64": "^1.0.9", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/check-bundle": "^1.0.12", + "@endo/compartment-mapper": "^1.4.0", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/import-bundle": "^1.3.2", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", + "@endo/ses-ava": "^1.2.8", + "@endo/stream": "^1.2.8", + "@endo/zip": "^1.0.9", "ansi-styles": "^6.2.1", "anylogger": "^0.21.0", "better-sqlite3": "^9.1.1", @@ -65,6 +64,7 @@ "yargs-parser": "^21.1.1" }, "peerDependencies": { + "@agoric/xsnap": "^0.14.2", "ava": "^5.3.0" }, "files": [ @@ -101,6 +101,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 75.82 + "atLeast": 76.28 } } diff --git a/packages/SwingSet/src/controller/controller.js b/packages/SwingSet/src/controller/controller.js index c3091989814..eace725d4ce 100644 --- a/packages/SwingSet/src/controller/controller.js +++ b/packages/SwingSet/src/controller/controller.js @@ -15,6 +15,7 @@ import { initSwingStore } from '@agoric/swing-store'; import { mustMatch, M } from '@endo/patterns'; import { checkBundle } from '@endo/check-bundle/lite.js'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; import engineGC from '@agoric/internal/src/lib-nodejs/engine-gc.js'; import { startSubprocessWorker } from '@agoric/internal/src/lib-nodejs/spawnSubprocessWorker.js'; import { waitUntilQuiescent } from '@agoric/internal/src/lib-nodejs/waitUntilQuiescent.js'; @@ -263,13 +264,6 @@ export async function makeSwingsetController( await kernel.start(); - /** - * @param {T} x - * @returns {T} - * @template T - */ - const defensiveCopy = x => JSON.parse(JSON.stringify(x)); - /** * Validate and install a code bundle. * @@ -304,7 +298,7 @@ export async function makeSwingsetController( writeSlogObject, dump() { - return defensiveCopy(kernel.dump()); + return deepCopyJsonable(kernel.dump()); }, verboseDebugMode(flag) { @@ -340,11 +334,11 @@ export async function makeSwingsetController( }, getStats() { - return defensiveCopy(kernel.getStats()); + return deepCopyJsonable(kernel.getStats()); }, getStatus() { - return defensiveCopy(kernel.getStatus()); + return deepCopyJsonable(kernel.getStatus()); }, getActivityhash() { diff --git a/packages/SwingSet/src/controller/initializeKernel.js b/packages/SwingSet/src/controller/initializeKernel.js index aa84c4b0216..dfe3ba00157 100644 --- a/packages/SwingSet/src/controller/initializeKernel.js +++ b/packages/SwingSet/src/controller/initializeKernel.js @@ -1,5 +1,3 @@ -/* eslint-disable no-use-before-define */ - import { assert, Fail } from '@endo/errors'; import { makeMarshal } from '@endo/marshal'; import { Far } from '@endo/far'; diff --git a/packages/SwingSet/src/controller/initializeSwingset.js b/packages/SwingSet/src/controller/initializeSwingset.js index 5b66bc53538..7ecb1f048c3 100644 --- a/packages/SwingSet/src/controller/initializeSwingset.js +++ b/packages/SwingSet/src/controller/initializeSwingset.js @@ -2,8 +2,8 @@ import fs from 'fs'; import path from 'path'; -import { assert, Fail } from '@endo/errors'; -import { makeTracer } from '@agoric/internal'; +import { assert, b, Fail } from '@endo/errors'; +import { deepCopyJsonable, makeTracer } from '@agoric/internal'; import { mustMatch } from '@agoric/store'; import bundleSource from '@endo/bundle-source'; import { resolve as resolveModuleSpecifier } from 'import-meta-resolve'; @@ -86,16 +86,6 @@ export async function buildKernelBundles() { return harden({ kernel: kernelBundle, ...vdBundles }); } -function byName(a, b) { - if (a.name < b.name) { - return -1; - } - if (a.name > b.name) { - return 1; - } - return 0; -} - /** * Scan a directory for files defining the vats to bootstrap for a swingset, and * produce a swingset config object for what was found there. Looks for files @@ -126,18 +116,18 @@ export function loadBasedir(basedir, options = {}) { const { includeDevDependencies = false, bundleFormat = undefined } = options; /** @type { SwingSetConfigDescriptor } */ const vats = {}; - const subs = fs.readdirSync(basedir, { withFileTypes: true }); - subs.sort(byName); - for (const dirent of subs) { - if ( - dirent.name.startsWith('vat-') && - dirent.name.endsWith('.js') && - dirent.isFile() - ) { - const name = dirent.name.slice('vat-'.length, -'.js'.length); - const vatSourcePath = path.resolve(basedir, dirent.name); - vats[name] = { sourceSpec: vatSourcePath, parameters: {} }; - } + const rVatName = /^vat-(.*)\.js$/s; + const files = fs.readdirSync(basedir, { withFileTypes: true }); + const vatFiles = files.flatMap(dirent => { + const file = dirent.name; + const m = rVatName.exec(file); + return m && dirent.isFile() ? [{ file, label: m[1] }] : []; + }); + // eslint-disable-next-line no-shadow,no-nested-ternary + vatFiles.sort((a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0)); + for (const { file, label } of vatFiles) { + const vatSourcePath = path.resolve(basedir, file); + vats[label] = { sourceSpec: vatSourcePath, parameters: {} }; } /** @type {string | void} */ let bootstrapPath = path.resolve(basedir, 'bootstrap.js'); @@ -185,37 +175,42 @@ async function resolveSpecFromConfig(referrer, specPath) { } /** - * For each entry in a config descriptor (i.e, `vats`, `bundles`, etc), convert - * it to normal form: resolve each pathname to a context-insensitive absolute - * path and make sure it has a `parameters` property if it's supposed to. + * Convert each entry in a config descriptor group (`vats`/`bundles`/etc.) to + * normal form: resolve each pathname to a context-insensitive absolute path and + * run any other appropriate fixup. * - * @param {SwingSetConfigDescriptor | void} desc The config descriptor to be normalized. - * @param {string} referrer The pathname of the file or directory in which the - * config file was found - * @param {boolean} expectParameters `true` if the entries should have parameters (for - * example, `true` for `vats` but `false` for bundles). + * @param {SwingSetConfig} config + * @param {'vats' | 'bundles' | 'devices'} groupName + * @param {string | undefined} configPath of the containing config file + * @param {string} referrer URL + * @param {(entry: SwingSetConfigProperties, name?: string) => void} [fixupEntry] + * A function to call on each entry to e.g. add defaults for missing fields + * such as vat `parameters`. */ -async function normalizeConfigDescriptor(desc, referrer, expectParameters) { - const normalizeSpec = async (entry, key) => { - return resolveSpecFromConfig(referrer, entry[key]).then(spec => { - fs.existsSync(spec) || - Fail`spec for ${entry[key]} does not exist: ${spec}`; - entry[key] = spec; - }); +async function normalizeConfigDescriptor( + config, + groupName, + configPath, + referrer, + fixupEntry, +) { + const normalizeSpec = async (entry, specKey, name) => { + const sourcePath = await resolveSpecFromConfig(referrer, entry[specKey]); + fs.existsSync(sourcePath) || + Fail`${sourcePath} for ${b(groupName)}[${name}].${b(specKey)} in ${configPath} config file does not exist`; + entry[specKey] = sourcePath; }; const jobs = []; + const desc = config[groupName]; if (desc) { - for (const name of Object.keys(desc)) { - const entry = desc[name]; + for (const [name, entry] of Object.entries(desc)) { + fixupEntry?.(entry, name); if ('sourceSpec' in entry) { - jobs.push(normalizeSpec(entry, 'sourceSpec')); + jobs.push(normalizeSpec(entry, 'sourceSpec', name)); } if ('bundleSpec' in entry) { - jobs.push(normalizeSpec(entry, 'bundleSpec')); - } - if (expectParameters && !entry.parameters) { - entry.parameters = {}; + jobs.push(normalizeSpec(entry, 'bundleSpec', name)); } } } @@ -223,27 +218,41 @@ async function normalizeConfigDescriptor(desc, referrer, expectParameters) { } /** - * Read and parse a swingset config file and return it in normalized form. - * - * @param {string} configPath Path to the config file to be processed - * - * @returns {Promise} the contained config object, in normalized form, or null if the - * requested config file did not exist. + * @param {SwingSetConfig} config + * @param {string} [configPath] + * @returns {Promise} + * @throws {Error} if the config is invalid + */ +export async function normalizeConfig(config, configPath) { + const base = `file://${process.cwd()}/`; + const referrer = configPath + ? new URL(configPath, base).href + : new URL(base).href; + const fixupVat = vat => (vat.parameters ||= {}); + await Promise.all([ + normalizeConfigDescriptor(config, 'vats', configPath, referrer, fixupVat), + normalizeConfigDescriptor(config, 'bundles', configPath, referrer), + // TODO: represent devices + // normalizeConfigDescriptor(config, 'devices', configPath, referrer), + ]); + config.bootstrap || + Fail`no designated bootstrap vat in ${configPath} config file`; + (config.vats && config.vats[/** @type {string} */ (config.bootstrap)]) || + Fail`bootstrap vat ${config.bootstrap} not found in ${configPath} config file`; +} + +/** + * Read and normalize a swingset config file. * - * @throws {Error} if the file existed but was inaccessible, malformed, or otherwise - * invalid. + * @param {string} configPath + * @returns {Promise} the normalized config, + * or null if the file did not exist */ export async function loadSwingsetConfigFile(configPath) { await null; try { const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); - const referrer = new URL(configPath, `file://${process.cwd()}/`).toString(); - await normalizeConfigDescriptor(config.vats, referrer, true); - await normalizeConfigDescriptor(config.bundles, referrer, false); - // await normalizeConfigDescriptor(config.devices, referrer, true); // TODO: represent devices - config.bootstrap || Fail`no designated bootstrap vat in ${configPath}`; - (config.vats && config.vats[config.bootstrap]) || - Fail`bootstrap vat ${config.bootstrap} not found in ${configPath}`; + await normalizeConfig(config, configPath); return config; } catch (e) { console.error(`failed to load ${configPath}`); @@ -314,7 +323,7 @@ export async function initializeSwingset( } = runtimeOptions; // copy config so we can safely mess with it even if it's shared or hardened - config = JSON.parse(JSON.stringify(config)); + config = deepCopyJsonable(config); if (!config.bundles) { config.bundles = {}; } diff --git a/packages/SwingSet/src/controller/upgradeSwingset.js b/packages/SwingSet/src/controller/upgradeSwingset.js index 3c12c97f0b6..4c4ca4fd364 100644 --- a/packages/SwingSet/src/controller/upgradeSwingset.js +++ b/packages/SwingSet/src/controller/upgradeSwingset.js @@ -10,13 +10,38 @@ import { import { enumeratePrefixedKeys } from '../kernel/state/storageHelper.js'; /** - * @import {RunQueueEvent} from '../types-internal.js'; + * @import {ReapDirtThreshold, RunQueueEvent} from '../types-internal.js'; */ -const upgradeVatV0toV1 = (kvStore, defaultReapDirtThreshold, vatID) => { - // This is called, once per vat, when upgradeSwingset migrates from - // v0 to v1 +/** + * Parse a string of decimal digits into a number. + * + * @param {string} digits + * @param {string} label + * @returns {number} + */ +const mustParseInt = (digits, label) => { + assert( + digits.match(/^\d+$/), + `expected ${label}=${digits} to be a decimal integer`, + ); + return Number(digits); +}; +/** + * Called for each vat when upgradeSwingset migrates from v0 to v1. + * + * @param {KVStore} kvStore + * @param {(key: string) => string} getRequired + * @param {ReapDirtThreshold} defaultReapDirtThreshold + * @param {string} vatID + */ +const upgradeVatV0toV1 = ( + kvStore, + getRequired, + defaultReapDirtThreshold, + vatID, +) => { // schema v0: // Each vat has a `vNN.reapInterval` and `vNN.reapCountdown`. // vNN.options has a `.reapInterval` property (however it was not @@ -33,15 +58,10 @@ const upgradeVatV0toV1 = (kvStore, defaultReapDirtThreshold, vatID) => { // `defaultReapDirtThreshold`) const reapDirtKey = `${vatID}.reapDirt`; - - assert(kvStore.has(oldReapIntervalKey), oldReapIntervalKey); - assert(kvStore.has(oldReapCountdownKey), oldReapCountdownKey); assert(!kvStore.has(reapDirtKey), reapDirtKey); - const reapIntervalString = kvStore.get(oldReapIntervalKey); - const reapCountdownString = kvStore.get(oldReapCountdownKey); - assert(reapIntervalString !== undefined); - assert(reapCountdownString !== undefined); + const reapIntervalString = getRequired(oldReapIntervalKey); + const reapCountdownString = getRequired(oldReapCountdownKey); const intervalIsNever = reapIntervalString === 'never'; const countdownIsNever = reapCountdownString === 'never'; @@ -62,8 +82,11 @@ const upgradeVatV0toV1 = (kvStore, defaultReapDirtThreshold, vatID) => { threshold.never = true; } else { // deduce delivery count from old countdown values - const reapInterval = Number.parseInt(reapIntervalString, 10); - const reapCountdown = Number.parseInt(reapCountdownString, 10); + const reapInterval = mustParseInt(reapIntervalString, oldReapIntervalKey); + const reapCountdown = mustParseInt( + reapCountdownString, + oldReapCountdownKey, + ); const deliveries = reapInterval - reapCountdown; reapDirt.deliveries = Math.max(deliveries, 0); // just in case if (reapInterval !== defaultReapDirtThreshold.deliveries) { @@ -76,7 +99,7 @@ const upgradeVatV0toV1 = (kvStore, defaultReapDirtThreshold, vatID) => { kvStore.set(reapDirtKey, JSON.stringify(reapDirt)); // Update options to use the new schema. - const options = JSON.parse(kvStore.get(vatOptionsKey)); + const options = JSON.parse(getRequired(vatOptionsKey)); delete options.reapInterval; options.reapDirtThreshold = threshold; kvStore.set(vatOptionsKey, JSON.stringify(options)); @@ -104,14 +127,11 @@ const upgradeVatV0toV1 = (kvStore, defaultReapDirtThreshold, vatID) => { */ export const upgradeSwingset = kernelStorage => { const { kvStore } = kernelStorage; - let modified = false; /** @type {RunQueueEvent[]} */ const upgradeEvents = []; - let vstring = kvStore.get('version'); - if (vstring === undefined) { - vstring = '0'; - } - let version = Number(vstring); + const vstring = kvStore.get('version'); + const version = Number(vstring) || 0; + let newVersion; /** * @param {string} key @@ -166,11 +186,7 @@ export const upgradeSwingset = kernelStorage => { assert(kvStore.has(oldDefaultReapIntervalKey)); assert(!kvStore.has(DEFAULT_REAP_DIRT_THRESHOLD_KEY)); - /** - * @typedef { import('../types-internal.js').ReapDirtThreshold } ReapDirtThreshold - */ - - /** @type ReapDirtThreshold */ + /** @type {ReapDirtThreshold} */ const threshold = { deliveries: 'never', gcKrefs: 'never', @@ -179,9 +195,7 @@ export const upgradeSwingset = kernelStorage => { const oldValue = getRequired(oldDefaultReapIntervalKey); if (oldValue !== 'never') { - const value = Number.parseInt(oldValue, 10); - assert.typeof(value, 'number'); - threshold.deliveries = value; + threshold.deliveries = mustParseInt(oldValue, oldDefaultReapIntervalKey); // if BOYD wasn't turned off entirely (eg // defaultReapInterval='never', which only happens in unit // tests), then pretend we wanted a gcKrefs= threshold all @@ -196,22 +210,20 @@ export const upgradeSwingset = kernelStorage => { // now upgrade all vats for (const [_name, vatID] of getAllStaticVats(kvStore)) { - upgradeVatV0toV1(kvStore, threshold, vatID); + upgradeVatV0toV1(kvStore, getRequired, threshold, vatID); } for (const vatID of getAllDynamicVats(getRequired)) { - upgradeVatV0toV1(kvStore, threshold, vatID); + upgradeVatV0toV1(kvStore, getRequired, threshold, vatID); } - modified = true; - version = 1; + newVersion = 1; } if (version < 2) { // schema v2: add vats.terminated = [] assert(!kvStore.has('vats.terminated')); kvStore.set('vats.terminated', JSON.stringify([])); - modified = true; - version = 2; + newVersion = 2; } if (version < 3) { @@ -322,10 +334,11 @@ export const upgradeSwingset = kernelStorage => { } console.log(` - #9039 remediation complete, ${count} notifies to inject`); - modified = true; - version = 3; + newVersion = 3; } + const modified = newVersion !== undefined; + if (upgradeEvents.length) { assert(modified); // stash until host calls controller.injectQueuedUpgradeEvents() @@ -335,7 +348,7 @@ export const upgradeSwingset = kernelStorage => { } if (modified) { - kvStore.set('version', `${version}`); + kvStore.set('version', `${newVersion}`); } return harden({ modified }); }; diff --git a/packages/SwingSet/src/devices/bridge/device-bridge.js b/packages/SwingSet/src/devices/bridge/device-bridge.js index 216bf6556ca..3cdd8710e24 100644 --- a/packages/SwingSet/src/devices/bridge/device-bridge.js +++ b/packages/SwingSet/src/devices/bridge/device-bridge.js @@ -1,5 +1,6 @@ import { Fail } from '@endo/errors'; import { Far } from '@endo/far'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; function sanitize(data) { if (data === undefined) { @@ -8,7 +9,7 @@ function sanitize(data) { if (data instanceof Error) { data = data.stack; } - return JSON.parse(JSON.stringify(data)); + return deepCopyJsonable(data); } /** @@ -32,7 +33,7 @@ export function buildRootDeviceNode(tools) { function inboundCallback(...args) { inboundHandler || Fail`inboundHandler not yet registered`; - const safeArgs = JSON.parse(JSON.stringify(args)); + const safeArgs = deepCopyJsonable(args); try { SO(inboundHandler).inbound(...harden(safeArgs)); } catch (e) { diff --git a/packages/SwingSet/src/devices/lib/deviceTools.js b/packages/SwingSet/src/devices/lib/deviceTools.js index 9b5c91aaf28..624cfe0eb3d 100644 --- a/packages/SwingSet/src/devices/lib/deviceTools.js +++ b/packages/SwingSet/src/devices/lib/deviceTools.js @@ -24,7 +24,6 @@ export function buildSerializationTools(syscall, deviceName) { send(method, args) { assert.typeof(method, 'string'); assert(Array.isArray(args), args); - // eslint-disable-next-line no-use-before-define const capdata = serialize([method, args]); syscall.sendOnly(slot, capdata); }, diff --git a/packages/SwingSet/src/index.js b/packages/SwingSet/src/index.js index c8e72886361..47ee711aeee 100644 --- a/packages/SwingSet/src/index.js +++ b/packages/SwingSet/src/index.js @@ -8,6 +8,7 @@ export { buildKernelBundles, loadBasedir, loadSwingsetConfigFile, + normalizeConfig, } from './controller/initializeSwingset.js'; export { upgradeSwingset } from './controller/upgradeSwingset.js'; export { diff --git a/packages/SwingSet/src/kernel/kernel.js b/packages/SwingSet/src/kernel/kernel.js index b68d6836b95..cd20086dde7 100644 --- a/packages/SwingSet/src/kernel/kernel.js +++ b/packages/SwingSet/src/kernel/kernel.js @@ -1128,7 +1128,6 @@ export default function buildKernel( } else if (message.type === 'changeVatOptions') { // prettier-ignore return `changeVatOptions ${message.vatID} options: ${JSON.stringify(message.options)}`; - // eslint-disable-next-line no-use-before-define } else if (gcMessages.includes(message.type)) { // prettier-ignore return `${message.type} ${message.vatID} ${message.krefs.map(e=>`@${e}`).join(' ')}`; diff --git a/packages/SwingSet/src/kernel/state/kernelKeeper.js b/packages/SwingSet/src/kernel/state/kernelKeeper.js index 1d64b225f1c..02d43b45ea0 100644 --- a/packages/SwingSet/src/kernel/state/kernelKeeper.js +++ b/packages/SwingSet/src/kernel/state/kernelKeeper.js @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import { Nat, isNat } from '@endo/nat'; import { assert, Fail } from '@endo/errors'; import { @@ -43,6 +42,7 @@ const enableKernelGC = true; * @typedef { import('../../types-external.js').SnapStore } SnapStore * @typedef { import('../../types-external.js').TranscriptStore } TranscriptStore * @typedef { import('../../types-external.js').VatKeeper } VatKeeper + * @typedef { Pick } VatUndertaker * @typedef { import('../../types-internal.js').InternalKernelOptions } InternalKernelOptions * @typedef { import('../../types-internal.js').ReapDirtThreshold } ReapDirtThreshold * @import {PromiseRecord} from '../../types-internal.js'; @@ -422,6 +422,8 @@ export default function makeKernelKeeper( const ephemeral = harden({ /** @type { Map } */ vatKeepers: new Map(), + /** @type { Map } */ + vatUndertakers: new Map(), deviceKeepers: new Map(), // deviceID -> deviceKeeper }); @@ -1044,7 +1046,7 @@ export default function makeKernelKeeper( // first or vref first), and delete the other one in the same // call, so we don't wind up with half an entry. - const vatKeeper = provideVatKeeper(vatID); + const undertaker = provideVatUndertaker(vatID); const clistPrefix = `${vatID}.c.`; const exportPrefix = `${clistPrefix}o+`; const importPrefix = `${clistPrefix}o-`; @@ -1092,7 +1094,7 @@ export default function makeKernelKeeper( // drop+retire const kref = kvStore.get(k) || Fail`getNextKey ensures get`; const vref = stripPrefix(clistPrefix, k); - vatKeeper.deleteCListEntry(kref, vref); + undertaker.deleteCListEntry(kref, vref); // that will also delete both db keys work.imports += 1; remaining -= 1; @@ -1109,7 +1111,7 @@ export default function makeKernelKeeper( for (const k of enumeratePrefixedKeys(kvStore, promisePrefix)) { const kref = kvStore.get(k) || Fail`getNextKey ensures get`; const vref = stripPrefix(clistPrefix, k); - vatKeeper.deleteCListEntry(kref, vref); + undertaker.deleteCListEntry(kref, vref); // that will also delete both db keys work.promises += 1; remaining -= 1; @@ -1131,7 +1133,7 @@ export default function makeKernelKeeper( // this will internally loop through 'budget' deletions remaining = budget.snapshots ?? budget.default; - const dsc = vatKeeper.deleteSnapshots(remaining); + const dsc = undertaker.deleteSnapshots(remaining); work.snapshots += dsc.cleanups; remaining -= dsc.cleanups; if (remaining <= 0) { @@ -1140,7 +1142,7 @@ export default function makeKernelKeeper( // same remaining = budget.transcripts ?? budget.default; - const dts = vatKeeper.deleteTranscripts(remaining); + const dts = undertaker.deleteTranscripts(remaining); work.transcripts += dts.cleanups; remaining -= dts.cleanups; // last task, so increment cleanups, but dc.done is authoritative @@ -1697,6 +1699,26 @@ export default function makeKernelKeeper( initializeVatState(kvStore, transcriptStore, vatID, source, options); } + /** @type {import('./vatKeeper.js').VatKeeperPowers} */ + const vatKeeperPowers = { + transcriptStore, + kernelSlog, + addKernelObject, + addKernelPromiseForVat, + kernelObjectExists, + incrementRefCount, + decrementRefCount, + getObjectRefCount, + setObjectRefCount, + getReachableAndVatSlot, + addMaybeFreeKref, + incStat, + decStat, + getCrankNumber, + scheduleReap, + snapStore, + }; + function provideVatKeeper(vatID) { insistVatID(vatID); const found = ephemeral.vatKeepers.get(vatID); @@ -1704,30 +1726,36 @@ export default function makeKernelKeeper( return found; } assert(kvStore.has(`${vatID}.o.nextID`), `${vatID} was not initialized`); - const vk = makeVatKeeper( - kvStore, - transcriptStore, - kernelSlog, - vatID, - addKernelObject, - addKernelPromiseForVat, - kernelObjectExists, - incrementRefCount, - decrementRefCount, - getObjectRefCount, - setObjectRefCount, - getReachableAndVatSlot, - addMaybeFreeKref, - incStat, - decStat, - getCrankNumber, - scheduleReap, - snapStore, - ); + const vk = makeVatKeeper(vatID, kvStore, vatKeeperPowers); ephemeral.vatKeepers.set(vatID, vk); return vk; } + /** + * Produce an attenuated vatKeeper for slow vat termination (and that + * therefore does not insist on liveness, unlike provideVatKeeper). + * + * @param {string} vatID + */ + function provideVatUndertaker(vatID) { + insistVatID(vatID); + const found = ephemeral.vatUndertakers.get(vatID); + if (found !== undefined) { + return found; + } + const { deleteCListEntry, deleteSnapshots, deleteTranscripts } = + ephemeral.vatKeepers.get(vatID) || + makeVatKeeper(vatID, kvStore, vatKeeperPowers); + /** @type {VatUndertaker} */ + const undertaker = harden({ + deleteCListEntry, + deleteSnapshots, + deleteTranscripts, + }); + ephemeral.vatUndertakers.set(vatID, undertaker); + return undertaker; + } + function vatIsAlive(vatID) { insistVatID(vatID); return kvStore.has(`${vatID}.o.nextID`) && !terminatedVats.includes(vatID); diff --git a/packages/SwingSet/src/kernel/state/vatKeeper.js b/packages/SwingSet/src/kernel/state/vatKeeper.js index 1d4d6b1f12f..d307bc77e7b 100644 --- a/packages/SwingSet/src/kernel/state/vatKeeper.js +++ b/packages/SwingSet/src/kernel/state/vatKeeper.js @@ -84,49 +84,53 @@ export function initializeVatState( } /** - * Produce a vat keeper for a vat. + * @typedef {object} VatKeeperPowers + * @property {TranscriptStore} transcriptStore Accompanying transcript store, for the transcripts + * @property {*} kernelSlog + * @property {*} addKernelObject Kernel function to add a new object to the kernel's mapping tables. + * @property {*} addKernelPromiseForVat Kernel function to add a new promise to the kernel's mapping tables. + * @property {(kernelSlot: string) => boolean} kernelObjectExists + * @property {*} incrementRefCount + * @property {*} decrementRefCount + * @property {(kernelSlot: string) => {reachable: number, recognizable: number}} getObjectRefCount + * @property {(kernelSlot: string, o: { reachable: number, recognizable: number }) => void} setObjectRefCount + * @property {(vatID: string, kernelSlot: string) => {isReachable: boolean, vatSlot: string}} getReachableAndVatSlot + * @property {(kernelSlot: string) => void} addMaybeFreeKref + * @property {*} incStat + * @property {*} decStat + * @property {*} getCrankNumber + * @property {*} scheduleReap + * @property {SnapStore} snapStore + */ + +/** + * Produce a "vat keeper" for the kernel state of a vat. * - * @param {KVStore} kvStore The keyValue store in which the persistent state will be kept - * @param {TranscriptStore} transcriptStore Accompanying transcript store, for the transcripts - * @param {*} kernelSlog * @param {string} vatID The vat ID string of the vat in question - * @param {*} addKernelObject Kernel function to add a new object to the kernel's - * mapping tables. - * @param {*} addKernelPromiseForVat Kernel function to add a new promise to the - * kernel's mapping tables. - * @param {(kernelSlot: string) => boolean} kernelObjectExists - * @param {*} incrementRefCount - * @param {*} decrementRefCount - * @param {(kernelSlot: string) => {reachable: number, recognizable: number}} getObjectRefCount - * @param {(kernelSlot: string, o: { reachable: number, recognizable: number }) => void} setObjectRefCount - * @param {(vatID: string, kernelSlot: string) => {isReachable: boolean, vatSlot: string}} getReachableAndVatSlot - * @param {(kernelSlot: string) => void} addMaybeFreeKref - * @param {*} incStat - * @param {*} decStat - * @param {*} getCrankNumber - * @param {*} scheduleReap - * @param {SnapStore} [snapStore] - * returns an object to hold and access the kernel's state for the given vat + * @param {KVStore} kvStore The keyValue store in which the persistent state will be kept + * @param {VatKeeperPowers} powers */ export function makeVatKeeper( - kvStore, - transcriptStore, - kernelSlog, vatID, - addKernelObject, - addKernelPromiseForVat, - kernelObjectExists, - incrementRefCount, - decrementRefCount, - getObjectRefCount, - setObjectRefCount, - getReachableAndVatSlot, - addMaybeFreeKref, - incStat, - decStat, - getCrankNumber, - scheduleReap, - snapStore = undefined, + kvStore, + { + transcriptStore, + kernelSlog, + addKernelObject, + addKernelPromiseForVat, + kernelObjectExists, + incrementRefCount, + decrementRefCount, + getObjectRefCount, + setObjectRefCount, + getReachableAndVatSlot, + addMaybeFreeKref, + incStat, + decStat, + getCrankNumber, + scheduleReap, + snapStore, + }, ) { insistVatID(vatID); diff --git a/packages/SwingSet/src/kernel/vat-warehouse.js b/packages/SwingSet/src/kernel/vat-warehouse.js index 2d4a167c398..2c2dbe07377 100644 --- a/packages/SwingSet/src/kernel/vat-warehouse.js +++ b/packages/SwingSet/src/kernel/vat-warehouse.js @@ -97,6 +97,7 @@ export function makeSyscallSimulator( deliveryNum, transcriptEntry, ) { + const context = `anachrophobia in ${vatID} delivery d${deliveryNum}`; const syscallsExpected = [...transcriptEntry.sc]; // copy const syscallsMade = []; // syscallStatus's length will be max(syscallsExpected, @@ -107,31 +108,36 @@ export function makeSyscallSimulator( let replayError; // sticky const explain = () => { - console.log(`anachrophobia strikes ${vatID} on delivery ${deliveryNum}`); + console.log( + `anachrophobia strikes ${vatID} delivery d${deliveryNum} syscalls`, + ); for (const [idx, status] of syscallStatus.entries()) { const expected = syscallsExpected[idx]; const got = syscallsMade[idx]; switch (status) { case 'ok': { - console.log(`sc[${idx}]: ok: ${djson.stringify(got)}`); + console.log(`sc${idx}: ok: ${djson.stringify(got)}`); break; } case 'wrong': { - console.log(`sc[${idx}]: wrong`); - console.log(` expected: ${djson.stringify(expected.s)}`); - console.log(` got : ${djson.stringify(got)}`); + console.log( + ` +sc${idx}: WRONG + expected: ${djson.stringify(expected.s)} + got : ${djson.stringify(got)}`.trimStart(), + ); break; } case 'extra': { - console.log(`sc[${idx}]: extra: ${djson.stringify(got)}`); + console.log(`sc${idx}: EXTRA: ${djson.stringify(got)}`); break; } case 'missing': { - console.log(`sc[${idx}]: missing: ${djson.stringify(expected.s)}`); + console.log(`sc${idx}: MISSING: ${djson.stringify(expected.s)}`); break; } default: - Fail`bad ${status}`; + Fail`sc${idx}: bad status ${status}`; } } }; @@ -140,16 +146,16 @@ export function makeSyscallSimulator( // slog entries have no kernel-translated kso/ksr const finish = kernelSlog.syscall(vatID, undefined, vso); const expected = syscallsExpected[syscallsMade.length]; - syscallsMade.push(vso); + const idx = syscallsMade.push(vso) - 1; if (!expected) { syscallStatus.push('extra'); - const error = Error(`anachrophobia in ${vatID}: extra syscall`); + const error = Error(`${context}: extra syscall at index sc${idx}`); replayError ||= error; throw error; } if (!syscallsAreIdentical(expected.s, vso)) { syscallStatus.push('wrong'); - const error = Error(`anachrophobia in ${vatID}: wrong syscall`); + const error = Error(`${context}: wrong syscall at index sc${idx}`); replayError ||= error; throw error; } @@ -159,12 +165,14 @@ export function makeSyscallSimulator( }; const finishSimulation = () => { - if (syscallsMade.length < syscallsExpected.length) { - const missing = syscallsExpected.length - syscallsMade.length; + const missing = syscallsExpected.length - syscallsMade.length; + if (missing > 0) { for (let i = 0; i < missing; i += 1) { syscallStatus.push('missing'); } - const error = Error(`anachrophobia in ${vatID}: missing syscalls`); + const error = Error( + `${context}: missing ${missing} syscall(s) at index sc${syscallsMade.length}`, + ); replayError ||= error; } @@ -389,7 +397,6 @@ export function makeVatWarehouse({ // entriesReplayed, // retval of replayTranscript() above // ); ephemeral.vats.set(vatID, result); - // eslint-disable-next-line no-use-before-define await applyAvailabilityPolicy(vatID); return result; } @@ -596,7 +603,6 @@ export function makeVatWarehouse({ // /** @type { KernelDeliveryObject } */ const kd = harden(['bringOutYourDead']); - // eslint-disable-next-line no-use-before-define const vd = kernelDeliveryToVatDelivery(vatID, kd); const vs = kernelSlog.provideVatSlogger(vatID).vatSlog; await deliverToVat(vatID, kd, vd, vs); diff --git a/packages/SwingSet/src/supervisors/subprocess-node/supervisor-subprocess-node.js b/packages/SwingSet/src/supervisors/subprocess-node/supervisor-subprocess-node.js index 8f1067b84ca..912ea44c231 100644 --- a/packages/SwingSet/src/supervisors/subprocess-node/supervisor-subprocess-node.js +++ b/packages/SwingSet/src/supervisors/subprocess-node/supervisor-subprocess-node.js @@ -36,6 +36,7 @@ workerLog(`supervisor started`); function makeNetstringReader({ fd, encoding }) { const input = Buffer.alloc(32 * 1024); + /** @type {Buffer} */ let buffered = Buffer.alloc(0); let decoded = []; diff --git a/packages/SwingSet/src/typeGuards.js b/packages/SwingSet/src/typeGuards.js index dd313d11b14..44bbb67b365 100644 --- a/packages/SwingSet/src/typeGuards.js +++ b/packages/SwingSet/src/typeGuards.js @@ -10,10 +10,11 @@ export const ManagerType = M.or( const Bundle = M.splitRecord({ moduleType: M.string() }); -const SwingsetConfigOptions = harden({ +const SwingsetConfigOptions = { creationOptions: M.splitRecord({}, { critical: M.boolean() }), parameters: M.recordOf(M.string(), M.any()), -}); +}; +harden(SwingsetConfigOptions); const SwingSetConfigProperties = M.or( M.splitRecord({ sourceSpec: M.string() }, SwingsetConfigOptions), diff --git a/packages/SwingSet/src/vats/comms/delivery.js b/packages/SwingSet/src/vats/comms/delivery.js index bdfd8703226..c513a877812 100644 --- a/packages/SwingSet/src/vats/comms/delivery.js +++ b/packages/SwingSet/src/vats/comms/delivery.js @@ -1,5 +1,3 @@ -/* eslint-disable no-use-before-define */ - import { assert, Fail } from '@endo/errors'; import { kser } from '@agoric/kmarshal'; import { parseLocalSlot, insistLocalType } from './parseLocalSlots.js'; diff --git a/packages/SwingSet/src/vats/comms/state.js b/packages/SwingSet/src/vats/comms/state.js index 65813f276b7..8e0f9a616eb 100644 --- a/packages/SwingSet/src/vats/comms/state.js +++ b/packages/SwingSet/src/vats/comms/state.js @@ -150,7 +150,6 @@ export function makeState(syscall) { store.set('r.nextID', '1'); store.set('initialized', 'true'); if (controller) { - // eslint-disable-next-line no-use-before-define addMetaObject(controller); cdebug(`comms controller is ${controller}`); } @@ -393,7 +392,6 @@ export function makeState(syscall) { // the object is unreachable const { owner, isReachable, isRecognizable } = - // eslint-disable-next-line no-use-before-define getOwnerAndStatus(lref); if (isReachable) { // but the exporter doesn't realize it yet, so schedule a @@ -558,7 +556,6 @@ export function makeState(syscall) { isReachable = isReachableByKernel(lref); isRecognizable = !!mapToKernel(lref); } else { - // eslint-disable-next-line no-use-before-define const remote = getRemote(owner); isReachable = remote.isReachable(lref); isRecognizable = !!remote.mapToRemote(lref); @@ -794,7 +791,6 @@ export function makeState(syscall) { insistPromiseIsUnresolved, markPromiseAsResolved, - // eslint-disable-next-line no-use-before-define getRemote, addRemote, getRemoteIDForName, diff --git a/packages/SwingSet/src/vats/timer/vat-timer.js b/packages/SwingSet/src/vats/timer/vat-timer.js index 1f1ce669439..7e137bbe540 100644 --- a/packages/SwingSet/src/vats/timer/vat-timer.js +++ b/packages/SwingSet/src/vats/timer/vat-timer.js @@ -1,5 +1,3 @@ -/* eslint-disable no-use-before-define */ - import { assert } from '@endo/errors'; import { Far, E, passStyleOf } from '@endo/far'; import { makePromiseKit } from '@endo/promise-kit'; diff --git a/packages/SwingSet/src/vats/vat-admin/vat-vat-admin.js b/packages/SwingSet/src/vats/vat-admin/vat-vat-admin.js index 965fcb47864..675db94cbb1 100644 --- a/packages/SwingSet/src/vats/vat-admin/vat-vat-admin.js +++ b/packages/SwingSet/src/vats/vat-admin/vat-vat-admin.js @@ -100,7 +100,6 @@ export function buildRootObject(vatPowers, _vatParameters, baggage) { // getNotifier: ({ state }) => state.notifier, // XXX RESTORE getNotifier: ({ _self }) => Fail`not implemented, see #7234`, // XXX TEMP }, - // eslint-disable-next-line no-use-before-define { finish: finishMeter }, ); @@ -120,18 +119,15 @@ export function buildRootObject(vatPowers, _vatParameters, baggage) { // getNotifier: ({ state }) => state.notifier, // will never fire // XXX RESTORE getNotifier: ({ _self }) => Fail`not implemented, see #7234`, // XXX TEMP }, - // eslint-disable-next-line no-use-before-define { finish: finishMeter }, ); function finishMeter({ state, self }) { - // eslint-disable-next-line no-use-before-define meterByID.init( state.meterID, // harden({ meter: self, updater: state.updater }), // XXX RESTORE harden({ meter: self }), // XXX TEMP ); - // eslint-disable-next-line no-use-before-define meterIDByMeter.set(self, state.meterID); } diff --git a/packages/SwingSet/test/metering/metered-code.js b/packages/SwingSet/test/metering/metered-code.js index 05859f127ae..618a170e6cb 100644 --- a/packages/SwingSet/test/metering/metered-code.js +++ b/packages/SwingSet/test/metering/metered-code.js @@ -18,7 +18,7 @@ export function meterMe(log2, explode = 'no') { } try { if (explode === 'compute') { - // eslint-disable-next-line no-constant-condition, no-empty + // eslint-disable-next-line no-empty while (true) {} } else if (explode === 'stack') { delveForeverIntoTheRecursiveDepths(); diff --git a/packages/SwingSet/test/snapshots/xsnap-store.test.js.md b/packages/SwingSet/test/snapshots/xsnap-store.test.js.md index 7c3c9d5d9f0..43137c2f9e3 100644 --- a/packages/SwingSet/test/snapshots/xsnap-store.test.js.md +++ b/packages/SwingSet/test/snapshots/xsnap-store.test.js.md @@ -22,8 +22,8 @@ Generated by [AVA](https://avajs.dev). archiveWriteSeconds: undefined, compressSeconds: 0, dbSaveSeconds: 0, - hash: 'fb587fde939d0e8e73cb6dd109e908f8c1c718c645144ad9d1f562671fd3b729', - uncompressedSize: 842803, + hash: '8da7b45fc3fbb377376a4569e8d8f8f971b2d1cd82e5b0d2e7210532c350568e', + uncompressedSize: 854315, } > after use of harden() - sensitive to SES-shim, XS, and supervisor @@ -32,6 +32,6 @@ Generated by [AVA](https://avajs.dev). archiveWriteSeconds: undefined, compressSeconds: 0, dbSaveSeconds: 0, - hash: 'aacc598ff81bb8ea45f38f05ba80b1ec6a399973a82f0271a2992418b0db7eb1', - uncompressedSize: 842963, + hash: 'f4adb516a299d85752f93ee1191844efc77ae73313ab93971b2d1eb10a04f5f9', + uncompressedSize: 854475, } diff --git a/packages/SwingSet/test/snapshots/xsnap-store.test.js.snap b/packages/SwingSet/test/snapshots/xsnap-store.test.js.snap index 73de27193b1..96ba58ad65f 100644 Binary files a/packages/SwingSet/test/snapshots/xsnap-store.test.js.snap and b/packages/SwingSet/test/snapshots/xsnap-store.test.js.snap differ diff --git a/packages/SwingSet/test/upgrade/upgrade-replay.test.js b/packages/SwingSet/test/upgrade/upgrade-replay.test.js index 1cd95fc32d2..1978de10bbf 100644 --- a/packages/SwingSet/test/upgrade/upgrade-replay.test.js +++ b/packages/SwingSet/test/upgrade/upgrade-replay.test.js @@ -4,6 +4,7 @@ import { test } from '../../tools/prepare-test-env-ava.js'; import { assert } from '@endo/errors'; import { kser } from '@agoric/kmarshal'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; import { initSwingStore } from '@agoric/swing-store'; import { buildKernelBundles, @@ -16,10 +17,6 @@ function bfile(name) { return new URL(name, import.meta.url).pathname; } -function copy(data) { - return JSON.parse(JSON.stringify(data)); -} - async function run(c, method, args = []) { assert(Array.isArray(args)); const kpid = c.queueToVatRoot('bootstrap', method, args); @@ -49,7 +46,12 @@ test('replay after upgrade', async t => { const ss1 = initSwingStore(); { - await initializeSwingset(copy(config), [], ss1.kernelStorage, initOpts); + await initializeSwingset( + deepCopyJsonable(config), + [], + ss1.kernelStorage, + initOpts, + ); const c1 = await makeSwingsetController(ss1.kernelStorage, {}, runtimeOpts); t.teardown(c1.shutdown); c1.pinVatRoot('bootstrap'); diff --git a/packages/SwingSet/test/vat-admin/replay.test.js b/packages/SwingSet/test/vat-admin/replay.test.js index 24cb2dfd24f..61658ad7fc3 100644 --- a/packages/SwingSet/test/vat-admin/replay.test.js +++ b/packages/SwingSet/test/vat-admin/replay.test.js @@ -2,14 +2,11 @@ // eslint-disable-next-line import/order import { test } from '../../tools/prepare-test-env-ava.js'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; import { kser } from '@agoric/kmarshal'; import { initSwingStore } from '@agoric/swing-store'; import { buildKernelBundles, buildVatController } from '../../src/index.js'; -function copy(data) { - return JSON.parse(JSON.stringify(data)); -} - test.before(async t => { const kernelBundles = await buildKernelBundles(); t.context.data = { kernelBundles }; @@ -34,7 +31,7 @@ test.serial('replay dynamic vat', async t => { const ss1 = initSwingStore(); { - const c1 = await buildVatController(copy(config), [], { + const c1 = await buildVatController(deepCopyJsonable(config), [], { kernelStorage: ss1.kernelStorage, kernelBundles: t.context.data.kernelBundles, }); @@ -52,7 +49,7 @@ test.serial('replay dynamic vat', async t => { const serialized = ss1.debug.serialize(); const ss2 = initSwingStore(null, { serialized }); { - const c2 = await buildVatController(copy(config), [], { + const c2 = await buildVatController(deepCopyJsonable(config), [], { kernelStorage: ss2.kernelStorage, }); t.teardown(c2.shutdown); diff --git a/packages/SwingSet/tools/baggage-check.js b/packages/SwingSet/tools/baggage-check.js index 6455952d10e..6d190e19e00 100644 --- a/packages/SwingSet/tools/baggage-check.js +++ b/packages/SwingSet/tools/baggage-check.js @@ -1,8 +1,6 @@ import { makeMarshal } from '@endo/marshal'; import { Far } from '@endo/far'; -/* eslint-disable no-use-before-define */ - function fakeSTV(slot, iface = 'Remotable') { return Far(iface, { getSlot: () => slot, diff --git a/packages/SwingSet/tools/bootstrap-dvo-test.js b/packages/SwingSet/tools/bootstrap-dvo-test.js index 337e4d95abe..eb085aa7814 100644 --- a/packages/SwingSet/tools/bootstrap-dvo-test.js +++ b/packages/SwingSet/tools/bootstrap-dvo-test.js @@ -11,7 +11,6 @@ export function buildRootObject() { async function runTests(phase) { testLog = []; doneP = makePromiseKit(); - // eslint-disable-next-line no-use-before-define await E(testVatRoot).runTests(self, phase); await doneP.promise; return testLog; diff --git a/packages/SwingSet/tools/bootstrap-relay.js b/packages/SwingSet/tools/bootstrap-relay.js index 730a7aa6593..8b30c77e5b6 100644 --- a/packages/SwingSet/tools/bootstrap-relay.js +++ b/packages/SwingSet/tools/bootstrap-relay.js @@ -1,3 +1,12 @@ +/** + * @file Source code for a bootstrap vat that runs blockchain behaviors (such as + * bridge vat integration) and exposes reflective methods for use in testing. + * + * TODO: Build from ./vat-puppet.js makeReflectionMethods + * and share code with packages/vats/tools/vat-reflective-chain-bootstrap.js + * (which basically extends this for better [mock] blockchain integration). + */ + import { Fail, q } from '@endo/errors'; import { objectMap } from '@agoric/internal'; import { Far, E } from '@endo/far'; diff --git a/packages/SwingSet/tools/run-utils.js b/packages/SwingSet/tools/run-utils.js index 5c1ed2e4b39..bdb1a435390 100644 --- a/packages/SwingSet/tools/run-utils.js +++ b/packages/SwingSet/tools/run-utils.js @@ -2,12 +2,18 @@ import { Fail, q } from '@endo/errors'; import { kunser } from '@agoric/kmarshal'; import { makeQueue } from '@endo/stream'; -/** @import { ERef } from '@endo/far' */ +/** + * @import { ERef } from '@endo/far' + * @import { RunPolicy } from '../src/types-external.js' + */ + +/** @typedef {{ provideRunPolicy: () => RunPolicy | undefined }} RunHarness */ /** * @param {import('../src/controller/controller.js').SwingsetController} controller + * @param {RunHarness} [harness] */ -export const makeRunUtils = controller => { +export const makeRunUtils = (controller, harness) => { const mutex = makeQueue(); const logRunFailure = reason => console.log('controller.run() failure', reason); @@ -17,7 +23,7 @@ export const makeRunUtils = controller => { * Wait for exclusive access to the controller, then before relinquishing that access, * enqueue and process a delivery and return the result. * - * @param {() => ERef>} deliveryThunk + * @param {() => ERef>} deliveryThunk * function for enqueueing a delivery and returning the result kpid (if any) * @param {boolean} [voidResult] whether to ignore the result * @returns {Promise} @@ -25,7 +31,8 @@ export const makeRunUtils = controller => { const queueAndRun = async (deliveryThunk, voidResult = false) => { await mutex.get(); const kpid = await deliveryThunk(); - const runResultP = controller.run(); + const runPolicy = harness && harness.provideRunPolicy(); + const runResultP = controller.run(runPolicy); mutex.put(runResultP.catch(logRunFailure)); await runResultP; diff --git a/packages/SwingSet/tools/vat-puppet.js b/packages/SwingSet/tools/vat-puppet.js new file mode 100644 index 00000000000..d3a9ed3d78e --- /dev/null +++ b/packages/SwingSet/tools/vat-puppet.js @@ -0,0 +1,111 @@ +/** + * @file Source code for a vat that exposes reflective methods for use in + * testing. + */ + +import { Fail, q } from '@endo/errors'; +import { Far, E } from '@endo/far'; +import { makePromiseKit } from '@endo/promise-kit'; +import { objectMap } from '@agoric/internal'; + +/** + * @callback Die + * @param {unknown} completion + * @param {[target: unknown, method: string, ...args: unknown[]]} [finalSend] + */ + +/** + * @typedef {Array<[name: string, ...args: unknown[]]>} CallLog + */ + +/** + * @param {import('@agoric/swingset-vat').VatPowers} vatPowers + * @param {import('@agoric/vat-data').Baggage} baggage + */ +export const makeReflectionMethods = (vatPowers, baggage) => { + let baggageHoldCount = 0; + /** @type {Map} */ + const callLogsByRemotable = new Map(); + const heldInHeap = []; + const send = (target, method, ...args) => E(target)[method](...args); + const makeSpy = (value, name, callLog) => { + const spyName = `get ${name}`; + const spy = { + [spyName](...args) { + callLog.push([name, ...args]); + return value; + }, + }[spyName]; + return spy; + }; + + return { + /** @type {Die} */ + dieHappy: (completion, finalSend) => { + vatPowers.exitVat(completion); + if (finalSend) send(...finalSend); + }, + + /** @type {Die} */ + dieSad: (reason, finalSend) => { + vatPowers.exitVatWithFailure(/** @type {Error} */ (reason)); + if (finalSend) send(...finalSend); + }, + + holdInBaggage: (...values) => { + for (const value of values) { + baggage.init(`held-${baggageHoldCount}`, value); + baggageHoldCount += 1; + } + return baggageHoldCount; + }, + + holdInHeap: (...values) => heldInHeap.push(...values), + + makePromiseKit: () => { + const { promise, ...resolverMethods } = makePromiseKit(); + void promise.catch(() => {}); + const resolver = Far('resolver', resolverMethods); + return harden({ promise, resolver }); + }, + + makeUnsettledPromise() { + const { promise } = makePromiseKit(); + void promise.catch(() => {}); + return promise; + }, + + /** + * Returns a remotable with methods that return provided values. Invocations + * of those methods and their arguments are captured for later retrieval by + * `getCallLogForRemotable`. + * + * @param {string} [label] + * @param {Record} [fields] + */ + makeRemotable: (label = 'Remotable', fields = {}) => { + /** @type {CallLog} */ + const callLog = []; + const methods = objectMap(fields, (value, name) => + makeSpy(value, name, callLog), + ); + const remotable = Far(label, { ...methods }); + callLogsByRemotable.set(remotable, callLog); + return remotable; + }, + + /** + * @param {object} remotable + * @returns {CallLog} + */ + getCallLogForRemotable: remotable => + callLogsByRemotable.get(remotable) || + Fail`unknown remotable ${q(remotable)}`, + }; +}; +harden(makeReflectionMethods); + +export function buildRootObject(vatPowers, _vatParameters, baggage) { + const methods = makeReflectionMethods(vatPowers, baggage); + return Far('root', methods); +} diff --git a/packages/access-token/package.json b/packages/access-token/package.json index 785731b9092..dd3f1177999 100644 --- a/packages/access-token/package.json +++ b/packages/access-token/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint": "run-s --continue-on-error lint:*", "lint-fix": "yarn lint:eslint --fix", @@ -26,7 +26,7 @@ "@types/n-readlines": "^1.0.3", "@types/proper-lockfile": "^4.1.2", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "publishConfig": { "access": "public" diff --git a/packages/agoric-cli/integration-tests/workflow.test.js b/packages/agoric-cli/integration-tests/workflow.test.js index 471e3550c40..05f5bc344f5 100644 --- a/packages/agoric-cli/integration-tests/workflow.test.js +++ b/packages/agoric-cli/integration-tests/workflow.test.js @@ -2,5 +2,4 @@ import { test } from '@agoric/swingset-vat/tools/prepare-test-env-ava.js'; import { gettingStartedWorkflowTest } from '../tools/getting-started.js'; -test('workflow', t => - gettingStartedWorkflowTest(t, { testUnsafePlugins: true })); +test('"getting started" workflow', t => gettingStartedWorkflowTest(t)); diff --git a/packages/agoric-cli/package.json b/packages/agoric-cli/package.json index ed4bc6004f1..c4953bbe4b5 100644 --- a/packages/agoric-cli/package.json +++ b/packages/agoric-cli/package.json @@ -10,7 +10,8 @@ }, "exports": { "./src/entrypoint.js": "./src/entrypoint.js", - "./src/helpers.js": "./src/helpers.js" + "./src/helpers.js": "./src/helpers.js", + "./src/lib/index.js": "./src/lib/index.js" }, "files": [ "src", @@ -20,7 +21,7 @@ "scripts": { "build": "node ./scripts/get-sdk-package-names.js > src/sdk-package-names.js", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "integration-test": "ava --config .ava-integration-test.config.js", "lint-fix": "yarn lint:eslint --fix", @@ -32,13 +33,15 @@ "@agoric/cosmic-swingset": "^0.42.0-u18.5", "@agoric/deploy-script-support": "^0.10.4-u18.4", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "dd-trace": "^4.11.1" }, "dependencies": { "@agoric/access-token": "^0.4.22-u18.0", + "@endo/errors": "^1.2.8", "@agoric/cache": "^0.3.3-u18.0", "@agoric/casting": "^0.4.3-u18.4", + "@agoric/client-utils": "^0.1.0", "@agoric/cosmic-proto": "^0.5.0-u18.4", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/governance": "^0.10.4-u18.0", @@ -57,22 +60,21 @@ "@cosmjs/math": "^0.32.3", "@cosmjs/proto-signing": "^0.32.3", "@cosmjs/stargate": "^0.32.3", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/compartment-mapper": "^1.3.1", - "@endo/env-options": "^1.1.7", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", - "@endo/zip": "^1.0.8", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/compartment-mapper": "^1.4.0", + "@endo/env-options": "^1.1.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", + "@endo/zip": "^1.0.9", "@iarna/toml": "^2.2.3", "anylogger": "^0.21.0", "chalk": "^5.2.0", - "commander": "^11.1.0", + "commander": "^12.1.0", "deterministic-json": "^1.0.5", "esm": "agoric-labs/esm#Agoric-built", "inquirer": "^8.2.2", @@ -99,6 +101,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 77.44 + "atLeast": 78.19 } } diff --git a/packages/agoric-cli/src/anylogger-agoric.js b/packages/agoric-cli/src/anylogger-agoric.js index d4db4f2a315..87bc1bb679f 100644 --- a/packages/agoric-cli/src/anylogger-agoric.js +++ b/packages/agoric-cli/src/anylogger-agoric.js @@ -28,8 +28,8 @@ const selectedCode = anylogger.levels[selectedLevel]; const globalCode = selectedCode === undefined ? -Infinity : selectedCode; const oldExt = anylogger.ext; -anylogger.ext = (l, o) => { - l = oldExt(l, o); +anylogger.ext = (l, ...rest) => { + l = oldExt(l, ...rest); l.enabledFor = lvl => globalCode >= anylogger.levels[lvl]; const prefix = l.name.replace(/:/g, ': '); diff --git a/packages/agoric-cli/src/chain-config.js b/packages/agoric-cli/src/chain-config.js index e9bc39f7376..6f90e854b33 100644 --- a/packages/agoric-cli/src/chain-config.js +++ b/packages/agoric-cli/src/chain-config.js @@ -81,7 +81,12 @@ export const DEFAULT_RPC_PORT = 26657; export const DEFAULT_PROM_PORT = 26660; export const DEFAULT_API_PORT = 1317; -// Rewrite the app.toml. +/** + * Rewrite the app.toml. + * + * @param {{ appToml: string, enableCors?: boolean, exportMetrics?: boolean, portNum?: string, chainId?: string, enableRosetta?: boolean, rosettaPort?: string }} input + * @returns {string} toml + */ export function finishCosmosApp({ appToml, enableCors, @@ -92,6 +97,8 @@ export function finishCosmosApp({ rosettaPort = `${DEFAULT_ROSETTA_PORT}`, }) { const rpcPort = Number(portNum); + // TODO: Use an accurate narrow type. + /** @type {Record} */ const app = TOML.parse(appToml); if (enableCors) { @@ -138,7 +145,12 @@ export function finishCosmosApp({ return TOML.stringify(app); } -// Rewrite the config.toml. +/** + * Rewrite the config.toml. + * + * @param {{ configToml: string, enableCors?: boolean, exportMetrics?: boolean, portNum?: string, persistentPeers?: string, seeds?: string, unconditionalPeerIds?: string }} input + * @returns {string} toml + */ export function finishTendermintConfig({ configToml, enableCors, @@ -151,6 +163,8 @@ export function finishTendermintConfig({ const rpcPort = Number(portNum); // Adjust the config.toml. + // TODO: Use an accurate narrow type. + /** @type {Record} */ const config = TOML.parse(configToml); config.proxy_app = 'kvstore'; @@ -189,7 +203,12 @@ export function finishTendermintConfig({ return TOML.stringify(config); } -// Rewrite/import the genesis.json. +/** + * Rewrite/import the genesis.json. + * + * @param {{ genesisJson: string, exportedGenesisJson?: string }} input + * @returns {string} json + */ export function finishCosmosGenesis({ genesisJson, exportedGenesisJson }) { const genesis = JSON.parse(genesisJson); const exported = exportedGenesisJson ? JSON.parse(exportedGenesisJson) : {}; diff --git a/packages/agoric-cli/src/commands/auction.js b/packages/agoric-cli/src/commands/auction.js index 99ffd43355c..684cd4356a4 100644 --- a/packages/agoric-cli/src/commands/auction.js +++ b/packages/agoric-cli/src/commands/auction.js @@ -1,8 +1,12 @@ // @ts-check - -import { InvalidArgumentError } from 'commander'; +/* eslint-env node */ +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, +} from '@agoric/client-utils'; import { Fail } from '@endo/errors'; -import { makeRpcUtils } from '../lib/rpc.js'; +import { InvalidArgumentError } from 'commander'; import { outputActionAndHint } from '../lib/wallet.js'; /** @@ -10,6 +14,8 @@ import { outputActionAndHint } from '../lib/wallet.js'; * @import {ParamValueForType} from '@agoric/governance/src/types.js' */ +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + /** * @template {ParamTypesMap} M * @typedef {{ @@ -59,11 +65,6 @@ export const makeAuctionCommand = ( 'descending clock step size', BigInt, ) - .option( - '--discount-step ', - 'proposed value (basis points)', - BigInt, - ) .requiredOption( '--charterAcceptOfferId ', 'offer that had continuing invitation result', @@ -91,13 +92,13 @@ export const makeAuctionCommand = ( * }} opts */ async opts => { - const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); - - /** @type {{ current: AuctionParamRecord }} */ - // @ts-expect-error XXX should runtime check? - const { current } = await readLatestHead( - `published.auction.governance`, + const { readPublished, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); + + const { current } = await readPublished(`auction.governance`); const { AuctionStartDelay: { diff --git a/packages/agoric-cli/src/commands/gov.js b/packages/agoric-cli/src/commands/gov.js index 8a4b46d49e5..007b6b1a2ea 100644 --- a/packages/agoric-cli/src/commands/gov.js +++ b/packages/agoric-cli/src/commands/gov.js @@ -1,10 +1,14 @@ // @ts-check /* eslint-disable func-names */ -/* global globalThis, process, setTimeout */ +/* eslint-env node */ +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, +} from '@agoric/client-utils'; import { execFileSync as execFileSyncAmbient } from 'child_process'; import { Command, CommanderError } from 'commander'; import { normalizeAddressWithOptions, pollBlocks } from '../lib/chain.js'; -import { getNetworkConfig, makeRpcUtils } from '../lib/rpc.js'; import { findContinuingIds, getCurrent, @@ -14,8 +18,10 @@ import { } from '../lib/wallet.js'; /** - * @import {OfferSpec} from '@agoric/smart-wallet/src/offers.js' - * @import {QuestionDetails} from '@agoric/governance/src/types.js' + * @import {OfferSpec} from '@agoric/smart-wallet/src/offers.js'; + * @import {AgoricNamesRemotes} from '@agoric/vats/tools/board-utils.js'; + * @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js'; + * @import {VstorageKit} from '@agoric/client-utils'; */ const collectValues = (val, memo) => { @@ -25,6 +31,8 @@ const collectValues = (val, memo) => { const defaultKeyring = process.env.AGORIC_KEYRING_BACKEND || 'test'; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + /** * @param {import('anylogger').Logger} _logger * @param {{ @@ -40,10 +48,9 @@ export const makeGovCommand = (_logger, io = {}) => { const { // Allow caller to provide access explicitly, but // default to conventional ambient IO facilities. - env = process.env, stdout = process.stdout, stderr = process.stderr, - fetch = globalThis.fetch, + fetch = global.fetch, execFileSync = execFileSyncAmbient, delay = ms => new Promise(resolve => setTimeout(resolve, ms)), } = io; @@ -84,26 +91,27 @@ export const makeGovCommand = (_logger, io = {}) => { * given a sendFrom address; else print it. * * @param {{ - * toOffer: (agoricNames: *, current: import('@agoric/smart-wallet/src/smartWallet.js').CurrentWalletRecord | undefined) => OfferSpec, + * toOffer: (agoricNames: AgoricNamesRemotes, current: CurrentWalletRecord | undefined) => OfferSpec, * sendFrom?: string | undefined, * keyringBackend: string, * instanceName?: string, * }} detail - * @param {Awaited>} [optUtils] + * @param {VstorageKit} [vsk] */ const processOffer = async function ( { toOffer, sendFrom, keyringBackend }, - optUtils, + vsk, ) { - const networkConfig = await getNetworkConfig(env); - const utils = await (optUtils || makeRpcUtils({ fetch })); - const { agoricNames, readLatestHead } = utils; + await null; + vsk ||= makeVstorageKit({ fetch }, networkConfig); + const { readPublished } = vsk; + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); assert(keyringBackend, 'missing keyring-backend option'); let current; if (sendFrom) { - current = await getCurrent(sendFrom, { readLatestHead }); + current = await getCurrent(sendFrom, { readPublished }); } const offer = toOffer(agoricNames, current); @@ -133,9 +141,9 @@ export const makeGovCommand = (_logger, io = {}) => { show({ timestamp, height, offerId: offer.id, txhash }); const checkInWallet = async blockInfo => { const [state, update] = await Promise.all([ - getCurrent(sendFrom, { readLatestHead }), - getLastUpdate(sendFrom, { readLatestHead }), - readLatestHead(`published.wallet.${sendFrom}`), + getCurrent(sendFrom, { readPublished }), + getLastUpdate(sendFrom, { readPublished }), + readPublished(`wallet.${sendFrom}`), ]); if (update.updated === 'offerStatus' && update.status.id === offer.id) { return blockInfo; @@ -264,8 +272,12 @@ export const makeGovCommand = (_logger, io = {}) => { ) .requiredOption('--for ', 'description of the invitation') .action(async opts => { - const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); - const current = await getCurrent(opts.from, { readLatestHead }); + const { readPublished, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, + ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); + const current = await getCurrent(opts.from, { readPublished }); const known = findContinuingIds(current, agoricNames); if (!known) { @@ -290,8 +302,12 @@ export const makeGovCommand = (_logger, io = {}) => { normalizeAddress, ) .action(async opts => { - const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); - const current = await getCurrent(opts.from, { readLatestHead }); + const { readPublished, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, + ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); + const current = await getCurrent(opts.from, { readPublished }); const found = findContinuingIds(current, agoricNames); for (const it of found) { @@ -326,20 +342,17 @@ export const makeGovCommand = (_logger, io = {}) => { normalizeAddress, ) .action(async function (opts, options) { - const utils = await makeRpcUtils({ fetch }); - const { readLatestHead } = utils; + const vsk = makeVstorageKit({ fetch }, networkConfig); + const { readPublished } = vsk; - const info = await readLatestHead( - `published.committees.${opts.pathname}.latestQuestion`, + const questionDesc = await readPublished( + `committees.${opts.pathname}.latestQuestion`, ).catch(err => { // CommanderError is a class constructor, and so // must be invoked with `new`. throw new CommanderError(1, 'VSTORAGE_FAILURE', err.message); }); - // XXX runtime shape-check - const questionDesc = /** @type {QuestionDetails} */ (info); - // TODO support multiple position arguments const chosenPositions = [questionDesc.positions[opts.forPosition]]; assert(chosenPositions, `undefined position index ${opts.forPosition}`); @@ -380,7 +393,7 @@ export const makeGovCommand = (_logger, io = {}) => { sendFrom: opts.sendFrom, keyringBackend: options.optsWithGlobals().keyringBackend, }, - utils, + vsk, ); }); diff --git a/packages/agoric-cli/src/commands/inter.js b/packages/agoric-cli/src/commands/inter.js index 702b2ae0f48..013e1b9af0d 100644 --- a/packages/agoric-cli/src/commands/inter.js +++ b/packages/agoric-cli/src/commands/inter.js @@ -4,26 +4,19 @@ */ // @ts-check -import { CommanderError, InvalidArgumentError } from 'commander'; -// TODO: should get M from endo https://github.com/Agoric/agoric-sdk/issues/7090 +import { fetchEnvNetworkConfig, makeWalletUtils } from '@agoric/client-utils'; import { makeOfferSpecShape } from '@agoric/inter-protocol/src/auction/auctionBook.js'; import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; import { objectMap } from '@agoric/internal'; -import { M, matches } from '@agoric/store'; - +import { M, matches } from '@endo/patterns'; +import { CommanderError, InvalidArgumentError } from 'commander'; import { normalizeAddressWithOptions, pollBlocks } from '../lib/chain.js'; import { asBoardRemote, bigintReplacer, makeAmountFormatter, } from '../lib/format.js'; -import { getNetworkConfig } from '../lib/rpc.js'; -import { - getCurrent, - makeWalletUtils, - outputActionAndHint, - sendAction, -} from '../lib/wallet.js'; +import { getCurrent, outputActionAndHint, sendAction } from '../lib/wallet.js'; const { values } = Object; @@ -238,8 +231,8 @@ export const makeInterCommand = ( try { // XXX pass fetch to getNetworkConfig() explicitly // await null above makes this await safe - const networkConfig = await getNetworkConfig(env); - return makeWalletUtils({ fetch, execFileSync, delay }, networkConfig); + const networkConfig = await fetchEnvNetworkConfig({ env, fetch }); + return makeWalletUtils({ fetch, delay }, networkConfig); } catch (err) { // CommanderError is a class constructor, and so // must be invoked with `new`. @@ -287,14 +280,12 @@ inter auction status * }} */ opts, ) => { - const { agoricNames, readLatestHead } = await tryMakeUtils(); + const { agoricNames, readPublished } = await tryMakeUtils(); - /** @type { [ScheduleNotification, BookDataNotification, *] } */ - // @ts-expect-error dynamic cast const [schedule, book, { current: params }] = await Promise.all([ - readLatestHead(`published.auction.schedule`), - readLatestHead(`published.auction.book${opts.book}`), - readLatestHead(`published.auction.governance`), + readPublished('auction.schedule'), + readPublished(`auction.book${opts.book}`), + readPublished('auction.governance'), ]); const fmt = makeFormatters(Object.values(agoricNames.vbankAsset)); @@ -334,7 +325,7 @@ inter auction status * @param {string} from * @param {import('@agoric/smart-wallet/src/offers.js').OfferSpec} offer * @param {Awaited>} tools - * @param {boolean?} dryRun + * @param {boolean | undefined} dryRun */ const placeBid = async (from, offer, tools, dryRun = false) => { const { networkConfig, agoricNames, pollOffer } = tools; @@ -499,9 +490,9 @@ inter auction status return; } - const { networkConfig, readLatestHead } = await tryMakeUtils(); + const { networkConfig, readPublished } = await tryMakeUtils(); - const current = await getCurrent(from, { readLatestHead }); + const current = await getCurrent(from, { readPublished }); const liveIds = current.liveOffers.map(([i, _s]) => i); if (!liveIds.includes(id)) { // InvalidArgumentError is a class constructor, and so @@ -526,7 +517,7 @@ inter auction status show({ timestamp, height, offerId: id, txhash }); const checkGone = async blockInfo => { - const pollResult = await getCurrent(from, { readLatestHead }); + const pollResult = await getCurrent(from, { readPublished }); const found = pollResult.liveOffers.find(([i, _]) => i === id); if (found) throw Error('retry'); return blockInfo; @@ -568,11 +559,11 @@ $ inter bid list --from my-acct * }} opts */ async opts => { - const { agoricNames, readLatestHead, storedWalletState } = + const { agoricNames, readPublished, storedWalletState } = await tryMakeUtils(); const [current, state] = await Promise.all([ - getCurrent(opts.from, { readLatestHead }), + getCurrent(opts.from, { readPublished }), storedWalletState(opts.from), ]); const entries = opts.all diff --git a/packages/agoric-cli/src/commands/oracle.js b/packages/agoric-cli/src/commands/oracle.js index 520de3ba710..e91d9967be7 100644 --- a/packages/agoric-cli/src/commands/oracle.js +++ b/packages/agoric-cli/src/commands/oracle.js @@ -1,6 +1,13 @@ // @ts-check /* eslint-disable func-names */ /* eslint-env node */ +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, + makeWalletUtils, + storageHelper, +} from '@agoric/client-utils'; import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; import { oracleBrandFeedName } from '@agoric/inter-protocol/src/proposals/utils.js'; import { Fail } from '@endo/errors'; @@ -10,10 +17,8 @@ import { Command } from 'commander'; import { inspect } from 'util'; import { normalizeAddressWithOptions } from '../lib/chain.js'; import { bigintReplacer } from '../lib/format.js'; -import { getNetworkConfig, makeRpcUtils, storageHelper } from '../lib/rpc.js'; import { getCurrent, - makeWalletUtils, outputAction, sendAction, sendHint, @@ -82,20 +87,24 @@ export const makeOracleCommand = (logger, io = {}) => { const rpcTools = async () => { // XXX pass fetch to getNetworkConfig() explicitly - const networkConfig = await getNetworkConfig(env); - const utils = await makeRpcUtils({ fetch }); + const networkConfig = await fetchEnvNetworkConfig({ + env: process.env, + fetch, + }); + const vsk = makeVstorageKit({ fetch }, networkConfig); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const lookupPriceAggregatorInstance = ([brandIn, brandOut]) => { const name = oracleBrandFeedName(brandIn, brandOut); - const instance = utils.agoricNames.instance[name]; + const instance = agoricNames.instance[name]; if (!instance) { - logger.debug('known instances:', utils.agoricNames.instance); + logger.debug('known instances:', agoricNames.instance); throw Error(`Unknown instance ${name}`); } return instance; }; - return { ...utils, networkConfig, lookupPriceAggregatorInstance }; + return { ...vsk, networkConfig, lookupPriceAggregatorInstance }; }; oracle @@ -171,8 +180,8 @@ export const makeOracleCommand = (logger, io = {}) => { console.warn(sendHint); }); - const findOracleCap = async (instance, from, readLatestHead) => { - const current = await getCurrent(from, { readLatestHead }); + const findOracleCap = async (instance, from, readPublished) => { + const current = await getCurrent(from, { readPublished }); const { offerToUsedInvitation: entries } = /** @type {any} */ (current); Array.isArray(entries) || Fail`entries must be an array: ${entries}`; @@ -200,11 +209,10 @@ export const makeOracleCommand = (logger, io = {}) => { s => s.split('.'), ) .action(async opts => { - const { readLatestHead, lookupPriceAggregatorInstance } = - await rpcTools(); + const { readPublished, lookupPriceAggregatorInstance } = await rpcTools(); const instance = lookupPriceAggregatorInstance(opts.pair); - const offerId = await findOracleCap(instance, opts.from, readLatestHead); + const offerId = await findOracleCap(instance, opts.from, readPublished); if (!offerId) { console.error('No continuing ids found'); } @@ -265,12 +273,13 @@ export const makeOracleCommand = (logger, io = {}) => { * }} */ { pair, keys, price }, ) => { - const { readLatestHead, networkConfig, lookupPriceAggregatorInstance } = - await rpcTools(); - const wutil = await makeWalletUtils( - { fetch, execFileSync, delay }, + const { + readLatestHead, + readPublished, networkConfig, - ); + lookupPriceAggregatorInstance, + } = await rpcTools(); + const wutil = await makeWalletUtils({ fetch, delay }, networkConfig); const unitPrice = scaleDecimals(price); const feedPath = `published.priceFeed.${pair[0]}-${pair[1]}_price_feed`; @@ -334,7 +343,7 @@ export const makeOracleCommand = (logger, io = {}) => { adminOfferIds[from] = await findOracleCap( instance, from, - readLatestHead, + readPublished, ); if (!adminOfferIds[from]) { console.error( diff --git a/packages/agoric-cli/src/commands/perf.js b/packages/agoric-cli/src/commands/perf.js index 199101a6fa4..957561cad61 100644 --- a/packages/agoric-cli/src/commands/perf.js +++ b/packages/agoric-cli/src/commands/perf.js @@ -7,21 +7,23 @@ import { makeFollower, makeLeaderFromRpcAddresses, } from '@agoric/casting'; +import { fetchEnvNetworkConfig } from '@agoric/client-utils'; +import { slotToRemotable } from '@agoric/internal/src/storage-test-utils.js'; +import { boardSlottingMarshaller } from '@agoric/vats/tools/board-utils.js'; import { Command } from 'commander'; import fs from 'fs'; import { exit } from 'process'; -import { slotToRemotable } from '@agoric/internal/src/storage-test-utils.js'; -import { boardSlottingMarshaller } from '@agoric/vats/tools/board-utils.js'; import { makeLeaderOptions } from '../lib/casting.js'; import { execSwingsetTransaction, normalizeAddressWithOptions, } from '../lib/chain.js'; -import { networkConfig } from '../lib/rpc.js'; // tight for perf testing but less than this tends to hang. const SLEEP_SECONDS = 0.1; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + /** * @param {import('anylogger').Logger} logger */ diff --git a/packages/agoric-cli/src/commands/psm.js b/packages/agoric-cli/src/commands/psm.js index 8b2af277d58..e800b5f1c16 100644 --- a/packages/agoric-cli/src/commands/psm.js +++ b/packages/agoric-cli/src/commands/psm.js @@ -1,12 +1,19 @@ // @ts-check /* eslint-disable func-names */ /* eslint-env node */ -import { Command } from 'commander'; +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, + storageHelper, +} from '@agoric/client-utils'; import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; +import { Command } from 'commander'; import { asPercent } from '../lib/format.js'; -import { makeRpcUtils, storageHelper } from '../lib/rpc.js'; import { outputExecuteOfferAction } from '../lib/wallet.js'; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + // Adapted from https://gist.github.com/dckc/8b5b2f16395cb4d7f2ff340e0bc6b610#file-psm-tool /** @@ -60,13 +67,14 @@ export const makePsmCommand = logger => { ); const rpcTools = async () => { - const utils = await makeRpcUtils({ fetch }); + const vsk = await makeVstorageKit({ fetch }, networkConfig); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const lookupPsmInstance = ([minted, anchor]) => { const name = `psm-${minted}-${anchor}`; - const instance = utils.agoricNames.instance[name]; + const instance = agoricNames.instance[name]; if (!instance) { - logger.debug('known instances:', utils.agoricNames.instance); + logger.debug('known instances:', agoricNames.instance); throw Error(`Unknown instance ${name}`); } return instance; @@ -77,20 +85,19 @@ export const makePsmCommand = logger => { * @param {[Minted: string, Anchor: string]} pair */ const getGovernanceState = async ([Minted, Anchor]) => { - const govContent = await utils.vstorage.readLatest( + const govContent = await vsk.vstorage.readLatest( `published.psm.${Minted}.${Anchor}.governance`, ); assert(govContent, 'no gov content'); const { current: governance } = last( - storageHelper.unserializeTxt(govContent, utils.fromBoard), + storageHelper.unserializeTxt(govContent, vsk.fromBoard), ); - const { [`psm.${Minted}.${Anchor}`]: instance } = - utils.agoricNames.instance; + const { [`psm.${Minted}.${Anchor}`]: instance } = agoricNames.instance; return { instance, governance }; }; - return { ...utils, lookupPsmInstance, getGovernanceState }; + return { ...vsk, agoricNames, lookupPsmInstance, getGovernanceState }; }; psm diff --git a/packages/agoric-cli/src/commands/reserve.js b/packages/agoric-cli/src/commands/reserve.js index 4e55b921761..9716590402e 100644 --- a/packages/agoric-cli/src/commands/reserve.js +++ b/packages/agoric-cli/src/commands/reserve.js @@ -1,11 +1,17 @@ // @ts-check /* eslint-disable func-names */ /* eslint-env node */ +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, +} from '@agoric/client-utils'; import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; import { Command } from 'commander'; -import { makeRpcUtils } from '../lib/rpc.js'; import { outputActionAndHint } from '../lib/wallet.js'; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + /** * @param {import('anylogger').Logger} _logger * @param {*} io @@ -29,7 +35,8 @@ export const makeReserveCommand = (_logger, io = {}) => { * }} opts */ async ({ collateralBrand, ...opts }) => { - const { agoricNames } = await makeRpcUtils({ fetch }); + const vsk = makeVstorageKit({ fetch }, networkConfig); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const offer = Offers.reserve.AddCollateral(agoricNames, { collateralBrandKey: collateralBrand, @@ -63,7 +70,8 @@ export const makeReserveCommand = (_logger, io = {}) => { 1, ) .action(async function (opts) { - const { agoricNames } = await makeRpcUtils({ fetch }); + const vsk = makeVstorageKit({ fetch }, networkConfig); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const reserveInstance = agoricNames.instance.reserve; assert(reserveInstance, 'missing reserve in names'); diff --git a/packages/agoric-cli/src/commands/test-upgrade.js b/packages/agoric-cli/src/commands/test-upgrade.js index d9d7c977bd6..328f019bd6e 100644 --- a/packages/agoric-cli/src/commands/test-upgrade.js +++ b/packages/agoric-cli/src/commands/test-upgrade.js @@ -1,11 +1,11 @@ // @ts-check /* eslint-env node */ +import { fetchEnvNetworkConfig, makeWalletUtils } from '@agoric/client-utils'; import { Fail } from '@endo/errors'; import { CommanderError } from 'commander'; import { normalizeAddressWithOptions } from '../lib/chain.js'; import { bigintReplacer } from '../lib/format.js'; -import { getNetworkConfig } from '../lib/rpc.js'; -import { makeWalletUtils, sendAction } from '../lib/wallet.js'; +import { sendAction } from '../lib/wallet.js'; /** * Make commands for testing. @@ -38,8 +38,8 @@ export const makeTestCommand = ( try { // XXX pass fetch to getNetworkConfig() explicitly // await null above makes this await safe - const networkConfig = await getNetworkConfig(env); - return makeWalletUtils({ fetch, execFileSync, delay }, networkConfig); + const networkConfig = await fetchEnvNetworkConfig({ env, fetch }); + return makeWalletUtils({ fetch, delay }, networkConfig); } catch (err) { // CommanderError is a class constructor, and so // must be invoked with `new`. diff --git a/packages/agoric-cli/src/commands/vaults.js b/packages/agoric-cli/src/commands/vaults.js index 523b6170069..006831862e7 100644 --- a/packages/agoric-cli/src/commands/vaults.js +++ b/packages/agoric-cli/src/commands/vaults.js @@ -1,15 +1,21 @@ // @ts-check /* eslint-disable func-names */ /* eslint-env node */ -import { Command } from 'commander'; +import { + fetchEnvNetworkConfig, + makeAgoricNames, + makeVstorageKit, +} from '@agoric/client-utils'; import { lookupOfferIdForVault, Offers, } from '@agoric/inter-protocol/src/clientSupport.js'; +import { Command } from 'commander'; import { normalizeAddressWithOptions } from '../lib/chain.js'; -import { makeRpcUtils } from '../lib/rpc.js'; import { getCurrent, outputExecuteOfferAction } from '../lib/wallet.js'; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + /** * @param {import('anylogger').Logger} logger */ @@ -36,10 +42,10 @@ export const makeVaultsCommand = logger => { normalizeAddress, ) .action(async function (opts) { - const { readLatestHead } = await makeRpcUtils({ fetch }); + const { readPublished } = await makeVstorageKit({ fetch }, networkConfig); const current = await getCurrent(opts.from, { - readLatestHead, + readPublished, }); const vaultStoragePaths = current.offerToPublicSubscriberPaths.map( @@ -61,7 +67,8 @@ export const makeVaultsCommand = logger => { .option('--collateralBrand ', 'Collateral brand key', 'ATOM') .action(async function (opts) { logger.warn('running with options', opts); - const { agoricNames } = await makeRpcUtils({ fetch }); + const vsk = makeVstorageKit({ fetch }, networkConfig); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const offer = Offers.vaults.OpenVault(agoricNames, { giveCollateral: opts.giveCollateral, @@ -96,11 +103,15 @@ export const makeVaultsCommand = logger => { .requiredOption('--vaultId ', 'Key of vault (e.g. vault1)') .action(async function (opts) { logger.warn('running with options', opts); - const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); + const { readPublished, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, + ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const previousOfferId = await lookupOfferIdForVault( opts.vaultId, - getCurrent(opts.from, { readLatestHead }), + getCurrent(opts.from, { readPublished }), ); const offer = Offers.vaults.AdjustBalances( @@ -137,11 +148,15 @@ export const makeVaultsCommand = logger => { ) .action(async function (opts) { logger.warn('running with options', opts); - const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); + const { readPublished, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, + ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const previousOfferId = await lookupOfferIdForVault( opts.vaultId, - getCurrent(opts.from, { readLatestHead }), + getCurrent(opts.from, { readPublished }), ); const offer = Offers.vaults.CloseVault( diff --git a/packages/agoric-cli/src/commands/wallet.js b/packages/agoric-cli/src/commands/wallet.js index 961b480ee3b..18d3d597c2b 100644 --- a/packages/agoric-cli/src/commands/wallet.js +++ b/packages/agoric-cli/src/commands/wallet.js @@ -8,11 +8,14 @@ import { makeLeader, makeLeaderFromRpcAddresses, } from '@agoric/casting'; +import { + makeVstorageKit, + fetchEnvNetworkConfig, + makeAgoricNames, +} from '@agoric/client-utils'; +import { execFileSync } from 'child_process'; import fs from 'fs'; import util from 'util'; -import { execFileSync } from 'child_process'; -import { fmtRecordOfLines, summarize } from '../lib/format.js'; -import { makeRpcUtils, networkConfig } from '../lib/rpc.js'; import { makeLeaderOptions } from '../lib/casting.js'; import { @@ -20,8 +23,15 @@ import { fetchSwingsetParams, normalizeAddressWithOptions, } from '../lib/chain.js'; +import { + fmtRecordOfLines, + parseFiniteNumber, + summarize, +} from '../lib/format.js'; import { coalesceWalletState, getCurrent } from '../lib/wallet.js'; +const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch }); + const SLEEP_SECONDS = 3; /** @@ -102,7 +112,7 @@ export const makeWalletCommand = async command => { .action(async function (opts) { const offerStr = fs.readFileSync(opts.file).toString(); - const { unserializer } = await makeRpcUtils({ fetch }); + const { unserializer } = await makeVstorageKit({ fetch }, networkConfig); const offerObj = unserializer.fromCapData(JSON.parse(offerStr)); console.log(offerObj); @@ -117,7 +127,7 @@ export const makeWalletCommand = async command => { .action(async function (opts) { const offerStr = fs.readFileSync(opts.offer).toString(); - const { unserializer } = await makeRpcUtils({ fetch }); + const { unserializer } = await makeVstorageKit({ fetch }, networkConfig); const offerObj = unserializer.fromCapData(JSON.parse(offerStr)); console.log(offerObj.offer.id); @@ -132,30 +142,69 @@ export const makeWalletCommand = async command => { ) .requiredOption('--offer [filename]', 'path to file with prepared offer') .option('--dry-run', 'spit out the command instead of running it') + .option('--gas', 'gas limit; "auto" [default] to calculate automatically') + .option( + '--gas-adjustment', + 'factor by which to multiply the --gas=auto calculation result [default 1.2]', + ) + .option('--verbose', 'print command output') .action(function (opts) { - /** @typedef {{ from: string, offer: string, dryRun: boolean }} Opts */ + /** + * @typedef {{ + * from: string, + * offer: string, + * dryRun: boolean, + * gas: string, + * gasAdjustment: string, + * verbose: boolean, + * }} Opts + */ const { dryRun, from, + gas = 'auto', + gasAdjustment = '1.2', offer, home, + verbose, keyringBackend: backend, } = /** @type {SharedTxOptions & Opts} */ ({ ...wallet.opts(), ...opts }); const offerBody = fs.readFileSync(offer).toString(); - execSwingsetTransaction(['wallet-action', '--allow-spend', offerBody], { - from, - dryRun, - keyring: { home, backend }, - ...networkConfig, - }); + const out = execSwingsetTransaction( + ['wallet-action', '--allow-spend', offerBody, '-ojson', '-bblock'], + { + ...networkConfig, + keyring: { home, backend }, + from, + gas: + gas === 'auto' + ? ['auto', parseFiniteNumber(gasAdjustment)] + : parseFiniteNumber(gas), + dryRun, + verbose, + }, + ); + + // see sendAction in {@link ../lib/wallet.js} + if (dryRun || !verbose) return; + try { + const tx = JSON.parse(/** @type {string} */ (out)); + if (tx.code !== 0) { + console.error('failed to send tx', tx); + } + console.log(tx); + } catch (err) { + console.error('unexpected output', JSON.stringify(out)); + throw err; + } }); wallet .command('list') .description('list all wallets in vstorage') .action(async function () { - const { vstorage } = await makeRpcUtils({ fetch }); + const { vstorage } = await makeVstorageKit({ fetch }, networkConfig); const wallets = await vstorage.keys('published.wallet'); process.stdout.write(wallets.join('\n')); }); @@ -169,23 +218,24 @@ export const makeWalletCommand = async command => { normalizeAddress, ) .action(async function (opts) { - const { agoricNames, unserializer, readLatestHead } = await makeRpcUtils({ - fetch, - }); + const { readPublished, unserializer, ...vsk } = makeVstorageKit( + { fetch }, + networkConfig, + ); + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); const leader = makeLeader(networkConfig.rpcAddrs[0]); const follower = await makeFollower( `:published.wallet.${opts.from}`, leader, { - // @ts-expect-error xxx unserializer, }, ); const coalesced = await coalesceWalletState(follower); - const current = await getCurrent(opts.from, { readLatestHead }); + const current = await getCurrent(opts.from, { readPublished }); console.warn( 'got coalesced', diff --git a/packages/agoric-cli/src/cosmos.js b/packages/agoric-cli/src/cosmos.js index 147cda627d0..5c4aefeca55 100644 --- a/packages/agoric-cli/src/cosmos.js +++ b/packages/agoric-cli/src/cosmos.js @@ -50,7 +50,7 @@ export default async function cosmosMain(progname, rawArgs, powers, opts) { }, ); // Ensure the build doesn't mess up stdout. - ps.childProcess.stdout.pipe(process.stderr); + ps.childProcess.stdout?.pipe(process.stderr); return ps; } throw e; diff --git a/packages/agoric-cli/src/helpers.js b/packages/agoric-cli/src/helpers.js index 51c3443806e..444e8a4fe4d 100644 --- a/packages/agoric-cli/src/helpers.js +++ b/packages/agoric-cli/src/helpers.js @@ -3,6 +3,9 @@ /** @import { ChildProcess } from 'child_process' */ +// Backwards compatibility +export { fetchEnvNetworkConfig as getNetworkConfig } from '@agoric/client-utils'; + export const getSDKBinaries = ({ jsPfx = '../..', goPfx = `${jsPfx}/../golang`, @@ -40,12 +43,12 @@ export const makePspawn = ({ * * @param {string} cmd command name to run * @param {Array} cargs arguments to the command - * @param {object} param2 - * @param {string} [param2.cwd] - * @param {string | [string, string, string]} [param2.stdio] standard IO + * @param {object} [opts] + * @param {string} [opts.cwd] + * @param {string | [string, string, string]} [opts.stdio] standard IO * specification - * @param {Record} [param2.env] environment - * @param {boolean} [param2.detached] whether the child process should be detached + * @param {Record} [opts.env] environment + * @param {boolean} [opts.detached] whether the child process should be detached * @returns {Promise & { childProcess: ChildProcess }}} promise for * exit status. The return result has a `childProcess` property to obtain * control over the running process diff --git a/packages/agoric-cli/src/install.js b/packages/agoric-cli/src/install.js index ed549517db4..25c605991d2 100644 --- a/packages/agoric-cli/src/install.js +++ b/packages/agoric-cli/src/install.js @@ -37,7 +37,7 @@ export default async function installMain(progname, rawArgs, powers, opts) { stdio: ['inherit', 'pipe', 'inherit'], }); const stdout = []; - p.childProcess.stdout.on('data', out => stdout.push(out)); + p.childProcess.stdout?.on('data', out => stdout.push(out)); await p; const d = JSON.parse(Buffer.concat(stdout).toString('utf-8')); for (const [name, { location }] of Object.entries(d)) { @@ -49,7 +49,7 @@ export default async function installMain(progname, rawArgs, powers, opts) { let subdirs; const workTrees = ['.']; let sdkWorktree; - /** @type {Map} */ + /** @type {Map} */ const sdkPackageToPath = new Map(); const linkFolder = path.resolve(`_agstate/yarn-links`); const linkFlags = []; @@ -131,7 +131,6 @@ export default async function installMain(progname, rawArgs, powers, opts) { // Ensure we update the package.json before exiting. const updatePackageJson = async () => { // Don't update on exit anymore. - // eslint-disable-next-line no-use-before-define process.off('beforeExit', updatePackageJsonOnExit); log.info(`updating ${pjson}`); await fs.writeFile( @@ -170,7 +169,7 @@ export default async function installMain(progname, rawArgs, powers, opts) { .then(results => { // After all have settled, throw any errors. const failures = results.filter( - ({ status }) => status !== 'fulfilled', + result => result.status !== 'fulfilled', ); if (failures.length) { throw AggregateError( @@ -284,6 +283,10 @@ export default async function installMain(progname, rawArgs, powers, opts) { // Create symlinks to the SDK packages. await Promise.all( [...sdkPackageToPath.entries()].map(async ([pjName, dir]) => { + if (typeof dir !== 'string') { + throw Error(`unexpected incomplete package mapping: ${pjName}`); + } + const SUBOPTIMAL = false; await null; if (SUBOPTIMAL) { @@ -301,7 +304,7 @@ export default async function installMain(progname, rawArgs, powers, opts) { log('linking', linkName); return fs .mkdir(linkDir, { recursive: true }) - .then(_ => fs.symlink(path.relative(linkDir, dir), linkName)); + .then(() => fs.symlink(path.relative(linkDir, dir), linkName)); }), ); diff --git a/packages/agoric-cli/src/lib/chain.js b/packages/agoric-cli/src/lib/chain.js index 282650c31bf..3a47c5a7f49 100644 --- a/packages/agoric-cli/src/lib/chain.js +++ b/packages/agoric-cli/src/lib/chain.js @@ -3,6 +3,10 @@ import { normalizeBech32 } from '@cosmjs/encoding'; import { execFileSync as execFileSyncAmbient } from 'child_process'; +/** + * @import {MinimalNetworkConfig} from '@agoric/client-utils'; + */ + const agdBinary = 'agd'; /** @@ -34,11 +38,42 @@ export const normalizeAddressWithOptions = ( }; harden(normalizeAddressWithOptions); +/** @typedef {number | 'auto' | ['auto', adjustment?: number | undefined]} GasLimit */ + +/** + * @param {GasLimit} limit + * @returns {string[]} + */ +const makeGasOpts = limit => { + if (Number.isFinite(limit) || limit === 'auto') { + return [`--gas=${limit}`]; + } + if (Array.isArray(limit) && limit.length >= 1 && limit[0] === 'auto') { + const gasOpts = ['--gas=auto']; + if (limit.length > 1) { + const [adjustment, ...rest] = limit.slice(1); + const adjustmentIsValid = + adjustment === undefined || + (Number.isFinite(adjustment) && Number(adjustment) > 0); + if (rest.length !== 0 || !adjustmentIsValid) { + throw Error('invalid gas input'); + } + if (adjustment !== undefined) { + gasOpts.push(`--gas-adjustment=${adjustment}`); + } + } + return gasOpts; + } + + throw Error('invalid gas input'); +}; + /** * @param {ReadonlyArray} swingsetArgs - * @param {import('./rpc.js').MinimalNetworkConfig & { + * @param {MinimalNetworkConfig & { * from: string, * fees?: string, + * gas?: GasLimit, * dryRun?: boolean, * verbose?: boolean, * keyring?: {home?: string, backend: string} @@ -50,6 +85,7 @@ export const execSwingsetTransaction = (swingsetArgs, opts) => { const { from, fees, + gas = ['auto', 1.2], dryRun = false, verbose = true, keyring = undefined, @@ -67,6 +103,7 @@ export const execSwingsetTransaction = (swingsetArgs, opts) => { homeOpt, backendOpt, feeOpt, + makeGasOpts(gas), [`--from=${from}`, 'tx', 'swingset'], swingsetArgs, ); @@ -78,7 +115,7 @@ export const execSwingsetTransaction = (swingsetArgs, opts) => { stdout.write('\n'); } else { const yesCmd = cmd.concat(['--yes']); - if (verbose) console.log('Executing ', yesCmd); + if (verbose) console.log('Executing ', agdBinary, yesCmd); const out = execFileSync(agdBinary, yesCmd, { encoding: 'utf-8' }); // agd puts this diagnostic on stdout rather than stderr :-/ @@ -94,7 +131,7 @@ harden(execSwingsetTransaction); /** * - * @param {import('./rpc.js').MinimalNetworkConfig} net + * @param {MinimalNetworkConfig} net */ // TODO fetch by HTTP instead of shelling out https://github.com/Agoric/agoric-sdk/issues/9200 export const fetchSwingsetParams = net => { @@ -114,7 +151,7 @@ export const fetchSwingsetParams = net => { harden(fetchSwingsetParams); /** - * @param {import('./rpc.js').MinimalNetworkConfig & { + * @param {MinimalNetworkConfig & { * execFileSync: typeof import('child_process').execFileSync, * delay: (ms: number) => Promise, * period?: number, @@ -154,7 +191,7 @@ export const pollBlocks = opts => async lookup => { /** * @param {string} txhash - * @param {import('./rpc.js').MinimalNetworkConfig & { + * @param {MinimalNetworkConfig & { * execFileSync: typeof import('child_process').execFileSync, * delay: (ms: number) => Promise, * period?: number, diff --git a/packages/agoric-cli/src/lib/format.js b/packages/agoric-cli/src/lib/format.js index 78227bcd615..d5e9d8836bb 100644 --- a/packages/agoric-cli/src/lib/format.js +++ b/packages/agoric-cli/src/lib/format.js @@ -1,23 +1,21 @@ -// @ts-check - import { Fail, q } from '@endo/errors'; import { makeBoardRemote } from '@agoric/vats/tools/board-utils.js'; -/** @import {BoardRemote} from '@agoric/vats/tools/board-utils.js' */ -/** @import {VBankAssetDetail} from '@agoric/vats/tools/board-utils.js'; */ +/** + * @import {Amount, Brand} from '@agoric/ertp' + * @import {AgoricNamesRemotes, BoardRemote, VBankAssetDetail} from '@agoric/vats/tools/board-utils.js'; + */ +// TODO Move to packages/internal. /** - * Like @endo/nat but coerces + * Parses the input and returns either a finite number or NaN. * - * @param {string} str - * @returns {bigint} + * @param {string} input + * @returns {number} */ -export const Natural = str => { - const b = BigInt(str); - if (b < 0) { - throw RangeError(`${b} is negative`); - } - return b; +export const parseFiniteNumber = input => { + const result = /[0-9]/.test(input || '') ? Number(input) : NaN; + return Number.isFinite(result) ? result : NaN; }; /** @@ -102,14 +100,15 @@ export const purseBalanceTuples = (purses, assets) => { */ export const fmtRecordOfLines = record => { const { stringify } = JSON; + /** @type {Array<[string, string[]]>} */ const groups = Object.entries(record).map(([key, items]) => [ key, items.map(item => ` ${stringify(item)}`), ]); - const lineEntries = groups.map( - // @ts-expect-error ??? - ([key, lines]) => ` ${stringify(key)}: [\n${lines.join(',\n')}\n ]`, - ); + const lineEntries = groups.map(([key, lines]) => { + const linesStr = lines.length === 0 ? `[]` : `[\n${lines.join(',\n')}\n ]`; + return ` ${stringify(key)}: ${linesStr}`; + }); return `{\n${lineEntries.join(',\n')}\n}`; }; @@ -117,7 +116,7 @@ export const fmtRecordOfLines = record => { * Summarize the offerStatuses of the state as user-facing informative tuples * * @param {import('@agoric/smart-wallet/src/utils.js').CoalescedWalletState} state - * @param {import('@agoric/vats/tools/board-utils.js').AgoricNamesRemotes} agoricNames + * @param {AgoricNamesRemotes} agoricNames */ export const offerStatusTuples = (state, agoricNames) => { const { offerStatuses } = state; @@ -174,7 +173,7 @@ export const offerStatusTuples = (state, agoricNames) => { /** * @param {import('@agoric/smart-wallet/src/smartWallet.js').CurrentWalletRecord} current * @param {ReturnType['state']} coalesced - * @param {import('@agoric/vats/tools/board-utils.js').AgoricNamesRemotes} agoricNames + * @param {AgoricNamesRemotes} agoricNames */ export const summarize = (current, coalesced, agoricNames) => { return { diff --git a/packages/agoric-cli/src/lib/index.js b/packages/agoric-cli/src/lib/index.js new file mode 100644 index 00000000000..bf6ed5ccc44 --- /dev/null +++ b/packages/agoric-cli/src/lib/index.js @@ -0,0 +1,7 @@ +/** @file Utility library for use in other packages */ + +export * from './bundles.js'; +export * from './casting.js'; +export * from './chain.js'; +export * from './format.js'; +export * from './wallet.js'; diff --git a/packages/agoric-cli/src/lib/rpc.js b/packages/agoric-cli/src/lib/rpc.js deleted file mode 100644 index e633aabd93b..00000000000 --- a/packages/agoric-cli/src/lib/rpc.js +++ /dev/null @@ -1,285 +0,0 @@ -// @ts-check -/* eslint-env node */ - -import { NonNullish } from '@agoric/internal'; -import { - boardSlottingMarshaller, - makeBoardRemote, -} from '@agoric/vats/tools/board-utils.js'; - -export { boardSlottingMarshaller }; - -export const networkConfigUrl = agoricNetSubdomain => - `https://${agoricNetSubdomain}.agoric.net/network-config`; -export const rpcUrl = agoricNetSubdomain => - `https://${agoricNetSubdomain}.rpc.agoric.net:443`; - -/** - * @typedef {{ rpcAddrs: string[], chainName: string }} MinimalNetworkConfig - */ - -/** - * @param {string} str - * @returns {Promise} - */ -const fromAgoricNet = str => { - const [netName, chainName] = str.split(','); - if (chainName) { - return Promise.resolve({ chainName, rpcAddrs: [rpcUrl(netName)] }); - } - return fetch(networkConfigUrl(netName)).then(res => res.json()); -}; - -/** - * @param {typeof process.env} env - * @returns {Promise} - */ -export const getNetworkConfig = async env => { - if (!('AGORIC_NET' in env) || env.AGORIC_NET === 'local') { - return { rpcAddrs: ['http://0.0.0.0:26657'], chainName: 'agoriclocal' }; - } - - return fromAgoricNet(NonNullish(env.AGORIC_NET)).catch(err => { - throw Error( - `cannot get network config (${env.AGORIC_NET || 'local'}): ${ - err.message - }`, - ); - }); -}; - -/** @type {MinimalNetworkConfig} */ -const networkConfig = await getNetworkConfig(process.env); -export { networkConfig }; -// console.warn('networkConfig', networkConfig); - -/** - * @param {object} powers - * @param {typeof window.fetch} powers.fetch - * @param {MinimalNetworkConfig} config - */ -export const makeVStorage = (powers, config = networkConfig) => { - /** @param {string} path */ - const getJSON = path => { - const url = config.rpcAddrs[0] + path; - // console.warn('fetching', url); - return powers.fetch(url, { keepalive: true }).then(res => res.json()); - }; - // height=0 is the same as omitting height and implies the highest block - const url = (path = 'published', { kind = 'children', height = 0 } = {}) => - `/abci_query?path=%22/custom/vstorage/${kind}/${path}%22&height=${height}`; - - const readStorage = (path = 'published', { kind = 'children', height = 0 }) => - getJSON(url(path, { kind, height })) - .catch(err => { - throw Error(`cannot read ${kind} of ${path}: ${err.message}`); - }) - .then(data => { - const { - result: { response }, - } = data; - if (response?.code !== 0) { - /** @type {any} */ - const err = Error( - `error code ${response?.code} reading ${kind} of ${path}: ${response.log}`, - ); - err.code = response?.code; - err.codespace = response?.codespace; - throw err; - } - return data; - }); - - return { - url, - decode({ result: { response } }) { - const { code } = response; - if (code !== 0) { - throw response; - } - const { value } = response; - return Buffer.from(value, 'base64').toString(); - }, - /** - * - * @param {string} path - * @returns {Promise} latest vstorage value at path - */ - async readLatest(path = 'published') { - const raw = await readStorage(path, { kind: 'data' }); - return this.decode(raw); - }, - async keys(path = 'published') { - const raw = await readStorage(path, { kind: 'children' }); - return JSON.parse(this.decode(raw)).children; - }, - /** - * @param {string} path - * @param {number} [height] default is highest - * @returns {Promise<{blockHeight: number, values: string[]}>} - */ - async readAt(path, height = undefined) { - const raw = await readStorage(path, { kind: 'data', height }); - const txt = this.decode(raw); - /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); - return JSON.parse(value); - }, - /** - * Read values going back as far as available - * - * @param {string} path - * @param {number | string} [minHeight] - * @returns {Promise} - */ - async readFully(path, minHeight = undefined) { - const parts = []; - // undefined the first iteration, to query at the highest - let blockHeight; - await null; - do { - // console.debug('READING', { blockHeight }); - let values; - try { - ({ blockHeight, values } = await this.readAt( - path, - blockHeight && Number(blockHeight) - 1, - )); - // console.debug('readAt returned', { blockHeight }); - } catch (err) { - if ( - // CosmosSDK ErrInvalidRequest with particular message text; - // misrepresentation of pruned data - // TODO replace after incorporating a fix to - // https://github.com/cosmos/cosmos-sdk/issues/19992 - err.codespace === 'sdk' && - err.code === 18 && - err.message.match(/pruned/) - ) { - // console.error(err); - break; - } - throw err; - } - parts.push(values); - // console.debug('PUSHED', values); - // console.debug('NEW', { blockHeight, minHeight }); - if (minHeight && Number(blockHeight) <= Number(minHeight)) break; - } while (blockHeight > 0); - return parts.flat(); - }, - }; -}; -/** @typedef {ReturnType} VStorage */ - -export const makeFromBoard = () => { - const cache = new Map(); - const convertSlotToVal = (boardId, iface) => { - if (cache.has(boardId)) { - return cache.get(boardId); - } - const val = makeBoardRemote({ boardId, iface }); - cache.set(boardId, val); - return val; - }; - return harden({ convertSlotToVal }); -}; -/** @typedef {ReturnType} IdMap */ - -export const storageHelper = { - /** @param { string } txt */ - parseCapData: txt => { - assert(typeof txt === 'string', typeof txt); - /** @type {{ value: string }} */ - const { value } = JSON.parse(txt); - const specimen = JSON.parse(value); - const { blockHeight, values } = specimen; - assert(values, `empty values in specimen ${value}`); - const capDatas = storageHelper.parseMany(values); - return { blockHeight, capDatas }; - }, - /** - * @param {string} txt - * @param {IdMap} ctx - */ - unserializeTxt: (txt, ctx) => { - const { capDatas } = storageHelper.parseCapData(txt); - return capDatas.map(capData => - boardSlottingMarshaller(ctx.convertSlotToVal).fromCapData(capData), - ); - }, - /** @param {string[]} capDataStrings array of stringified capData */ - parseMany: capDataStrings => { - assert(capDataStrings && capDataStrings.length); - /** @type {{ body: string, slots: string[] }[]} */ - const capDatas = capDataStrings.map(s => JSON.parse(s)); - for (const capData of capDatas) { - assert(typeof capData === 'object' && capData !== null); - assert('body' in capData && 'slots' in capData); - assert(typeof capData.body === 'string'); - assert(Array.isArray(capData.slots)); - } - return capDatas; - }, -}; -harden(storageHelper); - -/** - * @param {IdMap} ctx - * @param {VStorage} vstorage - * @returns {Promise} - */ -export const makeAgoricNames = async (ctx, vstorage) => { - const reverse = {}; - const entries = await Promise.all( - ['brand', 'instance', 'vbankAsset'].map(async kind => { - const content = await vstorage.readLatest( - `published.agoricNames.${kind}`, - ); - /** @type {Array<[string, import('@agoric/vats/tools/board-utils.js').BoardRemote]>} */ - const parts = storageHelper.unserializeTxt(content, ctx).at(-1); - for (const [name, remote] of parts) { - if ('getBoardId' in remote) { - reverse[remote.getBoardId()] = name; - } - } - return [kind, Object.fromEntries(parts)]; - }), - ); - return { ...Object.fromEntries(entries), reverse }; -}; - -/** - * @param {{ fetch: typeof window.fetch }} io - * @param {MinimalNetworkConfig} config - */ -export const makeRpcUtils = async ({ fetch }, config = networkConfig) => { - await null; - try { - const vstorage = makeVStorage({ fetch }, config); - const fromBoard = makeFromBoard(); - const agoricNames = await makeAgoricNames(fromBoard, vstorage); - - const unserializer = boardSlottingMarshaller(fromBoard.convertSlotToVal); - - /** @type {(txt: string) => unknown} */ - const unserializeHead = txt => - storageHelper.unserializeTxt(txt, fromBoard).at(-1); - - /** @type {(path: string) => Promise} */ - const readLatestHead = path => - vstorage.readLatest(path).then(unserializeHead); - - return { - agoricNames, - fromBoard, - readLatestHead, - unserializeHead, - unserializer, - vstorage, - }; - } catch (err) { - throw Error(`RPC failure (${config.rpcAddrs}): ${err.message}`); - } -}; -/** @typedef {Awaited>} RpcUtils */ diff --git a/packages/agoric-cli/src/lib/wallet.js b/packages/agoric-cli/src/lib/wallet.js index abb2f417b33..c4e66cf2437 100644 --- a/packages/agoric-cli/src/lib/wallet.js +++ b/packages/agoric-cli/src/lib/wallet.js @@ -1,14 +1,17 @@ // @ts-check /* eslint-env node */ -import { Fail } from '@endo/errors'; import { iterateReverse } from '@agoric/casting'; +import { boardSlottingMarshaller } from '@agoric/client-utils'; import { makeWalletStateCoalescer } from '@agoric/smart-wallet/src/utils.js'; -import { execSwingsetTransaction, pollBlocks, pollTx } from './chain.js'; -import { boardSlottingMarshaller, makeRpcUtils } from './rpc.js'; +import { Fail } from '@endo/errors'; +import { execSwingsetTransaction, pollTx } from './chain.js'; -/** @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js' */ -/** @import {AgoricNamesRemotes} from '@agoric/vats/tools/board-utils.js' */ +/** + * @import {CurrentWalletRecord} from '@agoric/smart-wallet/src/smartWallet.js'; + * @import {AgoricNamesRemotes} from '@agoric/vats/tools/board-utils.js'; + * @import {MinimalNetworkConfig, VstorageKit} from '@agoric/client-utils'; + */ const marshaller = boardSlottingMarshaller(); @@ -22,15 +25,15 @@ const emptyCurrentRecord = { /** * @param {string} addr - * @param {Pick} io + * @param {Pick} io * @returns {Promise} */ -export const getCurrent = async (addr, { readLatestHead }) => { +export const getCurrent = async (addr, { readPublished }) => { // Partial because older writes may not have had all properties // NB: assumes changes are only additions let current = /** @type {Partial | undefined} */ ( - await readLatestHead(`published.wallet.${addr}.current`) + await readPublished(`wallet.${addr}.current`) ); if (current === undefined) { throw Error(`undefined current node for ${addr}`); @@ -57,12 +60,11 @@ export const getCurrent = async (addr, { readLatestHead }) => { /** * @param {string} addr - * @param {Pick} io + * @param {Pick} io * @returns {Promise} */ -export const getLastUpdate = (addr, { readLatestHead }) => { - // @ts-expect-error cast - return readLatestHead(`published.wallet.${addr}`); +export const getLastUpdate = (addr, { readPublished }) => { + return readPublished(`wallet.${addr}`); }; /** @@ -142,12 +144,12 @@ export const coalesceWalletState = async (follower, invitationBrand) => { * * @throws { Error & { code: number } } if transaction fails * @param {import('@agoric/smart-wallet/src/smartWallet.js').BridgeAction} bridgeAction - * @param {import('./rpc.js').MinimalNetworkConfig & { + * @param {MinimalNetworkConfig & { * from: string, * fees?: string, * verbose?: boolean, * keyring?: {home?: string, backend: string}, - * stdout: Pick, + * stdout?: Pick, * execFileSync: typeof import('child_process').execFileSync, * delay: (ms: number) => Promise, * dryRun?: boolean, @@ -211,76 +213,3 @@ export const findContinuingIds = (current, agoricNames) => { } return found; }; - -export const makeWalletUtils = async ( - { fetch, execFileSync, delay }, - networkConfig, -) => { - const { agoricNames, fromBoard, readLatestHead, vstorage } = - await makeRpcUtils({ fetch }, networkConfig); - /** - * @param {string} from - * @param {number|string} [minHeight] - */ - const storedWalletState = async (from, minHeight = undefined) => { - const m = boardSlottingMarshaller(fromBoard.convertSlotToVal); - - const history = await vstorage.readFully( - `published.wallet.${from}`, - minHeight, - ); - - /** @type {{ Invitation: Brand<'set'> }} */ - // @ts-expect-error XXX how to narrow AssetKind to set? - const { Invitation } = agoricNames.brand; - const coalescer = makeWalletStateCoalescer(Invitation); - // update with oldest first - for (const txt of history.reverse()) { - const { body, slots } = JSON.parse(txt); - const record = m.fromCapData({ body, slots }); - coalescer.update(record); - } - const coalesced = coalescer.state; - harden(coalesced); - return coalesced; - }; - - /** - * Get OfferStatus by id, polling until available. - * - * @param {string} from - * @param {string|number} id - * @param {number|string} minHeight - * @param {boolean} [untilNumWantsSatisfied] - */ - const pollOffer = async ( - from, - id, - minHeight, - untilNumWantsSatisfied = false, - ) => { - const lookup = async () => { - const { offerStatuses } = await storedWalletState(from, minHeight); - const offerStatus = [...offerStatuses.values()].find(s => s.id === id); - if (!offerStatus) throw Error('retry'); - harden(offerStatus); - if (untilNumWantsSatisfied && !('numWantsSatisfied' in offerStatus)) { - throw Error('retry (no numWantsSatisfied yet)'); - } - return offerStatus; - }; - const retryMessage = 'offer not in wallet at block'; - const opts = { ...networkConfig, execFileSync, delay, retryMessage }; - return pollBlocks(opts)(lookup); - }; - - return { - networkConfig, - agoricNames, - fromBoard, - vstorage, - readLatestHead, - storedWalletState, - pollOffer, - }; -}; diff --git a/packages/agoric-cli/src/main.js b/packages/agoric-cli/src/main.js index c9df6c9f903..af834f16964 100644 --- a/packages/agoric-cli/src/main.js +++ b/packages/agoric-cli/src/main.js @@ -66,7 +66,9 @@ const main = async (progname, rawArgs, powers) => { 'verbosity that can be increased', (_value, _previous) => (cmdOpts.verbose += 1), ); - const baseCmd = (...args) => addCmdOpts(program.command(...args)); + /** @type {typeof program.command} */ + const baseCmd = (nameAndParams, ...rest) => + addCmdOpts(program.command(nameAndParams, ...rest)); addCmdOpts( program diff --git a/packages/agoric-cli/src/scripts.js b/packages/agoric-cli/src/scripts.js index 9be651984ba..bb921c20739 100644 --- a/packages/agoric-cli/src/scripts.js +++ b/packages/agoric-cli/src/scripts.js @@ -56,7 +56,7 @@ export const makeLookup = /** * @param {string[]} scripts - * @param {{ allowUnsafePlugins: boolean, progname: string, rawArgs: string[], endowments?: Record }} opts + * @param {{ allowUnsafePlugins?: boolean, progname: string, rawArgs: string[], endowments?: Record }} opts * @param {{ fs: import('fs/promises'), console: Console }} powers */ export const makeScriptLoader = diff --git a/packages/agoric-cli/src/sdk-package-names.js b/packages/agoric-cli/src/sdk-package-names.js index bd78d1387fb..70e5eec1242 100644 --- a/packages/agoric-cli/src/sdk-package-names.js +++ b/packages/agoric-cli/src/sdk-package-names.js @@ -9,6 +9,7 @@ export default [ "@agoric/builders", "@agoric/cache", "@agoric/casting", + "@agoric/client-utils", "@agoric/cosmic-proto", "@agoric/cosmic-swingset", "@agoric/cosmos", @@ -17,6 +18,7 @@ export default [ "@agoric/deployment", "@agoric/ertp", "@agoric/eslint-config", + "@agoric/fast-usdc", "@agoric/governance", "@agoric/import-manager", "@agoric/inter-protocol", @@ -49,6 +51,5 @@ export default [ "@agoric/xsnap-lockdown", "@agoric/zoe", "@agoric/zone", - "agoric", - "fast-usdc" + "agoric" ]; diff --git a/packages/agoric-cli/src/start.js b/packages/agoric-cli/src/start.js index 5f5f81382a5..4832c7cd555 100644 --- a/packages/agoric-cli/src/start.js +++ b/packages/agoric-cli/src/start.js @@ -276,13 +276,13 @@ export default async function startMain(progname, rawArgs, powers, opts) { await rmVerbose(serverDir); } + /** @type {(args: string[], spawnOpts?: Parameters[2], dockerArgs?: string[]) => ReturnType} */ let chainSpawn; if (!popts.dockerTag) { - chainSpawn = (args, spawnOpts = undefined) => { - return pspawn(cosmosChain, [...args, `--home=${serverDir}`], spawnOpts); - }; + chainSpawn = (args, spawnOpts) => + pspawn(cosmosChain, [...args, `--home=${serverDir}`], spawnOpts); } else { - chainSpawn = (args, spawnOpts = undefined, dockerArgs = []) => + chainSpawn = (args, spawnOpts, dockerArgs = []) => pspawn( 'docker', [ @@ -482,12 +482,12 @@ export default async function startMain(progname, rawArgs, powers, opts) { await rmVerbose(serverDir); } + /** @type {(args: string[], spawnOpts?: Parameters[2], dockerArgs?: string[]) => ReturnType} */ let soloSpawn; if (!popts.dockerTag) { - soloSpawn = (args, spawnOpts = undefined) => - pspawn(agSolo, args, spawnOpts); + soloSpawn = (args, spawnOpts) => pspawn(agSolo, args, spawnOpts); } else { - soloSpawn = (args, spawnOpts = undefined, dockerArgs = []) => + soloSpawn = (args, spawnOpts, dockerArgs = []) => pspawn( 'docker', [ diff --git a/packages/agoric-cli/test/bundles-regExp.test.js b/packages/agoric-cli/test/bundles-regExp.test.js index 87b6f040b14..49aeb63e39d 100644 --- a/packages/agoric-cli/test/bundles-regExp.test.js +++ b/packages/agoric-cli/test/bundles-regExp.test.js @@ -1,6 +1,7 @@ import test from 'ava'; import { PACKAGE_NAME_RE } from '../src/lib/bundles.js'; +/** @type {Array<[name: string, spec?: string]>} */ const goodPatterns = [ ['@agoric/assert-v0.6.0'], ['@agoric/base-zone-v0.1.0/', '@agoric/base-zone-v0.1.0'], diff --git a/packages/agoric-cli/test/inter-cli.test.js b/packages/agoric-cli/test/inter-cli.test.js index 2a8023c15f0..386f9b6e825 100644 --- a/packages/agoric-cli/test/inter-cli.test.js +++ b/packages/agoric-cli/test/inter-cli.test.js @@ -2,11 +2,11 @@ /* eslint-env node */ import '@endo/init'; import test from 'ava'; -import { createCommand, CommanderError } from 'commander'; +import { CommanderError, createCommand } from 'commander'; -import { Far } from '@endo/far'; import { makeParseAmount } from '@agoric/inter-protocol/src/clientSupport.js'; -import { boardSlottingMarshaller, makeFromBoard } from '../src/lib/rpc.js'; +import { Far } from '@endo/far'; +import { boardSlottingMarshaller, makeFromBoard } from '@agoric/client-utils'; import { fmtBid, makeInterCommand } from '../src/commands/inter.js'; @@ -599,7 +599,7 @@ test('README ex1: inter bid place by-price: printed offer is correct', async t = const expected = [ 'Run this interactive command in shell:\n\n', 'agd ', - '--node=http://0.0.0.0:26657 --chain-id=agoriclocal --from=agoric18jr9nlvp300feu726y3v4n07ykfjwup3twnlyn tx swingset wallet-action --allow-spend {"body":"#{\\"method\\":\\"executeOffer\\",\\"offer\\":{\\"id\\":\\"bid-1680241587424\\",\\"invitationSpec\\":{\\"callPipe\\":[[\\"makeBidInvitation\\",[\\"$0.Alleged: BoardRemoteBrand\\"]]],\\"instancePath\\":[\\"auctioneer\\"],\\"source\\":\\"agoricContract\\"},\\"offerArgs\\":{\\"maxBuy\\":{\\"brand\\":\\"$0\\",\\"value\\":\\"+1000000000000\\"},\\"offerPrice\\":{\\"denominator\\":{\\"brand\\":\\"$0\\",\\"value\\":\\"+100\\"},\\"numerator\\":{\\"brand\\":\\"$1.Alleged: BoardRemoteBrand\\",\\"value\\":\\"+855\\"}}},\\"proposal\\":{\\"give\\":{\\"Bid\\":{\\"brand\\":\\"$1\\",\\"value\\":\\"+85000000\\"}}}}}","slots":["board03446","board0566"]} --output json', + '--node=http://0.0.0.0:26657 --chain-id=agoriclocal --gas=auto --gas-adjustment=1.2 --from=agoric18jr9nlvp300feu726y3v4n07ykfjwup3twnlyn tx swingset wallet-action --allow-spend {"body":"#{\\"method\\":\\"executeOffer\\",\\"offer\\":{\\"id\\":\\"bid-1680241587424\\",\\"invitationSpec\\":{\\"callPipe\\":[[\\"makeBidInvitation\\",[\\"$0.Alleged: BoardRemoteBrand\\"]]],\\"instancePath\\":[\\"auctioneer\\"],\\"source\\":\\"agoricContract\\"},\\"offerArgs\\":{\\"maxBuy\\":{\\"brand\\":\\"$0\\",\\"value\\":\\"+1000000000000\\"},\\"offerPrice\\":{\\"denominator\\":{\\"brand\\":\\"$0\\",\\"value\\":\\"+100\\"},\\"numerator\\":{\\"brand\\":\\"$1.Alleged: BoardRemoteBrand\\",\\"value\\":\\"+855\\"}}},\\"proposal\\":{\\"give\\":{\\"Bid\\":{\\"brand\\":\\"$1\\",\\"value\\":\\"+85000000\\"}}}}}","slots":["board03446","board0566"]} --output json', ].join(''); t.deepEqual(txt, expected); }); diff --git a/packages/agoric-cli/test/main.test.js b/packages/agoric-cli/test/main.test.js index d2b17a170a5..a6ec076e8e7 100644 --- a/packages/agoric-cli/test/main.test.js +++ b/packages/agoric-cli/test/main.test.js @@ -19,6 +19,7 @@ test('sanity', async t => { const myMain = args => { const oldConsole = console; try { + // @ts-expect-error globalThis.console = stubAnylogger(); return main('foo', args, { anylogger: stubAnylogger, diff --git a/packages/agoric-cli/test/upgrade-contract/init-proposal.js b/packages/agoric-cli/test/upgrade-contract/init-proposal.js index ff3238455ea..9ab07c75b62 100644 --- a/packages/agoric-cli/test/upgrade-contract/init-proposal.js +++ b/packages/agoric-cli/test/upgrade-contract/init-proposal.js @@ -3,7 +3,7 @@ import { E } from '@endo/far'; /** * Initialize contractRef the first time. * - * @param {BootstrapSpace} param0 + * @param {{ [K in keyof BootstrapSpace]: object }} promiseSpace */ export const initContract = async ({ consume: { zoe, myStatus }, diff --git a/packages/agoric-cli/tools/getting-started.js b/packages/agoric-cli/tools/getting-started.js index c4d23c05388..f294fb653ed 100644 --- a/packages/agoric-cli/tools/getting-started.js +++ b/packages/agoric-cli/tools/getting-started.js @@ -62,6 +62,13 @@ const getLatestBlockHeight = url => req.end(); }); +/** + * Test the "getting started" workflow. Note that this function may be imported + * by external repositories. + * + * @param {import('ava').ExecutionContext} t + * @param {{ init?: string[], install?: string[] }} [options] + */ export const gettingStartedWorkflowTest = async (t, options = {}) => { const { init: initOptions = [], install: installOptions = [] } = options; const pspawn = makePspawn({ spawn }); diff --git a/packages/agoric-cli/tsconfig.json b/packages/agoric-cli/tsconfig.json index 392e85ad58f..b0a3738ead7 100644 --- a/packages/agoric-cli/tsconfig.json +++ b/packages/agoric-cli/tsconfig.json @@ -2,7 +2,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "checkJs": false, + "checkJs": true, }, "include": [ "*.js", diff --git a/packages/async-flow/package.json b/packages/async-flow/package.json index 5f9b8b612e5..b6b8623a0a9 100644 --- a/packages/async-flow/package.json +++ b/packages/async-flow/package.json @@ -10,7 +10,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -28,18 +28,18 @@ "@agoric/internal": "^0.4.0-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/vow": "^0.2.0-u18.0", - "@endo/common": "^1.2.7", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/marshal": "^1.6.1", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/common": "^1.2.8", + "@endo/errors": "^1.2.8", + "@endo/eventual-send": "^1.2.8", + "@endo/marshal": "^1.6.2", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { "@agoric/swingset-vat": "^0.33.0-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/env-options": "^1.1.7", + "@endo/env-options": "^1.1.8", "ava": "^5.3.0", "tsd": "^0.31.1" }, @@ -60,6 +60,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 76.93 + "atLeast": 77.11 } } diff --git a/packages/async-flow/src/convert.js b/packages/async-flow/src/convert.js index 51ed928ec2e..aa2e7b2be23 100644 --- a/packages/async-flow/src/convert.js +++ b/packages/async-flow/src/convert.js @@ -22,11 +22,9 @@ const makeConvert = (convertRemotable, convertPromiseOrVow, convertError) => { // to keep track of the error labeling. // See https://github.com/endojs/endo/pull/1795#issuecomment-1756093032 if (label === undefined) { - // eslint-disable-next-line no-use-before-define return innerConvert(specimen); } try { - // eslint-disable-next-line no-use-before-define return innerConvert(specimen); } catch (err) { throwLabeled(err, label); diff --git a/packages/async-flow/src/equate.js b/packages/async-flow/src/equate.js index 9bfa3bba4a3..a4798a0bd76 100644 --- a/packages/async-flow/src/equate.js +++ b/packages/async-flow/src/equate.js @@ -13,11 +13,9 @@ export const makeEquate = bijection => { // TODO switch to Richard Gibson's suggestion for a better way // to keep track of the error labeling. if (label === undefined) { - // eslint-disable-next-line no-use-before-define innerEquate(g, h); } try { - // eslint-disable-next-line no-use-before-define innerEquate(g, h); } catch (err) { throwLabeled(err, label); diff --git a/packages/async-flow/src/replay-membrane.js b/packages/async-flow/src/replay-membrane.js index 57aa83aef9b..702e6920a67 100644 --- a/packages/async-flow/src/replay-membrane.js +++ b/packages/async-flow/src/replay-membrane.js @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import { isVow } from '@agoric/vow/src/vow-utils.js'; import { heapVowE } from '@agoric/vow/vat.js'; import { throwLabeled } from '@endo/common/throw-labeled.js'; diff --git a/packages/async-flow/src/types.ts b/packages/async-flow/src/types.ts index c9b00533392..29359000d39 100644 --- a/packages/async-flow/src/types.ts +++ b/packages/async-flow/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { Passable } from '@endo/pass-style'; import type { Vow, VowTools } from '@agoric/vow'; import type { LogStore } from './log-store.js'; diff --git a/packages/base-zone/package.json b/packages/base-zone/package.json index a38ffb331c6..02da008aa7e 100644 --- a/packages/base-zone/package.json +++ b/packages/base-zone/package.json @@ -10,7 +10,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -28,16 +28,16 @@ "license": "Apache-2.0", "dependencies": { "@agoric/store": "^0.9.3-u18.0", - "@endo/common": "^1.2.7", - "@endo/errors": "^1.2.7", - "@endo/exo": "^1.5.6", - "@endo/far": "^1.1.8", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6" + "@endo/common": "^1.2.8", + "@endo/errors": "^1.2.8", + "@endo/exo": "^1.5.7", + "@endo/far": "^1.1.9", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7" }, "devDependencies": { - "@endo/init": "^1.1.6", - "@endo/ses-ava": "^1.2.7", + "@endo/init": "^1.1.7", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0" }, "publishConfig": { diff --git a/packages/benchmark/package.json b/packages/benchmark/package.json index e19826bd844..abb62105a7d 100644 --- a/packages/benchmark/package.json +++ b/packages/benchmark/package.json @@ -22,15 +22,16 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/boot": "^0.2.0-u18.5", "@agoric/cosmic-swingset": "^0.42.0-u18.5", - "@agoric/inter-protocol": "^0.17.0-u18.5", "@agoric/internal": "^0.4.0-u18.0", + "@agoric/inter-protocol": "^0.17.0-u18.5", "@agoric/vats": "^0.16.0-u18.4", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/init": "^1.1.6" + "@endo/init": "^1.1.7" }, + "devDependencies": {}, "files": [ "CHANGELOG.md", "src/", diff --git a/packages/boot/package.json b/packages/boot/package.json index 8a5c85e0e50..81624130f63 100644 --- a/packages/boot/package.json +++ b/packages/boot/package.json @@ -9,7 +9,7 @@ "build": "exit 0", "clean": "rm -rf bundles/config.*", "test": "ava", - "test:xs": "SWINGSET_WORKER_TYPE=xs-worker ava test/bootstrapTests test/upgrading", + "test:xs": "SWINGSET_WORKER_TYPE=xs-worker ava test/bootstrapTests test/upgrading test/fast-usdc", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", "lint:types": "tsc", @@ -19,10 +19,13 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/builders": "^0.2.0-u18.5", + "@agoric/client-utils": "^0.1.0", "@agoric/cosmic-proto": "^0.5.0-u18.4", "@agoric/cosmic-swingset": "^0.42.0-u18.5", "@agoric/ertp": "^0.16.3-u18.0", + "@agoric/fast-usdc": "0.1.1-u18.5", "@agoric/inter-protocol": "^0.17.0-u18.5", "@agoric/internal": "^0.4.0-u18.0", "@agoric/kmarshal": "^0.1.1-u18.0", @@ -38,15 +41,14 @@ "@agoric/vow": "^0.2.0-u18.0", "@agoric/zoe": "^0.26.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/promise-kit": "^1.1.7", - "@endo/stream": "^1.2.7", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/promise-kit": "^1.1.8", + "@endo/stream": "^1.2.8", "import-meta-resolve": "^2.2.1" }, "devDependencies": { @@ -54,11 +56,11 @@ "@agoric/governance": "^0.10.4-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/swingset-liveslots": "^0.10.3-u18.0", - "@endo/base64": "^1.0.8", - "@endo/patterns": "^1.4.6", + "@endo/base64": "^1.0.9", + "@endo/patterns": "^1.4.7", "ava": "^5.3.0", - "c8": "^9.1.0", - "ts-blank-space": "^0.4.1" + "c8": "^10.1.2", + "ts-blank-space": "^0.4.4" }, "files": [ "CHANGELOG.md", @@ -91,6 +93,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 90.38 + "atLeast": 91.37 } } diff --git a/packages/boot/test/bootstrapTests/ec-membership-update.test.ts b/packages/boot/test/bootstrapTests/ec-membership-update.test.ts index 3865cb87432..b48948acba7 100644 --- a/packages/boot/test/bootstrapTests/ec-membership-update.test.ts +++ b/packages/boot/test/bootstrapTests/ec-membership-update.test.ts @@ -196,7 +196,7 @@ test.serial( test.serial('Update reserve metrics', async t => { // Need to update metrics before membership upgrade for tests related to vault params later - const { advanceTimeTo, setupVaults, priceFeedDrivers, readLatest } = + const { advanceTimeTo, setupVaults, priceFeedDrivers, readPublished } = t.context; const setup = { vaults: [ @@ -225,7 +225,7 @@ test.serial('Update reserve metrics', async t => { await setupVaults('ATOM', 0, setup); await priceFeedDrivers.ATOM.setPrice(setup.price.trigger); - const liveSchedule = readLatest('published.auction.schedule'); + const liveSchedule = readPublished('auction.schedule'); await advanceTimeTo(NonNullish(liveSchedule.nextDescendingStepTime)); t.pass(); }); diff --git a/packages/boot/test/bootstrapTests/liquidation-1.test.ts b/packages/boot/test/bootstrapTests/liquidation-1.test.ts index 75dce450d2d..531962dffff 100644 --- a/packages/boot/test/bootstrapTests/liquidation-1.test.ts +++ b/packages/boot/test/bootstrapTests/liquidation-1.test.ts @@ -146,12 +146,14 @@ const checkFlow1 = async ( check, priceFeedDrivers, readLatest, + readPublished, walletFactoryDriver, setupVaults, placeBids, } = t.context; - const metricsPath = `published.vaultFactory.managers.manager${managerIndex}.metrics`; + const metricsSubpath = + `vaultFactory.managers.manager${managerIndex}.metrics` as const; await setupVaults(collateralBrandKey, managerIndex, setup); @@ -166,11 +168,9 @@ const checkFlow1 = async ( await priceFeedDrivers[collateralBrandKey].setPrice(9.99); // check nothing liquidating yet - const liveSchedule: ScheduleNotification = readLatest( - 'published.auction.schedule', - ); + const liveSchedule = readPublished('auction.schedule'); t.is(liveSchedule.activeStartTime, null); - t.like(readLatest(metricsPath), { + t.like(readPublished(metricsSubpath), { numActiveVaults: setup.vaults.length, numLiquidatingVaults: 0, }); @@ -178,7 +178,7 @@ const checkFlow1 = async ( // advance time to start an auction console.log(collateralBrandKey, 'step 1 of 10'); await advanceTimeTo(NonNullish(liveSchedule.nextDescendingStepTime)); - t.like(readLatest(metricsPath), { + t.like(readPublished(metricsSubpath), { numActiveVaults: 0, numLiquidatingVaults: setup.vaults.length, liquidatingCollateral: { @@ -190,7 +190,7 @@ const checkFlow1 = async ( console.log(collateralBrandKey, 'step 2 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setup.auction.start.collateral) }, startCollateral: { value: scale6(setup.auction.start.collateral) }, startProceedsGoal: { value: scale6(setup.auction.start.debt) }, @@ -203,7 +203,7 @@ const checkFlow1 = async ( await advanceTimeBy(3, 'minutes'); // XXX updates for bid1 and bid2 are appended in the same turn so readLatest gives bid2 // NB: console output shows 8897786n payout which matches spec 8.897ATOM - // t.like(readLatest('published.wallet.agoric1buyer'), { + // t.like(readPublished('wallet.agoric1buyer'), { // status: { // id: `${collateralBrandKey}-bid1`, // payouts: { @@ -213,7 +213,7 @@ const checkFlow1 = async ( // }, // }); - t.like(readLatest('published.wallet.agoric1buyer'), { + t.like(readPublished('wallet.agoric1buyer'), { status: { id: `${collateralBrandKey}-bid2`, payouts: likePayouts(outcome.bids[1].payouts), @@ -225,7 +225,7 @@ const checkFlow1 = async ( console.log(collateralBrandKey, 'step 6 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: 9659301n }, }); @@ -238,7 +238,7 @@ const checkFlow1 = async ( console.log(collateralBrandKey, 'step 9 of 10'); await advanceTimeBy(3, 'minutes'); // Not part of product spec - t.like(readLatest(metricsPath), { + t.like(readPublished(metricsSubpath), { numActiveVaults: 0, numLiquidationsCompleted: setup.vaults.length, numLiquidatingVaults: 0, @@ -254,18 +254,17 @@ const checkFlow1 = async ( console.log(collateralBrandKey, 'step 10 of 10'); // continuing after now would start a new auction { - const { nextDescendingStepTime, nextStartTime } = readLatest( - 'published.auction.schedule', - ) as Record; + const { nextDescendingStepTime, nextStartTime } = + readPublished('auction.schedule'); t.is(nextDescendingStepTime.absValue, nextStartTime.absValue); } // bid3 still live because it's not fully satisfied - const { liveOffers } = readLatest('published.wallet.agoric1buyer.current'); + const { liveOffers } = readPublished('wallet.agoric1buyer.current'); t.is(liveOffers[0][1].id, `${collateralBrandKey}-bid3`); // exit to get payouts await buyer.tryExitOffer(`${collateralBrandKey}-bid3`); - t.like(readLatest('published.wallet.agoric1buyer'), { + t.like(readPublished('wallet.agoric1buyer'), { status: { id: `${collateralBrandKey}-bid3`, payouts: likePayouts(outcome.bids[2].payouts), @@ -290,7 +289,7 @@ const checkFlow1 = async ( } // check reserve balances - t.like(readLatest('published.reserve.metrics'), { + t.like(readPublished('reserve.metrics'), { allocations: { [collateralBrandKey]: { value: scale6(outcome.reserve.allocations[collateralBrandKey]), diff --git a/packages/boot/test/bootstrapTests/liquidation-2b.test.ts b/packages/boot/test/bootstrapTests/liquidation-2b.test.ts index 59f6f6a67ac..e7f4354cb04 100644 --- a/packages/boot/test/bootstrapTests/liquidation-2b.test.ts +++ b/packages/boot/test/bootstrapTests/liquidation-2b.test.ts @@ -132,12 +132,13 @@ test.serial('scenario: Flow 2b', async t => { check, priceFeedDrivers, readLatest, + readPublished, setupVaults, placeBids, } = t.context; const managerIndex = 0; - const metricPath = `published.vaultFactory.managers.manager${managerIndex}.metrics`; + const publishedMetrics = `vaultFactory.managers.manager${managerIndex}.metrics`; await setupVaults(collateralBrandKey, managerIndex, setup); await placeBids(collateralBrandKey, 'agoric1buyer', setup); @@ -150,11 +151,9 @@ test.serial('scenario: Flow 2b', async t => { await priceFeedDrivers.ATOM.setPrice(setup.price.trigger); // check nothing liquidating yet - const liveSchedule: ScheduleNotification = readLatest( - 'published.auction.schedule', - ); + const liveSchedule = readPublished('auction.schedule'); t.is(liveSchedule.activeStartTime, null); - t.like(readLatest(metricPath), { + t.like(readPublished(publishedMetrics), { numActiveVaults: setup.vaults.length, numLiquidatingVaults: 0, }); @@ -162,7 +161,7 @@ test.serial('scenario: Flow 2b', async t => { // advance time to start an auction console.log('step 0 of 10'); await advanceTimeTo(NonNullish(liveSchedule.nextDescendingStepTime)); - t.like(readLatest(metricPath), { + t.like(readPublished(publishedMetrics), { numActiveVaults: 0, numLiquidatingVaults: setup.vaults.length, liquidatingCollateral: { @@ -173,7 +172,7 @@ test.serial('scenario: Flow 2b', async t => { console.log('step 1 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setup.auction.start.collateral) }, startCollateral: { value: scale6(setup.auction.start.collateral) }, startProceedsGoal: { value: scale6(setup.auction.start.debt) }, @@ -190,7 +189,7 @@ test.serial('scenario: Flow 2b', async t => { console.log('step 5 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(45) }, }); @@ -237,14 +236,14 @@ test.serial('scenario: Flow 2b', async t => { } // check reserve balances - t.like(readLatest('published.reserve.metrics'), { + t.like(readPublished('reserve.metrics'), { allocations: { ATOM: { value: scale6(outcome.reserve.allocations.ATOM) }, }, shortfallBalance: { value: scale6(outcome.reserve.shortfall) }, }); - t.like(readLatest(metricPath), { + t.like(readPublished(publishedMetrics), { // reconstituted numActiveVaults: 2, numLiquidationsCompleted: 1, diff --git a/packages/boot/test/bootstrapTests/liquidation-concurrent-1.test.ts b/packages/boot/test/bootstrapTests/liquidation-concurrent-1.test.ts index 04176d3a921..93401554206 100644 --- a/packages/boot/test/bootstrapTests/liquidation-concurrent-1.test.ts +++ b/packages/boot/test/bootstrapTests/liquidation-concurrent-1.test.ts @@ -245,6 +245,7 @@ test('concurrent flow 1', async t => { check, priceFeedDrivers, readLatest, + readPublished, walletFactoryDriver, setupVaults, placeBids, @@ -305,7 +306,7 @@ test('concurrent flow 1', async t => { setups[collateralBrandKeySt].price.trigger, ); - const liveSchedule = readLatest('published.auction.schedule'); + const liveSchedule = readPublished('auction.schedule'); for (const { collateralBrandKey, managerIndex } of cases) { // check nothing liquidating yet @@ -339,7 +340,7 @@ test('concurrent flow 1', async t => { await advanceTimeBy(3, 'minutes'); for (const { collateralBrandKey, managerIndex } of cases) { - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setups[collateralBrandKey].auction.start.collateral), }, @@ -360,7 +361,7 @@ test('concurrent flow 1', async t => { // updates for bid1 and bid2 are appended in the same turn so readLatest gives bid2 // updates for ATOM and STARS are appended in the same turn so readLatest gives STARS - t.like(readLatest('published.wallet.agoric1buyer'), { + t.like(readPublished('wallet.agoric1buyer'), { status: { id: `${collateralBrandKeySt}-bid2`, payouts: likePayouts(outcomes[collateralBrandKeySt].bids[1].payouts), @@ -374,7 +375,7 @@ test('concurrent flow 1', async t => { await advanceTimeBy(3, 'minutes'); for (const { collateralBrandKey, managerIndex } of cases) { - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setups[collateralBrandKey].auction.end.collateral), }, @@ -393,15 +394,8 @@ test('concurrent flow 1', async t => { console.log('step 10 of 10'); // continuing after now would start a new auction { - /** - * @type {Record< - * string, - * import('@agoric/time').TimestampRecord - * >} - */ - const { nextDescendingStepTime, nextStartTime } = readLatest( - 'published.auction.schedule', - ); + const { nextDescendingStepTime, nextStartTime } = + readPublished('auction.schedule'); t.is(nextDescendingStepTime.absValue, nextStartTime.absValue); } @@ -422,7 +416,7 @@ test('concurrent flow 1', async t => { }); // check reserve balances - t.like(readLatest('published.reserve.metrics'), { + t.like(readPublished('reserve.metrics'), { allocations: { [collateralBrandKey]: { value: scale6( @@ -459,11 +453,11 @@ test('concurrent flow 1', async t => { }); // bid3 still live because it's not fully satisfied - const { liveOffers } = readLatest('published.wallet.agoric1buyer.current'); + const { liveOffers } = readPublished('wallet.agoric1buyer.current'); t.is(liveOffers[0][1].id, `${collateralBrandKeyA}-bid3`); // exit to get payouts await buyer.tryExitOffer(`${collateralBrandKeyA}-bid3`); - t.like(readLatest('published.wallet.agoric1buyer'), { + t.like(readPublished('wallet.agoric1buyer'), { status: { id: `${collateralBrandKeyA}-bid3`, payouts: likePayouts(outcomes[collateralBrandKeyA].bids[2].payouts), diff --git a/packages/boot/test/bootstrapTests/liquidation-concurrent-2b.test.ts b/packages/boot/test/bootstrapTests/liquidation-concurrent-2b.test.ts index 11ee81cd70f..ce50c0dccf6 100644 --- a/packages/boot/test/bootstrapTests/liquidation-concurrent-2b.test.ts +++ b/packages/boot/test/bootstrapTests/liquidation-concurrent-2b.test.ts @@ -205,6 +205,7 @@ test.serial( check, priceFeedDrivers, readLatest, + readPublished, setupVaults, placeBids, } = t.context; @@ -266,7 +267,7 @@ test.serial( setups[collateralBrandKeySt].price.trigger, ); - const liveSchedule = readLatest('published.auction.schedule'); + const liveSchedule = readPublished('auction.schedule'); for (const { collateralBrandKey, managerIndex } of cases) { // check nothing liquidating yet @@ -298,7 +299,7 @@ test.serial( await advanceTimeBy(3, 'minutes'); for (const { collateralBrandKey, managerIndex } of cases) { - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setups[collateralBrandKey].auction.start.collateral), }, @@ -324,7 +325,7 @@ test.serial( await advanceTimeBy(3, 'minutes'); for (const { collateralBrandKey, managerIndex } of cases) { - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setups[collateralBrandKey].auction.start.collateral), }, diff --git a/packages/boot/test/bootstrapTests/orchestration.test.ts b/packages/boot/test/bootstrapTests/orchestration.test.ts index ba56accaabe..e2e49122890 100644 --- a/packages/boot/test/bootstrapTests/orchestration.test.ts +++ b/packages/boot/test/bootstrapTests/orchestration.test.ts @@ -1,18 +1,36 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import { Fail } from '@endo/errors'; -import { documentStorageSchema } from '@agoric/internal/src/storage-test-utils.js'; -import type { CosmosValidatorAddress } from '@agoric/orchestration'; +import { + defaultMarshaller, + documentStorageSchema, +} from '@agoric/internal/src/storage-test-utils.js'; +import { + withChainCapabilities, + type CosmosValidatorAddress, +} from '@agoric/orchestration'; import type { start as startStakeIca } from '@agoric/orchestration/src/examples/stake-ica.contract.js'; import type { Instance } from '@agoric/zoe/src/zoeService/utils.js'; import type { TestFn } from 'ava'; import { SIMULATED_ERRORS } from '@agoric/vats/tools/fake-bridge.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; +import { BridgeId } from '@agoric/internal'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; import { makeWalletFactoryContext, type WalletFactoryTestContext, } from './walletFactory.js'; +import { + insistManagerType, + makeSwingsetHarness, +} from '../../tools/supports.js'; -const test: TestFn = anyTest; +const test: TestFn< + WalletFactoryTestContext & { + harness?: ReturnType; + } +> = anyTest; const validatorAddress: CosmosValidatorAddress = { value: 'cosmosvaloper1test', @@ -22,11 +40,21 @@ const validatorAddress: CosmosValidatorAddress = { const ATOM_DENOM = 'uatom'; +const { + SLOGFILE: slogFile, + SWINGSET_WORKER_TYPE: defaultManagerType = 'local', +} = process.env; + test.before(async t => { - t.context = await makeWalletFactoryContext( + insistManagerType(defaultManagerType); + const harness = + defaultManagerType === 'xsnap' ? makeSwingsetHarness() : undefined; + const ctx = await makeWalletFactoryContext( t, '@agoric/vm-config/decentral-itest-orchestration-config.json', + { slogFile, defaultManagerType, harness }, ); + t.context = { ...ctx, harness }; }); test.after.always(t => t.context.shutdown?.()); @@ -36,7 +64,7 @@ test.after.always(t => t.context.shutdown?.()); test.serial('config', async t => { const { storage, - readLatest, + readPublished, runUtils: { EV }, } = t.context; @@ -48,13 +76,11 @@ test.serial('config', async t => { chainId: 'cosmoshub-4', stakingTokens: [{ denom: ATOM_DENOM }], }); - t.deepEqual( - readLatest(`published.agoricNames.chain.cosmoshub`), - cosmosChainInfo, - ); + t.deepEqual(readPublished(`agoricNames.chain.cosmoshub`), cosmosChainInfo); await documentStorageSchema(t, storage, { note: 'Chain info for Orchestration', node: 'agoricNames.chain', + showValue: v => defaultMarshaller.fromCapData(JSON.parse(v)), }); } @@ -69,13 +95,14 @@ test.serial('config', async t => { }); t.deepEqual( - readLatest(`published.agoricNames.chainConnection.cosmoshub-4_juno-1`), + readPublished(`agoricNames.chainConnection.cosmoshub-4_juno-1`), connection, ); await documentStorageSchema(t, storage, { note: 'Chain connections for Orchestration', node: 'agoricNames.chainConnection', + showValue: v => defaultMarshaller.fromCapData(JSON.parse(v)), }); } { @@ -103,6 +130,7 @@ test.skip('stakeOsmo - queries', async t => { buildProposal, evalProposal, runUtils: { EV }, + harness, } = t.context; await evalProposal( buildProposal('@agoric/builders/scripts/orchestration/init-stakeOsmo.js'), @@ -140,7 +168,8 @@ test.serial('stakeAtom - smart wallet', async t => { evalProposal, agoricNamesRemotes, bridgeUtils: { flushInboundQueue }, - readLatest, + readPublished, + harness, } = t.context; await evalProposal( @@ -151,6 +180,7 @@ test.serial('stakeAtom - smart wallet', async t => { 'agoric1testStakAtom', ); + harness?.useRunPolicy(true); await wd.sendOffer({ id: 'request-account', invitationSpec: { @@ -160,6 +190,9 @@ test.serial('stakeAtom - smart wallet', async t => { }, proposal: {}, }); + harness && t.log('makeAccount computrons', harness.totalComputronCount()); + harness?.useRunPolicy(false); + await flushInboundQueue(); t.like(wd.getCurrentWalletRecord(), { offerToPublicSubscriberPaths: [ @@ -174,7 +207,7 @@ test.serial('stakeAtom - smart wallet', async t => { t.like(wd.getLatestUpdateRecord(), { status: { id: 'request-account', numWantsSatisfied: 1 }, }); - t.deepEqual(readLatest('published.stakeAtom.accounts.cosmos1test'), { + t.deepEqual(readPublished('stakeAtom.accounts.cosmos1test'), { localAddress: '/ibc-port/icacontroller-1/ordered/{"version":"ics27-1","controllerConnectionId":"connection-8","hostConnectionId":"connection-649","address":"cosmos1test","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-1', remoteAddress: @@ -240,7 +273,9 @@ test.serial('stakeAtom - smart wallet', async t => { proposal: {}, }), { - message: 'No denom for brand [object Alleged: ATOM brand]', + // TODO #10449 + message: + "'amountToCoin' not working for \"[Alleged: ATOM brand]\" until #10449; use 'DenomAmount' for now", }, ); }); @@ -282,17 +317,44 @@ test.serial('revise chain info', async t => { }); }); -test('basic-flows', async t => { +test.serial('basic-flows', async t => { const { buildProposal, evalProposal, agoricNamesRemotes, - readLatest, - bridgeUtils: { flushInboundQueue }, + readPublished, + bridgeUtils: { flushInboundQueue, runInbound }, } = t.context; await evalProposal( - buildProposal('@agoric/builders/scripts/orchestration/init-basic-flows.js'), + buildProposal( + '@agoric/builders/scripts/orchestration/init-basic-flows.js', + [ + '--chainInfo', + JSON.stringify(withChainCapabilities(fetchedChainInfo)), + '--assetInfo', + JSON.stringify([ + [ + 'ibc/uusdconagoric', + { + chainName: 'agoric', + baseName: 'noble', + baseDenom: 'uusdc', + }, + ], + // not tested until #10006. consider renaming to ibc/uusdconcosmos + // and updating boot/tools/ibc/mocks.ts + [ + 'ibc/uusdchash', + { + chainName: 'cosmoshub', + baseName: 'noble', + baseDenom: 'uusdc', + }, + ], + ]), + ], + ), ); const wd = @@ -317,7 +379,7 @@ test('basic-flows', async t => { [ 'request-coa', { - account: 'published.basicFlows.cosmos1test', + account: 'published.basicFlows.cosmos1test1', }, ], ], @@ -325,11 +387,11 @@ test('basic-flows', async t => { t.like(wd.getLatestUpdateRecord(), { status: { id: 'request-coa', numWantsSatisfied: 1 }, }); - t.deepEqual(readLatest('published.basicFlows.cosmos1test'), { + t.deepEqual(readPublished('basicFlows.cosmos1test1'), { localAddress: - '/ibc-port/icacontroller-4/ordered/{"version":"ics27-1","controllerConnectionId":"connection-8","hostConnectionId":"connection-649","address":"cosmos1test","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-4', + '/ibc-port/icacontroller-2/ordered/{"version":"ics27-1","controllerConnectionId":"connection-8","hostConnectionId":"connection-649","address":"cosmos1test1","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-2', remoteAddress: - '/ibc-hop/connection-8/ibc-port/icahost/ordered/{"version":"ics27-1","controllerConnectionId":"connection-8","hostConnectionId":"connection-649","address":"cosmos1test","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-4', + '/ibc-hop/connection-8/ibc-port/icahost/ordered/{"version":"ics27-1","controllerConnectionId":"connection-8","hostConnectionId":"connection-649","address":"cosmos1test1","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-2', }); // create a local orchestration account @@ -349,13 +411,13 @@ test('basic-flows', async t => { const publicSubscriberPaths = Object.fromEntries( wd.getCurrentWalletRecord().offerToPublicSubscriberPaths, ); + const expectedAddress = makeTestAddress(); t.deepEqual(publicSubscriberPaths['request-loa'], { - account: 'published.basicFlows.agoric1fakeLCAAddress1', + account: `published.basicFlows.${expectedAddress}`, }); t.like(wd.getLatestUpdateRecord(), { status: { id: 'request-loa', numWantsSatisfied: 1 }, }); - t.is(readLatest('published.basicFlows.agoric1fakeLCAAddress'), ''); await wd.sendOffer({ id: 'transfer-to-noble-from-cosmos', @@ -415,7 +477,7 @@ test('basic-flows', async t => { }, proposal: {}, offerArgs: { - amount: { denom: 'ibc/uusdchash', value: 10n }, + amount: { denom: 'ibc/uusdconagoric', value: 10n }, destination: { chainId: 'noble-1', value: 'noble1test', @@ -423,12 +485,31 @@ test('basic-flows', async t => { }, }, }); - t.like(wd.getLatestUpdateRecord(), { - status: { - id: 'transfer-to-noble-from-agoric', - error: undefined, - }, + + await runInbound( + BridgeId.VTRANSFER, + buildVTransferEvent({ + sender: expectedAddress, + target: expectedAddress, + sourceChannel: 'channel-62', + sequence: '1', + }), + ); + + const latestOfferStatus = () => { + const curr = wd.getLatestUpdateRecord(); + if (curr.updated === 'offerStatus') { + return curr.status; + } + throw new Error('expected updated to be "offerStatus"'); + }; + + const offerResult = latestOfferStatus(); + t.like(offerResult, { + id: 'transfer-to-noble-from-agoric', + error: undefined, }); + t.true('result' in offerResult, 'transfer vow settled'); await t.throwsAsync( wd.executeOffer({ @@ -440,7 +521,7 @@ test('basic-flows', async t => { }, proposal: {}, offerArgs: { - amount: { denom: 'ibc/uusdchash', value: SIMULATED_ERRORS.TIMEOUT }, + amount: { denom: 'ibc/uusdconagoric', value: SIMULATED_ERRORS.TIMEOUT }, destination: { chainId: 'noble-1', value: 'noble1test', @@ -456,7 +537,7 @@ test.serial('auto-stake-it - proposal', async t => { await t.notThrowsAsync( evalProposal( - buildProposal('@agoric/builders/scripts/testing/start-auto-stake-it.js'), + buildProposal('@agoric/builders/scripts/testing/init-auto-stake-it.js'), ), ); }); @@ -465,13 +546,31 @@ test.serial('basic-flows - portfolio holder', async t => { const { buildProposal, evalProposal, - readLatest, + readPublished, agoricNamesRemotes, bridgeUtils: { flushInboundQueue }, } = t.context; await evalProposal( - buildProposal('@agoric/builders/scripts/orchestration/init-basic-flows.js'), + buildProposal( + '@agoric/builders/scripts/orchestration/init-basic-flows.js', + [ + '--chainInfo', + JSON.stringify(withChainCapabilities(fetchedChainInfo)), + '--assetInfo', + JSON.stringify([ + [ + 'ubld', + { + baseDenom: 'ubld', + baseName: 'agoric', + chainName: 'agoric', + brandKey: 'BLD', + }, + ], + ]), + ], + ), ); const wd = @@ -503,10 +602,10 @@ test.serial('basic-flows - portfolio holder', async t => { [ 'request-portfolio-acct', { - agoric: 'published.basicFlows.agoric1fakeLCAAddress', - cosmoshub: 'published.basicFlows.cosmos1test', - // XXX support multiple chain addresses in ibc mocks - osmosis: 'published.basicFlows.cosmos1test', + agoric: + 'published.basicFlows.agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g', + cosmoshub: 'published.basicFlows.cosmos1test2', + osmosis: 'published.basicFlows.cosmos1test3', }, ], ], @@ -514,15 +613,17 @@ test.serial('basic-flows - portfolio holder', async t => { t.like(wd.getLatestUpdateRecord(), { status: { id: 'request-portfolio-acct', numWantsSatisfied: 1 }, }); - // XXX this overrides a previous account, since mocks only provide one address - t.deepEqual(readLatest('published.basicFlows.cosmos1test'), { + + t.deepEqual(readPublished('basicFlows.cosmos1test3'), { localAddress: - '/ibc-port/icacontroller-3/ordered/{"version":"ics27-1","controllerConnectionId":"connection-1","hostConnectionId":"connection-1649","address":"cosmos1test","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-3', + '/ibc-port/icacontroller-4/ordered/{"version":"ics27-1","controllerConnectionId":"connection-1","hostConnectionId":"connection-1649","address":"cosmos1test3","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-4', remoteAddress: - '/ibc-hop/connection-1/ibc-port/icahost/ordered/{"version":"ics27-1","controllerConnectionId":"connection-1","hostConnectionId":"connection-1649","address":"cosmos1test","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-3', + '/ibc-hop/connection-1/ibc-port/icahost/ordered/{"version":"ics27-1","controllerConnectionId":"connection-1","hostConnectionId":"connection-1649","address":"cosmos1test3","encoding":"proto3","txType":"sdk_multi_msg"}/ibc-channel/channel-4', }); - // XXX this overrides a previous account, since mocks only provide one address - t.is(readLatest('published.basicFlows.agoric1fakeLCAAddress'), ''); + t.is( + readPublished('basicFlows.agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g'), + '', + ); const { BLD } = agoricNamesRemotes.brand; BLD || Fail`BLD missing from agoricNames`; diff --git a/packages/boot/test/bootstrapTests/price-feed-replace.test.ts b/packages/boot/test/bootstrapTests/price-feed-replace.test.ts index 0888a9bbcfd..d2cd27af919 100644 --- a/packages/boot/test/bootstrapTests/price-feed-replace.test.ts +++ b/packages/boot/test/bootstrapTests/price-feed-replace.test.ts @@ -63,20 +63,24 @@ test.serial('setupVaults; run updatePriceFeeds proposals', async t => { refreshAgoricNamesRemotes, setupVaults, governanceDriver: gd, - readLatest, + readPublished, + harness, } = t.context; await setupVaults(collateralBrandKey, managerIndex, setup); const instancePre = agoricNamesRemotes.instance['ATOM-USD price feed']; - t.like(readLatest('published.priceFeed.ATOM-USD_price_feed.latestRound'), { + t.like(readPublished('priceFeed.ATOM-USD_price_feed.latestRound'), { roundId: 1n, }); + harness && harness.useRunPolicy(true); await priceFeedDrivers[collateralBrandKey].setPrice(15.99); + harness && t.log('setPrice computrons', harness.totalComputronCount()); + harness && harness.useRunPolicy(false); - t.like(readLatest('published.priceFeed.ATOM-USD_price_feed.latestRound'), { + t.like(readPublished('priceFeed.ATOM-USD_price_feed.latestRound'), { roundId: 2n, }); @@ -124,7 +128,7 @@ test.serial('setupVaults; run updatePriceFeeds proposals', async t => { ); // after the coreEval, the roundId will reset to 1. - t.like(readLatest('published.priceFeed.ATOM-USD_price_feed.latestRound'), { + t.like(readPublished('priceFeed.ATOM-USD_price_feed.latestRound'), { roundId: 1n, }); @@ -135,51 +139,48 @@ test.serial('setupVaults; run updatePriceFeeds proposals', async t => { }); test.serial('1. place bid', async t => { - const { placeBids, readLatest } = t.context; + const { placeBids, readPublished } = t.context; await placeBids(collateralBrandKey, 'agoric1buyer', setup, 0); - t.like(readLatest('published.wallet.agoric1buyer.current'), { + t.like(readPublished('wallet.agoric1buyer.current'), { liveOffers: [['ATOM-bid1', { id: 'ATOM-bid1' }]], }); }); test.serial('2. trigger liquidation by changing price', async t => { - const { priceFeedDrivers, readLatest } = t.context; + const { priceFeedDrivers, readPublished } = t.context; // the current roundId is still 1. Round 1 is special, and you can't get to // round 2 until roundTimeout (10s) has elapsed. await priceFeedDrivers[collateralBrandKey].setPrice(9.99); - t.like(readLatest('published.priceFeed.ATOM-USD_price_feed'), { + t.like(readPublished('priceFeed.ATOM-USD_price_feed'), { // aka 9.99 amountIn: { value: 1000000n }, amountOut: { value: 9990000n }, }); - t.like(readLatest('published.priceFeed.ATOM-USD_price_feed.latestRound'), { + t.like(readPublished('priceFeed.ATOM-USD_price_feed.latestRound'), { roundId: 1n, }); // check nothing liquidating yet - const liveSchedule: ScheduleNotification = readLatest( - 'published.auction.schedule', - ); + const liveSchedule: ScheduleNotification = readPublished('auction.schedule'); t.is(liveSchedule.activeStartTime, null); - const metricsPath = `published.vaultFactory.managers.manager${managerIndex}.metrics`; + const metricsPath = + `vaultFactory.managers.manager${managerIndex}.metrics` as const; - t.like(readLatest(metricsPath), { + t.like(readPublished(metricsPath), { numActiveVaults: setup.vaults.length, numLiquidatingVaults: 0, }); }); test.serial('3. verify liquidation', async t => { - const { advanceTimeBy, advanceTimeTo, readLatest } = t.context; + const { advanceTimeBy, advanceTimeTo, readPublished } = t.context; - const liveSchedule: ScheduleNotification = readLatest( - 'published.auction.schedule', - ); - const metricsPath = `published.vaultFactory.managers.manager${managerIndex}.metrics`; + const liveSchedule: ScheduleNotification = readPublished('auction.schedule'); + const metricsPath = `vaultFactory.managers.manager${managerIndex}.metrics`; // advance time to start an auction console.log(collateralBrandKey, 'step 1 of 10'); @@ -187,7 +188,7 @@ test.serial('3. verify liquidation', async t => { await eventLoopIteration(); // let promises to update vstorage settle // vaultFactory sent collateral for liquidation - t.like(readLatest(metricsPath), { + t.like(readPublished(metricsPath), { numActiveVaults: 0, numLiquidatingVaults: setup.vaults.length, liquidatingCollateral: { @@ -199,7 +200,7 @@ test.serial('3. verify liquidation', async t => { console.log(collateralBrandKey, 'step 2 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { collateralAvailable: { value: scale6(setup.auction.start.collateral) }, startCollateral: { value: scale6(setup.auction.start.collateral) }, startProceedsGoal: { value: scale6(setup.auction.start.debt) }, @@ -216,7 +217,7 @@ test.serial('3. verify liquidation', async t => { console.log(collateralBrandKey, 'step 6 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest(`published.auction.book${managerIndex}`), { + t.like(readPublished(`auction.book${managerIndex}`), { // 15_000_000 - ( 20_000_000 / 8.991 ) collateralAvailable: { value: 12775554n }, }); @@ -230,7 +231,7 @@ test.serial('3. verify liquidation', async t => { console.log(collateralBrandKey, 'step 9 of 10'); await advanceTimeBy(3, 'minutes'); - t.like(readLatest('published.wallet.agoric1buyer'), { + t.like(readPublished('wallet.agoric1buyer'), { status: { id: `${collateralBrandKey}-bid1`, payouts: likePayouts(outcome.bids[0].payouts), diff --git a/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.md b/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.md index 720d6075dc2..bcc520982e9 100644 --- a/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.md +++ b/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.md @@ -14,259 +14,1238 @@ Generated by [AVA](https://avajs.dev). [ [ 'published.agoricNames.chain.agoric', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"agoric-3\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"ubld\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'agoric', + chainId: 'agoric-3', + icqEnabled: false, + stakingTokens: [ + { + denom: 'ubld', + }, + ], + }, ], [ 'published.agoricNames.chain.celestia', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"celestia\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"utia\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'celestia', + chainId: 'celestia', + icqEnabled: false, + stakingTokens: [ + { + denom: 'utia', + }, + ], + }, ], [ 'published.agoricNames.chain.cosmoshub', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"cosmoshub-4\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"uatom\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'cosmos', + chainId: 'cosmoshub-4', + icqEnabled: false, + stakingTokens: [ + { + denom: 'uatom', + }, + ], + }, ], [ 'published.agoricNames.chain.dydx', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"dydx-mainnet-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"adydx\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'dydx', + chainId: 'dydx-mainnet-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'adydx', + }, + ], + }, ], [ 'published.agoricNames.chain.juno', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"juno-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"ujuno\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'juno', + chainId: 'juno-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'ujuno', + }, + ], + }, ], [ 'published.agoricNames.chain.neutron', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"neutron-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"untrn\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'neutron', + chainId: 'neutron-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'untrn', + }, + ], + }, ], [ 'published.agoricNames.chain.noble', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"noble-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'noble', + chainId: 'noble-1', + icqEnabled: false, + }, ], [ 'published.agoricNames.chain.omniflixhub', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"omniflixhub-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"uflix\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'omniflix', + chainId: 'omniflixhub-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'uflix', + }, + ], + }, ], [ 'published.agoricNames.chain.osmosis', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"osmosis-1\\\\\\",\\\\\\"icqEnabled\\\\\\":true,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"uosmo\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'osmo', + chainId: 'osmosis-1', + icqEnabled: true, + stakingTokens: [ + { + denom: 'uosmo', + }, + ], + }, ], [ 'published.agoricNames.chain.secretnetwork', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"secret-4\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"uscrt\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'secret', + chainId: 'secret-4', + icqEnabled: false, + stakingTokens: [ + { + denom: 'uscrt', + }, + ], + }, ], [ 'published.agoricNames.chain.stargaze', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"stargaze-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"ustars\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'stars', + chainId: 'stargaze-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'ustars', + }, + ], + }, ], [ 'published.agoricNames.chain.stride', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"stride-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"ustrd\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'stride', + chainId: 'stride-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'ustrd', + }, + ], + }, ], [ 'published.agoricNames.chain.umee', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"chainId\\\\\\":\\\\\\"umee-1\\\\\\",\\\\\\"icqEnabled\\\\\\":false,\\\\\\"stakingTokens\\\\\\":[{\\\\\\"denom\\\\\\":\\\\\\"uumee\\\\\\"}]}\\",\\"slots\\":[]}"]}', + { + bech32Prefix: 'umee', + chainId: 'umee-1', + icqEnabled: false, + stakingTokens: [ + { + denom: 'uumee', + }, + ], + }, ], [ 'published.agoricNames.chainConnection.agoric-3_cosmoshub-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-6\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-927\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-649\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-8\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-405\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-5', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-77\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-32\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-40\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-72\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-62\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-21\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + id: 'connection-72', + state: 3, + transferChannel: { + channelId: 'channel-62', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-73\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-47\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-40\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-67\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-58\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-30\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + id: 'connection-67', + state: 3, + transferChannel: { + channelId: 'channel-58', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2109\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1649\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-320\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-17\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-111\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-80\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-17\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-10\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-51\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-74\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-129\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-118\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-68\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-59\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-148\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-59', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-18\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-152\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-101\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-18\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-42\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-29\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-48\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-36\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-7\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-35\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-29', + counterparty: { + client_id: '07-tendermint-48', + connection_id: 'connection-36', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-35', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-10\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3012\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2503\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-2\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-2\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-6994\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-2', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-52\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-174\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-131\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-15\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-14\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-91\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-52', + counterparty: { + client_id: '07-tendermint-174', + connection_id: 'connection-131', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-14', + counterPartyChannelId: 'channel-91', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-86\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-359\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-296\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-56\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-33\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-291\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-86', + counterparty: { + client_id: '07-tendermint-359', + connection_id: 'connection-296', + }, + id: 'connection-56', + state: 3, + transferChannel: { + channelId: 'channel-33', + counterPartyChannelId: 'channel-291', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-137\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-125\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-4\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-4\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-162\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-137', + connection_id: 'connection-125', + }, + id: 'connection-4', + state: 3, + transferChannel: { + channelId: 'channel-4', + counterPartyChannelId: 'channel-162', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_juno-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-439\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-372\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-207\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-439', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-2', + }, + id: 'connection-372', + state: 3, + transferChannel: { + channelId: 'channel-207', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1119\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-809\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-569\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1119', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-809', + state: 3, + transferChannel: { + channelId: 'channel-569', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1116\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-4\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-12\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-790\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-536\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-4\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + id: 'connection-790', + state: 3, + transferChannel: { + channelId: 'channel-536', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-656\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-23\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-19\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-501\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-306\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-12\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-656', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-19', + }, + id: 'connection-501', + state: 3, + transferChannel: { + channelId: 'channel-306', + counterPartyChannelId: 'channel-12', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-259\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-257\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-141\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + id: 'connection-257', + state: 3, + transferChannel: { + channelId: 'channel-141', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-492\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-401\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-235\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-492', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-0', + }, + id: 'connection-401', + state: 3, + transferChannel: { + channelId: 'channel-235', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1188\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-320\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-256\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-918\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-730\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-239\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1188', + counterparty: { + client_id: '07-tendermint-320', + connection_id: 'connection-256', + }, + id: 'connection-918', + state: 3, + transferChannel: { + channelId: 'channel-730', + counterPartyChannelId: 'channel-239', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-913\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-635\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-391\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-913', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-635', + state: 3, + transferChannel: { + channelId: 'channel-391', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-11\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-72\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-51\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-17\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-11', + counterparty: { + client_id: '07-tendermint-72', + connection_id: 'connection-51', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-59\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-57\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-0\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-33\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3009\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2500\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-7\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-3\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-6787\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-3', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-133\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-123\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-160\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-133', + connection_id: 'connection-123', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-160', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-8\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-244\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-208\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-13\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-118\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-244', + connection_id: 'connection-208', + }, + id: 'connection-13', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-118', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-557\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-97\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-71\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-524\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-548\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-4328\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-557', + counterparty: { + client_id: '07-tendermint-97', + connection_id: 'connection-71', + }, + id: 'connection-524', + state: 3, + transferChannel: { + channelId: 'channel-548', + counterPartyChannelId: 'channel-4328', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-334\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-8\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-322\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-224\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-3\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + id: 'connection-322', + state: 3, + transferChannel: { + channelId: 'channel-224', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1457\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1142\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-0\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-42\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-108\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-23\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-9\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-68\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-108', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-9', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-48', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-44\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-13\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-11\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-30\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-20\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-44', + counterparty: { + client_id: '07-tendermint-13', + connection_id: 'connection-11', + }, + id: 'connection-30', + state: 3, + transferChannel: { + channelId: 'channel-20', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-263\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-31\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-19\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-205\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-139\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-24\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-263', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-19', + }, + id: 'connection-205', + state: 3, + transferChannel: { + channelId: 'channel-139', + counterPartyChannelId: 'channel-24', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-40\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-25\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-34\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-31\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-30\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-18\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + id: 'connection-31', + state: 3, + transferChannel: { + channelId: 'channel-30', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-19\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2823\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2338\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-18\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-10\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-874\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-85\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-199\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-192\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-63\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1551\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-144\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-85', + counterparty: { + client_id: '07-tendermint-199', + connection_id: 'connection-192', + }, + id: 'connection-63', + state: 3, + transferChannel: { + channelId: 'channel-1551', + counterPartyChannelId: 'channel-144', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-31\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-283\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-211\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-23\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-18\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-191\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-283', + connection_id: 'connection-211', + }, + id: 'connection-23', + state: 3, + transferChannel: { + channelId: 'channel-18', + counterPartyChannelId: 'channel-191', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-18\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-125\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-113\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-15\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-123\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-125', + connection_id: 'connection-113', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-68\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-51\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-49\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-65\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-44\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-38\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + id: 'connection-65', + state: 3, + transferChannel: { + channelId: 'channel-44', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2704\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2241\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-2\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-750\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-24\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-170\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-127\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-33\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-17\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-88\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + id: 'connection-33', + state: 3, + transferChannel: { + channelId: 'channel-17', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-16\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-287\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-214\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-25\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-204\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-73\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-248\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-210\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-74\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-51\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-120\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + id: 'connection-74', + state: 3, + transferChannel: { + channelId: 'channel-51', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.omniflixhub-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-8\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1829\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1431\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-8\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-199\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1588\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1244\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-88\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + id: 'connection-1244', + state: 3, + transferChannel: { + channelId: 'channel-88', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1562\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1223\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-75\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-1223', + state: 3, + transferChannel: { + channelId: 'channel-75', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2119\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1657\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-326\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + id: 'connection-1657', + state: 3, + transferChannel: { + channelId: 'channel-326', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1805\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-6\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1410\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-184\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + id: 'connection-1410', + state: 3, + transferChannel: { + channelId: 'channel-184', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-43\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-177\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-110\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-25\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-19\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-43', + counterparty: { + client_id: '07-tendermint-177', + connection_id: 'connection-110', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-19', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-75\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-37\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-25\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-40\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-37\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-40\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-75', + counterparty: { + client_id: '07-tendermint-37', + connection_id: 'connection-25', + }, + id: 'connection-40', + state: 3, + transferChannel: { + channelId: 'channel-37', + counterPartyChannelId: 'channel-40', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-193\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-249\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-213\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-188\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-126\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-123\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-193', + counterparty: { + client_id: '07-tendermint-249', + connection_id: 'connection-213', + }, + id: 'connection-188', + state: 3, + transferChannel: { + channelId: 'channel-126', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.stargaze-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-195\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-30\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-18\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-128\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-106\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-19\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-195', + counterparty: { + client_id: '07-tendermint-30', + connection_id: 'connection-18', + }, + id: 'connection-128', + state: 3, + transferChannel: { + channelId: 'channel-106', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.stride-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-32\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-64\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-45\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-20\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-29\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-34\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-64', + connection_id: 'connection-45', + }, + id: 'connection-20', + state: 3, + transferChannel: { + channelId: 'channel-29', + counterPartyChannelId: 'channel-34', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], ] @@ -278,206 +1257,1073 @@ Generated by [AVA](https://avajs.dev). [ [ 'published.agoricNames.chainConnection.agoric-3_cosmoshub-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-6\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-927\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-649\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-8\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-405\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-5', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-77\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-32\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-40\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-72\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-62\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-21\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + id: 'connection-72', + state: 3, + transferChannel: { + channelId: 'channel-62', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-73\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-47\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-40\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-67\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-58\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-30\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + id: 'connection-67', + state: 3, + transferChannel: { + channelId: 'channel-58', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2109\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1649\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-320\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-17\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-111\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-80\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-17\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-10\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-51\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-74\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-129\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-118\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-68\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-59\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-148\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-59', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.agoric-3_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-18\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-152\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-101\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-18\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-42\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-29\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-48\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-36\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-7\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-35\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-29', + counterparty: { + client_id: '07-tendermint-48', + connection_id: 'connection-36', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-35', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-10\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3012\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2503\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-2\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-2\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-6994\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-2', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-52\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-174\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-131\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-15\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-14\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-91\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-52', + counterparty: { + client_id: '07-tendermint-174', + connection_id: 'connection-131', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-14', + counterPartyChannelId: 'channel-91', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-86\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-359\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-296\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-56\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-33\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-291\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-86', + counterparty: { + client_id: '07-tendermint-359', + connection_id: 'connection-296', + }, + id: 'connection-56', + state: 3, + transferChannel: { + channelId: 'channel-33', + counterPartyChannelId: 'channel-291', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.celestia_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-137\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-125\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-4\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-4\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-162\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-137', + connection_id: 'connection-125', + }, + id: 'connection-4', + state: 3, + transferChannel: { + channelId: 'channel-4', + counterPartyChannelId: 'channel-162', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_juno-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-439\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-372\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-207\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-439', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-2', + }, + id: 'connection-372', + state: 3, + transferChannel: { + channelId: 'channel-207', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1119\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-809\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-569\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1119', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-809', + state: 3, + transferChannel: { + channelId: 'channel-569', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1116\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-4\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-12\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-790\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-536\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-4\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + id: 'connection-790', + state: 3, + transferChannel: { + channelId: 'channel-536', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-656\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-23\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-19\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-501\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-306\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-12\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-656', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-19', + }, + id: 'connection-501', + state: 3, + transferChannel: { + channelId: 'channel-306', + counterPartyChannelId: 'channel-12', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-259\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-257\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-141\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + id: 'connection-257', + state: 3, + transferChannel: { + channelId: 'channel-141', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-492\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-401\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-235\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-492', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-0', + }, + id: 'connection-401', + state: 3, + transferChannel: { + channelId: 'channel-235', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1188\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-320\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-256\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-918\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-730\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-239\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1188', + counterparty: { + client_id: '07-tendermint-320', + connection_id: 'connection-256', + }, + id: 'connection-918', + state: 3, + transferChannel: { + channelId: 'channel-730', + counterPartyChannelId: 'channel-239', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.cosmoshub-4_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-913\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-635\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-391\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-913', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-635', + state: 3, + transferChannel: { + channelId: 'channel-391', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-11\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-72\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-51\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-17\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-11', + counterparty: { + client_id: '07-tendermint-72', + connection_id: 'connection-51', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-59\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-57\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-0\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-33\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3009\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2500\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-7\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-3\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-6787\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-3', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-133\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-123\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-160\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-133', + connection_id: 'connection-123', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-160', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.dydx-mainnet-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-8\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-244\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-208\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-13\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-118\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-244', + connection_id: 'connection-208', + }, + id: 'connection-13', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-118', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_neutron-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-557\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-97\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-71\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-524\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-548\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-4328\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-557', + counterparty: { + client_id: '07-tendermint-97', + connection_id: 'connection-71', + }, + id: 'connection-524', + state: 3, + transferChannel: { + channelId: 'channel-548', + counterPartyChannelId: 'channel-4328', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-334\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-3\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-8\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-322\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-224\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-3\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + id: 'connection-322', + state: 3, + transferChannel: { + channelId: 'channel-224', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1457\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1142\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-0\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-42\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-108\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-23\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-9\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-68\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-108', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-9', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-48', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-44\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-13\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-11\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-30\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-20\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-44', + counterparty: { + client_id: '07-tendermint-13', + connection_id: 'connection-11', + }, + id: 'connection-30', + state: 3, + transferChannel: { + channelId: 'channel-20', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.juno-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-263\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-31\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-19\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-205\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-139\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-24\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-263', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-19', + }, + id: 'connection-205', + state: 3, + transferChannel: { + channelId: 'channel-139', + counterPartyChannelId: 'channel-24', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_noble-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-40\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-25\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-34\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-31\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-30\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-18\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + id: 'connection-31', + state: 3, + transferChannel: { + channelId: 'channel-30', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-19\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2823\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2338\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-18\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-10\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-874\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-85\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-199\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-192\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-63\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1551\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-144\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-85', + counterparty: { + client_id: '07-tendermint-199', + connection_id: 'connection-192', + }, + id: 'connection-63', + state: 3, + transferChannel: { + channelId: 'channel-1551', + counterPartyChannelId: 'channel-144', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-31\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-283\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-211\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-23\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-18\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-191\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-283', + connection_id: 'connection-211', + }, + id: 'connection-23', + state: 3, + transferChannel: { + channelId: 'channel-18', + counterPartyChannelId: 'channel-191', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.neutron-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-18\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-125\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-113\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-15\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-8\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-123\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-125', + connection_id: 'connection-113', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_omniflixhub-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-68\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-51\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-49\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-65\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-44\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-38\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + id: 'connection-65', + state: 3, + transferChannel: { + channelId: 'channel-44', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2704\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2241\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-2\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-750\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-24\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-170\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-127\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-33\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-17\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-88\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + id: 'connection-33', + state: 3, + transferChannel: { + channelId: 'channel-17', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-16\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-287\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-214\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-25\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-11\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-204\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.noble-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-73\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-248\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-210\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-74\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-51\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-120\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + id: 'connection-74', + state: 3, + transferChannel: { + channelId: 'channel-51', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.omniflixhub-1_osmosis-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-8\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1829\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1431\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-8\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-199\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_secret-4', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1588\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-1\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1244\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-88\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-1\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + id: 'connection-1244', + state: 3, + transferChannel: { + channelId: 'channel-88', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1562\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-0\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1223\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-75\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-1223', + state: 3, + transferChannel: { + channelId: 'channel-75', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-2119\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-2\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1657\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-326\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-5\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + id: 'connection-1657', + state: 3, + transferChannel: { + channelId: 'channel-326', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.osmosis-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-1805\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-6\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-0\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-1410\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-184\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-0\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + id: 'connection-1410', + state: 3, + transferChannel: { + channelId: 'channel-184', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_stargaze-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-43\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-177\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-110\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-25\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-19\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-48\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-43', + counterparty: { + client_id: '07-tendermint-177', + connection_id: 'connection-110', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-19', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-75\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-37\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-25\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-40\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-37\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-40\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-75', + counterparty: { + client_id: '07-tendermint-37', + connection_id: 'connection-25', + }, + id: 'connection-40', + state: 3, + transferChannel: { + channelId: 'channel-37', + counterPartyChannelId: 'channel-40', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.secret-4_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-193\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-249\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-213\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-188\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-126\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-123\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-193', + counterparty: { + client_id: '07-tendermint-249', + connection_id: 'connection-213', + }, + id: 'connection-188', + state: 3, + transferChannel: { + channelId: 'channel-126', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.stargaze-1_stride-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-195\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-30\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-18\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-128\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-106\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-19\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-195', + counterparty: { + client_id: '07-tendermint-30', + connection_id: 'connection-18', + }, + id: 'connection-128', + state: 3, + transferChannel: { + channelId: 'channel-106', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], [ 'published.agoricNames.chainConnection.stride-1_umee-1', - '{"blockHeight":"0","values":["{\\"body\\":\\"{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-32\\\\\\",\\\\\\"counterparty\\\\\\":{\\\\\\"client_id\\\\\\":\\\\\\"07-tendermint-64\\\\\\",\\\\\\"connection_id\\\\\\":\\\\\\"connection-45\\\\\\"},\\\\\\"id\\\\\\":\\\\\\"connection-20\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"transferChannel\\\\\\":{\\\\\\"channelId\\\\\\":\\\\\\"channel-29\\\\\\",\\\\\\"counterPartyChannelId\\\\\\":\\\\\\"channel-34\\\\\\",\\\\\\"counterPartyPortId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"ordering\\\\\\":0,\\\\\\"portId\\\\\\":\\\\\\"transfer\\\\\\",\\\\\\"state\\\\\\":3,\\\\\\"version\\\\\\":\\\\\\"ics20-1\\\\\\"}}\\",\\"slots\\":[]}"]}', + { + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-64', + connection_id: 'connection-45', + }, + id: 'connection-20', + state: 3, + transferChannel: { + channelId: 'channel-29', + counterPartyChannelId: 'channel-34', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, ], ] diff --git a/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.snap b/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.snap index 53aefbf2f9c..d018a0d07a0 100644 Binary files a/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.snap and b/packages/boot/test/bootstrapTests/snapshots/orchestration.test.ts.snap differ diff --git a/packages/boot/test/bootstrapTests/vaults-upgrade.test.ts b/packages/boot/test/bootstrapTests/vaults-upgrade.test.ts index 2233e798e25..940339eec69 100644 --- a/packages/boot/test/bootstrapTests/vaults-upgrade.test.ts +++ b/packages/boot/test/bootstrapTests/vaults-upgrade.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @jessie.js/safe-await-separator */ /** * @file Bootstrap test integration vaults with smart-wallet. The tests in this * file are NOT independent; a single `test.before()` handler creates shared @@ -34,7 +33,7 @@ const makeDefaultTestContext = async ( storage, }); - const { readLatest, runUtils } = swingsetTestKit; + const { readLatest, readPublished, runUtils } = swingsetTestKit; ({ storage } = swingsetTestKit); const { EV } = runUtils; logTiming && console.timeLog('DefaultTestContext', 'swingsetTestKit'); @@ -58,13 +57,11 @@ const makeDefaultTestContext = async ( logTiming && console.timeEnd('DefaultTestContext'); const readRewardPoolBalance = () => { - return readLatest('published.vaultFactory.metrics').rewardPoolAllocation - .Minted?.value; + return readPublished('vaultFactory.metrics').rewardPoolAllocation.Minted + ?.value; }; const readCollateralMetrics = vaultManagerIndex => - readLatest( - `published.vaultFactory.managers.manager${vaultManagerIndex}.metrics`, - ); + readPublished(`vaultFactory.managers.manager${vaultManagerIndex}.metrics`); return { ...swingsetTestKit, @@ -98,7 +95,7 @@ test.serial('re-bootstrap', async t => { t.true(wd1.isNew); const assertWalletCount = (walletsProvisioned, message) => { - const metrics = oldContext.readLatest('published.provisionPool.metrics'); + const metrics = oldContext.readPublished('provisionPool.metrics'); // FIXME make wallet provisioning use the provisionPool // disabled while wallet provisioning bypasses provisionPool // t.like(metrics, { walletsProvisioned }, message); diff --git a/packages/boot/test/bootstrapTests/vtransfer.test.ts b/packages/boot/test/bootstrapTests/vtransfer.test.ts index fd0bec558ac..7f865e596fe 100644 --- a/packages/boot/test/bootstrapTests/vtransfer.test.ts +++ b/packages/boot/test/bootstrapTests/vtransfer.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @jessie.js/safe-await-separator -- confused by casting 'as' */ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import type { TestFn } from 'ava'; diff --git a/packages/boot/test/bootstrapTests/walletFactory.ts b/packages/boot/test/bootstrapTests/walletFactory.ts index 0b8fea676bc..ce964047233 100644 --- a/packages/boot/test/bootstrapTests/walletFactory.ts +++ b/packages/boot/test/bootstrapTests/walletFactory.ts @@ -9,9 +9,11 @@ import { makeWalletFactoryDriver } from '../../tools/drivers.js'; export const makeWalletFactoryContext = async ( t, configSpecifier = '@agoric/vm-config/decentral-main-vaults-config.json', + opts = {}, ) => { const swingsetTestKit = await makeSwingsetTestKit(t.log, undefined, { configSpecifier, + ...opts, }); const { runUtils, storage } = swingsetTestKit; diff --git a/packages/boot/test/fast-usdc/fast-usdc.test.ts b/packages/boot/test/fast-usdc/fast-usdc.test.ts new file mode 100644 index 00000000000..60850171ada --- /dev/null +++ b/packages/boot/test/fast-usdc/fast-usdc.test.ts @@ -0,0 +1,370 @@ +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; + +import type { TestFn } from 'ava'; +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { configurations } from '@agoric/fast-usdc/src/utils/deploy-config.js'; +import { MockCctpTxEvidences } from '@agoric/fast-usdc/test/fixtures.js'; +import { documentStorageSchema } from '@agoric/governance/tools/storageDoc.js'; +import { Fail } from '@endo/errors'; +import { unmarshalFromVstorage } from '@agoric/internal/src/marshal.js'; +import { makeMarshal } from '@endo/marshal'; +import { + defaultMarshaller, + defaultSerializer, +} from '@agoric/internal/src/storage-test-utils.js'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { BridgeId, NonNullish } from '@agoric/internal'; +import { + makeWalletFactoryContext, + type WalletFactoryTestContext, +} from '../bootstrapTests/walletFactory.js'; +import { + makeSwingsetHarness, + insistManagerType, + AckBehavior, +} from '../../tools/supports.js'; + +const test: TestFn< + WalletFactoryTestContext & { + harness?: ReturnType; + } +> = anyTest; + +const { + SLOGFILE: slogFile, + SWINGSET_WORKER_TYPE: defaultManagerType = 'local', +} = process.env; + +test.before('bootstrap', async t => { + const config = '@agoric/vm-config/decentral-itest-orchestration-config.json'; + insistManagerType(defaultManagerType); + const harness = ['xs-worker', 'xsnap'].includes(defaultManagerType) + ? makeSwingsetHarness() + : undefined; + const ctx = await makeWalletFactoryContext(t, config, { + slogFile, + defaultManagerType, + harness, + }); + t.context = { ...ctx, harness }; +}); +test.after.always(t => t.context.shutdown?.()); + +test.serial('oracles provision before contract deployment', async t => { + const { walletFactoryDriver: wd } = t.context; + const watcherWallet = await wd.provideSmartWallet('agoric1watcher1'); + t.truthy(watcherWallet); +}); + +test.serial( + 'contract starts; adds to agoricNames; sends invitation', + async t => { + const { + agoricNamesRemotes, + bridgeUtils, + buildProposal, + evalProposal, + refreshAgoricNamesRemotes, + storage, + walletFactoryDriver: wd, + } = t.context; + + const { oracles } = configurations.MAINNET; + const [watcherWallet] = await Promise.all( + Object.values(oracles).map(addr => wd.provideSmartWallet(addr)), + ); + + // inbound `startChannelOpenInit` responses immediately. + // needed since the Fusdc StartFn relies on an ICA being created + bridgeUtils.setAckBehavior( + BridgeId.DIBC, + 'startChannelOpenInit', + AckBehavior.Immediate, + ); + bridgeUtils.setBech32Prefix('noble'); + + const materials = buildProposal( + '@agoric/builders/scripts/fast-usdc/init-fast-usdc.js', + ['--net', 'MAINNET'], + ); + await evalProposal(materials); + + // update now that fastUsdc is instantiated + refreshAgoricNamesRemotes(); + t.truthy(agoricNamesRemotes.instance.fastUsdc); + t.truthy(agoricNamesRemotes.brand.FastLP); + const lpAsset = agoricNamesRemotes.vbankAsset.FastLP; + t.like(lpAsset, { + issuerName: 'FastLP', + denom: 'ufastlp', + displayInfo: { assetKind: 'nat', decimalPlaces: 6 }, + }); + const lpId = lpAsset.brand.getBoardId() || assert.fail('impossible'); + t.is(agoricNamesRemotes.brand.FastLP.getBoardId(), lpId); + + const { EV } = t.context.runUtils; + const agoricNames = await EV.vat('bootstrap').consumeItem('agoricNames'); + const board = await EV.vat('bootstrap').consumeItem('board'); + const getBoardAux = async name => { + const brand = await EV(agoricNames).lookup('brand', name); + const id = await EV(board).getId(brand); + t.is(id, lpId); + t.truthy(storage.data.get(`published.boardAux.${id}`)); + return unmarshalFromVstorage( + storage.data, + `published.boardAux.${id}`, + makeMarshal().fromCapData, + -1, + ); + }; + t.like( + await getBoardAux('FastLP'), + { + allegedName: 'PoolShares', // misnomer, in some contexts + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + }, + 'brand displayInfo available in boardAux', + ); + + const current = watcherWallet.getCurrentWalletRecord(); + + // XXX #10491 We should be able to compare objects by identity like this: + // + // const invitationPurse = current.purses.find( + // p => p.brand === agoricNamesRemotes.brand.Invitation, + // ); + // + // But agoricNamesRemotes and walletFactoryDriver + // don't share a marshal context. + // We should be able to map between them using + // const walletStuff = w.fromCapData(a.toCapData(aStuff)) + // but the marshallers don't even preserve identity within themselves. + + current.purses.length === 1 || Fail`test limited to 1 purse`; + const [thePurse] = current.purses; + const details = thePurse.balance.value as Array; + Array.isArray(details) || Fail`expected SET value`; + t.is(details.length, 1, 'oracle wallet has 1 invitation'); + t.is(details[0].description, 'oracle operator invitation'); + // XXX t.is(details.instance, agoricNames.instance.fastUsdc) should work + }, +); + +test.serial('writes feed policy to vstorage', async t => { + const { storage } = t.context; + const opts = { + node: 'fastUsdc.feedPolicy', + owner: 'the general and chain-specific policies for the Fast USDC feed', + showValue: JSON.parse, + }; + await documentStorageSchema(t, storage, opts); +}); + +test.serial('writes fee config to vstorage', async t => { + const { storage } = t.context; + const doc = { + node: 'fastUsdc.feeConfig', + owner: 'the fee configuration for Fast USDC', + showValue: defaultSerializer.parse, + }; + await documentStorageSchema(t, storage, doc); +}); + +test.serial('writes pool metrics to vstorage', async t => { + const { storage } = t.context; + const doc = { + node: 'fastUsdc.poolMetrics', + owner: 'FastUSC LiquidityPool exo', + showValue: defaultSerializer.parse, + }; + await documentStorageSchema(t, storage, doc); +}); + +test.serial('writes account addresses to vstorage', async t => { + const { storage } = t.context; + const doc = { + node: 'fastUsdc', + showValue: JSON.parse, + pattern: /published\.fastUsdc\.(feeConfig|feedPolicy|poolMetrics)/, + replacement: '', + note: `Under "published", the "fastUsdc" node is delegated to FastUSDC contract. + Note: published.fastUsdc.[settleAcctAddr], published.fastUsdc.[poolAcctAddr], + and published.fastUsdc.[intermediateAcctAddr] are published by @agoric/orchestration + via 'withOrchestration' and (local|cosmos)-orch-account-kit.js. + `, + }; + + await documentStorageSchema(t, storage, doc); +}); + +test.serial('makes usdc advance', async t => { + const { + walletFactoryDriver: wd, + storage, + agoricNamesRemotes, + harness, + } = t.context; + const oracles = await Promise.all([ + wd.provideSmartWallet('agoric19uscwxdac6cf6z7d5e26e0jm0lgwstc47cpll8'), + wd.provideSmartWallet('agoric1krunjcqfrf7la48zrvdfeeqtls5r00ep68mzkr'), + wd.provideSmartWallet('agoric1n4fcxsnkxe4gj6e24naec99hzmc4pjfdccy5nj'), + ]); + await Promise.all( + oracles.map(wallet => + wallet.sendOffer({ + id: 'claim-oracle-invitation', + invitationSpec: { + source: 'purse', + instance: agoricNamesRemotes.instance.fastUsdc, + description: 'oracle operator invitation', + }, + proposal: {}, + }), + ), + ); + + const lp = oracles[0]; // somewhat arbitrary + + // @ts-expect-error it doesnt recognize usdc as a Brand type + const usdc = agoricNamesRemotes.vbankAsset.USDC.brand as Brand<'nat'>; + await lp.sendOffer({ + id: 'deposit-lp-0', + invitationSpec: { + source: 'agoricContract', + instancePath: ['fastUsdc'], + callPipe: [['makeDepositInvitation', []]], + }, + proposal: { + give: { + USDC: { brand: usdc, value: 150_000_000n }, + }, + }, + }); + await eventLoopIteration(); + + const { getOutboundMessages } = t.context.bridgeUtils; + const lpBankDeposit = getOutboundMessages(BridgeId.BANK).find( + obj => + obj.type === 'VBANK_GIVE' && + obj.denom === 'ufastlp' && + obj.recipient === lp.getAddress(), + ); + t.log('LP vbank deposit', lpBankDeposit); + t.true(BigInt(lpBankDeposit.amount) > 1_000_000n, 'vbank GIVEs shares to LP'); + + const { purses } = lp.getCurrentWalletRecord(); + // XXX #10491 should not need to resort to string match on brand + t.falsy( + purses.find(p => `${p.brand}`.match(/FastLP/)), + 'FastLP balance not in wallet record', + ); + + const EUD = 'dydx1anything'; + const lastNodeValue = storage.getValues('published.fastUsdc').at(-1); + const { settlementAccount } = JSON.parse(NonNullish(lastNodeValue)); + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO( + // mock with the read settlementAccount address + encodeAddressHook(settlementAccount, { EUD }), + ); + + harness?.useRunPolicy(true); + await Promise.all( + oracles.map(wallet => + wallet.sendOffer({ + id: 'submit-mock-evidence-osmo', + invitationSpec: { + source: 'continuing', + previousOffer: 'claim-oracle-invitation', + invitationMakerName: 'SubmitEvidence', + invitationArgs: [evidence], + }, + proposal: {}, + }), + ), + ); + await eventLoopIteration(); + harness && + t.log( + `fusdc advance computrons (${oracles.length} oracles)`, + harness.totalComputronCount(), + ); + harness?.resetRunPolicy(); + + t.deepEqual( + storage + .getValues(`published.fastUsdc.txns.${evidence.txHash}`) + .map(defaultSerializer.parse), + [ + { evidence, status: 'OBSERVED' }, // observation includes evidence observed + { status: 'ADVANCING' }, + ], + ); + + const doc = { + node: `fastUsdc.txns`, + owner: `the Ethereum transactions upon which Fast USDC is acting`, + showValue: defaultSerializer.parse, + }; + await documentStorageSchema(t, storage, doc); +}); + +test.serial('skips usdc advance when risks identified', async t => { + const { walletFactoryDriver: wd, storage } = t.context; + const oracles = await Promise.all([ + wd.provideSmartWallet('agoric19uscwxdac6cf6z7d5e26e0jm0lgwstc47cpll8'), + wd.provideSmartWallet('agoric1krunjcqfrf7la48zrvdfeeqtls5r00ep68mzkr'), + wd.provideSmartWallet('agoric1n4fcxsnkxe4gj6e24naec99hzmc4pjfdccy5nj'), + ]); + + const EUD = 'dydx1riskyeud'; + const lastNodeValue = storage.getValues('published.fastUsdc').at(-1); + const { settlementAccount } = JSON.parse(NonNullish(lastNodeValue)); + const evidence = MockCctpTxEvidences.AGORIC_PLUS_DYDX( + // mock with the read settlementAccount address + encodeAddressHook(settlementAccount, { EUD }), + ); + + await Promise.all( + oracles.map(wallet => + wallet.sendOffer({ + id: 'submit-mock-evidence-dydx-risky', + invitationSpec: { + source: 'continuing', + previousOffer: 'claim-oracle-invitation', + invitationMakerName: 'SubmitEvidence', + invitationArgs: [evidence, { risksIdentified: ['TOO_LARGE_AMOUNT'] }], + }, + proposal: {}, + }), + ), + ); + await eventLoopIteration(); + + t.deepEqual( + storage + .getValues(`published.fastUsdc.txns.${evidence.txHash}`) + .map(defaultSerializer.parse), + [ + { evidence, status: 'OBSERVED' }, // observation includes evidence observed + { status: 'ADVANCE_SKIPPED', risksIdentified: ['TOO_LARGE_AMOUNT'] }, + ], + ); + + const doc = { + node: `fastUsdc.txns`, + owner: `the Ethereum transactions upon which Fast USDC is acting`, + showValue: defaultSerializer.parse, + }; + await documentStorageSchema(t, storage, doc); +}); + +test.serial('restart contract', async t => { + const { EV } = t.context.runUtils; + await null; + const kit = await EV.vat('bootstrap').consumeItem('fastUsdcKit'); + const actual = await EV(kit.adminFacet).restartContract(kit.privateArgs); + t.deepEqual(actual, { incarnationNumber: 1 }); +}); diff --git a/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md new file mode 100644 index 00000000000..726ac84a4ac --- /dev/null +++ b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md @@ -0,0 +1,201 @@ +# Snapshot report for `test/fast-usdc/fast-usdc.test.ts` + +The actual snapshot is saved in `fast-usdc.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## writes feed policy to vstorage + +> Under "published", the "fastUsdc.feedPolicy" node is delegated to the general and chain-specific policies for the Fast USDC feed. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.feedPolicy', + { + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: '0xe298b93ffB5eA1FB628e0C0D55A43aeaC268e347', + cctpTokenMessengerAddress: '0x19330d10D9Cc8751218eaf51E8885D058642E08A', + chainId: 42161, + confirmations: 2, + }, + }, + nobleAgoricChannelId: 'channel-21', + nobleDomainId: 4, + }, + ], + ] + +## writes fee config to vstorage + +> Under "published", the "fastUsdc.feeConfig" node is delegated to the fee configuration for Fast USDC. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.feeConfig', + { + contractRate: { + denominator: { + brand: Object @Alleged: USDC brand {}, + value: 10n, + }, + numerator: { + brand: Object @Alleged: USDC brand {}, + value: 2n, + }, + }, + flat: { + brand: Object @Alleged: USDC brand {}, + value: 10000n, + }, + maxVariable: { + brand: Object @Alleged: USDC brand {}, + value: 5000000n, + }, + variableRate: { + denominator: { + brand: Object @Alleged: USDC brand {}, + value: 100n, + }, + numerator: { + brand: Object @Alleged: USDC brand {}, + value: 1n, + }, + }, + }, + ], + ] + +## writes pool metrics to vstorage + +> Under "published", the "fastUsdc.poolMetrics" node is delegated to FastUSC LiquidityPool exo. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.poolMetrics', + { + encumberedBalance: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + shareWorth: { + denominator: { + brand: Object @Alleged: PoolShares brand {}, + value: 1n, + }, + numerator: { + brand: Object @Alleged: USDC brand {}, + value: 1n, + }, + }, + totalBorrows: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalContractFees: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalPoolFees: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalRepays: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + }, + ], + ] + +## writes account addresses to vstorage + +> Under "published", the "fastUsdc" node is delegated to FastUSDC contract. +> Note: published.fastUsdc.[settleAcctAddr], published.fastUsdc.[poolAcctAddr], +> and published.fastUsdc.[intermediateAcctAddr] are published by @agoric/orchestration +> via 'withOrchestration' and (local|cosmos)-orch-account-kit.js. +> +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc', + { + poolAccount: 'agoric1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqp7zqht', + settlementAccount: 'agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g', + }, + ], + [ + 'published.fastUsdc.agoric1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqp7zqht', + { + body: '#""', + slots: [], + }, + ], + [ + 'published.fastUsdc.agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g', + { + body: '#""', + slots: [], + }, + ], + [ + 'published.fastUsdc.noble1test', + { + body: '#{"localAddress":"/ibc-port/icacontroller-1/ordered/{\\"version\\":\\"ics27-1\\",\\"controllerConnectionId\\":\\"connection-72\\",\\"hostConnectionId\\":\\"connection-40\\",\\"address\\":\\"noble1test\\",\\"encoding\\":\\"proto3\\",\\"txType\\":\\"sdk_multi_msg\\"}/ibc-channel/channel-1","remoteAddress":"/ibc-hop/connection-72/ibc-port/icahost/ordered/{\\"version\\":\\"ics27-1\\",\\"controllerConnectionId\\":\\"connection-72\\",\\"hostConnectionId\\":\\"connection-40\\",\\"address\\":\\"noble1test\\",\\"encoding\\":\\"proto3\\",\\"txType\\":\\"sdk_multi_msg\\"}/ibc-channel/channel-1"}', + slots: [], + }, + ], + ] + +## makes usdc advance + +> Under "published", the "fastUsdc.txns" node is delegated to the Ethereum transactions upon which Fast USDC is acting. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.txns.0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702', + { + status: 'ADVANCING', + }, + ], + ] + +## skips usdc advance when risks identified + +> Under "published", the "fastUsdc.txns" node is delegated to the Ethereum transactions upon which Fast USDC is acting. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.txns.0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702', + { + status: 'ADVANCING', + }, + ], + [ + 'published.fastUsdc.txns.0xd81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761799', + { + risksIdentified: [ + 'TOO_LARGE_AMOUNT', + ], + status: 'ADVANCE_SKIPPED', + }, + ], + ] diff --git a/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.snap b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.snap new file mode 100644 index 00000000000..8528f3eda7c Binary files /dev/null and b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.snap differ diff --git a/packages/boot/test/orchestration/contract-upgrade.test.ts b/packages/boot/test/orchestration/contract-upgrade.test.ts index 86f76a30102..553f58f87db 100644 --- a/packages/boot/test/orchestration/contract-upgrade.test.ts +++ b/packages/boot/test/orchestration/contract-upgrade.test.ts @@ -4,6 +4,9 @@ import type { TestFn } from 'ava'; import { BridgeId } from '@agoric/internal'; import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import { withChainCapabilities } from '@agoric/orchestration'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; import { makeWalletFactoryContext, type WalletFactoryTestContext, @@ -19,17 +22,13 @@ test.before(async t => { test.after.always(t => t.context.shutdown?.()); /** - * This test core-evals a buggy installation of the sendAnywhere contract by - * giving it a faulty `agoricNames` service with a lookup() function which - * returns a promise that never resolves. + * This test core-evals an installation of the sendAnywhere contract that + * initiates an IBC Transfer. Since that goes over a bridge and is tracked + * by a vow, we can restart the contract and see that the vow settles. We + * can manually trigger a bridge event in the testing context. * - * Because the send-anywhere flow requires a lookup(), it waits forever. This - * gives us a point at which we can upgrade the vat with a working agoricNames - * and see that the flow continues from that point. (The lookup call is not made - * directly in a flow, but instead from a host API which uses the retryable - * helper. As such it tests both the idempotent retry mechanism of retryable on - * upgrades, and the ability to resume an async-flow for which a host vow - * settles after an upgrade.) + * As such, this demonstrates the ability to resume an async-flow for for which + * a host vow settles after an upgrade. */ test('resume', async t => { const { @@ -44,9 +43,21 @@ test('resume', async t => { t.log('start sendAnywhere'); await evalProposal( - buildProposal( - '@agoric/builders/scripts/testing/start-buggy-sendAnywhere.js', - ), + buildProposal('@agoric/builders/scripts/testing/init-send-anywhere.js', [ + '--chainInfo', + JSON.stringify(withChainCapabilities(fetchedChainInfo)), + '--assetInfo', + JSON.stringify([ + [ + 'uist', + { + baseDenom: 'uist', + baseName: 'agoric', + chainName: 'agoric', + }, + ], + ]), + ]), ); t.log('making offer'); @@ -70,28 +81,28 @@ test('resume', async t => { // XXX golden test const getLogged = () => - JSON.parse(storage.data.get('published.sendAnywhere.log')!).values; - - // This log shows the flow started, but didn't get past the name lookup - t.deepEqual(getLogged(), ['sending {0} from cosmoshub to cosmos1whatever']); - - t.log('upgrade sendAnywhere with fix'); - await evalProposal( - buildProposal('@agoric/builders/scripts/testing/fix-buggy-sendAnywhere.js'), - ); + JSON.parse(storage.data.get('published.send-anywhere.log')!).values; + // This log shows the flow started, but didn't get past the IBC Transfer settlement t.deepEqual(getLogged(), [ 'sending {0} from cosmoshub to cosmos1whatever', - 'got info for denoms: ibc/toyatom, ibc/toyusdc, ubld, uist', + 'got info for denoms: ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9, ibc/toyatom, ibc/toyusdc, ubld, uist', 'got info for chain: cosmoshub cosmoshub-4', 'completed transfer to localAccount', ]); + t.log('null upgrading sendAnywhere'); + await evalProposal( + buildProposal('@agoric/builders/scripts/testing/upgrade-send-anywhere.js'), + ); + // simulate ibc/MsgTransfer ack from remote chain, enabling `.transfer()` promise // to resolve await runInbound( BridgeId.VTRANSFER, buildVTransferEvent({ + sender: makeTestAddress(), + target: makeTestAddress(), sourceChannel: 'channel-5', sequence: '1', }), @@ -99,7 +110,7 @@ test('resume', async t => { t.deepEqual(getLogged(), [ 'sending {0} from cosmoshub to cosmos1whatever', - 'got info for denoms: ibc/toyatom, ibc/toyusdc, ubld, uist', + 'got info for denoms: ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9, ibc/toyatom, ibc/toyusdc, ubld, uist', 'got info for chain: cosmoshub cosmoshub-4', 'completed transfer to localAccount', 'completed transfer to cosmos1whatever', diff --git a/packages/boot/test/orchestration/restart-contracts.test.ts b/packages/boot/test/orchestration/restart-contracts.test.ts index a8f5f56511a..bf5d22efd07 100644 --- a/packages/boot/test/orchestration/restart-contracts.test.ts +++ b/packages/boot/test/orchestration/restart-contracts.test.ts @@ -3,9 +3,14 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import type { TestFn } from 'ava'; import { BridgeId } from '@agoric/internal'; -import type { CosmosValidatorAddress } from '@agoric/orchestration'; +import { + withChainCapabilities, + type CosmosValidatorAddress, +} from '@agoric/orchestration'; import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; import type { UpdateRecord } from '@agoric/smart-wallet/src/smartWallet.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; import { makeWalletFactoryContext, type WalletFactoryTestContext, @@ -32,7 +37,21 @@ test.serial('send-anywhere', async t => { t.log('start send-anywhere'); await evalProposal( - buildProposal('@agoric/builders/scripts/testing/start-send-anywhere.js'), + buildProposal('@agoric/builders/scripts/testing/init-send-anywhere.js', [ + '--chainInfo', + JSON.stringify(withChainCapabilities(fetchedChainInfo)), + '--assetInfo', + JSON.stringify([ + [ + 'uist', + { + baseDenom: 'uist', + baseName: 'agoric', + chainName: 'agoric', + }, + ], + ]), + ]), ); t.log('making offer'); @@ -83,6 +102,8 @@ test.serial('send-anywhere', async t => { await runInbound( BridgeId.VTRANSFER, buildVTransferEvent({ + sender: makeTestAddress(), + target: makeTestAddress(), sourceChannel: 'channel-5', sequence: '1', }), @@ -95,9 +116,12 @@ test.serial('send-anywhere', async t => { id: 'send-somewhere', numWantsSatisfied: 1, error: undefined, - result: undefined, }, }); + if (conclusion.updated !== 'offerStatus') { + throw new Error('expected offerStatus'); + } + t.true('result' in conclusion.status, 'transfer vow settled'); }); const validatorAddress: CosmosValidatorAddress = { diff --git a/packages/boot/test/upgrading/upgrade-vats.test.ts b/packages/boot/test/upgrading/upgrade-vats.test.ts index ed1647e1303..9711c7dd121 100644 --- a/packages/boot/test/upgrading/upgrade-vats.test.ts +++ b/packages/boot/test/upgrading/upgrade-vats.test.ts @@ -1,7 +1,6 @@ -/* eslint-disable @jessie.js/safe-await-separator -- test */ import { test } from '@agoric/swingset-vat/tools/prepare-test-env-ava.js'; -import { BridgeId } from '@agoric/internal'; +import { BridgeId, deepCopyJsonable } from '@agoric/internal'; import { buildVatController } from '@agoric/swingset-vat'; import { makeRunUtils } from '@agoric/swingset-vat/tools/run-utils.js'; import { Fail } from '@endo/errors'; @@ -434,8 +433,6 @@ test('upgrade vat-priceAuthority', async t => { matchRef(t, reincarnatedRegistry.adminFacet, registry.adminFacet); }); -const dataOnly = obj => JSON.parse(JSON.stringify(obj)); - test('upgrade vat-vow', async t => { const bundles = { vow: { @@ -483,7 +480,7 @@ test('upgrade vat-vow', async t => { }; await EV(vowRoot).makeLocalPromiseWatchers(localPromises); await EV(vowRoot).makeLocalVowWatchers(localVows); - t.deepEqual(dataOnly(await EV(vowRoot).getWatcherResults()), { + t.deepEqual(deepCopyJsonable(await EV(vowRoot).getWatcherResults()), { promiseForever: { status: 'unsettled' }, promiseFulfilled: { status: 'fulfilled', value: 'hello' }, promiseRejected: { status: 'rejected', reason: 'goodbye' }, @@ -533,7 +530,7 @@ test('upgrade vat-vow', async t => { }); await EV(fakeVowKit.resolver).reject(upgradeRejection.reason); t.timeout(600_000); // t.timeout.clear() not yet available in our ava version - t.deepEqual(dataOnly(await EV(vowRoot).getWatcherResults()), { + t.deepEqual(deepCopyJsonable(await EV(vowRoot).getWatcherResults()), { promiseForever: upgradeRejection, promiseFulfilled: { status: 'fulfilled', value: 'hello' }, promiseRejected: { status: 'rejected', reason: 'goodbye' }, diff --git a/packages/boot/tools/drivers.ts b/packages/boot/tools/drivers.ts index 7abb91344c6..850cf668d04 100644 --- a/packages/boot/tools/drivers.ts +++ b/packages/boot/tools/drivers.ts @@ -30,6 +30,7 @@ import type { RunUtils } from '@agoric/swingset-vat/tools/run-utils.js'; import { makeMarshal } from '@endo/marshal'; import type { SwingsetTestKit } from './supports.js'; +// XXX SwingsetTestKit would simplify this export const makeWalletFactoryDriver = async ( runUtils: RunUtils, storage: FakeStorageKit, @@ -54,6 +55,7 @@ export const makeWalletFactoryDriver = async ( isNew: boolean, ) => ({ isNew, + getAddress: () => walletAddress, executeOffer(offer: OfferSpec): Promise { const offerCapData = marshaller.toCapData( @@ -283,9 +285,9 @@ export const makeGovernanceDriver = async ( voteId = 'voteInNewLimit', committeeId = committeeMembershipId, ) => { - const latestQuestionRecord = testKit.readLatest( - 'published.committees.Economic_Committee.latestQuestion', - ) as any; + const latestQuestionRecord = testKit.readPublished( + 'committees.Economic_Committee.latestQuestion', + ); const chosenPositions = [latestQuestionRecord.positions[0]]; @@ -389,14 +391,8 @@ export const makeGovernanceDriver = async ( await Promise.all(promises); }; - const getLatestOutcome = async () => { - return unmarshalFromVstorage( - testKit.storage.data, - 'published.committees.Economic_Committee.latestOutcome', - fromCapData, - -1, - ); - }; + const getLatestOutcome = () => + testKit.readPublished('committees.Economic_Committee.latestOutcome'); return { proposeParams, diff --git a/packages/boot/tools/ibc/mocks.ts b/packages/boot/tools/ibc/mocks.ts index 824768df9d6..57385252a77 100644 --- a/packages/boot/tools/ibc/mocks.ts +++ b/packages/boot/tools/ibc/mocks.ts @@ -1,5 +1,6 @@ // @ts-check import { createMockAckMap } from '@agoric/orchestration/tools/ibc-mocks.js'; +import type { IBCChannelID, IBCEvent, IBCMethod } from '@agoric/vats'; /** @import { IBCChannelID, IBCMethod, IBCEvent } from '@agoric/vats'; */ @@ -65,6 +66,11 @@ export const protoMsgMocks = { msg: 'eyJ0eXBlIjoxLCJkYXRhIjoiQ25zS0tTOXBZbU11WVhCd2JHbGpZWFJwYjI1ekxuUnlZVzV6Wm1WeUxuWXhMazF6WjFSeVlXNXpabVZ5RWs0S0NIUnlZVzV6Wm1WeUVndGphR0Z1Ym1Wc0xUVXpOaG9UQ2cxcFltTXZkWFZ6WkdOb1lYTm9FZ0l4TUNJTFkyOXpiVzl6TVhSbGMzUXFDbTV2WW14bE1YUmxjM1F5QURpQThKTEwzUWc9IiwibWVtbyI6IiJ9', ack: responses.ibcTransfer, }, + // MsgTransfer 10 ibc/uusdchash from cosmos1test1 to noble1test through channel-536 + ibcTransfer2: { + msg: 'eyJ0eXBlIjoxLCJkYXRhIjoiQ253S0tTOXBZbU11WVhCd2JHbGpZWFJwYjI1ekxuUnlZVzV6Wm1WeUxuWXhMazF6WjFSeVlXNXpabVZ5RWs4S0NIUnlZVzV6Wm1WeUVndGphR0Z1Ym1Wc0xUVXpOaG9UQ2cxcFltTXZkWFZ6WkdOb1lYTm9FZ0l4TUNJTVkyOXpiVzl6TVhSbGMzUXhLZ3B1YjJKc1pURjBaWE4wTWdBNGdQQ1N5OTBJIiwibWVtbyI6IiJ9', + ack: responses.ibcTransfer, + }, error: { msg: '', ack: responses.error5, @@ -101,17 +107,18 @@ export const addParamsIfJsonVersion = (version, params) => { export const icaMocks = { /** * ICA Channel Creation - * @param {IBCMethod<'startChannelOpenInit'>} obj - * @returns {IBCEvent<'channelOpenAck'>} + * @param obj + * @param bech32Prefix */ - channelOpenAck: obj => { + channelOpenAck: ( + obj: IBCMethod<'startChannelOpenInit'>, + bech32Prefix: string = 'cosmos', + ): IBCEvent<'channelOpenAck'> => { // Fake a channel IDs from port suffixes. _Ports have no relation to channels, and hosts // and controllers will likely have different channel IDs for the same channel._ const mocklID = Number(obj.packet.source_port.split('-').at(-1)); - /** @type {IBCChannelID} */ - const mockLocalChannelID = `channel-${mocklID}`; - /** @type {IBCChannelID} */ - const mockRemoteChannelID = `channel-${mocklID}`; + const mockLocalChannelID: IBCChannelID = `channel-${mocklID}`; + const mockRemoteChannelID: IBCChannelID = `channel-${mocklID}`; return { type: 'IBC_EVENT', @@ -125,8 +132,8 @@ export const icaMocks = { channel_id: mockRemoteChannelID, }, counterpartyVersion: addParamsIfJsonVersion(obj.version, { - // TODO, parameterize - address: 'cosmos1test', + // mockID expected to increase monotonically since icacontroller ports are sequential + address: `${bech32Prefix}1test${mocklID < 2 ? '' : mocklID - 1}`, }), connectionHops: obj.hops, order: obj.order, diff --git a/packages/boot/tools/liquidation.ts b/packages/boot/tools/liquidation.ts index 175186a9b49..6b386535ef0 100644 --- a/packages/boot/tools/liquidation.ts +++ b/packages/boot/tools/liquidation.ts @@ -9,6 +9,7 @@ import { } from '@agoric/vats/tools/board-utils.js'; import { Offers } from '@agoric/inter-protocol/src/clientSupport.js'; import type { ExecutionContext } from 'ava'; +import { insistManagerType, makeSwingsetHarness } from './supports.js'; import { type SwingsetTestKit, makeSwingsetTestKit } from './supports.js'; import { type GovernanceDriver, @@ -105,8 +106,8 @@ export const makeLiquidationTestKit = async ({ managerIndex: number; price: number; }) => { - const managerPath = `published.vaultFactory.managers.manager${managerIndex}`; - const { advanceTimeBy, readLatest } = swingsetTestKit; + const managerPath = `vaultFactory.managers.manager${managerIndex}`; + const { advanceTimeBy, readLatest, readPublished } = swingsetTestKit; await null; if (!priceFeedDrivers[collateralBrandKey]) { @@ -153,7 +154,7 @@ export const makeLiquidationTestKit = async ({ ); // confirm Relevant Governance Parameter Assumptions - t.like(readLatest(`${managerPath}.governance`), { + t.like(readPublished(`${managerPath}.governance`), { current: { DebtLimit: { value: { value: DebtLimitValue } }, InterestRate: { @@ -178,7 +179,7 @@ export const makeLiquidationTestKit = async ({ }, }, }); - t.like(readLatest('published.auction.governance'), { + t.like(readPublished('auction.governance'), { current: { AuctionStartDelay: { type: 'relativeTime', value: { relValue: 2n } }, ClockStep: { @@ -206,10 +207,10 @@ export const makeLiquidationTestKit = async ({ vaultIndex: number, partial: Record, ) { - const { readLatest } = swingsetTestKit; + const { readPublished } = swingsetTestKit; - const notification = readLatest( - `published.vaultFactory.managers.manager${managerIndex}.vaults.vault${vaultIndex}`, + const notification = readPublished( + `vaultFactory.managers.manager${managerIndex}.vaults.vault${vaultIndex}`, ); t.like(notification, partial); }, @@ -287,16 +288,13 @@ export const makeLiquidationTestKit = async ({ ...setup.bids[i], maxBuy, }); - t.like( - swingsetTestKit.readLatest(`published.wallet.${buyerWalletAddress}`), - { - status: { - id: offerId, - result: 'Your bid has been accepted', - payouts: undefined, - }, + t.like(swingsetTestKit.readPublished(`wallet.${buyerWalletAddress}`), { + status: { + id: offerId, + result: 'Your bid has been accepted', + payouts: undefined, }, - ); + }); } }; @@ -308,13 +306,28 @@ export const makeLiquidationTestKit = async ({ }; }; +// asserts x is type doesn't work when using arrow functions +// https://github.com/microsoft/TypeScript/issues/34523 +function assertManagerType(specimen: string): asserts specimen is ManagerType { + insistManagerType(specimen); +} + export const makeLiquidationTestContext = async ( t, io: { env?: Record } = {}, ) => { const { env = {} } = io; + const { + SLOGFILE: slogFile, + SWINGSET_WORKER_TYPE: defaultManagerType = 'local', + } = env; + assertManagerType(defaultManagerType); + const harness = + defaultManagerType === 'xsnap' ? makeSwingsetHarness() : undefined; const swingsetTestKit = await makeSwingsetTestKit(t.log, undefined, { - slogFile: env.SLOGFILE, + slogFile, + defaultManagerType, + harness, }); console.time('DefaultTestContext'); @@ -372,6 +385,7 @@ export const makeLiquidationTestContext = async ( refreshAgoricNamesRemotes, walletFactoryDriver, governanceDriver, + harness, }; }; diff --git a/packages/boot/tools/supports.ts b/packages/boot/tools/supports.ts index 8b4a810f799..8f17cb2be16 100644 --- a/packages/boot/tools/supports.ts +++ b/packages/boot/tools/supports.ts @@ -7,7 +7,9 @@ import { resolve as importMetaResolve } from 'import-meta-resolve'; import { basename, join } from 'path'; import { inspect } from 'util'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; import { buildSwingset } from '@agoric/cosmic-swingset/src/launch-chain.js'; +import type { TypedPublished } from '@agoric/client-utils'; import { BridgeId, makeTracer, @@ -31,6 +33,7 @@ import { Fail } from '@endo/errors'; import { makeRunUtils, type RunUtils, + type RunHarness, } from '@agoric/swingset-vat/tools/run-utils.js'; import { boardSlottingMarshaller, @@ -42,18 +45,26 @@ import type { ExecutionContext as AvaT } from 'ava'; import type { CoreEvalSDKType } from '@agoric/cosmic-proto/swingset/swingset.js'; import type { EconomyBootstrapPowers } from '@agoric/inter-protocol/src/proposals/econ-behaviors.js'; import type { SwingsetController } from '@agoric/swingset-vat/src/controller/controller.js'; -import type { BridgeHandler, IBCMethod } from '@agoric/vats'; +import type { BridgeHandler, IBCDowncallMethod, IBCMethod } from '@agoric/vats'; import type { BootstrapRootObject } from '@agoric/vats/src/core/lib-boot.js'; import type { EProxy } from '@endo/eventual-send'; +import type { FastUSDCCorePowers } from '@agoric/fast-usdc/src/fast-usdc.start.js'; +import { + defaultBeansPerVatCreation, + defaultBeansPerXsnapComputron, +} from '@agoric/cosmic-swingset/src/sim-params.js'; +import { computronCounter } from '@agoric/cosmic-swingset/src/computron-counter.js'; import { icaMocks, protoMsgMockMap, protoMsgMocks } from './ibc/mocks.js'; const trace = makeTracer('BSTSupport', false); type ConsumeBootrapItem = ( name: N, -) => N extends keyof EconomyBootstrapPowers['consume'] - ? EconomyBootstrapPowers['consume'][N] - : unknown; +) => N extends keyof FastUSDCCorePowers['consume'] + ? FastUSDCCorePowers['consume'][N] + : N extends keyof EconomyBootstrapPowers['consume'] + ? EconomyBootstrapPowers['consume'][N] + : unknown; // XXX should satisfy EVProxy from run-utils.js but that's failing to import /** @@ -73,6 +84,7 @@ type BootstrapEV = EProxy & { const makeBootstrapRunUtils = makeRunUtils as ( controller: SwingsetController, + harness?: RunHarness, ) => Omit & { EV: BootstrapEV }; const keysToObject = ( @@ -278,6 +290,14 @@ export const matchIter = (t: AvaT, iter, valueRef) => { matchValue(t, iter.value, valueRef); }; +export const AckBehavior = { + /** inbound responses are queued. use `flushInboundQueue()` to simulate the remote response */ + Queued: 'QUEUED', + /** inbound messages are delivered immediately */ + Immediate: 'IMMEDIATE', +} as const; +type AckBehaviorType = (typeof AckBehavior)[keyof typeof AckBehavior]; + /** * Start a SwingSet kernel to be used by tests and benchmarks. * @@ -304,6 +324,7 @@ export const matchIter = (t: AvaT, iter, valueRef) => { * @param [options.profileVats] * @param [options.debugVats] * @param [options.defaultManagerType] + * @param [options.harness] */ export const makeSwingsetTestKit = async ( log: (..._: any[]) => void, @@ -317,6 +338,7 @@ export const makeSwingsetTestKit = async ( profileVats = [] as string[], debugVats = [] as string[], defaultManagerType = 'local' as ManagerType, + harness = undefined as RunHarness | undefined, } = {}, ) => { console.time('makeBaseSwingsetTestKit'); @@ -336,6 +358,9 @@ export const makeSwingsetTestKit = async ( return data; }; + const readPublished = (subpath: T) => + readLatest(`published.${subpath}`) as TypedPublished; + let lastBankNonce = 0n; let ibcSequenceNonce = 0; let lcaSequenceNonce = 0; @@ -347,10 +372,32 @@ export const makeSwingsetTestKit = async ( ...args ) => { console.log('inbound', ...args); - // eslint-disable-next-line no-use-before-define bridgeInbound!(...args); }; + /** + * Config DIBC bridge behavior. + * Defaults to `Queued` unless specified. + * Current only configured for `channelOpenInit` but can be + * extended to support `sendPacket`. + */ + const ackBehaviors: Partial< + Record>> + > = { + [BridgeId.DIBC]: { + startChannelOpenInit: AckBehavior.Queued, + }, + }; + + const shouldAckImmediately = ( + bridgeId: BridgeId, + method: IBCDowncallMethod, + ) => ackBehaviors?.[bridgeId]?.[method] === AckBehavior.Immediate; + /** + * configurable `bech32Prefix` for DIBC bridge + * messages that involve creating an ICA. + */ + let bech32Prefix = 'cosmos'; /** * Adds the sequence so the bridge knows what response to connect it to. * Then queue it send it over the bridge over this returns. @@ -389,7 +436,7 @@ export const makeSwingsetTestKit = async ( * Mock the bridge outbound handler. The real one is implemented in Golang so * changes there will sometimes require changes here. */ - const bridgeOutbound = (bridgeId: string, obj: any) => { + const bridgeOutbound = (bridgeId: BridgeId, obj: any) => { // store all messages for querying by tests if (!outboundMessages.has(bridgeId)) { outboundMessages.set(bridgeId, []); @@ -461,9 +508,17 @@ export const makeSwingsetTestKit = async ( case `${BridgeId.DIBC}:IBC_METHOD`: case `${BridgeId.VTRANSFER}:IBC_METHOD`: { switch (obj.method) { - case 'startChannelOpenInit': - pushInbound(BridgeId.DIBC, icaMocks.channelOpenAck(obj)); + case 'startChannelOpenInit': { + const message = icaMocks.channelOpenAck(obj, bech32Prefix); + const handle = shouldAckImmediately( + bridgeId, + 'startChannelOpenInit', + ) + ? inbound + : pushInbound; + handle(BridgeId.DIBC, message); return undefined; + } case 'sendPacket': { if (protoMsgMockMap[obj.packet.data]) { return ackLater(obj, protoMsgMockMap[obj.packet.data]); @@ -484,7 +539,7 @@ export const makeSwingsetTestKit = async ( return undefined; } case `${BridgeId.VLOCALCHAIN}:VLOCALCHAIN_ALLOCATE_ADDRESS`: { - const address = `${LOCALCHAIN_DEFAULT_ADDRESS}${lcaAccountsCreated || ''}`; + const address = makeTestAddress(lcaAccountsCreated); lcaAccountsCreated += 1; return address; } @@ -532,7 +587,7 @@ export const makeSwingsetTestKit = async ( console.timeLog('makeBaseSwingsetTestKit', 'buildSwingset'); - const runUtils = makeBootstrapRunUtils(controller); + const runUtils = makeBootstrapRunUtils(controller, harness); const buildProposal = makeProposalExtractor({ childProcess: childProcessAmbient, @@ -614,6 +669,27 @@ export const makeSwingsetTestKit = async ( getOutboundMessages: (bridgeId: string) => harden([...outboundMessages.get(bridgeId)]), getInboundQueueLength: () => inboundQueue.length, + setAckBehavior( + bridgeId: BridgeId, + method: IBCDowncallMethod, + behavior: AckBehaviorType, + ): void { + if (!ackBehaviors?.[bridgeId]?.[method]) + throw Fail`ack behavior not yet configurable for ${bridgeId} ${method}`; + console.log('setting', bridgeId, method, 'ack behavior to', behavior); + ackBehaviors[bridgeId][method] = behavior; + }, + lookupAckBehavior( + bridgeId: BridgeId, + method: IBCDowncallMethod, + ): AckBehaviorType { + if (!ackBehaviors?.[bridgeId]?.[method]) + throw Fail`ack behavior not yet configurable for ${bridgeId} ${method}`; + return ackBehaviors[bridgeId][method]; + }, + setBech32Prefix(prefix: string): void { + bech32Prefix = prefix; + }, /** * @param {number} max the max number of messages to flush * @returns {Promise} the number of messages flushed @@ -645,6 +721,7 @@ export const makeSwingsetTestKit = async ( getCrankNumber, jumpTimeTo, readLatest, + readPublished, runUtils, shutdown, storage, @@ -653,3 +730,50 @@ export const makeSwingsetTestKit = async ( }; }; export type SwingsetTestKit = Awaited>; + +/** + * Return a harness that can be dynamically configured to provide a computron- + * counting run policy (and queried for the count of computrons recorded since + * the last reset). + */ +export const makeSwingsetHarness = () => { + const c2b = defaultBeansPerXsnapComputron; + const beansPerUnit = { + // see https://cosgov.org/agoric?msgType=parameterChangeProposal&network=main + blockComputeLimit: 65_000_000n * c2b, + vatCreation: defaultBeansPerVatCreation, + xsnapComputron: c2b, + }; + + /** @type {ReturnType | undefined} */ + let policy; + let policyEnabled = false; + + const meter = harden({ + provideRunPolicy: () => { + if (policyEnabled && !policy) { + policy = computronCounter({ beansPerUnit }); + } + return policy; + }, + /** @param {boolean} forceEnabled */ + useRunPolicy: forceEnabled => { + policyEnabled = forceEnabled; + if (!policyEnabled) { + policy = undefined; + } + }, + totalComputronCount: () => (policy?.totalBeans() || 0n) / c2b, + resetRunPolicy: () => (policy = undefined), + }); + return meter; +}; + +/** + * + * @param {string} mt + * @returns {asserts mt is ManagerType} + */ +export function insistManagerType(mt) { + assert(['local', 'node-subprocess', 'xsnap', 'xs-worker'].includes(mt)); +} diff --git a/packages/builders/package.json b/packages/builders/package.json index d019dd426ae..16b4f080390 100644 --- a/packages/builders/package.json +++ b/packages/builders/package.json @@ -24,23 +24,26 @@ "license": "Apache-2.0", "dependencies": { "@agoric/ertp": "^0.16.3-u18.0", + "@agoric/fast-usdc": "0.1.1-u18.5", "@agoric/internal": "^0.4.0-u18.0", "@agoric/notifier": "^0.7.0-u18.0", "@agoric/smart-wallet": "^0.5.4-u18.4", "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/vats": "^0.16.0-u18.4", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/promise-kit": "^1.1.7", - "@endo/stream": "^1.2.7", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", + "@endo/stream": "^1.2.8", "import-meta-resolve": "^2.2.1" }, "devDependencies": { + "@endo/errors": "^1.2.8", "@agoric/deploy-script-support": "^0.10.4-u18.4", "@agoric/governance": "^0.10.4-u18.0", "@agoric/inter-protocol": "^0.17.0-u18.5", @@ -49,9 +52,8 @@ "@agoric/swing-store": "^0.10.0-u18.0", "@agoric/swingset-liveslots": "^0.10.3-u18.0", "@agoric/time": "^0.3.3-u18.0", - "@endo/errors": "^1.2.7", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "CHANGELOG.md", @@ -79,6 +81,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 82.43 + "atLeast": 90.93 } } diff --git a/packages/builders/scripts/fast-usdc/fast-usdc-update.build.js b/packages/builders/scripts/fast-usdc/fast-usdc-update.build.js new file mode 100644 index 00000000000..21a1e6a0573 --- /dev/null +++ b/packages/builders/scripts/fast-usdc/fast-usdc-update.build.js @@ -0,0 +1,61 @@ +import { parseArgs } from 'node:util'; +import { getManifestForUpdateFastUsdcPolicy } from '@agoric/fast-usdc/src/fast-usdc-policy.core.js'; +import { toExternalConfig } from '@agoric/fast-usdc/src/utils/config-marshal.js'; +import { FeedPolicyShape } from '@agoric/fast-usdc/src/type-guards.js'; +import { makeHelpers } from '@agoric/deploy-script-support'; + +/** + * @import {CoreEvalBuilder, DeployScriptFunction} from '@agoric/deploy-script-support/src/externalTypes.js' + * @import {ParseArgsConfig} from 'node:util' + * @import {FastUSDCConfig} from '@agoric/fast-usdc/src/types.js' + */ + +/** @type {ParseArgsConfig['options']} */ +const options = { + feedPolicy: { type: 'string' }, +}; +const feedPolicyUsage = 'use --feedPolicy ...'; + +/** + * @typedef {{ + * feedPolicy?: string; + * }} FastUSDCUpdateOpts + */ + +/** @type {CoreEvalBuilder} */ +export const updateProposalBuilder = async ( + _utils, + /** @type {FastUSDCConfig} */ config, +) => { + return harden({ + sourceSpec: '@agoric/fast-usdc/src/fast-usdc-policy.core.js', + /** @type {[string, Parameters[1]]} */ + getManifestCall: [ + getManifestForUpdateFastUsdcPolicy.name, + { + options: toExternalConfig( + config, + {}, + harden({ feedPolicy: FeedPolicyShape }), + ), + }, + ], + }); +}; + +/** @type {DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + const { + values: { feedPolicy }, + } = parseArgs({ args: endowments.scriptArgs, options }); + + const parseFeedPolicy = () => { + if (typeof feedPolicy !== 'string') throw Error(feedPolicyUsage); + return JSON.parse(feedPolicy); + }; + const config = harden({ feedPolicy: parseFeedPolicy() }); + await writeCoreEval('eval-fast-usdc-policy-update', utils => + updateProposalBuilder(utils, config), + ); +}; diff --git a/packages/builders/scripts/fast-usdc/init-fast-usdc.js b/packages/builders/scripts/fast-usdc/init-fast-usdc.js new file mode 100644 index 00000000000..fade01cea83 --- /dev/null +++ b/packages/builders/scripts/fast-usdc/init-fast-usdc.js @@ -0,0 +1,197 @@ +// @ts-check +import { makeHelpers } from '@agoric/deploy-script-support'; +import { AmountMath } from '@agoric/ertp'; +import { + FastUSDCConfigShape, + getManifestForFastUSDC, +} from '@agoric/fast-usdc/src/fast-usdc.start.js'; +import { toExternalConfig } from '@agoric/fast-usdc/src/utils/config-marshal.js'; +import { configurations } from '@agoric/fast-usdc/src/utils/deploy-config.js'; +import { + multiplyBy, + parseRatio, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import { Far } from '@endo/far'; +import { parseArgs } from 'node:util'; + +/** + * @import {CoreEvalBuilder, DeployScriptFunction} from '@agoric/deploy-script-support/src/externalTypes.js' + * @import {ParseArgsConfig} from 'node:util' + * @import {FastUSDCConfig} from '@agoric/fast-usdc/src/types.js' + */ + +const { keys } = Object; + +/** @type {ParseArgsConfig['options']} */ +const options = { + flatFee: { type: 'string', default: '0.01' }, + variableRate: { type: 'string', default: '0.01' }, + maxVariableFee: { type: 'string', default: '5' }, + contractRate: { type: 'string', default: '0.2' }, + net: { type: 'string' }, + oracle: { type: 'string', multiple: true }, + feedPolicy: { type: 'string' }, + usdcDenom: { + type: 'string', + default: + 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + }, + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, + noNoble: { type: 'boolean', default: false }, +}; +const oraclesUsage = 'use --oracle name:address ...'; + +const feedPolicyUsage = 'use --feedPolicy ...'; + +const chainInfoUsage = 'use --chainInfo {chainName:CosmosChainInfo, ...}'; +const assetInfoUsage = + 'use --assetInfo { denom:DenomInfo & {brandKey?: string} ... }'; + +/** + * @typedef {{ + * flatFee: string; + * variableRate: string; + * maxVariableFee: string; + * contractRate: string; + * net?: string; + * oracle?: string[]; + * usdcDenom: string; + * feedPolicy?: string; + * chainInfo?: string; + * assetInfo?: string; + * noNoble: boolean; + * }} FastUSDCOpts + */ + +const crossVatContext = /** @type {const} */ ({ + /** @type {Brand<'nat'>} */ + USDC: Far('USDC Brand'), +}); +const { USDC } = crossVatContext; +const USDC_DECIMALS = 6; +const unit = AmountMath.make(USDC, 10n ** BigInt(USDC_DECIMALS)); + +/** @type {CoreEvalBuilder} */ +export const defaultProposalBuilder = async ( + { publishRef, install }, + /** @type {FastUSDCConfig} */ config, +) => { + return harden({ + sourceSpec: '@agoric/fast-usdc/src/fast-usdc.start.js', + /** @type {[string, Parameters[1]]} */ + getManifestCall: [ + getManifestForFastUSDC.name, + { + options: toExternalConfig(config, crossVatContext, FastUSDCConfigShape), + installKeys: { + fastUsdc: publishRef( + install('@agoric/fast-usdc/src/fast-usdc.contract.js'), + ), + }, + }, + ], + }); +}; + +/** @type {DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + const { scriptArgs } = endowments; + + /** @type {{ values: FastUSDCOpts }} */ + // @ts-expect-error ensured by options + const { + values: { + oracle: oracleArgs, + net, + usdcDenom, + feedPolicy, + chainInfo, + assetInfo, + noNoble, + ...fees + }, + } = parseArgs({ args: scriptArgs, options }); + + const parseFeedPolicy = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].feedPolicy; + } + if (!feedPolicy) throw Error(feedPolicyUsage); + return JSON.parse(feedPolicy); + }; + + const parseOracleArgs = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].oracles; + } + if (!oracleArgs) throw Error(oraclesUsage); + return Object.fromEntries( + oracleArgs.map(arg => { + const result = arg.match(/(?[^:]+):(?
.+)/); + if (!(result && result.groups)) throw Error(oraclesUsage); + const { name, address } = result.groups; + return [name, address]; + }), + ); + }; + + /** @param {string} numeral */ + const toAmount = numeral => multiplyBy(unit, parseRatio(numeral, USDC)); + /** @param {string} numeral */ + const toRatio = numeral => parseRatio(numeral, USDC); + const parseFeeConfigArgs = () => { + const { flatFee, variableRate, maxVariableFee, contractRate } = fees; + return { + flat: toAmount(flatFee), + variableRate: toRatio(variableRate), + maxVariable: toAmount(maxVariableFee), + contractRate: toRatio(contractRate), + }; + }; + + const parseChainInfo = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].chainInfo; + } + if (!chainInfo) throw Error(chainInfoUsage); + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].assetInfo; + } + if (!assetInfo) throw Error(assetInfoUsage); + return JSON.parse(assetInfo); + }; + + /** @type {FastUSDCConfig} */ + const config = harden({ + oracles: parseOracleArgs(), + terms: { + usdcDenom, + }, + feeConfig: parseFeeConfigArgs(), + feedPolicy: parseFeedPolicy(), + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), + noNoble, + }); + + await writeCoreEval('start-fast-usdc', utils => + defaultProposalBuilder(utils, config), + ); +}; diff --git a/packages/builders/scripts/inter-protocol/replace-feeDistributor.js b/packages/builders/scripts/inter-protocol/replace-feeDistributor.js new file mode 100644 index 00000000000..60f0f5f3e6b --- /dev/null +++ b/packages/builders/scripts/inter-protocol/replace-feeDistributor.js @@ -0,0 +1,28 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForReplaceFeeDistributor } from '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js'; +import { SECONDS_PER_HOUR } from '@agoric/inter-protocol/src/proposals/econ-behaviors.js'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async (_, opts) => { + console.log('feeDist OPTS', opts); + return harden({ + sourceSpec: + '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js', + getManifestCall: [getManifestForReplaceFeeDistributor.name, { ...opts }], + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval('replace-feeDistributor', utils => + defaultProposalBuilder(utils, { + collectionInterval: 1n * SECONDS_PER_HOUR, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }), + ); +}; diff --git a/packages/builders/scripts/orchestration/init-basic-flows.js b/packages/builders/scripts/orchestration/init-basic-flows.js index ab2de229cf3..430df76140a 100644 --- a/packages/builders/scripts/orchestration/init-basic-flows.js +++ b/packages/builders/scripts/orchestration/init-basic-flows.js @@ -1,8 +1,22 @@ import { makeHelpers } from '@agoric/deploy-script-support'; import { startBasicFlows } from '@agoric/orchestration/src/proposals/start-basic-flows.js'; +import { parseArgs } from 'node:util'; + +/** + * @import {ParseArgsConfig} from 'node:util' + */ + +/** @type {ParseArgsConfig['options']} */ +const parserOpts = { + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, +}; /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ -export const defaultProposalBuilder = async ({ publishRef, install }) => { +export const defaultProposalBuilder = async ( + { publishRef, install }, + options, +) => { return harden({ sourceSpec: '@agoric/orchestration/src/proposals/start-basic-flows.js', getManifestCall: [ @@ -15,6 +29,7 @@ export const defaultProposalBuilder = async ({ publishRef, install }) => { ), ), }, + options, }, ], }); @@ -22,6 +37,31 @@ export const defaultProposalBuilder = async ({ publishRef, install }) => { /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + + const { + values: { chainInfo, assetInfo }, + } = parseArgs({ + args: scriptArgs, + options: parserOpts, + }); + + const parseChainInfo = () => { + if (typeof chainInfo !== 'string') return undefined; + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (typeof assetInfo !== 'string') return undefined; + return JSON.parse(assetInfo); + }; + const opts = harden({ + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), + }); + const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(startBasicFlows.name, defaultProposalBuilder); + + await writeCoreEval(startBasicFlows.name, utils => + defaultProposalBuilder(utils, opts), + ); }; diff --git a/packages/builders/scripts/testing/add-USD-LEMONS.js b/packages/builders/scripts/testing/add-USD-LEMONS.js new file mode 100644 index 00000000000..ed548b5561c --- /dev/null +++ b/packages/builders/scripts/testing/add-USD-LEMONS.js @@ -0,0 +1,19 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { psmProposalBuilder } from '../inter-protocol/add-collateral-core.js'; + +const addUsdLemonsProposalBuilder = async powers => { + return psmProposalBuilder(powers, { + anchorOptions: { + denom: 'ibc/000C0AAAEECAFE000', + keyword: 'USD_LEMONS', + decimalPlaces: 6, + proposedName: 'USD_LEMONS', + }, + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('add-LEMONS-PSM', addUsdLemonsProposalBuilder); +}; diff --git a/packages/builders/scripts/testing/add-USD-OLIVES.js b/packages/builders/scripts/testing/add-USD-OLIVES.js new file mode 100644 index 00000000000..679bb24fc6f --- /dev/null +++ b/packages/builders/scripts/testing/add-USD-OLIVES.js @@ -0,0 +1,19 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { psmProposalBuilder } from '../inter-protocol/add-collateral-core.js'; + +const addUsdOlivesProposalBuilder = async powers => { + return psmProposalBuilder(powers, { + anchorOptions: { + denom: 'ibc/000C0AAAEECAFE111', + keyword: 'USD_OLIVES', + decimalPlaces: 6, + proposedName: 'USD_OLIVES', + }, + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('add-OLIVES-PSM', addUsdOlivesProposalBuilder); +}; diff --git a/packages/builders/scripts/testing/init-auto-stake-it.js b/packages/builders/scripts/testing/init-auto-stake-it.js new file mode 100644 index 00000000000..8c5a515b8ee --- /dev/null +++ b/packages/builders/scripts/testing/init-auto-stake-it.js @@ -0,0 +1,73 @@ +/** + * @file A proposal to start the auto-stake-it contract. + * + * AutoStakeIt allows users to to create an auto-forwarding address that + * transfers and stakes tokens on a remote chain when received. + */ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { startAutoStakeIt } from '@agoric/orchestration/src/proposals/start-auto-stake-it.js'; +import { parseArgs } from 'node:util'; + +/** + * @import {ParseArgsConfig} from 'node:util' + */ + +/** @type {ParseArgsConfig['options']} */ +const parserOpts = { + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ( + { publishRef, install }, + options, +) => { + return harden({ + sourceSpec: '@agoric/orchestration/src/proposals/start-auto-stake-it.js', + getManifestCall: [ + 'getManifest', + { + installKeys: { + autoAutoStakeIt: publishRef( + install( + '@agoric/orchestration/src/examples/auto-stake-it.contract.js', + ), + ), + }, + options, + }, + ], + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + + const { + values: { chainInfo, assetInfo }, + } = parseArgs({ + args: scriptArgs, + options: parserOpts, + }); + + const parseChainInfo = () => { + if (typeof chainInfo !== 'string') return undefined; + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (typeof assetInfo !== 'string') return undefined; + return JSON.parse(assetInfo); + }; + const opts = harden({ + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), + }); + + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval(startAutoStakeIt.name, utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/packages/builders/scripts/testing/init-send-anywhere.js b/packages/builders/scripts/testing/init-send-anywhere.js new file mode 100644 index 00000000000..fb953768ea2 --- /dev/null +++ b/packages/builders/scripts/testing/init-send-anywhere.js @@ -0,0 +1,67 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { + getManifest, + startSendAnywhere, +} from '@agoric/orchestration/src/proposals/start-send-anywhere.js'; +import { parseArgs } from 'node:util'; + +/** + * @import {ParseArgsConfig} from 'node:util' + */ + +/** @type {ParseArgsConfig['options']} */ +const parserOpts = { + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ( + { publishRef, install }, + options, +) => + harden({ + sourceSpec: '@agoric/orchestration/src/proposals/start-send-anywhere.js', + getManifestCall: [ + getManifest.name, + { + installationRef: publishRef( + install( + '@agoric/orchestration/src/examples/send-anywhere.contract.js', + ), + ), + options, + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + + const { + values: { chainInfo, assetInfo }, + } = parseArgs({ + args: scriptArgs, + options: parserOpts, + }); + + const parseChainInfo = () => { + if (typeof chainInfo !== 'string') return undefined; + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (typeof assetInfo !== 'string') return undefined; + return JSON.parse(assetInfo); + }; + const opts = harden({ + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), + }); + + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval(startSendAnywhere.name, utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/packages/builders/scripts/testing/publish-test-info.js b/packages/builders/scripts/testing/publish-test-info.js new file mode 100644 index 00000000000..b5798688727 --- /dev/null +++ b/packages/builders/scripts/testing/publish-test-info.js @@ -0,0 +1,79 @@ +import { makeTracer } from '@agoric/internal'; +import { E, Far } from '@endo/far'; +import { makeMarshal } from '@endo/marshal'; + +const trace = makeTracer('PublishTestInfo'); +const { Fail } = assert; + +/** + * @param {BootstrapPowers} powers + */ +export const publishTestInfo = async powers => { + const { + consume: { agoricNamesAdmin, chainStorage: chainStorageP }, + } = powers; + + const chainStorage = await chainStorageP; + if (!chainStorage) { + trace('no chain storage, not registering chain info'); + return; + } + + trace('publishing testInfo'); + const agoricNamesNode = E(chainStorage).makeChildNode('agoricNames'); + const testInfoNode = E(agoricNamesNode).makeChildNode('testInfo'); + const { nameAdmin } = await E(agoricNamesAdmin).provideChild('testInfo'); + + trace('registering onUpdate...'); + await E(nameAdmin).onUpdate( + Far('chain info writer', { + write(entries) { + const marshalData = makeMarshal(_val => Fail`data only`); + const value = JSON.stringify(marshalData.toCapData(entries)); + void E(testInfoNode) + .setValue(value) + .catch(() => + console.log('cannot update vstorage after write to testInfo'), + ); + }, + }), + ); + + trace('writing to testInfo...'); + await E(nameAdmin).update('agoric', { + isAwesome: 'yes', + tech: ['HardenedJs', 'Orchestration', 'Async_Execution'], + }); + + trace('Done.'); +}; + +export const getManifestForPublishTestInfo = () => { + return { + manifest: { + [publishTestInfo.name]: { + consume: { + agoricNamesAdmin: true, + chainStorage: true, + }, + }, + }, + }; +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async () => + harden({ + // Somewhat unorthodox, source the exports from this builder module + sourceSpec: '@agoric/builders/scripts/testing/publish-test-info.js', + getManifestCall: ['getManifestForPublishTestInfo'], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + // import dynamically so the module can work in CoreEval environment + const dspModule = await import('@agoric/deploy-script-support'); + const { makeHelpers } = dspModule; + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('publish-test-info', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/testing/recorded-retired-instances.js b/packages/builders/scripts/testing/recorded-retired-instances.js index 2dae21fd4af..1f37e892a0d 100644 --- a/packages/builders/scripts/testing/recorded-retired-instances.js +++ b/packages/builders/scripts/testing/recorded-retired-instances.js @@ -33,9 +33,18 @@ export const testRecordedRetiredInstances = async ({ ); assert(committeeIDs); assert(committeeIDs.length === 1); + trace('found committeeIDs', committeeIDs); + const committeeInstance = retiredContractInstances.get(committeeIDs[0]); assert(await E(contractKits).get(committeeInstance)); + const charterIDs = [...retiredContractInstances.keys()].filter(k => + k.startsWith('econCommitteeCharter'), + ); + assert(charterIDs); + assert(charterIDs.length === 1); + trace('found charterID', charterIDs); + trace('done'); }; harden(testRecordedRetiredInstances); diff --git a/packages/builders/scripts/testing/register-interchain-bank-assets.js b/packages/builders/scripts/testing/register-interchain-bank-assets.js new file mode 100644 index 00000000000..dc99315c52b --- /dev/null +++ b/packages/builders/scripts/testing/register-interchain-bank-assets.js @@ -0,0 +1,199 @@ +/** + * @file register-interchain-bank-assets.js Core Eval + * + * Used to populate vbank in testing environments. + */ +import { AssetKind } from '@agoric/ertp'; +import { makeTracer } from '@agoric/internal'; +import { E } from '@endo/far'; +import { makeMarshal } from '@endo/marshal'; + +const { Fail } = assert; + +const trace = makeTracer('RegisterInterchainBankAssets', true); + +/** @import {Board} from '@agoric/vats'; */ + +/** + * @typedef {object} InterchainAssetOptions + * @property {string} denom + * @property {number} decimalPlaces + * @property {string} issuerName + * @property {string} keyword - defaults to `issuerName` if not provided + * @property {string} [proposedName] - defaults to `issuerName` if not provided + */ + +// vstorage paths under published.* +const BOARD_AUX = 'boardAux'; + +const marshalData = makeMarshal(_val => Fail`data only`); + +/** + * Make a storage node for auxiliary data for a value on the board. + * + * @param {ERef} chainStorage + * @param {string} boardId + */ +const makeBoardAuxNode = async (chainStorage, boardId) => { + const boardAux = E(chainStorage).makeChildNode(BOARD_AUX); + return E(boardAux).makeChildNode(boardId); +}; + +/** + * see `publishAgoricBrandsDisplayInfo` {@link @agoric/smart-wallet/proposals/upgrade-walletFactory-proposal.js} + * + * @param {ERef} chainStorage + * @param {ERef} board + * @param {Brand<'nat'>} brand + */ +const publishBrandInfo = async (chainStorage, board, brand) => { + const [boardId, displayInfo, allegedName] = await Promise.all([ + E(board).getId(brand), + E(brand).getDisplayInfo(), + E(brand).getAllegedName(), + ]); + const node = makeBoardAuxNode(chainStorage, boardId); + const aux = marshalData.toCapData(harden({ allegedName, displayInfo })); + await E(node).setValue(JSON.stringify(aux)); +}; + +/** + * @param {BootstrapPowers} powers + * @param {object} config + * @param {object} config.options + * @param {InterchainAssetOptions[]} config.options.assets + */ +export const publishInterchainAssets = async ( + { + consume: { + agoricNamesAdmin, + bankManager, + board, + chainStorage, + startUpgradable, + }, + brand: { produce: produceBrands }, + issuer: { produce: produceIssuers }, + installation: { + consume: { mintHolder }, + }, + }, + { options: { assets } }, +) => { + trace(`${publishInterchainAssets.name} starting...`); + trace(assets); + await null; + for (const interchainAssetOptions of assets) { + const { + denom, + decimalPlaces, + issuerName, + keyword = issuerName, + proposedName = issuerName, + } = interchainAssetOptions; + + trace('interchainAssetOptions', { + denom, + decimalPlaces, + issuerName, + keyword, + proposedName, + }); + + assert.typeof(denom, 'string'); + assert.typeof(decimalPlaces, 'number'); + assert.typeof(keyword, 'string'); + assert.typeof(issuerName, 'string'); + assert.typeof(proposedName, 'string'); + + const terms = { + keyword: issuerName, // "keyword" is a misnomer in mintHolder terms + assetKind: AssetKind.NAT, + displayInfo: { + decimalPlaces, + assetKind: AssetKind.NAT, + }, + }; + const { creatorFacet: mint, publicFacet: issuer } = await E( + startUpgradable, + )({ + installation: mintHolder, + label: issuerName, + privateArgs: undefined, + terms, + }); + + const brand = await E(issuer).getBrand(); + const kit = /** @type {IssuerKit<'nat'>} */ ({ mint, issuer, brand }); + + /** + * `addAssetToVault.js` will register the issuer with the `reserveKit`, + * but we don't need to do that here. + */ + + await Promise.all([ + E(E(agoricNamesAdmin).lookupAdmin('issuer')).update(issuerName, issuer), + E(E(agoricNamesAdmin).lookupAdmin('brand')).update(issuerName, brand), + // triggers benign UnhandledPromiseRejection 'Error: keyword "ATOM" must + // be unique' in provisionPool in testing environments + E(bankManager).addAsset(denom, issuerName, proposedName, kit), + ]); + + // publish brands and issuers to Bootstrap space for use in proposals + produceBrands[keyword].reset(); + produceIssuers[keyword].reset(); + produceBrands[keyword].resolve(brand); + produceIssuers[keyword].resolve(issuer); + + // publish brand info / boardAux for offer legibility + await publishBrandInfo( + // @ts-expect-error 'Promise' is not assignable to + // parameter of type 'ERef' + chainStorage, + board, + brand, + ); + } + trace(`${publishInterchainAssets.name} complete`); +}; + +/** + * @param {unknown} _powers + * @param {{ assets: InterchainAssetOptions[] }} options + */ +export const getManifestCall = (_powers, options) => { + /** @type {Record} */ + const IssuerKws = options.assets.reduce( + /** + * @param {Record} acc + * @param {InterchainAssetOptions} assetOptions + */ + (acc, { issuerName }) => Object.assign(acc, { [issuerName]: true }), + {}, + ); + harden(IssuerKws); + + return { + manifest: { + [publishInterchainAssets.name]: { + consume: { + agoricNamesAdmin: true, + bankManager: true, + board: true, + chainStorage: true, + startUpgradable: true, + }, + brand: { + produce: IssuerKws, + }, + issuer: { + produce: IssuerKws, + }, + installation: { + consume: { mintHolder: true }, + }, + }, + }, + options, + }; +}; diff --git a/packages/builders/scripts/testing/replace-feeDistributor-short.js b/packages/builders/scripts/testing/replace-feeDistributor-short.js new file mode 100644 index 00000000000..2cad2cca9ad --- /dev/null +++ b/packages/builders/scripts/testing/replace-feeDistributor-short.js @@ -0,0 +1,33 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForReplaceFeeDistributor } from '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js'; + +/** + * @file + * a Variant of ../inter-protocol/replace-feeDistributor.js that shortens the + * collectionInterval for testing + */ + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async (_, opts) => { + console.log('feeDist OPTS', opts); + return harden({ + sourceSpec: + '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js', + getManifestCall: [getManifestForReplaceFeeDistributor.name, { ...opts }], + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval('replace-feeDistributor-testing', utils => + defaultProposalBuilder(utils, { + collectionInterval: 30n, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }), + ); +}; diff --git a/packages/builders/scripts/testing/start-buggy-sendAnywhere.js b/packages/builders/scripts/testing/start-buggy-sendAnywhere.js deleted file mode 100644 index 6f5ac66ee1d..00000000000 --- a/packages/builders/scripts/testing/start-buggy-sendAnywhere.js +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @file This is for use in tests in a3p-integration - * Unlike most builder scripts, this one includes the proposal exports as well. - */ -import { - deeplyFulfilledObject, - makeTracer, - NonNullish, -} from '@agoric/internal'; -import { E, Far } from '@endo/far'; - -/// -/** - * @import {Installation} from '@agoric/zoe/src/zoeService/utils.js'; - */ - -const trace = makeTracer('StartBuggySA', true); - -/** - * @import {start as StartFn} from '@agoric/orchestration/src/examples/send-anywhere.contract.js'; - */ - -/** - * @param {BootstrapPowers & { - * installation: { - * consume: { - * sendAnywhere: Installation; - * }; - * }; - * }} powers - */ -export const startSendAnywhere = async ({ - consume: { - agoricNames, - board, - chainStorage, - chainTimerService, - cosmosInterchainService, - localchain, - startUpgradable, - }, - installation: { - consume: { sendAnywhere }, - }, - instance: { - // @ts-expect-error unknown instance - produce: { sendAnywhere: produceInstance }, - }, -}) => { - trace(startSendAnywhere.name); - - const marshaller = await E(board).getReadonlyMarshaller(); - - const privateArgs = await deeplyFulfilledObject( - harden({ - agoricNames, - localchain, - marshaller, - orchestrationService: cosmosInterchainService, - storageNode: E(NonNullish(await chainStorage)).makeChildNode( - 'sendAnywhere', - ), - timerService: chainTimerService, - }), - ); - - /** @type {import('@agoric/vats').NameHub} */ - // @ts-expect-error intentional fake - const agoricNamesHangs = Far('agoricNames that hangs', { - lookup: async () => { - trace('agoricNames.lookup being called that will never resolve'); - // BUG: this never resolves - return new Promise(() => {}); - }, - }); - - const { instance } = await E(startUpgradable)({ - label: 'sendAnywhere', - installation: sendAnywhere, - privateArgs: { - ...privateArgs, - agoricNames: agoricNamesHangs, - }, - }); - produceInstance.resolve(instance); - trace('done'); -}; -harden(startSendAnywhere); - -export const getManifestForValueVow = ({ restoreRef }, { sendAnywhereRef }) => { - trace('sendAnywhereRef', sendAnywhereRef); - return { - manifest: { - [startSendAnywhere.name]: { - consume: { - agoricNames: true, - board: true, - chainStorage: true, - chainTimerService: true, - cosmosInterchainService: true, - localchain: true, - - startUpgradable: true, - }, - installation: { - consume: { sendAnywhere: true }, - }, - instance: { - produce: { sendAnywhere: true }, - }, - }, - }, - installations: { - sendAnywhere: restoreRef(sendAnywhereRef), - }, - }; -}; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ -export const defaultProposalBuilder = async ({ publishRef, install }) => - harden({ - // Somewhat unorthodox, source the exports from this builder module - sourceSpec: '@agoric/builders/scripts/testing/start-buggy-sendAnywhere.js', - getManifestCall: [ - 'getManifestForValueVow', - { - sendAnywhereRef: publishRef( - install( - '@agoric/orchestration/src/examples/send-anywhere.contract.js', - ), - ), - }, - ], - }); - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ -export default async (homeP, endowments) => { - // import dynamically so the module can work in CoreEval environment - const dspModule = await import('@agoric/deploy-script-support'); - const { makeHelpers } = dspModule; - const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(startSendAnywhere.name, defaultProposalBuilder); -}; diff --git a/packages/builders/scripts/testing/test-upgraded-board.js b/packages/builders/scripts/testing/test-upgraded-board.js new file mode 100644 index 00000000000..28d90d2346d --- /dev/null +++ b/packages/builders/scripts/testing/test-upgraded-board.js @@ -0,0 +1,15 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForTestUpgradedBoard } from '@agoric/vats/src/proposals/testUpgradedBoard.js'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async () => + harden({ + sourceSpec: '@agoric/vats/src/proposals/testUpgradedBoard.js', + getManifestCall: [getManifestForTestUpgradedBoard.name], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('testUpgradedBoard', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/testing/fix-buggy-sendAnywhere.js b/packages/builders/scripts/testing/upgrade-send-anywhere.js similarity index 81% rename from packages/builders/scripts/testing/fix-buggy-sendAnywhere.js rename to packages/builders/scripts/testing/upgrade-send-anywhere.js index 8daa2dbf516..4acfaf5f8ad 100644 --- a/packages/builders/scripts/testing/fix-buggy-sendAnywhere.js +++ b/packages/builders/scripts/testing/upgrade-send-anywhere.js @@ -7,14 +7,14 @@ import { makeTracer, NonNullish, } from '@agoric/internal'; -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; /// /** * @import {Installation, Instance} from '@agoric/zoe/src/zoeService/utils.js'; */ -const trace = makeTracer('FixBuggySA', true); +const trace = makeTracer('UpgradeSA', true); /** * @import {start as StartFn} from '@agoric/orchestration/src/examples/send-anywhere.contract.js'; @@ -30,7 +30,7 @@ const trace = makeTracer('FixBuggySA', true); * }} powers * @param {...any} rest */ -export const fixSendAnywhere = async ( +export const upgradeSendAnywhere = async ( { consume: { agoricNames, @@ -45,7 +45,7 @@ export const fixSendAnywhere = async ( }, { options: { sendAnywhereRef } }, ) => { - trace(fixSendAnywhere.name); + trace(upgradeSendAnywhere.name); const saInstance = await instances.consume.sendAnywhere; trace('saInstance', saInstance); @@ -53,28 +53,24 @@ export const fixSendAnywhere = async ( const marshaller = await E(board).getReadonlyMarshaller(); - // This apparently pointless wrapper is to maintain structural parity - // with the buggy core-eval's wrapper to make lookup() hang. - const agoricNamesResolves = Far('agoricNames that resolves', { - lookup: async (...args) => { - return E(agoricNames).lookup(...args); - }, - }); - const privateArgs = await deeplyFulfilledObject( harden({ - agoricNames: agoricNamesResolves, + agoricNames, localchain, marshaller, orchestrationService: cosmosInterchainService, storageNode: E(NonNullish(await chainStorage)).makeChildNode( - 'sendAnywhere', + 'send-anywhere', ), timerService: chainTimerService, + // undefined so `registerKnownChainsAndAssets` does not run again + chainInfo: undefined, + assetInfo: undefined, }), ); trace('upgrading...'); + trace('ref', sendAnywhereRef); await E(saKit.adminFacet).upgradeContract( sendAnywhereRef.bundleID, privateArgs, @@ -82,13 +78,13 @@ export const fixSendAnywhere = async ( trace('done'); }; -harden(fixSendAnywhere); +harden(upgradeSendAnywhere); export const getManifestForValueVow = ({ restoreRef }, { sendAnywhereRef }) => { console.log('sendAnywhereRef', sendAnywhereRef); return { manifest: { - [fixSendAnywhere.name]: { + [upgradeSendAnywhere.name]: { consume: { agoricNames: true, board: true, @@ -120,7 +116,7 @@ export const getManifestForValueVow = ({ restoreRef }, { sendAnywhereRef }) => { export const defaultProposalBuilder = async ({ publishRef, install }) => harden({ // Somewhat unorthodox, source the exports from this builder module - sourceSpec: '@agoric/builders/scripts/testing/fix-buggy-sendAnywhere.js', + sourceSpec: '@agoric/builders/scripts/testing/upgrade-send-anywhere.js', getManifestCall: [ 'getManifestForValueVow', { @@ -139,5 +135,5 @@ export default async (homeP, endowments) => { const dspModule = await import('@agoric/deploy-script-support'); const { makeHelpers } = dspModule; const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(fixSendAnywhere.name, defaultProposalBuilder); + await writeCoreEval(upgradeSendAnywhere.name, defaultProposalBuilder); }; diff --git a/packages/builders/scripts/testing/upgrade-vaultFactory.js b/packages/builders/scripts/testing/upgrade-vaultFactory.js new file mode 100644 index 00000000000..fa12d22ddcc --- /dev/null +++ b/packages/builders/scripts/testing/upgrade-vaultFactory.js @@ -0,0 +1,21 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }) => + harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-vaultFactory-proposal.js', + getManifestCall: [ + 'getManifestForVaultFactoryUpgrade', + { + contractRef: publishRef( + install('@agoric/inter-protocol/src/vaultFactory/vaultFactory.js'), + ), + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('upgrade-vaults', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/vats/terminate-governor-instance.js b/packages/builders/scripts/vats/terminate-governor-instance.js new file mode 100644 index 00000000000..8712a484f64 --- /dev/null +++ b/packages/builders/scripts/vats/terminate-governor-instance.js @@ -0,0 +1,134 @@ +/** + * @file Terminate price-feed governor instances such as mainnet v110. + * Functions as both an off-chain builder and an on-chain core-eval. + */ + +/// + +import { E } from '@endo/far'; + +const SELF = '@agoric/builders/scripts/vats/terminate-governor-instance.js'; +const USAGE = `Usage: agoric run /path/to/terminate-governor-instance.js \\ + <$governorInstanceHandleBoardID:$instanceKitLabel>...`; + +const repr = val => + typeof val === 'string' || (typeof val === 'object' && val !== null) + ? JSON.stringify(val) + : String(val); +const defaultMakeError = (strings, ...subs) => + Error( + strings.map((s, i) => `${i === 0 ? '' : repr(subs[i - 1])}${s}`).join(''), + ); +const makeUsageError = (strings, ...subs) => { + const err = defaultMakeError(strings, ...subs); + console.error(err.message); + console.error(USAGE); + return err; +}; + +const rtarget = /^(?board[0-9]+):(?.+)$/; +/** + * @param {string[]} args + * @param {(strings: TemplateStringsArray | string[], ...subs: unknown[]) => Error} [makeError] + * @returns {Array<{boardID: string, instanceKitLabel: string}>} + */ +const parseTargets = (args = [], makeError = defaultMakeError) => { + if (!Array.isArray(args)) throw makeError`invalid targets: ${args}`; + /** @type {Array<{boardID: string, instanceKitLabel: string}>} */ + const targets = []; + const badTargets = []; + for (const arg of args) { + const m = typeof arg === 'string' && arg.match(rtarget); + if (!m) { + badTargets.push(arg); + } else { + // @ts-expect-error cast + targets.push(m.groups); + } + } + if (badTargets.length !== 0) { + throw makeError`malformed target(s): ${badTargets}`; + } else if (targets.length === 0) { + throw makeError`no target(s)`; + } + return targets; +}; + +/** + * @param {BootstrapPowers} powers + * @param {{ options: { targetSpecifiers: string[] } }} config + */ +export const terminateGovernors = async ( + { consume: { board, governedContractKits } }, + { options: { targetSpecifiers } }, +) => { + const { Fail, quote: q } = assert; + const targets = parseTargets(targetSpecifiers, Fail); + const doneP = Promise.allSettled( + targets.map(async ({ boardID, instanceKitLabel }) => { + const logLabel = [boardID, instanceKitLabel]; + const contractInstanceHandle = await E(board).getValue(boardID); + const instanceKit = await E(governedContractKits).get( + // @ts-expect-error TS2345 Property '[tag]' is missing + contractInstanceHandle, + ); + console.log( + `${q(logLabel)} alleged governor contract instance kit`, + instanceKit, + ); + const { label, governorAdminFacet, adminFacet } = instanceKit; + label === instanceKitLabel || + Fail`${q(logLabel)} unexpected instanceKit label, got ${label} but wanted ${q(instanceKitLabel)}`; + (adminFacet && adminFacet !== governorAdminFacet) || + Fail`${q(logLabel)} instanceKit adminFacet should have been present and different from governorAdminFacet but was ${adminFacet}`; + const reason = harden(Error(`core-eval terminating ${label} governor`)); + await E(governorAdminFacet).terminateContract(reason); + console.log(`${q(logLabel)} terminated governor`); + }), + ); + const results = await doneP; + const problems = targets.flatMap(({ boardID, instanceKitLabel }, i) => { + if (results[i].status === 'fulfilled') return []; + return [[boardID, instanceKitLabel, results[i].reason]]; + }); + if (problems.length !== 0) { + console.error('governor termination(s) failed', problems); + Fail`governor termination(s) failed: ${problems}`; + } +}; +harden(terminateGovernors); + +export const getManifest = (_powers, targetSpecifiers) => { + parseTargets(targetSpecifiers); + return { + manifest: { + [terminateGovernors.name]: { + consume: { board: true, governedContractKits: true }, + }, + }, + // Provide `terminateGovernors` a second argument like + // `{ options: { targetSpecifiers } }`. + options: { targetSpecifiers }, + }; +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async (_utils, targetSpecifiers) => { + parseTargets(targetSpecifiers); + return harden({ + sourceSpec: SELF, + getManifestCall: ['getManifest', targetSpecifiers], + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + parseTargets(scriptArgs, makeUsageError); + const dspModule = await import('@agoric/deploy-script-support'); + const { makeHelpers } = dspModule; + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval(terminateGovernors.name, utils => + defaultProposalBuilder(utils, scriptArgs), + ); +}; diff --git a/packages/builders/scripts/vats/upgrade-agoricNames.js b/packages/builders/scripts/vats/upgrade-agoricNames.js new file mode 100644 index 00000000000..80716903a06 --- /dev/null +++ b/packages/builders/scripts/vats/upgrade-agoricNames.js @@ -0,0 +1,21 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }) => + harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-agoricNames-proposal.js', + getManifestCall: [ + 'getManifestForUpgradingAgoricNames', + { + agoricNamesRef: publishRef( + install('@agoric/vats/src/vat-agoricNames.js'), + ), + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreProposal } = await makeHelpers(homeP, endowments); + await writeCoreProposal('upgrade-agoricNames', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/vats/upgrade-asset-reserve.js b/packages/builders/scripts/vats/upgrade-asset-reserve.js new file mode 100644 index 00000000000..b7d70d8e205 --- /dev/null +++ b/packages/builders/scripts/vats/upgrade-asset-reserve.js @@ -0,0 +1,21 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }) => + harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-asset-reserve-proposal.js', + getManifestCall: [ + 'getManifestForUpgradingAssetReserve', + { + assetReserveRef: publishRef( + install('@agoric/inter-protocol/src/reserve/assetReserve.js'), + ), + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreProposal } = await makeHelpers(homeP, endowments); + await writeCoreProposal('upgrade-asset-reserve', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/vats/upgrade-board.js b/packages/builders/scripts/vats/upgrade-board.js new file mode 100644 index 00000000000..b2b3070b2cd --- /dev/null +++ b/packages/builders/scripts/vats/upgrade-board.js @@ -0,0 +1,20 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForUpgradingBoard } from '@agoric/vats/src/proposals/upgrade-board-proposal.js'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }) => + harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-board-proposal.js', + getManifestCall: [ + getManifestForUpgradingBoard.name, + { + boardRef: publishRef(install('@agoric/vats/src/vat-board.js')), + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('upgrade-board', defaultProposalBuilder); +}; diff --git a/packages/builders/scripts/vats/upgrade-mintHolder.js b/packages/builders/scripts/vats/upgrade-mintHolder.js new file mode 100644 index 00000000000..18cb47854c2 --- /dev/null +++ b/packages/builders/scripts/vats/upgrade-mintHolder.js @@ -0,0 +1,126 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForUpgradingMintHolder } from '@agoric/vats/src/proposals/upgrade-mintHolder-proposal.js'; + +const configurations = { + A3P_INTEGRATION: { + labelList: [ + 'USDC_axl', + 'USDT_grv', + 'DAI_axl', + 'DAI_grv', + 'stATOM', + 'USDC_grv', + 'ATOM', + 'USDT_axl', + 'USDC', + 'BLD', + ], + }, + MAINNET: { + labelList: [ + 'USDT', + 'USDT_axl', + 'USDT_grv', + 'USDC', + 'USDC_axl', + 'USDC_grv', + 'DAI_axl', + 'DAI_grv', + 'ATOM', + 'stATOM', + 'stkATOM', + 'stTIA', + 'stOSMO', + ], + }, + DEVNET: { + labelList: [ + 'stATOM3', + 'stATOM', + 'dATOM', + 'stOSMO', + 'stkATOM', + 'stATOM2', + 'STOSMO', + 'stTIA', + 'ATOM', + 'AUSD', + 'USDT_grv', + 'USDC_axl', + 'USDC_grv', + 'USDT_axl', + 'BLD', + ], + }, + EMERYNET: { + labelList: [ + 'ATOM', + 'USDT', + 'DAI_axl', + 'DAI_grv', + 'USDC_axl', + 'stOSMO', + 'stATOM', + 'stkATOM', + 'stOSMO2', + 'ToyUSD', + 'BLD', + ], + }, +}; + +const { keys } = Object; +const knownVariants = keys(configurations); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }, opts) => { + const config = opts.config || configurations[opts.variant]; + if (!config) { + const error = `Unknown variant "${opts.variant}". Expected one of ${knownVariants.join(', ')}`; + console.error(error); + throw Error(error); + } + const { labelList } = config; + + return harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-mintHolder-proposal.js', + getManifestCall: [ + getManifestForUpgradingMintHolder.name, + { + labelList, + contractRef: publishRef(install('@agoric/vats/src/mintHolder.js')), + }, + ], + }); +}; + +const Usage = `agoric run upgrade-mintHolder.js ${[...knownVariants, ''].join(' | ')}`; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + const variantOrConfig = scriptArgs?.[0]; + console.log('upgrade-mintHolder', variantOrConfig); + + const opts = {}; + + if (typeof variantOrConfig === 'string') { + if (variantOrConfig[0] === '{') { + try { + opts.config = JSON.parse(variantOrConfig); + } catch (err) { + throw Error(`Failed to parse config argument ${variantOrConfig}`); + } + } else { + opts.variant = variantOrConfig; + } + } else { + console.error(Usage); + throw Error(Usage); + } + + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval(`upgrade-mintHolder`, utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/packages/builders/scripts/vats/upgrade-orch-core.js b/packages/builders/scripts/vats/upgrade-orchestration.js similarity index 79% rename from packages/builders/scripts/vats/upgrade-orch-core.js rename to packages/builders/scripts/vats/upgrade-orchestration.js index 47a0a6d437d..30225270932 100644 --- a/packages/builders/scripts/vats/upgrade-orch-core.js +++ b/packages/builders/scripts/vats/upgrade-orchestration.js @@ -3,15 +3,18 @@ import { makeHelpers } from '@agoric/deploy-script-support'; /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ export const defaultProposalBuilder = async ({ publishRef, install }) => harden({ - sourceSpec: '@agoric/vats/src/proposals/upgrade-orch-core-proposal.js', + sourceSpec: '@agoric/vats/src/proposals/upgrade-vats-generic-proposal.js', getManifestCall: [ - 'getManifestForUpgradingOrchCore', + 'getManifestForUpgradingVats', { bundleRefs: { ibc: publishRef(install('@agoric/vats/src/vat-ibc.js')), network: publishRef(install('@agoric/vats/src/vat-network.js')), localchain: publishRef(install('@agoric/vats/src/vat-localchain.js')), transfer: publishRef(install('@agoric/vats/src/vat-transfer.js')), + orchestration: publishRef( + install('@agoric/orchestration/src/vat-orchestration.js'), + ), }, }, ], diff --git a/packages/builders/scripts/vats/upgrade-paRegistry.js b/packages/builders/scripts/vats/upgrade-paRegistry.js new file mode 100644 index 00000000000..9f353134a77 --- /dev/null +++ b/packages/builders/scripts/vats/upgrade-paRegistry.js @@ -0,0 +1,21 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ({ publishRef, install }) => + harden({ + sourceSpec: '@agoric/vats/src/proposals/upgrade-paRegistry-proposal.js', + getManifestCall: [ + 'getManifestForUpgradingRegistry', + { + registryRef: publishRef( + install('@agoric/vats/src/vat-priceAuthority.js'), + ), + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('upgrade-paRegistry', defaultProposalBuilder); +}; diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index 386f751d75c..3639fcb2066 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -25,7 +25,7 @@ Generated by [AVA](https://avajs.dev). denom: Object @match:string { payload: [], }, - value: Object @match:bigint { + value: Object @match:nat { payload: [], }, }, @@ -85,6 +85,14 @@ Generated by [AVA](https://avajs.dev). }, ], }, + CoinShape: { + amount: Object @match:string { + payload: [], + }, + denom: Object @match:string { + payload: [], + }, + }, CosmosAssetInfoShape: Object @match:splitRecord { payload: [ { @@ -127,6 +135,9 @@ Generated by [AVA](https://avajs.dev). }, }, { + bech32Prefix: Object @match:string { + payload: [], + }, connections: Object @match:recordOf { payload: [ Object @match:any { @@ -140,6 +151,9 @@ Generated by [AVA](https://avajs.dev). icqEnabled: Object @match:kind { payload: 'boolean', }, + pfmEnabled: Object @match:kind { + payload: 'boolean', + }, stakingTokens: Object @match:arrayOf { payload: [ { @@ -171,7 +185,7 @@ Generated by [AVA](https://avajs.dev). denom: Object @match:string { payload: [], }, - value: Object @match:bigint { + value: Object @match:nat { payload: [], }, }, @@ -208,10 +222,32 @@ Generated by [AVA](https://avajs.dev). denom: Object @match:string { payload: [], }, - value: Object @match:bigint { + value: Object @match:nat { payload: [], }, }, + DenomDetailShape: Object @match:splitRecord { + payload: [ + { + baseDenom: Object @match:string { + payload: [], + }, + baseName: Object @match:string { + payload: [], + }, + chainName: Object @match:string { + payload: [], + }, + }, + { + brand: Object @match:remotable { + payload: { + label: 'Brand', + }, + }, + }, + ], + }, DenomInfoShape: { base: Object @match:remotable { payload: { @@ -242,6 +278,71 @@ Generated by [AVA](https://avajs.dev). DenomShape: Object @match:string { payload: [], }, + ForwardInfoShape: { + forward: Object @match:splitRecord { + payload: [ + { + channel: Object @match:string { + payload: [], + }, + port: 'transfer', + receiver: Object @match:string { + payload: [], + }, + retries: Object @match:kind { + payload: 'number', + }, + timeout: Object @match:string { + payload: [], + }, + }, + { + next: { + forward: { + channel: Object @match:string { + payload: [], + }, + port: 'transfer', + receiver: Object @match:string { + payload: [], + }, + retries: Object @match:kind { + payload: 'number', + }, + timeout: Object @match:string { + payload: [], + }, + }, + }, + }, + ], + }, + }, + ForwardOptsShape: Object @match:splitRecord { + payload: [ + {}, + { + intermediateRecipient: { + chainId: Object @match:string { + payload: [], + }, + encoding: Object @match:string { + payload: [], + }, + value: Object @match:string { + payload: [], + }, + }, + retries: Object @match:kind { + payload: 'number', + }, + timeout: Object @match:string { + payload: [], + }, + }, + {}, + ], + }, IBCChannelIDShape: Object @match:string { payload: [], }, @@ -329,6 +430,31 @@ Generated by [AVA](https://avajs.dev). payload: [ {}, { + forwardOpts: Object @match:splitRecord { + payload: [ + {}, + { + intermediateRecipient: { + chainId: Object @match:string { + payload: [], + }, + encoding: Object @match:string { + payload: [], + }, + value: Object @match:string { + payload: [], + }, + }, + retries: Object @match:kind { + payload: 'number', + }, + timeout: Object @match:string { + payload: [], + }, + }, + {}, + ], + }, memo: Object @match:string { payload: [], }, @@ -366,6 +492,23 @@ Generated by [AVA](https://avajs.dev). }, ], }, + OrchestrationPowersShape: { + agoricNames: Object @match:kind { + payload: 'remotable', + }, + localchain: Object @match:kind { + payload: 'remotable', + }, + orchestrationService: Object @match:kind { + payload: 'remotable', + }, + storageNode: Object @match:kind { + payload: 'remotable', + }, + timerService: Object @match:kind { + payload: 'remotable', + }, + }, OutboundConnectionHandlerI: Object @guard:interfaceGuard { payload: { defaultGuards: undefined, @@ -521,7 +664,10 @@ Generated by [AVA](https://avajs.dev). }, }, }, + denomHash: Function denomHash {}, prepareChainHubAdmin: Function prepareChainHubAdmin {}, prepareCosmosInterchainService: Function prepareCosmosInterchainService {}, + registerChainsAndAssets: Function registerChainsAndAssets {}, + withChainCapabilities: Function withChainCapabilities {}, withOrchestration: Function withOrchestration {}, } diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index 1a15f9da651..dc356ca0ef5 100644 Binary files a/packages/builders/test/snapshots/orchestration-imports.test.js.snap and b/packages/builders/test/snapshots/orchestration-imports.test.js.snap differ diff --git a/packages/cache/package.json b/packages/cache/package.json index fd34d2542a7..ed0682047d4 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -23,13 +23,13 @@ "@agoric/notifier": "^0.7.0-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1" + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2" }, "devDependencies": { "@agoric/zoe": "^0.26.3-u18.0", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "publishConfig": { "access": "public" @@ -47,6 +47,6 @@ "timeout": "20m" }, "typeCoverage": { - "atLeast": 94.12 + "atLeast": 94.13 } } diff --git a/packages/casting/package.json b/packages/casting/package.json index a9cbe4cbe42..8a3a673c489 100644 --- a/packages/casting/package.json +++ b/packages/casting/package.json @@ -11,7 +11,7 @@ "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "demo": "node -e 'import(\"./test/fake-rpc-server.js\").then(ns => ns.develop())'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -29,18 +29,18 @@ "@cosmjs/proto-signing": "^0.32.3", "@cosmjs/stargate": "^0.32.3", "@cosmjs/tendermint-rpc": "^0.32.3", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/lockdown": "^1.0.12", - "@endo/marshal": "^1.6.1", - "@endo/promise-kit": "^1.1.7" + "@endo/errors": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/lockdown": "^1.0.13", + "@endo/marshal": "^1.6.2", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { "@agoric/cosmic-proto": "^0.5.0-u18.4", - "@endo/ses-ava": "^1.2.7", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "express": "^5.0.1", "ws": "^7.2.0" }, @@ -58,6 +58,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 88.9 + "atLeast": 88.99 } } diff --git a/packages/casting/src/leader.js b/packages/casting/src/leader.js index 793551326ba..eed8d9de8ca 100644 --- a/packages/casting/src/leader.js +++ b/packages/casting/src/leader.js @@ -31,7 +31,6 @@ export const makeRoundRobinLeader = (endpoints, leaderOptions = {}) => { } throw err; }, - // eslint-disable-next-line no-use-before-define watchCasting: _castingSpecP => pollingChangeFollower, /** * @template T @@ -55,10 +54,7 @@ export const makeRoundRobinLeader = (endpoints, leaderOptions = {}) => { }); } - retrying - .then(() => jitter && jitter(where)) - // eslint-disable-next-line no-use-before-define - .then(applyOne, reject); + retrying.then(() => jitter && jitter(where)).then(applyOne, reject); thisAttempt += 1; }; diff --git a/packages/casting/src/main.js b/packages/casting/src/main.js index 6b0eee6ec01..f8fa0cb2f37 100644 --- a/packages/casting/src/main.js +++ b/packages/casting/src/main.js @@ -11,3 +11,4 @@ export * from './follower-cosmjs.js'; export * from './casting-spec.js'; export * from './leader.js'; export * from './iterable.js'; +export * from './makeHttpClient.js'; diff --git a/packages/casting/src/makeHttpClient.js b/packages/casting/src/makeHttpClient.js index e6fe7c1ec7e..a8fbd77b38b 100644 --- a/packages/casting/src/makeHttpClient.js +++ b/packages/casting/src/makeHttpClient.js @@ -25,7 +25,7 @@ const filterBadStatus = res => { * @param {typeof window.fetch} fetch * @returns {import('@cosmjs/tendermint-rpc').RpcClient} */ -export const makeHttpClient = (url, fetch) => { +export const makeTendermintRpcClient = (url, fetch) => { const headers = {}; // XXX needed? // based on cosmjs 0.30.1: @@ -54,3 +54,6 @@ export const makeHttpClient = (url, fetch) => { }, }); }; + +/** @deprecated use makeTendermintRpcClient */ +export const makeHttpClient = makeTendermintRpcClient; diff --git a/packages/casting/test/interpose-net-access.test.js b/packages/casting/test/interpose-net-access.test.js index f0a0110d32d..87913ff3461 100644 --- a/packages/casting/test/interpose-net-access.test.js +++ b/packages/casting/test/interpose-net-access.test.js @@ -12,7 +12,7 @@ import { QueryChildrenResponse, } from '@agoric/cosmic-proto/vstorage/query.js'; -import { makeHttpClient } from '../src/makeHttpClient.js'; +import { makeTendermintRpcClient } from '../src/makeHttpClient.js'; import { captureIO, replayIO, web1, web2 } from './net-access-fixture.js'; /** @type {import('ava').TestFn>>} */ @@ -43,7 +43,7 @@ const scenario1 = { test('interpose net access', async t => { const fetchMock = replayIO(web1); - const rpcClient = makeHttpClient(scenario1.endpoint, fetchMock); + const rpcClient = makeTendermintRpcClient(scenario1.endpoint, fetchMock); t.log('raw JSON RPC'); const res = await rpcClient.execute({ @@ -100,7 +100,7 @@ test(`vstorage query: Children (RECORDING: ${RECORDING})`, async t => { const { fetch: fetchMock, web } = io.recording ? captureIO(io.fetch) : { fetch: replayIO(web2), web: new Map() }; - const rpcClient = makeHttpClient(scenario2.endpoint, fetchMock); + const rpcClient = makeTendermintRpcClient(scenario2.endpoint, fetchMock); const tmClient = await Tendermint34Client.create(rpcClient); const qClient = new QueryClient(tmClient); diff --git a/packages/client-utils/CHANGELOG.md b/packages/client-utils/CHANGELOG.md new file mode 100644 index 00000000000..420e6f23d0e --- /dev/null +++ b/packages/client-utils/CHANGELOG.md @@ -0,0 +1 @@ +# Change Log diff --git a/packages/client-utils/README.md b/packages/client-utils/README.md new file mode 100644 index 00000000000..8311a92d024 --- /dev/null +++ b/packages/client-utils/README.md @@ -0,0 +1,37 @@ +# Client Utils + +Utilities for building clients of an Agoric chain + +## Overview + +The Agoric chain takes mutations through signed messages and reveals state updates through vstorage. This package abstracts the calls to RPC nodes into a [CQRS](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation) interface. The commands are made mostly through an on-chain Smart Wallet and the queries through vstorage. + +## Design + +This package will be used in several kinds of clients: +- CLI (such as the `agoric` command) +- GUI (such as dapps) +- Tests (such as a3p-integration tests) + +As such the modules cannot assume they're running in Node. There are some ambient authorities in common in the above environments (e.g. `setTimeout`) but a further constraint is that these modules will not export ambient authority. Instead they will provide interfaces that are ergonomic for creating empowered objects in the client context. + +## Related packages + +### cli +`agoric` package has a command line UI (CLI) for working with an Agoric chain. It's in this repository at `packages/agoric-cli`. + +### rpc +`@agoric/rpc` is a small library that currently just has utilities for watching vstorage. This package avoids depending on `@agoric/rpc` for now because it: + - is in a separate repository ([ui-kit](https://github.com/Agoric/ui-kit/blob/main/packages/rpc)) so not part of agoric-sdk CI + - depends on `axios` and `vite` which are unnecessary constraints + +Some of the functionality in this package could make sense in that package, but for now it will be ignored. + +### cosmic-proto + +`@agoric/cosmic-proto` is a package that contains the protobuf stubs for the Agoric cosmos-sdk module. At various points it has also held generated RPC clients. Because that package is imported into contracts we've kept those out. They may end up in `@agoric/rpc` eventually. + +### * / clientSupport + +The `clientSupport.js` module of several packages. Some packages export this module with certain helpers that this package may abstract. + diff --git a/packages/client-utils/package.json b/packages/client-utils/package.json new file mode 100644 index 00000000000..2c711e815ba --- /dev/null +++ b/packages/client-utils/package.json @@ -0,0 +1,61 @@ +{ + "name": "@agoric/client-utils", + "version": "0.1.0", + "description": "Utilities for building Agoric clients", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "type": "module", + "main": "src/main.js", + "files": [ + "src" + ], + "scripts": { + "build": "exit 0", + "test": "ava", + "test:c8": "c8 --all $C8_OPTIONS ava", + "test:xs": "exit 0", + "lint-fix": "yarn lint:eslint --fix", + "lint": "run-s --continue-on-error lint:*", + "lint:types": "tsc", + "lint:eslint": "eslint ." + }, + "devDependencies": { + "ava": "^5.3.0", + "c8": "^10.1.2", + "ts-blank-space": "^0.4.4" + }, + "dependencies": { + "@agoric/casting": "^0.4.3-u18.4", + "@agoric/ertp": "^0.16.3-u18.0", + "@agoric/internal": "^0.4.0-u18.0", + "@agoric/smart-wallet": "^0.5.4-u18.4", + "@agoric/vats": "^0.16.0-u18.4", + "@cosmjs/stargate": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@endo/common": "^1.2.8", + "@endo/errors": "^1.2.8", + "@endo/marshal": "^1.6.2", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" + }, + "ava": { + "extensions": { + "js": true, + "ts": "module" + }, + "files": [ + "test/**/*.test.*" + ], + "nodeArguments": [ + "--import=ts-blank-space/register", + "--no-warnings" + ], + "require": [ + "@endo/init/legacy.js" + ], + "timeout": "20m" + } +} diff --git a/packages/client-utils/src/chain.js b/packages/client-utils/src/chain.js new file mode 100644 index 00000000000..0ac2f32c372 --- /dev/null +++ b/packages/client-utils/src/chain.js @@ -0,0 +1,39 @@ +/** + * @import {StargateClient} from '@cosmjs/stargate'; + */ + +/** + * @param {{ + * client: StargateClient, + * delay: (ms: number) => Promise, + * period?: number, + * retryMessage?: string, + * }} opts + * @returns {(l: (b: { time: string, height: number }) => Promise) => Promise} + */ +export const pollBlocks = opts => async lookup => { + const { client, delay, period = 3 * 1000 } = opts; + const { retryMessage } = opts; + + await null; // separate sync prologue + + for (;;) { + const status = await client.getBlock(); + const { + header: { time, height }, + } = status; + try { + // see await null above + const result = await lookup({ time, height }); + return result; + } catch (_err) { + console.error( + time, + retryMessage || 'not in block', + height, + 'retrying...', + ); + await delay(period); + } + } +}; diff --git a/packages/client-utils/src/cli.js b/packages/client-utils/src/cli.js new file mode 100644 index 00000000000..f59c5a31e5a --- /dev/null +++ b/packages/client-utils/src/cli.js @@ -0,0 +1,20 @@ +import { LOCAL_CONFIG_KEY, fetchNetworkConfig } from './network-config.js'; + +/** + * @import {MinimalNetworkConfig} from './network-config.js'; + */ + +/** + * Fetch the network config for the AGORIC_NET environment variable. + * + * If none is set or it's 'local', return a local chain config. + * + * @param {{ env: typeof process.env, fetch: typeof fetch }} io + * @returns {Promise} + */ + +export const fetchEnvNetworkConfig = async ({ env, fetch }) => { + const net = env.AGORIC_NET || LOCAL_CONFIG_KEY; + + return fetchNetworkConfig(net, { fetch }); +}; diff --git a/packages/client-utils/src/main.js b/packages/client-utils/src/main.js new file mode 100644 index 00000000000..decf0366b5b --- /dev/null +++ b/packages/client-utils/src/main.js @@ -0,0 +1,11 @@ +export * from './cli.js'; +export * from './network-config.js'; +export * from './rpc.js'; +export * from './smart-wallet-kit.js'; +export * from './sync-tools.js'; +export * from './vstorage.js'; +export * from './vstorage-kit.js'; +export * from './wallet-utils.js'; + +// eslint-disable-next-line import/export -- just types +export * from './types.js'; diff --git a/packages/client-utils/src/network-config.js b/packages/client-utils/src/network-config.js new file mode 100644 index 00000000000..0d56fb4aa7e --- /dev/null +++ b/packages/client-utils/src/network-config.js @@ -0,0 +1,42 @@ +/** + * @typedef {{ rpcAddrs: string[], chainName: string }} MinimalNetworkConfig + */ + +export const toNetworkConfigUrl = agoricNetSubdomain => + `https://${agoricNetSubdomain}.agoric.net/network-config`; + +export const toRpcUrl = agoricNetSubdomain => + `https://${agoricNetSubdomain}.rpc.agoric.net:443`; + +/** @satisfies {MinimalNetworkConfig} */ +export const LOCAL_CONFIG = { + rpcAddrs: ['http://0.0.0.0:26657'], + chainName: 'agoriclocal', +}; + +export const LOCAL_CONFIG_KEY = 'local'; + +/** + * Fetches the network config for the given network specifier. + * + * @param {string} spec + * @param {{ fetch: typeof fetch }} io + * @returns {Promise} + */ +export const fetchNetworkConfig = async (spec, { fetch }) => { + const [netName, chainName] = spec.split(','); + + if (netName === LOCAL_CONFIG_KEY) { + return LOCAL_CONFIG; + } + + if (chainName) { + return { chainName, rpcAddrs: [toRpcUrl(netName)] }; + } + + return fetch(toNetworkConfigUrl(netName)) + .then(res => res.json()) + .catch(err => { + throw Error(`cannot get network config (${spec}): ${err.message}`); + }); +}; diff --git a/packages/client-utils/src/rpc.js b/packages/client-utils/src/rpc.js new file mode 100644 index 00000000000..9e1bb03dafb --- /dev/null +++ b/packages/client-utils/src/rpc.js @@ -0,0 +1,31 @@ +import { makeTendermintRpcClient } from '@agoric/casting'; +import { StargateClient } from '@cosmjs/stargate'; +import { Tendermint34Client } from '@cosmjs/tendermint-rpc'; + +/** + * @import {MinimalNetworkConfig} from './network-config.js'; + */ + +// TODO distribute load +export const pickEndpoint = ({ rpcAddrs }) => rpcAddrs[0]; + +/** + * @param {string} endpoint + * @param {{ fetch: typeof window.fetch }} io + * @returns {Promise} + */ +export const makeTendermint34Client = (endpoint, { fetch }) => { + const rpcClient = makeTendermintRpcClient(endpoint, fetch); + return Tendermint34Client.create(rpcClient); +}; + +/** + * @param {MinimalNetworkConfig} config + * @param {{ fetch: typeof window.fetch }} io + * @returns {Promise} + */ +export const makeStargateClient = async (config, { fetch }) => { + const url = pickEndpoint(config); + const tm = await makeTendermint34Client(url, { fetch }); + return StargateClient.create(tm); +}; diff --git a/packages/client-utils/src/smart-wallet-kit.js b/packages/client-utils/src/smart-wallet-kit.js new file mode 100644 index 00000000000..a570fe9855a --- /dev/null +++ b/packages/client-utils/src/smart-wallet-kit.js @@ -0,0 +1,113 @@ +import { makeWalletStateCoalescer } from '@agoric/smart-wallet/src/utils.js'; +import { pollBlocks } from './chain.js'; +import { makeStargateClient } from './rpc.js'; +import { makeAgoricNames, makeVstorageKit } from './vstorage-kit.js'; + +/** + * @import {Amount, Brand} from '@agoric/ertp/src/types.js' + * @import {CurrentWalletRecord, UpdateRecord} from '@agoric/smart-wallet/src/smartWallet.js'; + * @import {MinimalNetworkConfig} from './network-config.js'; + */ + +/** + * Augment VstorageKit with addtional convenience methods for working with + * Agoric smart wallets. + * + * @param {object} root0 + * @param {typeof globalThis.fetch} root0.fetch + * @param {(ms: number) => Promise} root0.delay + * @param {MinimalNetworkConfig} networkConfig + */ +export const makeSmartWalletKit = async ({ fetch, delay }, networkConfig) => { + const vsk = makeVstorageKit({ fetch }, networkConfig); + + const client = await makeStargateClient(networkConfig, { fetch }); + + const agoricNames = await makeAgoricNames(vsk.fromBoard, vsk.vstorage); + + /** + * @param {string} from + * @param {number|string} [minHeight] + */ + const storedWalletState = async (from, minHeight = undefined) => { + const history = await vsk.vstorage.readFully( + `published.wallet.${from}`, + minHeight, + ); + + /** @type {{ Invitation: Brand<'set'> }} */ + // @ts-expect-error XXX how to narrow AssetKind to set? + const { Invitation } = agoricNames.brand; + const coalescer = makeWalletStateCoalescer(Invitation); + // update with oldest first + for (const txt of history.reverse()) { + const { body, slots } = JSON.parse(txt); + const record = vsk.marshaller.fromCapData({ body, slots }); + coalescer.update(record); + } + const coalesced = coalescer.state; + harden(coalesced); + return coalesced; + }; + + /** + * Get OfferStatus by id, polling until available. + * + * @param {string} from + * @param {string|number} id + * @param {number|string} minHeight + * @param {boolean} [untilNumWantsSatisfied] + */ + const pollOffer = async ( + from, + id, + minHeight, + untilNumWantsSatisfied = false, + ) => { + const poll = pollBlocks({ + client, + delay, + retryMessage: 'offer not in wallet at block', + }); + + const lookup = async () => { + const { offerStatuses } = await storedWalletState(from, minHeight); + const offerStatus = [...offerStatuses.values()].find(s => s.id === id); + if (!offerStatus) throw Error('retry'); + harden(offerStatus); + if (untilNumWantsSatisfied && !('numWantsSatisfied' in offerStatus)) { + throw Error('retry (no numWantsSatisfied yet)'); + } + return offerStatus; + }; + return poll(lookup); + }; + + /** + * @param {string} addr + * @returns {Promise} + */ + const getLastUpdate = addr => { + return vsk.readPublished(`wallet.${addr}`); + }; + + /** + * @param {string} addr + * @returns {Promise} + */ + const getCurrentWalletRecord = addr => { + return vsk.readPublished(`wallet.${addr}.current`); + }; + + return { + // pass along all of VstorageKit + ...vsk, + agoricNames, + networkConfig, + getLastUpdate, + getCurrentWalletRecord, + storedWalletState, + pollOffer, + }; +}; +/** @typedef {Awaited>} SmartWalletKit */ diff --git a/packages/client-utils/src/sync-tools.js b/packages/client-utils/src/sync-tools.js new file mode 100644 index 00000000000..0cf68a03a68 --- /dev/null +++ b/packages/client-utils/src/sync-tools.js @@ -0,0 +1,428 @@ +/** + * @file The purpose of this file is to bring together a set of tools that + * developers can use to synchronize operations they carry out in their tests. + * + * These operations include; + * - Making sure a core-eval resulted in successfully deploying a contract + * - Making sure a core-eval successfully sent zoe invitations to committee members for governance + * - Making sure an account is successfully funded with vbank assets like IST, BLD etc. + * - operation: query dest account's balance + * - condition: dest account has a balance >= sent token + * - Making sure an offer resulted successfully + * - Making sure an offer was exited successfully + * - Make sure an election held by a given committee (see @agoric/governance) turned out as expected + */ + +/** + * @typedef {object} RetryOptions + * @property {number} [maxRetries] + * @property {number} [retryIntervalMs] + * @property {boolean} [reusePromise] + * @property {(value: unknown) => unknown} [renderResult] + * + * @typedef {RetryOptions & {errorMessage: string}} WaitUntilOptions + * + * @typedef {object} CosmosBalanceThreshold + * @property {string} denom + * @property {number} value + */ + +/** + * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L10 + * + * @param {number} ms + * @param {{log: (message: string) => void, setTimeout: typeof global.setTimeout}} io + */ +export const sleep = (ms, { log = () => {}, setTimeout }) => + new Promise(resolve => { + log(`Sleeping for ${ms}ms...`); + setTimeout(resolve, ms); + }); + +/** + * From https://github.com/Agoric/agoric-sdk/blob/442f07c8f0af03281b52b90e90c27131eef6f331/multichain-testing/tools/sleep.ts#L24 + * + * @template [T=unknown] + * @param {() => Promise} operation + * @param {(result: T) => boolean} condition + * @param {string} message + * @param {RetryOptions & {log?: typeof console.log, setTimeout: typeof global.setTimeout}} options + * @returns {Promise} + */ +export const retryUntilCondition = async ( + operation, + condition, + message, + { + maxRetries = 6, + retryIntervalMs = 3500, + reusePromise = false, + renderResult = x => x, + // XXX mixes ocaps with configuration options + log = console.log, + setTimeout, + }, +) => { + console.log({ maxRetries, retryIntervalMs, message }); + + await null; // separate sync prologue + + const timedOut = Symbol('timed out'); + let retries = 0; + /** @type {Promise | undefined } */ + let resultP; + while (retries < maxRetries) { + try { + if (!reusePromise || !resultP) { + resultP = operation(); + const makeCleanup = ref => { + const cleanup = () => { + if (resultP === ref) { + resultP = undefined; + } + }; + return cleanup; + }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + resultP.finally(makeCleanup(resultP)); + } + const result = await Promise.race([ + resultP, + // Overload the retryIntervalMs to apply both *to* and *between* iterations + sleep(retryIntervalMs, { log() {}, setTimeout }).then(() => timedOut), + ]); + if (result === timedOut) { + log(`Attempt ${retries + 1} timed out`); + if (!reusePromise) resultP = undefined; + } else { + log('RESULT', renderResult(result)); + if (condition(result)) { + return result; + } + } + } catch (error) { + if (error instanceof Error) { + log(`Error: ${error.message}: ${error.stack}`); + } else { + log(`Unknown error: ${String(error)}`); + } + } + + retries += 1; + console.log( + `Retry ${retries}/${maxRetries} - Waiting for ${retryIntervalMs}ms for ${message}...`, + ); + await sleep(retryIntervalMs, { log, setTimeout }); + } + + throw Error(`${message} condition failed after ${maxRetries} retries.`); +}; + +/** + * @param {WaitUntilOptions} options + * @returns {WaitUntilOptions & {log?: typeof console.log}} + */ +const overrideDefaultOptions = options => { + const defaultValues = { + maxRetries: 6, + retryIntervalMs: 3500, + errorMessage: 'Error', + log: console.log, + }; + + return { ...defaultValues, ...options }; +}; + +/// ////////// Making sure a core-eval resulted successfully deploying a contract ///////////// + +const makeGetInstances = follow => async () => { + const instanceEntries = await follow( + '-lF', + `:published.agoricNames.instance`, + ); + + return Object.fromEntries(instanceEntries); +}; + +/** + * + * @param {string} contractName + * @param {{ log: (message: string) => void, follow: () => object, setTimeout: typeof global.setTimeout }} ambientAuthority + * @param {WaitUntilOptions} options + */ +export const waitUntilContractDeployed = ( + contractName, + ambientAuthority, + options, +) => { + const { follow, setTimeout } = ambientAuthority; + const getInstances = makeGetInstances(follow); + const { errorMessage, ...resolvedOptions } = overrideDefaultOptions(options); + + return retryUntilCondition( + getInstances, + instanceObject => Object.keys(instanceObject).includes(contractName), + errorMessage, + { setTimeout, ...resolvedOptions }, + ); +}; + +/// ////////// Making sure an account is successfully funded with vbank assets like IST, BLD etc. /////////////// + +const makeQueryCosmosBalance = queryCb => async dest => { + const coins = await queryCb('bank', 'balances', dest); + return coins.balances; +}; + +/** + * + * @param {Array} balances + * @param {CosmosBalanceThreshold} threshold + * @returns {boolean} + */ +const checkCosmosBalance = (balances, threshold) => { + const balance = [...balances].find(({ denom }) => denom === threshold.denom); + return Number(balance.amount) >= threshold.value; +}; + +/** + * @param {string} destAcct + * @param {{ log?: (message: string) => void, query: () => Promise, setTimeout: typeof global.setTimeout}} io + * @param {{denom: string, value: number}} threshold + * @param {WaitUntilOptions} options + */ +export const waitUntilAccountFunded = (destAcct, io, threshold, options) => { + const { query, setTimeout } = io; + const queryCosmosBalance = makeQueryCosmosBalance(query); + const { errorMessage, ...resolvedOptions } = overrideDefaultOptions(options); + + return retryUntilCondition( + async () => queryCosmosBalance(destAcct), + balances => checkCosmosBalance(balances, threshold), + errorMessage, + { setTimeout, ...resolvedOptions }, + ); +}; + +/// ////////// Making sure an offers get results ///////////// + +const makeQueryWallet = follow => async (/** @type {string} */ addr) => { + const update = await follow('-lF', `:published.wallet.${addr}`); + + return update; +}; + +/** + * + * @param {object} offerStatus + * @param {boolean} waitForPayouts + * @param {string} offerId + */ +const checkOfferState = (offerStatus, waitForPayouts, offerId) => { + const { updated, status } = offerStatus; + + if (updated !== 'offerStatus') return false; + if (!status) return false; + if (status.id !== offerId) return false; + if (!status.numWantsSatisfied || status.numWantsSatisfied !== 1) return false; + if (waitForPayouts && status.payouts) return true; + if (!waitForPayouts && status.result) return true; + + return false; +}; + +/** + * + * @param {string} addr + * @param {string} offerId + * @param {boolean} waitForPayouts + * @param {{ log?: typeof console.log, follow: () => object, setTimeout: typeof global.setTimeout }} io + * @param {WaitUntilOptions} options + */ +export const waitUntilOfferResult = ( + addr, + offerId, + waitForPayouts, + io, + options, +) => { + const { follow, setTimeout } = io; + const queryWallet = makeQueryWallet(follow); + const { errorMessage, ...resolvedOptions } = overrideDefaultOptions(options); + + return retryUntilCondition( + async () => queryWallet(addr), + status => checkOfferState(status, waitForPayouts, offerId), + errorMessage, + { reusePromise: true, setTimeout, ...resolvedOptions }, + ); +}; + +/// ////////// Making sure a core-eval successfully sent zoe invitations to committee members for governance ///////////// + +/** + * + * @param {{ updated: string, currentAmount: any }} update + * @returns {boolean} + */ +const checkForInvitation = update => { + const { updated, currentAmount } = update; + + if (updated !== 'balance') return false; + if (!currentAmount || !currentAmount.brand) return false; + + return currentAmount.brand.includes('Invitation'); +}; + +/** + * + * @param {string} addr + * @param {{ follow: () => object, log: typeof console.log, setTimeout: typeof global.setTimeout}} io + * @param {WaitUntilOptions} options + */ +export const waitUntilInvitationReceived = (addr, io, options) => { + const { follow, setTimeout } = io; + const queryWallet = makeQueryWallet(follow); + const { errorMessage, ...resolvedOptions } = overrideDefaultOptions(options); + + return retryUntilCondition( + async () => queryWallet(addr), + checkForInvitation, + errorMessage, + { reusePromise: true, setTimeout, ...resolvedOptions }, + ); +}; + +/// ////////// Making sure an offer was exited successfully ///////////// + +const makeQueryWalletCurrent = follow => (/** @type {string} */ addr) => + follow('-lF', `:published.wallet.${addr}.current`); + +/** + * @param {object} update + * @param {string} offerId + * @returns {boolean} + */ +const checkLiveOffers = (update, offerId) => { + const liveOffers = update.liveOffers; + if (!liveOffers) { + return false; + } + return !liveOffers.some(element => element.includes(offerId)); +}; + +/** + * @param {string} addr + * @param {string} offerId + * @param {{ follow: () => object, log: typeof console.log, setTimeout: typeof global.setTimeout}} io + * @param {WaitUntilOptions} options + */ +export const waitUntilOfferExited = async (addr, offerId, io, options) => { + const { follow, setTimeout } = io; + const queryWalletCurrent = makeQueryWalletCurrent(follow); + const { errorMessage, ...resolvedOptions } = overrideDefaultOptions(options); + + return retryUntilCondition( + async () => queryWalletCurrent(addr), + update => checkLiveOffers(update, offerId), + errorMessage, + { setTimeout, ...resolvedOptions }, + ); +}; + +/// ////////// Make sure an election held by a given committee ////////// +/// ////////// (see @agoric/governance) turned out as expected ////////// + +/** + * @typedef {{ + * latestOutcome: { + * outcome: string; + * question: import('@endo/marshal').RemotableObject + * }, + * latestQuestion: { + * closingRule: { deadline: bigint }, + * questionHandle: import('@endo/marshal').RemotableObject + * } + * }} ElectionResult + */ + +/** + * @param {string} basePath + * @param {import('./vstorage-kit').VstorageKit} vstorage + * @returns {Promise} + */ +const fetchLatestEcQuestion = async (basePath, vstorage) => { + const pathOutcome = `${basePath}.latestOutcome`; + const pathQuestion = `${basePath}.latestQuestion`; + + const [latestOutcome, latestQuestion] = await Promise.all([ + /** @type {Promise} */ ( + vstorage.readLatestHead(pathOutcome) + ), + /** @type {Promise} */ ( + vstorage.readLatestHead(pathQuestion) + ), + ]); + + return { latestOutcome, latestQuestion }; +}; + +/** + * + * @param {ElectionResult} electionResult + * @param {{ outcome: string; deadline: bigint }} expectedResult + * @returns {boolean} + */ +const checkCommitteeElectionResult = (electionResult, expectedResult) => { + const { + latestOutcome: { outcome, question }, + latestQuestion: { + closingRule: { deadline }, + questionHandle, + }, + } = electionResult; + const { outcome: expectedOutcome, deadline: expectedDeadline } = + expectedResult; + + return ( + expectedOutcome === outcome && + deadline === expectedDeadline && + question === questionHandle + ); +}; + +/** + * Depends on "@agoric/governance" package's committee implementation where for a given committee + * there's two child nodes in vstorage named "latestOutcome" and "latestQuestion" respectively. + * + * @param {string} committeePathBase + * @param {{ + * outcome: string; + * deadline: bigint; + * }} expectedResult + * @param {{ + * vstorage: import('./vstorage-kit').VstorageKit; + * log: typeof console.log, + * setTimeout: typeof global.setTimeout + * }} io + * @param {WaitUntilOptions} options + */ +export const waitUntilElectionResult = ( + committeePathBase, + expectedResult, + io, + options, +) => { + const { vstorage, log, setTimeout } = io; + + const { maxRetries, retryIntervalMs, errorMessage } = + overrideDefaultOptions(options); + + return retryUntilCondition( + () => fetchLatestEcQuestion(committeePathBase, vstorage), + electionResult => + checkCommitteeElectionResult(electionResult, expectedResult), + errorMessage, + { maxRetries, retryIntervalMs, log, setTimeout }, + ); +}; diff --git a/packages/client-utils/src/types.d.ts b/packages/client-utils/src/types.d.ts new file mode 100644 index 00000000000..fc11550bbf5 --- /dev/null +++ b/packages/client-utils/src/types.d.ts @@ -0,0 +1,37 @@ +// @file types for the client-utils package +// NB: this doesn't follow best practices for TS in JS because this package will likely soon be written in TS + +import type { + OutcomeRecord, + QuestionDetails, +} from '@agoric/governance/src/types.js'; +import type { MetricsNotification as VaultManagerMetrics } from '@agoric/inter-protocol/src/vaultFactory/vaultManager.js'; +import type { + CurrentWalletRecord, + UpdateRecord, +} from '@agoric/smart-wallet/src/smartWallet.js'; + +// For static string key types. String template matching has to be in the ternary below. +type PublishedTypeMap = { + 'auction.governance': { current: AuctionParamRecord }; + 'auction.schedule': ScheduleNotification; + 'vaultFactory.metrics': { rewardPoolAllocation: RewardPoolAllocationRecord }; +}; + +/** + * Utility type to the type that would result from unmarshalling the latest + * value at a vstorage `published` path. + */ +export type TypedPublished = T extends keyof PublishedTypeMap + ? PublishedTypeMap[T] + : T extends `wallet.${string}.current` + ? CurrentWalletRecord + : T extends `wallet.${string}` + ? UpdateRecord + : T extends `committees.${string}.latestQuestion` + ? QuestionDetails + : T extends `committees.${string}.latestOutcome` + ? OutcomeRecord + : T extends `vaultFactory.managers.manager${number}.metrics` + ? VaultManagerMetrics + : unknown; diff --git a/packages/client-utils/src/types.js b/packages/client-utils/src/types.js new file mode 100644 index 00000000000..12277386eeb --- /dev/null +++ b/packages/client-utils/src/types.js @@ -0,0 +1,2 @@ +// Dummy for d.ts twin +export {}; diff --git a/packages/client-utils/src/vstorage-kit.js b/packages/client-utils/src/vstorage-kit.js new file mode 100644 index 00000000000..6643d81fe63 --- /dev/null +++ b/packages/client-utils/src/vstorage-kit.js @@ -0,0 +1,145 @@ +import { + boardSlottingMarshaller, + makeBoardRemote, +} from '@agoric/vats/tools/board-utils.js'; +import { assertAllDefined } from '@agoric/internal'; +import { makeVStorage } from './vstorage.js'; + +export { boardSlottingMarshaller }; + +/** + * @import {MinimalNetworkConfig} from './network-config.js'; + * @import {TypedPublished} from './types.js'; + * @import {VStorage} from './vstorage.js'; + */ + +/** @deprecated */ +export const makeFromBoard = () => { + const cache = new Map(); + const convertSlotToVal = (boardId, iface) => { + if (cache.has(boardId)) { + return cache.get(boardId); + } + const val = makeBoardRemote({ boardId, iface }); + cache.set(boardId, val); + return val; + }; + return harden({ convertSlotToVal }); +}; +/** @typedef {ReturnType} IdMap */ + +/** @deprecated */ +export const storageHelper = { + /** @param { string } txt */ + parseCapData: txt => { + assert(typeof txt === 'string', typeof txt); + /** @type {{ value: string }} */ + const { value } = JSON.parse(txt); + const specimen = JSON.parse(value); + const { blockHeight, values } = specimen; + assert(values, `empty values in specimen ${value}`); + const capDatas = storageHelper.parseMany(values); + return { blockHeight, capDatas }; + }, + /** + * @param {string} txt + * @param {IdMap} ctx + */ + unserializeTxt: (txt, ctx) => { + const { capDatas } = storageHelper.parseCapData(txt); + return capDatas.map(capData => + boardSlottingMarshaller(ctx.convertSlotToVal).fromCapData(capData), + ); + }, + /** @param {string[]} capDataStrings array of stringified capData */ + parseMany: capDataStrings => { + assert(capDataStrings && capDataStrings.length); + /** @type {{ body: string, slots: string[] }[]} */ + const capDatas = capDataStrings.map(s => JSON.parse(s)); + for (const capData of capDatas) { + assert(typeof capData === 'object' && capData !== null); + assert('body' in capData && 'slots' in capData); + assert(typeof capData.body === 'string'); + assert(Array.isArray(capData.slots)); + } + return capDatas; + }, +}; +harden(storageHelper); + +/** + * @deprecated + * @param {IdMap} ctx + * @param {VStorage} vstorage + * @returns {Promise} + */ +export const makeAgoricNames = async (ctx, vstorage) => { + assertAllDefined({ ctx, vstorage }); + const reverse = {}; + const entries = await Promise.all( + ['brand', 'instance', 'vbankAsset'].map(async kind => { + const content = await vstorage.readLatest( + `published.agoricNames.${kind}`, + ); + /** @type {Array<[string, import('@agoric/vats/tools/board-utils.js').BoardRemote]>} */ + const parts = storageHelper.unserializeTxt(content, ctx).at(-1); + for (const [name, remote] of parts) { + if ('getBoardId' in remote) { + reverse[remote.getBoardId()] = name; + } + } + return [kind, Object.fromEntries(parts)]; + }), + ); + return { ...Object.fromEntries(entries), reverse }; +}; + +/** + * @param {{ fetch: typeof window.fetch }} io + * @param {MinimalNetworkConfig} config + */ +export const makeVstorageKit = ({ fetch }, config) => { + try { + const vstorage = makeVStorage({ fetch }, config); + const fromBoard = makeFromBoard(); + + const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); + + /** @type {(txt: string) => unknown} */ + const unserializeHead = txt => + storageHelper.unserializeTxt(txt, fromBoard).at(-1); + + /** + * Read latest at path and unmarshal it + * @type {(path: string) => Promise} + */ + const readLatestHead = path => + vstorage.readLatest(path).then(unserializeHead); + + /** + * Read latest at published path and unmarshal it. + * + * Note this does not perform a runtime check to verify the shape. The + * static types come from the spec of what is supposed to be written to + * vstorage, which is validated in testing of the chain code that is run + * in consensus. + * + * @type {(subpath: T) => Promise>} + */ + const readPublished = subpath => + // @ts-expect-error cast + readLatestHead(`published.${subpath}`); + + return { + fromBoard, + marshaller, + readLatestHead, + readPublished, + unserializeHead, + vstorage, + }; + } catch (err) { + throw Error(`RPC failure (${config.rpcAddrs}): ${err.message}`); + } +}; +/** @typedef {ReturnType} VstorageKit */ diff --git a/packages/client-utils/src/vstorage.js b/packages/client-utils/src/vstorage.js new file mode 100644 index 00000000000..be365debf3d --- /dev/null +++ b/packages/client-utils/src/vstorage.js @@ -0,0 +1,125 @@ +/* global Buffer */ + +/** + * @import {MinimalNetworkConfig} from './network-config.js'; + */ + +/** + * @param {object} powers + * @param {typeof window.fetch} powers.fetch + * @param {MinimalNetworkConfig} config + */ +export const makeVStorage = ({ fetch }, config) => { + /** @param {string} path */ + const getJSON = path => { + const url = config.rpcAddrs[0] + path; + // console.warn('fetching', url); + return fetch(url, { keepalive: true }).then(res => res.json()); + }; + // height=0 is the same as omitting height and implies the highest block + const url = (path = 'published', { kind = 'children', height = 0 } = {}) => + `/abci_query?path=%22/custom/vstorage/${kind}/${path}%22&height=${height}`; + + const readStorage = (path = 'published', { kind = 'children', height = 0 }) => + getJSON(url(path, { kind, height })) + .catch(err => { + throw Error(`cannot read ${kind} of ${path}: ${err.message}`); + }) + .then(data => { + const { + result: { response }, + } = data; + if (response?.code !== 0) { + /** @type {any} */ + const err = Error( + `error code ${response?.code} reading ${kind} of ${path}: ${response.log}`, + ); + err.code = response?.code; + err.codespace = response?.codespace; + throw err; + } + return data; + }); + + const vstorage = { + url, + decode({ result: { response } }) { + const { code } = response; + if (code !== 0) { + throw response; + } + const { value } = response; + return Buffer.from(value, 'base64').toString(); + }, + /** + * + * @param {string} path + * @returns {Promise} latest vstorage value at path + */ + async readLatest(path = 'published') { + const raw = await readStorage(path, { kind: 'data' }); + return vstorage.decode(raw); + }, + async keys(path = 'published') { + const raw = await readStorage(path, { kind: 'children' }); + return JSON.parse(vstorage.decode(raw)).children; + }, + /** + * @param {string} path + * @param {number} [height] default is highest + * @returns {Promise<{blockHeight: number, values: string[]}>} + */ + async readAt(path, height = undefined) { + const raw = await readStorage(path, { kind: 'data', height }); + const txt = vstorage.decode(raw); + /** @type {{ value: string }} */ + const { value } = JSON.parse(txt); + return JSON.parse(value); + }, + /** + * Read values going back as far as available + * + * @param {string} path + * @param {number | string} [minHeight] + * @returns {Promise} + */ + async readFully(path, minHeight = undefined) { + const parts = []; + // undefined the first iteration, to query at the highest + let blockHeight; + await null; + do { + // console.debug('READING', { blockHeight }); + let values; + try { + ({ blockHeight, values } = await vstorage.readAt( + path, + blockHeight && Number(blockHeight) - 1, + )); + // console.debug('readAt returned', { blockHeight }); + } catch (err) { + if ( + // CosmosSDK ErrInvalidRequest with particular message text; + // misrepresentation of pruned data + // TODO replace after incorporating a fix to + // https://github.com/cosmos/cosmos-sdk/issues/19992 + err.codespace === 'sdk' && + err.code === 18 && + err.message.match(/pruned/) + ) { + // console.error(err); + break; + } + throw err; + } + parts.push(values); + // console.debug('PUSHED', values); + // console.debug('NEW', { blockHeight, minHeight }); + if (minHeight && Number(blockHeight) <= Number(minHeight)) break; + } while (blockHeight > 0); + return parts.flat(); + }, + }; + return vstorage; +}; +/** @typedef {ReturnType} VStorage */ diff --git a/packages/client-utils/src/wallet-utils.js b/packages/client-utils/src/wallet-utils.js new file mode 100644 index 00000000000..79f0d9edc96 --- /dev/null +++ b/packages/client-utils/src/wallet-utils.js @@ -0,0 +1,8 @@ +/** @file backwards compat */ + +import { makeSmartWalletKit } from './smart-wallet-kit.js'; + +/** @typedef {import('./smart-wallet-kit.js').SmartWalletKit} WalletUtils */ + +/** @deprecated use `makeSmartWalletKit` */ +export const makeWalletUtils = makeSmartWalletKit; diff --git a/packages/client-utils/test/exports.test.js b/packages/client-utils/test/exports.test.js new file mode 100644 index 00000000000..50e17472bf3 --- /dev/null +++ b/packages/client-utils/test/exports.test.js @@ -0,0 +1,10 @@ +/* eslint-disable import/no-extraneous-dependencies -- requiring the package itself to check exports map */ +// @ts-check + +import test from 'ava'; + +import * as index from '@agoric/client-utils'; + +test('index', t => { + t.snapshot(Object.keys(index).sort()); +}); diff --git a/packages/client-utils/test/snapshots/exports.test.js.md b/packages/client-utils/test/snapshots/exports.test.js.md new file mode 100644 index 00000000000..1dc0f08ff90 --- /dev/null +++ b/packages/client-utils/test/snapshots/exports.test.js.md @@ -0,0 +1,37 @@ +# Snapshot report for `test/exports.test.js` + +The actual snapshot is saved in `exports.test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## index + +> Snapshot 1 + + [ + 'LOCAL_CONFIG', + 'LOCAL_CONFIG_KEY', + 'boardSlottingMarshaller', + 'fetchEnvNetworkConfig', + 'fetchNetworkConfig', + 'makeAgoricNames', + 'makeFromBoard', + 'makeSmartWalletKit', + 'makeStargateClient', + 'makeTendermint34Client', + 'makeVStorage', + 'makeVstorageKit', + 'makeWalletUtils', + 'pickEndpoint', + 'retryUntilCondition', + 'sleep', + 'storageHelper', + 'toNetworkConfigUrl', + 'toRpcUrl', + 'waitUntilAccountFunded', + 'waitUntilContractDeployed', + 'waitUntilElectionResult', + 'waitUntilInvitationReceived', + 'waitUntilOfferExited', + 'waitUntilOfferResult', + ] diff --git a/packages/client-utils/test/snapshots/exports.test.js.snap b/packages/client-utils/test/snapshots/exports.test.js.snap new file mode 100644 index 00000000000..f44f9a7329c Binary files /dev/null and b/packages/client-utils/test/snapshots/exports.test.js.snap differ diff --git a/packages/client-utils/test/snapshots/vstorage-kit.test.js.md b/packages/client-utils/test/snapshots/vstorage-kit.test.js.md new file mode 100644 index 00000000000..fb788564f20 --- /dev/null +++ b/packages/client-utils/test/snapshots/vstorage-kit.test.js.md @@ -0,0 +1,352 @@ +# Snapshot report for `test/vstorage-kit.test.js` + +The actual snapshot is saved in `vstorage-kit.test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## agoricNames contains expected structure + +> agoricNames from A3P + + { + brand: { + ATOM: Object @Alleged: BoardRemoteATOM brand { + getBoardId: Function getBoardId {}, + }, + BLD: Object @Alleged: BoardRemoteBLD brand { + getBoardId: Function getBoardId {}, + }, + DAI_axl: Object @Alleged: BoardRemoteDAI_axl brand { + getBoardId: Function getBoardId {}, + }, + DAI_grv: Object @Alleged: BoardRemoteDAI_grv brand { + getBoardId: Function getBoardId {}, + }, + IST: Object @Alleged: BoardRemoteIST brand { + getBoardId: Function getBoardId {}, + }, + Invitation: Object @Alleged: BoardRemoteZoe Invitation brand { + getBoardId: Function getBoardId {}, + }, + KREAdCHARACTER: Object @Alleged: BoardRemoteKREAdCHARACTER brand { + getBoardId: Function getBoardId {}, + }, + KREAdITEM: Object @Alleged: BoardRemoteKREAdITEM brand { + getBoardId: Function getBoardId {}, + }, + USDC_axl: Object @Alleged: BoardRemoteUSDC_axl brand { + getBoardId: Function getBoardId {}, + }, + USDC_grv: Object @Alleged: BoardRemoteUSDC_grv brand { + getBoardId: Function getBoardId {}, + }, + USDT_axl: Object @Alleged: BoardRemoteUSDT_axl brand { + getBoardId: Function getBoardId {}, + }, + USDT_grv: Object @Alleged: BoardRemoteUSDT_grv brand { + getBoardId: Function getBoardId {}, + }, + stATOM: Object @Alleged: BoardRemotestATOM brand { + getBoardId: Function getBoardId {}, + }, + timer: Object @Alleged: BoardRemotetimerBrand { + getBoardId: Function getBoardId {}, + }, + }, + instance: { + 'ATOM-USD price feed': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + Crabble: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + CrabbleCommittee: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + CrabbleGovernor: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + VaultFactory: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + VaultFactoryGovernor: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + auctioneer: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + econCommitteeCharter: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + economicCommittee: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + feeDistributor: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + kread: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + kreadCommittee: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + kreadCommitteeCharter: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + provisionPool: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-DAI_axl': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-DAI_grv': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-USDC_axl': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-USDC_grv': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-USDT_axl': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'psm-IST-USDT_grv': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + reserve: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + reserveGovernor: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'scaledPriceAuthority-stATOM': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + 'stATOM-USD price feed': Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + walletFactory: Object @Alleged: BoardRemoteInstanceHandle { + getBoardId: Function getBoardId {}, + }, + }, + reverse: { + board00282: 'KREAdITEM', + board00360: 'VaultFactory', + board0074: 'Invitation', + board00990: 'stATOM', + board01272: 'psm-IST-USDT_grv', + board01664: 'provisionPool', + board01744: 'USDT_axl', + board01867: 'psm-IST-DAI_axl', + board01985: 'kreadCommittee', + board02271: 'psm-IST-USDT_axl', + board02393: 'CrabbleCommittee', + board02568: 'psm-IST-DAI_grv', + board0257: 'IST', + board02963: 'ATOM-USD price feed', + board03040: 'USDC_axl', + board03138: 'DAI_grv', + board03281: 'KREAdCHARACTER', + board03365: 'reserveGovernor', + board03446: 'USDT_grv', + board03773: 'VaultFactoryGovernor', + board04091: 'stATOM-USD price feed', + board04149: 'economicCommittee', + board0425: 'timer', + board04395: 'Crabble', + board04542: 'USDC_grv', + board04661: 'econCommitteeCharter', + board04783: 'kread', + board05262: 'feeDistributor', + board05396: 'CrabbleGovernor', + board05557: 'ATOM', + board0566: 'BLD', + board05669: 'psm-IST-USDC_axl', + board05736: 'DAI_axl', + board05892: 'scaledPriceAuthority-stATOM', + board05970: 'psm-IST-USDC_grv', + board06284: 'kreadCommitteeCharter', + board06299: 'auctioneer', + board06366: 'walletFactory', + board06458: 'reserve', + }, + vbankAsset: { + 'ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F': { + brand: Object @Alleged: BoardRemoteUSDC_axl brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/295548A78785A1007F232DE286149A6FF512F180AF5657780FC89C009E2C348F', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteUSDC_axl issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'USDC_axl', + proposedName: 'USD Coin', + }, + 'ibc/386D09AE31DA7C0C93091BB45D08CB7A0730B1F697CD813F06A5446DCF02EEB2': { + brand: Object @Alleged: BoardRemoteUSDT_grv brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/386D09AE31DA7C0C93091BB45D08CB7A0730B1F697CD813F06A5446DCF02EEB2', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteUSDT_grv issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'USDT_grv', + proposedName: 'Tether USD', + }, + 'ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242': { + brand: Object @Alleged: BoardRemoteDAI_axl brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/3914BDEF46F429A26917E4D8D434620EC4817DC6B6E68FB327E190902F1E9242', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 18, + }, + issuer: Object @Alleged: BoardRemoteDAI_axl issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'DAI_axl', + proposedName: 'DAI', + }, + 'ibc/3D5291C23D776C3AA7A7ABB34C7B023193ECD2BC42EA19D3165B2CF9652117E7': { + brand: Object @Alleged: BoardRemoteDAI_grv brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/3D5291C23D776C3AA7A7ABB34C7B023193ECD2BC42EA19D3165B2CF9652117E7', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 18, + }, + issuer: Object @Alleged: BoardRemoteDAI_grv issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'DAI_grv', + proposedName: 'DAI', + }, + 'ibc/42225F147137DDEB5FEF0F1D0A92F2AD57557AFA2C4D6F30B21E0D983001C002': { + brand: Object @Alleged: BoardRemotestATOM brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/42225F147137DDEB5FEF0F1D0A92F2AD57557AFA2C4D6F30B21E0D983001C002', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemotestATOM issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'stATOM', + proposedName: 'stATOM', + }, + 'ibc/6831292903487E58BF9A195FDDC8A2E626B3DF39B88F4E7F41C935CADBAF54AC': { + brand: Object @Alleged: BoardRemoteUSDC_grv brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/6831292903487E58BF9A195FDDC8A2E626B3DF39B88F4E7F41C935CADBAF54AC', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteUSDC_grv issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'USDC_grv', + proposedName: 'USC Coin', + }, + 'ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA': { + brand: Object @Alleged: BoardRemoteATOM brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteATOM issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'ATOM', + proposedName: 'ATOM', + }, + 'ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045': { + brand: Object @Alleged: BoardRemoteUSDT_axl brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ibc/F2331645B9683116188EF36FC04A809C28BD36B54555E8705A37146D0182F045', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteUSDT_axl issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'USDT_axl', + proposedName: 'Tether USD', + }, + ubld: { + brand: Object @Alleged: BoardRemoteBLD brand { + getBoardId: Function getBoardId {}, + }, + denom: 'ubld', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteBLD issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'BLD', + proposedName: 'Agoric staking token', + }, + uist: { + brand: Object @Alleged: BoardRemoteIST brand { + getBoardId: Function getBoardId {}, + }, + denom: 'uist', + displayInfo: { + assetKind: 'nat', + decimalPlaces: 6, + }, + issuer: Object @Alleged: BoardRemoteIST issuer { + getBoardId: Function getBoardId {}, + }, + issuerName: 'IST', + proposedName: 'Agoric stable token', + }, + }, + } + +> priceFeed from A3P + + { + amountIn: { + brand: Object @Alleged: BoardRemoteBrand { + getBoardId: Function getBoardId {}, + }, + value: 1000000n, + }, + amountOut: { + brand: Object @Alleged: BoardRemoteBrand { + getBoardId: Function getBoardId {}, + }, + value: 12010000n, + }, + timer: Object @Alleged: BoardRemotetimerService { + getBoardId: Function getBoardId {}, + }, + timestamp: { + absValue: 1729176290n, + timerBrand: Object @Alleged: BoardRemotetimerBrand { + getBoardId: Function getBoardId {}, + }, + }, + } diff --git a/packages/client-utils/test/snapshots/vstorage-kit.test.js.snap b/packages/client-utils/test/snapshots/vstorage-kit.test.js.snap new file mode 100644 index 00000000000..b36c073f925 Binary files /dev/null and b/packages/client-utils/test/snapshots/vstorage-kit.test.js.snap differ diff --git a/packages/client-utils/test/sync-tools.test.js b/packages/client-utils/test/sync-tools.test.js new file mode 100644 index 00000000000..4ad93a84016 --- /dev/null +++ b/packages/client-utils/test/sync-tools.test.js @@ -0,0 +1,614 @@ +/* eslint-env node */ +// @ts-check +import test from 'ava'; +import { Far } from '@endo/marshal'; +import { + waitUntilAccountFunded, + waitUntilContractDeployed, + waitUntilElectionResult, + waitUntilInvitationReceived, + waitUntilOfferExited, + waitUntilOfferResult, +} from '../src/sync-tools.js'; + +// keep these small for tests +const retryIntervalMs = 10; +const DEFAULT_TIMEOUT = 30; + +const makeFakeVstorageKit = () => { + let value; + + const setValue = newValue => (value = newValue); + // TODO remove this when we switch all sync-tools to use client-utils's vstorageKit + const follow = () => Promise.resolve(value); + /** + * @param {string} path Assumes the path will be something like 'published.auction.book0' + * where value = { book0: {...} } + */ + const readLatestHead = path => { + const key = path.split('.').at(-1); + // @ts-expect-error path will be a string joined by "." + return Promise.resolve(value[key]); + }; + + return { setValue, follow, readLatestHead }; +}; + +const makeFakeBalanceQuery = () => { + let result = { + balances: [ + { + denom: 'ubld', + amount: '364095061', + }, + { + denom: 'uist', + amount: '2257215', + }, + ], + pagination: { + next_key: null, + total: '0', + }, + }; + + const setResult = newValue => (result = newValue); + const query = () => Promise.resolve(result); + + return { setResult, query }; +}; + +test.serial('wait until contract is deployed', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue([['arbitrary', true]]); + const waitP = waitUntilContractDeployed( + 'name', + { + follow, + log: t.log, + setTimeout, + }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Contract not deployed yet', + }, + ); + + setTimeout(() => setValue([['name', true]]), DEFAULT_TIMEOUT); // set desired value after third retry + + await t.notThrowsAsync(waitP); +}); + +test.serial('wait until account funded', async t => { + const { setResult, query } = makeFakeBalanceQuery(); + + const waitP = waitUntilAccountFunded( + 'agoric12345', + { log: t.log, query, setTimeout }, + { denom: 'ufake', value: 100_000 }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Account not funded yet', + }, + ); + + const desiredResult = { + balances: [ + { + denom: 'ubld', + amount: '364095061', + }, + { + denom: 'uist', + amount: '2257215', + }, + { + denom: 'ufake', + amount: '100001', + }, + ], + pagination: { + next_key: null, + total: '0', + }, + }; + setTimeout(() => setResult(desiredResult), DEFAULT_TIMEOUT); // set desired value after third retry + await t.notThrowsAsync(waitP); +}); + +test.serial('wait until account funded, insufficient balance', async t => { + const { setResult, query } = makeFakeBalanceQuery(); + + const waitP = waitUntilAccountFunded( + 'agoric12345', + { log: t.log, query, setTimeout }, + { denom: 'ufake', value: 100_000 }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Account not funded yet', + }, + ); + + const desiredResult = { + balances: [ + { + denom: 'ubld', + amount: '364095061', + }, + { + denom: 'uist', + amount: '2257215', + }, + { + denom: 'ufake', + amount: '90000', + }, + ], + pagination: { + next_key: null, + total: '0', + }, + }; + setTimeout(() => setResult(desiredResult), DEFAULT_TIMEOUT); // set desired value after third retry + await t.throwsAsync(waitP, { message: /Account not funded yet/ }); +}); + +test.serial( + 'wait until offer result, balance update - should throw', + async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ status: {}, updated: 'balance' }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + false, + { log: t.log, follow, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Wrong update type', + }, + ); + + await t.throwsAsync(waitP, { message: /Wrong update type/ }); + }, +); + +test.serial('wait until offer result, wrong id - should throw', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ status: { id: 'your-offer' }, updated: 'offerStatus' }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + false, + { log: t.log, follow, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Wrong offer id', + }, + ); + + await t.throwsAsync(waitP, { message: /Wrong offer id/ }); +}); + +test.serial('wait until offer result, no "status" - should throw', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ updated: 'offerStatus' }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + false, + { follow, log: t.log, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'No "status" object', + }, + ); + + await t.throwsAsync(waitP, { message: /No "status" object/ }); +}); + +test.serial( + 'wait until offer result, numWantsSatisfied not equals to 1 - should throw', + async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ + status: { id: 'my-offer', numWantsSatisfied: 0 }, + updated: 'offerStatus', + }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + false, + { follow, log: t.log, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: '"numWantsSatisfied" is not 1', + }, + ); + + await t.throwsAsync(waitP, { message: /"numWantsSatisfied" is not 1/ }); + }, +); + +test.serial('wait until offer result, do not wait for "payouts"', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ status: { id: 'my-offer' }, updated: 'offerStatus' }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + false, + { follow, log: t.log, setTimeout }, + { + maxRetries: 7, + retryIntervalMs, + errorMessage: 'offer not resulted on time', + }, + ); + + setTimeout( + () => + setValue({ + status: { id: 'my-offer', numWantsSatisfied: 1 }, + updated: 'offerStatus', + }), + 10, + ); // First, offer is seated + setTimeout( + () => + setValue({ + status: { id: 'my-offer', numWantsSatisfied: 1, result: 'thank you' }, + updated: 'offerStatus', + }), + DEFAULT_TIMEOUT, + ); // Then offer got results + + await t.notThrowsAsync(waitP); +}); + +test.serial('wait until offer result, wait for "payouts"', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ status: { id: 'my-offer' }, updated: 'offerStatus' }); + + const waitP = waitUntilOfferResult( + 'agoric12345', + 'my-offer', + true, + { follow, log: t.log, setTimeout }, + { + maxRetries: 7, + retryIntervalMs, + errorMessage: 'payouts not received on time', + }, + ); + + setTimeout( + () => + setValue({ + status: { id: 'my-offer', numWantsSatisfied: 1 }, + updated: 'offerStatus', + }), + 10, + ); // First, offer is seated + setTimeout( + () => + setValue({ + status: { id: 'my-offer', numWantsSatisfied: 1, result: 'thank you' }, + updated: 'offerStatus', + }), + 30, + ); // Now offer got results + setTimeout( + () => + setValue({ + status: { + id: 'my-offer', + numWantsSatisfied: 1, + result: 'thank you', + payouts: {}, + }, + updated: 'offerStatus', + }), + 40, + ); // Payouts are received + + await t.notThrowsAsync(waitP); +}); + +test.serial( + 'wait until invitation recevied, wrong "updated" value', + async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ updated: 'offerStatus' }); + + const waitP = waitUntilInvitationReceived( + 'agoric12345', + { follow, log: t.log, setTimeout }, + { + maxRetries: 3, + retryIntervalMs, + errorMessage: 'wrong "updated" value', + }, + ); + + await t.throwsAsync(waitP, { message: /wrong "updated" value/ }); + }, +); + +test.serial( + 'wait until invitation recevied, falty "currentAmount" object', + async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ updated: 'balance' }); + + const waitP = waitUntilInvitationReceived( + 'agoric12345', + { follow, log: t.log, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'faulty "currentAmount" object', + }, + ); + + setTimeout( + () => setValue({ updated: 'balance', currentAmount: { foo: true } }), + 20, + ); + + await t.throwsAsync(waitP, { message: /faulty "currentAmount" object/ }); + }, +); + +test.serial( + 'wait until invitation recevied, brand string do not match', + async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({ updated: 'balance', currentAmount: { brand: 'foo bar foo' } }); + + const waitP = waitUntilInvitationReceived( + 'agoric12345', + { follow, log: t.log, setTimeout }, + { + maxRetries: 3, + retryIntervalMs, + errorMessage: 'brand string do not match', + }, + ); + + await t.throwsAsync(waitP, { message: /brand string do not match/ }); + }, +); + +test.serial('wait until invitation recevied', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({}); + + const waitP = waitUntilInvitationReceived( + 'agoric12345', + { follow, log: t.log, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'brand string do not match', + }, + ); + + setTimeout( + () => + setValue({ + updated: 'balance', + currentAmount: { brand: '[Alleged: SEVERED: Zoe Invitation brand {}]' }, + }), + 20, + ); + + await t.notThrowsAsync(waitP); +}); + +test.serial('wait until offer exited', async t => { + const { setValue, follow } = makeFakeVstorageKit(); + setValue({}); + + const waitP = waitUntilOfferExited( + 'agoric12345', + 'my-offer', + { follow, log: t.log, setTimeout }, + { + maxRetries: 5, + retryIntervalMs, + errorMessage: 'Offer not exited', + }, + ); + + await t.throwsAsync(waitP); +}); + +test.serial('wait election result: question handle is respected', async t => { + const oldQuestionHandle = Far('Question 1', {}); + const newQuestionHandle = Far('Question 2', {}); + + const { setValue, readLatestHead } = makeFakeVstorageKit(); + const initState = harden({ + latestOutcome: { outcome: 'win', question: oldQuestionHandle }, + latestQuestion: { + closingRule: { deadline: 2n }, + questionHandle: newQuestionHandle, + }, + }); + setValue(initState); + + const waitFailP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 2n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 3, + retryIntervalMs, + }, + ); + + // Make sure the promise rejects when state is not updated + await t.throwsAsync(waitFailP); + + const waitHappyP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 2n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 5, + retryIntervalMs, + }, + ); + + // Now set the state to a value where the promise should resolve + const updatedState = harden({ + ...initState, + latestOutcome: { outcome: 'win', question: newQuestionHandle }, + }); + setTimeout(() => setValue(updatedState), DEFAULT_TIMEOUT); + + await t.notThrowsAsync(waitHappyP); +}); + +test.serial('wait election result: deadline is respected', async t => { + const questionHandle = Far('Question', {}); + + const { setValue, readLatestHead } = makeFakeVstorageKit(); + const initState = harden({ + latestOutcome: { outcome: 'win', question: questionHandle }, + latestQuestion: { + closingRule: { deadline: 2n }, + questionHandle, + }, + }); + setValue(initState); + + const waitFailP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 5n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 3, + retryIntervalMs, + }, + ); + + // Make sure the promise rejects when state is not updated + await t.throwsAsync(waitFailP); + + const waitHappyP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 5n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 5, + retryIntervalMs, + }, + ); + + // Now set the state to a value where the promise should resolve + const updatedState = harden({ + ...initState, + latestQuestion: { + closingRule: { deadline: 5n }, + questionHandle, + }, + }); + setTimeout(() => setValue(updatedState), DEFAULT_TIMEOUT); + + await t.notThrowsAsync(waitHappyP); +}); + +test.serial('wait election result: outcome is respected', async t => { + const questionHandle = Far('Question', {}); + + const { setValue, readLatestHead } = makeFakeVstorageKit(); + const initState = harden({ + latestOutcome: { outcome: 'lose', question: questionHandle }, + latestQuestion: { + closingRule: { deadline: 5n }, + questionHandle, + }, + }); + setValue(initState); + + const waitFailP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 5n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 3, + retryIntervalMs, + }, + ); + + // Make sure the promise rejects when state is not updated + await t.throwsAsync(waitFailP); + + const waitHappyP = waitUntilElectionResult( + 'dummyPath', + { outcome: 'win', deadline: 5n }, + { + // @ts-expect-error casting + vstorage: { readLatestHead }, + log: console.log, + setTimeout, + }, + { + errorMessage: 'Oops, election did not turn out as expected', + maxRetries: 5, + retryIntervalMs, + }, + ); + + // Now set the state to a value where the promise should resolve + const updatedState = harden({ + ...initState, + latestOutcome: { outcome: 'win', question: questionHandle }, + }); + setTimeout(() => setValue(updatedState), DEFAULT_TIMEOUT); + + await t.notThrowsAsync(waitHappyP); +}); diff --git a/packages/client-utils/test/vstorage-kit.test.js b/packages/client-utils/test/vstorage-kit.test.js new file mode 100644 index 00000000000..a6d11c6972f --- /dev/null +++ b/packages/client-utils/test/vstorage-kit.test.js @@ -0,0 +1,88 @@ +/* eslint-env node */ +import test from 'ava'; +import { makeAgoricNames, makeVstorageKit } from '../src/vstorage-kit.js'; + +const makeMockFetch = (responses = {}) => { + return async url => { + const response = responses[url] || { + result: { + response: { + code: 0, + value: Buffer.from( + JSON.stringify({ value: '{"blockHeight":1,"values":[]}' }), + ).toString('base64'), + }, + }, + }; + return { json: () => Promise.resolve(response) }; + }; +}; + +const makeTestConfig = () => ({ + chainName: 'test-chain', + rpcAddrs: ['http://localhost:26657'], +}); + +test('agoricNames contains expected structure', async t => { + /** @type {typeof window.fetch} */ + // @ts-expect-error mock + const fetch = makeMockFetch({ + 'http://localhost:26657/abci_query?path=%22/custom/vstorage/data/published.agoricNames.brand%22&height=0': + { + result: { + response: { + code: 0, + value: + // observed in a3p + 'ewogICJ2YWx1ZSI6ICJ7XCJibG9ja0hlaWdodFwiOlwiNzY5XCIsXCJ2YWx1ZXNcIjpbXCJ7XFxcImJvZHlcXFwiOlxcXCIjW1tcXFxcXFxcIkFUT01cXFxcXFxcIixcXFxcXFxcIiQwLkFsbGVnZWQ6IEFUT00gYnJhbmRcXFxcXFxcIl0sW1xcXFxcXFwiQkxEXFxcXFxcXCIsXFxcXFxcXCIkMS5BbGxlZ2VkOiBCTEQgYnJhbmRcXFxcXFxcIl0sW1xcXFxcXFwiREFJX2F4bFxcXFxcXFwiLFxcXFxcXFwiJDIuQWxsZWdlZDogREFJX2F4bCBicmFuZFxcXFxcXFwiXSxbXFxcXFxcXCJEQUlfZ3J2XFxcXFxcXCIsXFxcXFxcXCIkMy5BbGxlZ2VkOiBEQUlfZ3J2IGJyYW5kXFxcXFxcXCJdLFtcXFxcXFxcIklTVFxcXFxcXFwiLFxcXFxcXFwiJDQuQWxsZWdlZDogSVNUIGJyYW5kXFxcXFxcXCJdLFtcXFxcXFxcIkludml0YXRpb25cXFxcXFxcIixcXFxcXFxcIiQ1LkFsbGVnZWQ6IFpvZSBJbnZpdGF0aW9uIGJyYW5kXFxcXFxcXCJdLFtcXFxcXFxcIktSRUFkQ0hBUkFDVEVSXFxcXFxcXCIsXFxcXFxcXCIkNi5BbGxlZ2VkOiBLUkVBZENIQVJBQ1RFUiBicmFuZFxcXFxcXFwiXSxbXFxcXFxcXCJLUkVBZElURU1cXFxcXFxcIixcXFxcXFxcIiQ3LkFsbGVnZWQ6IEtSRUFkSVRFTSBicmFuZFxcXFxcXFwiXSxbXFxcXFxcXCJVU0RDX2F4bFxcXFxcXFwiLFxcXFxcXFwiJDguQWxsZWdlZDogVVNEQ19heGwgYnJhbmRcXFxcXFxcIl0sW1xcXFxcXFwiVVNEQ19ncnZcXFxcXFxcIixcXFxcXFxcIiQ5LkFsbGVnZWQ6IFVTRENfZ3J2IGJyYW5kXFxcXFxcXCJdLFtcXFxcXFxcIlVTRFRfYXhsXFxcXFxcXCIsXFxcXFxcXCIkMTAuQWxsZWdlZDogVVNEVF9heGwgYnJhbmRcXFxcXFxcIl0sW1xcXFxcXFwiVVNEVF9ncnZcXFxcXFxcIixcXFxcXFxcIiQxMS5BbGxlZ2VkOiBVU0RUX2dydiBicmFuZFxcXFxcXFwiXSxbXFxcXFxcXCJ0aW1lclxcXFxcXFwiLFxcXFxcXFwiJDEyLkFsbGVnZWQ6IHRpbWVyQnJhbmRcXFxcXFxcIl0sW1xcXFxcXFwic3RBVE9NXFxcXFxcXCIsXFxcXFxcXCIkMTMuQWxsZWdlZDogc3RBVE9NIGJyYW5kXFxcXFxcXCJdXVxcXCIsXFxcInNsb3RzXFxcIjpbXFxcImJvYXJkMDU1NTdcXFwiLFxcXCJib2FyZDA1NjZcXFwiLFxcXCJib2FyZDA1NzM2XFxcIixcXFwiYm9hcmQwMzEzOFxcXCIsXFxcImJvYXJkMDI1N1xcXCIsXFxcImJvYXJkMDA3NFxcXCIsXFxcImJvYXJkMDMyODFcXFwiLFxcXCJib2FyZDAwMjgyXFxcIixcXFwiYm9hcmQwMzA0MFxcXCIsXFxcImJvYXJkMDQ1NDJcXFwiLFxcXCJib2FyZDAxNzQ0XFxcIixcXFwiYm9hcmQwMzQ0NlxcXCIsXFxcImJvYXJkMDQyNVxcXCIsXFxcImJvYXJkMDA5OTBcXFwiXX1cIl19Igp9', + }, + }, + }, + 'http://localhost:26657/abci_query?path=%22/custom/vstorage/data/published.agoricNames.instance%22&height=0': + { + result: { + response: { + code: 0, + value: + // observed in a3p + 'ewogICJ2YWx1ZSI6ICJ7XCJibG9ja0hlaWdodFwiOlwiMTE0MVwiLFwidmFsdWVzXCI6W1wie1xcXCJib2R5XFxcIjpcXFwiI1tbXFxcXFxcXCJBVE9NLVVTRCBwcmljZSBmZWVkXFxcXFxcXCIsXFxcXFxcXCIkMC5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJDcmFiYmxlXFxcXFxcXCIsXFxcXFxcXCIkMS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJDcmFiYmxlQ29tbWl0dGVlXFxcXFxcXCIsXFxcXFxcXCIkMi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJDcmFiYmxlR292ZXJub3JcXFxcXFxcIixcXFxcXFxcIiQzLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcIlZhdWx0RmFjdG9yeVxcXFxcXFwiLFxcXFxcXFwiJDQuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiVmF1bHRGYWN0b3J5R292ZXJub3JcXFxcXFxcIixcXFxcXFxcIiQ1LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImVjb25Db21taXR0ZWVDaGFydGVyXFxcXFxcXCIsXFxcXFxcXCIkNi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJlY29ub21pY0NvbW1pdHRlZVxcXFxcXFwiLFxcXFxcXFwiJDcuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiZmVlRGlzdHJpYnV0b3JcXFxcXFxcIixcXFxcXFxcIiQ4LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImtyZWFkXFxcXFxcXCIsXFxcXFxcXCIkOS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJrcmVhZENvbW1pdHRlZVxcXFxcXFwiLFxcXFxcXFwiJDEwLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImtyZWFkQ29tbWl0dGVlQ2hhcnRlclxcXFxcXFwiLFxcXFxcXFwiJDExLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInByb3Zpc2lvblBvb2xcXFxcXFxcIixcXFxcXFxcIiQxMi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULURBSV9heGxcXFxcXFxcIixcXFxcXFxcIiQxMy5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULURBSV9ncnZcXFxcXFxcIixcXFxcXFxcIiQxNC5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULVVTRENfYXhsXFxcXFxcXCIsXFxcXFxcXCIkMTUuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1VU0RDX2dydlxcXFxcXFwiLFxcXFxcXFwiJDE2LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtVVNEVF9heGxcXFxcXFxcIixcXFxcXFxcIiQxNy5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULVVTRFRfZ3J2XFxcXFxcXCIsXFxcXFxcXCIkMTguQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicmVzZXJ2ZVxcXFxcXFwiLFxcXFxcXFwiJDE5LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInJlc2VydmVHb3Zlcm5vclxcXFxcXFwiLFxcXFxcXFwiJDIwLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInNjYWxlZFByaWNlQXV0aG9yaXR5LXN0QVRPTVxcXFxcXFwiLFxcXFxcXFwiJDIxLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInN0QVRPTS1VU0QgcHJpY2UgZmVlZFxcXFxcXFwiLFxcXFxcXFwiJDIyLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcIndhbGxldEZhY3RvcnlcXFxcXFxcIixcXFxcXFxcIiQyMy5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXV1cXFwiLFxcXCJzbG90c1xcXCI6W1xcXCJib2FyZDAyOTYzXFxcIixcXFwiYm9hcmQwNDM5NVxcXCIsXFxcImJvYXJkMDIzOTNcXFwiLFxcXCJib2FyZDA1Mzk2XFxcIixcXFwiYm9hcmQwMDM2MFxcXCIsXFxcImJvYXJkMDM3NzNcXFwiLFxcXCJib2FyZDA0NjYxXFxcIixcXFwiYm9hcmQwNDE0OVxcXCIsXFxcImJvYXJkMDUyNjJcXFwiLFxcXCJib2FyZDA0NzgzXFxcIixcXFwiYm9hcmQwMTk4NVxcXCIsXFxcImJvYXJkMDYyODRcXFwiLFxcXCJib2FyZDAxNjY0XFxcIixcXFwiYm9hcmQwMTg2N1xcXCIsXFxcImJvYXJkMDI1NjhcXFwiLFxcXCJib2FyZDA1NjY5XFxcIixcXFwiYm9hcmQwNTk3MFxcXCIsXFxcImJvYXJkMDIyNzFcXFwiLFxcXCJib2FyZDAxMjcyXFxcIixcXFwiYm9hcmQwNjQ1OFxcXCIsXFxcImJvYXJkMDMzNjVcXFwiLFxcXCJib2FyZDA1ODkyXFxcIixcXFwiYm9hcmQwNDA5MVxcXCIsXFxcImJvYXJkMDYzNjZcXFwiXX1cIixcIntcXFwiYm9keVxcXCI6XFxcIiNbW1xcXFxcXFwiQVRPTS1VU0QgcHJpY2UgZmVlZFxcXFxcXFwiLFxcXFxcXFwiJDAuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZVxcXFxcXFwiLFxcXFxcXFwiJDEuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZUNvbW1pdHRlZVxcXFxcXFwiLFxcXFxcXFwiJDIuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZUdvdmVybm9yXFxcXFxcXCIsXFxcXFxcXCIkMy5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJWYXVsdEZhY3RvcnlcXFxcXFxcIixcXFxcXFxcIiQ0LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcIlZhdWx0RmFjdG9yeUdvdmVybm9yXFxcXFxcXCIsXFxcXFxcXCIkNS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJlY29uQ29tbWl0dGVlQ2hhcnRlclxcXFxcXFwiLFxcXFxcXFwiJDYuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiZWNvbm9taWNDb21taXR0ZWVcXFxcXFxcIixcXFxcXFxcIiQ3LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImZlZURpc3RyaWJ1dG9yXFxcXFxcXCIsXFxcXFxcXCIkOC5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJrcmVhZFxcXFxcXFwiLFxcXFxcXFwiJDkuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwia3JlYWRDb21taXR0ZWVcXFxcXFxcIixcXFxcXFxcIiQxMC5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJrcmVhZENvbW1pdHRlZUNoYXJ0ZXJcXFxcXFxcIixcXFxcXFxcIiQxMS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwcm92aXNpb25Qb29sXFxcXFxcXCIsXFxcXFxcXCIkMTIuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1EQUlfYXhsXFxcXFxcXCIsXFxcXFxcXCIkMTMuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1EQUlfZ3J2XFxcXFxcXCIsXFxcXFxcXCIkMTQuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1VU0RDX2F4bFxcXFxcXFwiLFxcXFxcXFwiJDE1LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtVVNEQ19ncnZcXFxcXFxcIixcXFxcXFxcIiQxNi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULVVTRFRfYXhsXFxcXFxcXCIsXFxcXFxcXCIkMTcuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1VU0RUX2dydlxcXFxcXFwiLFxcXFxcXFwiJDE4LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInJlc2VydmVcXFxcXFxcIixcXFxcXFxcIiQxOS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJyZXNlcnZlR292ZXJub3JcXFxcXFxcIixcXFxcXFxcIiQyMC5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJzY2FsZWRQcmljZUF1dGhvcml0eS1zdEFUT01cXFxcXFxcIixcXFxcXFxcIiQyMS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJzdEFUT00tVVNEIHByaWNlIGZlZWRcXFxcXFxcIixcXFxcXFxcIiQyMi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJ3YWxsZXRGYWN0b3J5XFxcXFxcXCIsXFxcXFxcXCIkMjMuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiYXVjdGlvbmVlclxcXFxcXFwiLFxcXFxcXFwiJDI0LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdXVxcXCIsXFxcInNsb3RzXFxcIjpbXFxcImJvYXJkMDI5NjNcXFwiLFxcXCJib2FyZDA0Mzk1XFxcIixcXFwiYm9hcmQwMjM5M1xcXCIsXFxcImJvYXJkMDUzOTZcXFwiLFxcXCJib2FyZDAwMzYwXFxcIixcXFwiYm9hcmQwMzc3M1xcXCIsXFxcImJvYXJkMDQ2NjFcXFwiLFxcXCJib2FyZDA0MTQ5XFxcIixcXFwiYm9hcmQwNTI2MlxcXCIsXFxcImJvYXJkMDQ3ODNcXFwiLFxcXCJib2FyZDAxOTg1XFxcIixcXFwiYm9hcmQwNjI4NFxcXCIsXFxcImJvYXJkMDE2NjRcXFwiLFxcXCJib2FyZDAxODY3XFxcIixcXFwiYm9hcmQwMjU2OFxcXCIsXFxcImJvYXJkMDU2NjlcXFwiLFxcXCJib2FyZDA1OTcwXFxcIixcXFwiYm9hcmQwMjI3MVxcXCIsXFxcImJvYXJkMDEyNzJcXFwiLFxcXCJib2FyZDA2NDU4XFxcIixcXFwiYm9hcmQwMzM2NVxcXCIsXFxcImJvYXJkMDU4OTJcXFwiLFxcXCJib2FyZDA0MDkxXFxcIixcXFwiYm9hcmQwNjM2NlxcXCIsXFxcImJvYXJkMDYyOTlcXFwiXX1cIixcIntcXFwiYm9keVxcXCI6XFxcIiNbW1xcXFxcXFwiQVRPTS1VU0QgcHJpY2UgZmVlZFxcXFxcXFwiLFxcXFxcXFwiJDAuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZVxcXFxcXFwiLFxcXFxcXFwiJDEuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZUNvbW1pdHRlZVxcXFxcXFwiLFxcXFxcXFwiJDIuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiQ3JhYmJsZUdvdmVybm9yXFxcXFxcXCIsXFxcXFxcXCIkMy5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJWYXVsdEZhY3RvcnlcXFxcXFxcIixcXFxcXFxcIiQ0LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcIlZhdWx0RmFjdG9yeUdvdmVybm9yXFxcXFxcXCIsXFxcXFxcXCIkNS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJhdWN0aW9uZWVyXFxcXFxcXCIsXFxcXFxcXCIkNi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJlY29uQ29tbWl0dGVlQ2hhcnRlclxcXFxcXFwiLFxcXFxcXFwiJDcuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwiZWNvbm9taWNDb21taXR0ZWVcXFxcXFxcIixcXFxcXFxcIiQ4LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImZlZURpc3RyaWJ1dG9yXFxcXFxcXCIsXFxcXFxcXCIkOS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJrcmVhZFxcXFxcXFwiLFxcXFxcXFwiJDEwLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcImtyZWFkQ29tbWl0dGVlXFxcXFxcXCIsXFxcXFxcXCIkMTEuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwia3JlYWRDb21taXR0ZWVDaGFydGVyXFxcXFxcXCIsXFxcXFxcXCIkMTIuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHJvdmlzaW9uUG9vbFxcXFxcXFwiLFxcXFxcXFwiJDEzLkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtREFJX2F4bFxcXFxcXFwiLFxcXFxcXFwiJDE0LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtREFJX2dydlxcXFxcXFwiLFxcXFxcXFwiJDE1LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtVVNEQ19heGxcXFxcXFxcIixcXFxcXFxcIiQxNi5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJwc20tSVNULVVTRENfZ3J2XFxcXFxcXCIsXFxcXFxcXCIkMTcuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicHNtLUlTVC1VU0RUX2F4bFxcXFxcXFwiLFxcXFxcXFwiJDE4LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdLFtcXFxcXFxcInBzbS1JU1QtVVNEVF9ncnZcXFxcXFxcIixcXFxcXFxcIiQxOS5BbGxlZ2VkOiBJbnN0YW5jZUhhbmRsZVxcXFxcXFwiXSxbXFxcXFxcXCJyZXNlcnZlXFxcXFxcXCIsXFxcXFxcXCIkMjAuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwicmVzZXJ2ZUdvdmVybm9yXFxcXFxcXCIsXFxcXFxcXCIkMjEuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwic2NhbGVkUHJpY2VBdXRob3JpdHktc3RBVE9NXFxcXFxcXCIsXFxcXFxcXCIkMjIuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwic3RBVE9NLVVTRCBwcmljZSBmZWVkXFxcXFxcXCIsXFxcXFxcXCIkMjMuQWxsZWdlZDogSW5zdGFuY2VIYW5kbGVcXFxcXFxcIl0sW1xcXFxcXFwid2FsbGV0RmFjdG9yeVxcXFxcXFwiLFxcXFxcXFwiJDI0LkFsbGVnZWQ6IEluc3RhbmNlSGFuZGxlXFxcXFxcXCJdXVxcXCIsXFxcInNsb3RzXFxcIjpbXFxcImJvYXJkMDI5NjNcXFwiLFxcXCJib2FyZDA0Mzk1XFxcIixcXFwiYm9hcmQwMjM5M1xcXCIsXFxcImJvYXJkMDUzOTZcXFwiLFxcXCJib2FyZDAwMzYwXFxcIixcXFwiYm9hcmQwMzc3M1xcXCIsXFxcImJvYXJkMDYyOTlcXFwiLFxcXCJib2FyZDA0NjYxXFxcIixcXFwiYm9hcmQwNDE0OVxcXCIsXFxcImJvYXJkMDUyNjJcXFwiLFxcXCJib2FyZDA0NzgzXFxcIixcXFwiYm9hcmQwMTk4NVxcXCIsXFxcImJvYXJkMDYyODRcXFwiLFxcXCJib2FyZDAxNjY0XFxcIixcXFwiYm9hcmQwMTg2N1xcXCIsXFxcImJvYXJkMDI1NjhcXFwiLFxcXCJib2FyZDA1NjY5XFxcIixcXFwiYm9hcmQwNTk3MFxcXCIsXFxcImJvYXJkMDIyNzFcXFwiLFxcXCJib2FyZDAxMjcyXFxcIixcXFwiYm9hcmQwNjQ1OFxcXCIsXFxcImJvYXJkMDMzNjVcXFwiLFxcXCJib2FyZDA1ODkyXFxcIixcXFwiYm9hcmQwNDA5MVxcXCIsXFxcImJvYXJkMDYzNjZcXFwiXX1cIl19Igp9', + }, + }, + }, + 'http://localhost:26657/abci_query?path=%22/custom/vstorage/data/published.agoricNames.vbankAsset%22&height=0': + { + result: { + response: { + code: 0, + value: + // observed in a3p + 'ewogICJ2YWx1ZSI6ICJ7XCJibG9ja0hlaWdodFwiOlwiNzY5XCIsXCJ2YWx1ZXNcIjpbXCJ7XFxcImJvZHlcXFwiOlxcXCIjW1tcXFxcXFxcImliYy8yOTU1NDhBNzg3ODVBMTAwN0YyMzJERTI4NjE0OUE2RkY1MTJGMTgwQUY1NjU3NzgwRkM4OUMwMDlFMkMzNDhGXFxcXFxcXCIse1xcXFxcXFwiYnJhbmRcXFxcXFxcIjpcXFxcXFxcIiQwLkFsbGVnZWQ6IFVTRENfYXhsIGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwiaWJjLzI5NTU0OEE3ODc4NUExMDA3RjIzMkRFMjg2MTQ5QTZGRjUxMkYxODBBRjU2NTc3ODBGQzg5QzAwOUUyQzM0OEZcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjo2fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDEuQWxsZWdlZDogVVNEQ19heGwgaXNzdWVyXFxcXFxcXCIsXFxcXFxcXCJpc3N1ZXJOYW1lXFxcXFxcXCI6XFxcXFxcXCJVU0RDX2F4bFxcXFxcXFwiLFxcXFxcXFwicHJvcG9zZWROYW1lXFxcXFxcXCI6XFxcXFxcXCJVU0QgQ29pblxcXFxcXFwifV0sW1xcXFxcXFwiaWJjLzM4NkQwOUFFMzFEQTdDMEM5MzA5MUJCNDVEMDhDQjdBMDczMEIxRjY5N0NEODEzRjA2QTU0NDZEQ0YwMkVFQjJcXFxcXFxcIix7XFxcXFxcXCJicmFuZFxcXFxcXFwiOlxcXFxcXFwiJDIuQWxsZWdlZDogVVNEVF9ncnYgYnJhbmRcXFxcXFxcIixcXFxcXFxcImRlbm9tXFxcXFxcXCI6XFxcXFxcXCJpYmMvMzg2RDA5QUUzMURBN0MwQzkzMDkxQkI0NUQwOENCN0EwNzMwQjFGNjk3Q0Q4MTNGMDZBNTQ0NkRDRjAyRUVCMlxcXFxcXFwiLFxcXFxcXFwiZGlzcGxheUluZm9cXFxcXFxcIjp7XFxcXFxcXCJhc3NldEtpbmRcXFxcXFxcIjpcXFxcXFxcIm5hdFxcXFxcXFwiLFxcXFxcXFwiZGVjaW1hbFBsYWNlc1xcXFxcXFwiOjZ9LFxcXFxcXFwiaXNzdWVyXFxcXFxcXCI6XFxcXFxcXCIkMy5BbGxlZ2VkOiBVU0RUX2dydiBpc3N1ZXJcXFxcXFxcIixcXFxcXFxcImlzc3Vlck5hbWVcXFxcXFxcIjpcXFxcXFxcIlVTRFRfZ3J2XFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcIlRldGhlciBVU0RcXFxcXFxcIn1dLFtcXFxcXFxcImliYy8zOTE0QkRFRjQ2RjQyOUEyNjkxN0U0RDhENDM0NjIwRUM0ODE3REM2QjZFNjhGQjMyN0UxOTA5MDJGMUU5MjQyXFxcXFxcXCIse1xcXFxcXFwiYnJhbmRcXFxcXFxcIjpcXFxcXFxcIiQ0LkFsbGVnZWQ6IERBSV9heGwgYnJhbmRcXFxcXFxcIixcXFxcXFxcImRlbm9tXFxcXFxcXCI6XFxcXFxcXCJpYmMvMzkxNEJERUY0NkY0MjlBMjY5MTdFNEQ4RDQzNDYyMEVDNDgxN0RDNkI2RTY4RkIzMjdFMTkwOTAyRjFFOTI0MlxcXFxcXFwiLFxcXFxcXFwiZGlzcGxheUluZm9cXFxcXFxcIjp7XFxcXFxcXCJhc3NldEtpbmRcXFxcXFxcIjpcXFxcXFxcIm5hdFxcXFxcXFwiLFxcXFxcXFwiZGVjaW1hbFBsYWNlc1xcXFxcXFwiOjE4fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDUuQWxsZWdlZDogREFJX2F4bCBpc3N1ZXJcXFxcXFxcIixcXFxcXFxcImlzc3Vlck5hbWVcXFxcXFxcIjpcXFxcXFxcIkRBSV9heGxcXFxcXFxcIixcXFxcXFxcInByb3Bvc2VkTmFtZVxcXFxcXFwiOlxcXFxcXFwiREFJXFxcXFxcXCJ9XSxbXFxcXFxcXCJpYmMvM0Q1MjkxQzIzRDc3NkMzQUE3QTdBQkIzNEM3QjAyMzE5M0VDRDJCQzQyRUExOUQzMTY1QjJDRjk2NTIxMTdFN1xcXFxcXFwiLHtcXFxcXFxcImJyYW5kXFxcXFxcXCI6XFxcXFxcXCIkNi5BbGxlZ2VkOiBEQUlfZ3J2IGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwiaWJjLzNENTI5MUMyM0Q3NzZDM0FBN0E3QUJCMzRDN0IwMjMxOTNFQ0QyQkM0MkVBMTlEMzE2NUIyQ0Y5NjUyMTE3RTdcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjoxOH0sXFxcXFxcXCJpc3N1ZXJcXFxcXFxcIjpcXFxcXFxcIiQ3LkFsbGVnZWQ6IERBSV9ncnYgaXNzdWVyXFxcXFxcXCIsXFxcXFxcXCJpc3N1ZXJOYW1lXFxcXFxcXCI6XFxcXFxcXCJEQUlfZ3J2XFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcIkRBSVxcXFxcXFwifV0sW1xcXFxcXFwiaWJjLzQyMjI1RjE0NzEzN0RERUI1RkVGMEYxRDBBOTJGMkFENTc1NTdBRkEyQzRENkYzMEIyMUUwRDk4MzAwMUMwMDJcXFxcXFxcIix7XFxcXFxcXCJicmFuZFxcXFxcXFwiOlxcXFxcXFwiJDguQWxsZWdlZDogc3RBVE9NIGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwiaWJjLzQyMjI1RjE0NzEzN0RERUI1RkVGMEYxRDBBOTJGMkFENTc1NTdBRkEyQzRENkYzMEIyMUUwRDk4MzAwMUMwMDJcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjo2fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDkuQWxsZWdlZDogc3RBVE9NIGlzc3VlclxcXFxcXFwiLFxcXFxcXFwiaXNzdWVyTmFtZVxcXFxcXFwiOlxcXFxcXFwic3RBVE9NXFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcInN0QVRPTVxcXFxcXFwifV0sW1xcXFxcXFwiaWJjLzY4MzEyOTI5MDM0ODdFNThCRjlBMTk1RkREQzhBMkU2MjZCM0RGMzlCODhGNEU3RjQxQzkzNUNBREJBRjU0QUNcXFxcXFxcIix7XFxcXFxcXCJicmFuZFxcXFxcXFwiOlxcXFxcXFwiJDEwLkFsbGVnZWQ6IFVTRENfZ3J2IGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwiaWJjLzY4MzEyOTI5MDM0ODdFNThCRjlBMTk1RkREQzhBMkU2MjZCM0RGMzlCODhGNEU3RjQxQzkzNUNBREJBRjU0QUNcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjo2fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDExLkFsbGVnZWQ6IFVTRENfZ3J2IGlzc3VlclxcXFxcXFwiLFxcXFxcXFwiaXNzdWVyTmFtZVxcXFxcXFwiOlxcXFxcXFwiVVNEQ19ncnZcXFxcXFxcIixcXFxcXFxcInByb3Bvc2VkTmFtZVxcXFxcXFwiOlxcXFxcXFwiVVNDIENvaW5cXFxcXFxcIn1dLFtcXFxcXFxcImliYy9CQTMxM0M0QTE5REZCRjk0MzU4NkMwMzg3RTZCMTEyODZGOUU0MTZCNEREMjc1NzRFNjkwOUNBQkUwRTM0MkZBXFxcXFxcXCIse1xcXFxcXFwiYnJhbmRcXFxcXFxcIjpcXFxcXFxcIiQxMi5BbGxlZ2VkOiBBVE9NIGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwiaWJjL0JBMzEzQzRBMTlERkJGOTQzNTg2QzAzODdFNkIxMTI4NkY5RTQxNkI0REQyNzU3NEU2OTA5Q0FCRTBFMzQyRkFcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjo2fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDEzLkFsbGVnZWQ6IEFUT00gaXNzdWVyXFxcXFxcXCIsXFxcXFxcXCJpc3N1ZXJOYW1lXFxcXFxcXCI6XFxcXFxcXCJBVE9NXFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcIkFUT01cXFxcXFxcIn1dLFtcXFxcXFxcImliYy9GMjMzMTY0NUI5NjgzMTE2MTg4RUYzNkZDMDRBODA5QzI4QkQzNkI1NDU1NUU4NzA1QTM3MTQ2RDAxODJGMDQ1XFxcXFxcXCIse1xcXFxcXFwiYnJhbmRcXFxcXFxcIjpcXFxcXFxcIiQxNC5BbGxlZ2VkOiBVU0RUX2F4bCBicmFuZFxcXFxcXFwiLFxcXFxcXFwiZGVub21cXFxcXFxcIjpcXFxcXFxcImliYy9GMjMzMTY0NUI5NjgzMTE2MTg4RUYzNkZDMDRBODA5QzI4QkQzNkI1NDU1NUU4NzA1QTM3MTQ2RDAxODJGMDQ1XFxcXFxcXCIsXFxcXFxcXCJkaXNwbGF5SW5mb1xcXFxcXFwiOntcXFxcXFxcImFzc2V0S2luZFxcXFxcXFwiOlxcXFxcXFwibmF0XFxcXFxcXCIsXFxcXFxcXCJkZWNpbWFsUGxhY2VzXFxcXFxcXCI6Nn0sXFxcXFxcXCJpc3N1ZXJcXFxcXFxcIjpcXFxcXFxcIiQxNS5BbGxlZ2VkOiBVU0RUX2F4bCBpc3N1ZXJcXFxcXFxcIixcXFxcXFxcImlzc3Vlck5hbWVcXFxcXFxcIjpcXFxcXFxcIlVTRFRfYXhsXFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcIlRldGhlciBVU0RcXFxcXFxcIn1dLFtcXFxcXFxcInVibGRcXFxcXFxcIix7XFxcXFxcXCJicmFuZFxcXFxcXFwiOlxcXFxcXFwiJDE2LkFsbGVnZWQ6IEJMRCBicmFuZFxcXFxcXFwiLFxcXFxcXFwiZGVub21cXFxcXFxcIjpcXFxcXFxcInVibGRcXFxcXFxcIixcXFxcXFxcImRpc3BsYXlJbmZvXFxcXFxcXCI6e1xcXFxcXFwiYXNzZXRLaW5kXFxcXFxcXCI6XFxcXFxcXCJuYXRcXFxcXFxcIixcXFxcXFxcImRlY2ltYWxQbGFjZXNcXFxcXFxcIjo2fSxcXFxcXFxcImlzc3VlclxcXFxcXFwiOlxcXFxcXFwiJDE3LkFsbGVnZWQ6IEJMRCBpc3N1ZXJcXFxcXFxcIixcXFxcXFxcImlzc3Vlck5hbWVcXFxcXFxcIjpcXFxcXFxcIkJMRFxcXFxcXFwiLFxcXFxcXFwicHJvcG9zZWROYW1lXFxcXFxcXCI6XFxcXFxcXCJBZ29yaWMgc3Rha2luZyB0b2tlblxcXFxcXFwifV0sW1xcXFxcXFwidWlzdFxcXFxcXFwiLHtcXFxcXFxcImJyYW5kXFxcXFxcXCI6XFxcXFxcXCIkMTguQWxsZWdlZDogSVNUIGJyYW5kXFxcXFxcXCIsXFxcXFxcXCJkZW5vbVxcXFxcXFwiOlxcXFxcXFwidWlzdFxcXFxcXFwiLFxcXFxcXFwiZGlzcGxheUluZm9cXFxcXFxcIjp7XFxcXFxcXCJhc3NldEtpbmRcXFxcXFxcIjpcXFxcXFxcIm5hdFxcXFxcXFwiLFxcXFxcXFwiZGVjaW1hbFBsYWNlc1xcXFxcXFwiOjZ9LFxcXFxcXFwiaXNzdWVyXFxcXFxcXCI6XFxcXFxcXCIkMTkuQWxsZWdlZDogSVNUIGlzc3VlclxcXFxcXFwiLFxcXFxcXFwiaXNzdWVyTmFtZVxcXFxcXFwiOlxcXFxcXFwiSVNUXFxcXFxcXCIsXFxcXFxcXCJwcm9wb3NlZE5hbWVcXFxcXFxcIjpcXFxcXFxcIkFnb3JpYyBzdGFibGUgdG9rZW5cXFxcXFxcIn1dXVxcXCIsXFxcInNsb3RzXFxcIjpbXFxcImJvYXJkMDMwNDBcXFwiLFxcXCJib2FyZDA1MTQxXFxcIixcXFwiYm9hcmQwMzQ0NlxcXCIsXFxcImJvYXJkMDE1NDdcXFwiLFxcXCJib2FyZDA1NzM2XFxcIixcXFwiYm9hcmQwMjQzN1xcXCIsXFxcImJvYXJkMDMxMzhcXFwiLFxcXCJib2FyZDA1MDM5XFxcIixcXFwiYm9hcmQwMDk5MFxcXCIsXFxcImJvYXJkMDA2ODlcXFwiLFxcXCJib2FyZDA0NTQyXFxcIixcXFwiYm9hcmQwMDQ0M1xcXCIsXFxcImJvYXJkMDU1NTdcXFwiLFxcXCJib2FyZDAyNjU2XFxcIixcXFwiYm9hcmQwMTc0NFxcXCIsXFxcImJvYXJkMDY0NDVcXFwiLFxcXCJib2FyZDA1NjZcXFwiLFxcXCJib2FyZDA1OTJcXFwiLFxcXCJib2FyZDAyNTdcXFwiLFxcXCJib2FyZDAyMjNcXFwiXX1cIl19Igp9', + }, + }, + }, + 'http://localhost:26657/abci_query?path=%22/custom/vstorage/data/published.priceFeed.ATOM-USD_price_feed%22&height=0': + { + result: { + response: { + code: 0, + value: + // observed in a3p + 'ewogICJ2YWx1ZSI6ICJ7XCJibG9ja0hlaWdodFwiOlwiNTA4XCIsXCJ2YWx1ZXNcIjpbXCJ7XFxcImJvZHlcXFwiOlxcXCIje1xcXFxcXFwiYW1vdW50SW5cXFxcXFxcIjp7XFxcXFxcXCJicmFuZFxcXFxcXFwiOlxcXFxcXFwiJDAuQWxsZWdlZDogQnJhbmRcXFxcXFxcIixcXFxcXFxcInZhbHVlXFxcXFxcXCI6XFxcXFxcXCIrMTAwMDAwMFxcXFxcXFwifSxcXFxcXFxcImFtb3VudE91dFxcXFxcXFwiOntcXFxcXFxcImJyYW5kXFxcXFxcXCI6XFxcXFxcXCIkMS5BbGxlZ2VkOiBCcmFuZFxcXFxcXFwiLFxcXFxcXFwidmFsdWVcXFxcXFxcIjpcXFxcXFxcIisxMjAxMDAwMFxcXFxcXFwifSxcXFxcXFxcInRpbWVyXFxcXFxcXCI6XFxcXFxcXCIkMi5BbGxlZ2VkOiB0aW1lclNlcnZpY2VcXFxcXFxcIixcXFxcXFxcInRpbWVzdGFtcFxcXFxcXFwiOntcXFxcXFxcImFic1ZhbHVlXFxcXFxcXCI6XFxcXFxcXCIrMTcyOTE3NjI5MFxcXFxcXFwiLFxcXFxcXFwidGltZXJCcmFuZFxcXFxcXFwiOlxcXFxcXFwiJDMuQWxsZWdlZDogdGltZXJCcmFuZFxcXFxcXFwifX1cXFwiLFxcXCJzbG90c1xcXCI6W1xcXCJib2FyZDAzOTM1XFxcIixcXFwiYm9hcmQwMTAzNFxcXCIsXFxcImJvYXJkMDU2NzRcXFwiLFxcXCJib2FyZDA0MjVcXFwiXX1cIixcIntcXFwiYm9keVxcXCI6XFxcIiN7XFxcXFxcXCJhbW91bnRJblxcXFxcXFwiOntcXFxcXFxcImJyYW5kXFxcXFxcXCI6XFxcXFxcXCIkMC5BbGxlZ2VkOiBCcmFuZFxcXFxcXFwiLFxcXFxcXFwidmFsdWVcXFxcXFxcIjpcXFxcXFxcIisxMDAwMDAwXFxcXFxcXCJ9LFxcXFxcXFwiYW1vdW50T3V0XFxcXFxcXCI6e1xcXFxcXFwiYnJhbmRcXFxcXFxcIjpcXFxcXFxcIiQxLkFsbGVnZWQ6IEJyYW5kXFxcXFxcXCIsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOlxcXFxcXFwiKzEyMDEwMDAwXFxcXFxcXCJ9LFxcXFxcXFwidGltZXJcXFxcXFxcIjpcXFxcXFxcIiQyLkFsbGVnZWQ6IHRpbWVyU2VydmljZVxcXFxcXFwiLFxcXFxcXFwidGltZXN0YW1wXFxcXFxcXCI6e1xcXFxcXFwiYWJzVmFsdWVcXFxcXFxcIjpcXFxcXFxcIisxNzI5MTc2MjkwXFxcXFxcXCIsXFxcXFxcXCJ0aW1lckJyYW5kXFxcXFxcXCI6XFxcXFxcXCIkMy5BbGxlZ2VkOiB0aW1lckJyYW5kXFxcXFxcXCJ9fVxcXCIsXFxcInNsb3RzXFxcIjpbXFxcImJvYXJkMDM5MzVcXFwiLFxcXCJib2FyZDAxMDM0XFxcIixcXFwiYm9hcmQwNTY3NFxcXCIsXFxcImJvYXJkMDQyNVxcXCJdfVwiXX0iCn0', + }, + }, + }, + }); + + const vstorageKit = makeVstorageKit({ fetch }, makeTestConfig()); + const agoricNames = await makeAgoricNames( + vstorageKit.fromBoard, + vstorageKit.vstorage, + ); + + t.snapshot(agoricNames, 'agoricNames from A3P'); + + const priceFeed = await vstorageKit.readPublished( + 'priceFeed.ATOM-USD_price_feed', + ); + t.snapshot(priceFeed, 'priceFeed from A3P'); +}); diff --git a/packages/client-utils/test/vstorage.test.js b/packages/client-utils/test/vstorage.test.js new file mode 100644 index 00000000000..17de8f02700 --- /dev/null +++ b/packages/client-utils/test/vstorage.test.js @@ -0,0 +1,18 @@ +/* eslint-env node */ +// @ts-check +import test from 'ava'; +import { makeVStorage } from '../src/vstorage.js'; + +/** @type {any} */ +const fetch = () => Promise.resolve({}); + +test('readFully can be used without instance binding', async t => { + const vstorage = makeVStorage({ fetch }, { chainName: '', rpcAddrs: [''] }); + const { readFully } = vstorage; + + // Mock implementation to avoid actual network calls + vstorage.readAt = async () => ({ blockHeight: 0, values: ['test'] }); + + // This would throw if readFully required 'this' binding + await t.notThrowsAsync(() => readFully('some/path')); +}); diff --git a/packages/client-utils/tsconfig.json b/packages/client-utils/tsconfig.json new file mode 100644 index 00000000000..f690da86a72 --- /dev/null +++ b/packages/client-utils/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": {}, + "include": [ + "scripts", + "src", + "test", + ], +} diff --git a/packages/cosmic-proto/.eslintignore b/packages/cosmic-proto/.eslintignore index 884f4d8432d..7eee12970a7 100644 --- a/packages/cosmic-proto/.eslintignore +++ b/packages/cosmic-proto/.eslintignore @@ -1,6 +1,7 @@ +# keep synchronized with ../../.eslintignore node_modules/ -dist/ -main/ -module/ coverage/ -src/codegen/ +dist/ +proto/ +# leading `**` ensures that this pattern still matches relative to project root +**/src/codegen/ diff --git a/packages/cosmic-proto/.gitignore b/packages/cosmic-proto/.gitignore deleted file mode 100644 index 5290a01927e..00000000000 --- a/packages/cosmic-proto/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# cache -.tsimp diff --git a/packages/cosmic-proto/package.json b/packages/cosmic-proto/package.json index f237d063c34..cbf43899cb6 100644 --- a/packages/cosmic-proto/package.json +++ b/packages/cosmic-proto/package.json @@ -20,6 +20,10 @@ "default": "./dist/index.js" }, "./package.json": "./package.json", + "./address-hooks.js": { + "types": "./dist/address-hooks.d.ts", + "default": "./dist/address-hooks.js" + }, "./agoric/*.js": { "types": "./dist/codegen/agoric/*.d.ts", "default": "./dist/codegen/agoric/*.js" @@ -133,7 +137,9 @@ "codegen": "./update-protos.sh && node scripts/codegen.cjs", "prepare": "npm run build", "lint-fix": "yarn lint:eslint --fix", - "lint": "tsc", + "lint": "run-s --continue-on-error lint:*", + "lint:types": "tsc", + "lint:eslint": "eslint .", "test": "ava", "test:xs": "exit 0", "test:live": "yarn build && scripts/test-live.js" @@ -145,17 +151,19 @@ "@agoric/cosmos": "^0.35.0-u18.4", "@ava/typescript": "^4.1.0", "@cosmology/telescope": "https://gitpkg.vercel.app/agoric-labs/telescope/packages/telescope?8d2c2f6ba637a5578eead09a7368dc41c262a9d0", - "@endo/bundle-source": "^3.4.2", - "@endo/import-bundle": "^1.3.1", + "@endo/bundle-source": "^3.5.0", + "@endo/import-bundle": "^1.3.2", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.1", "rimraf": "^5.0.0", "tsd": "^0.31.1", - "tsimp": "^2.0.11", - "typescript": "~5.6.2" + "typescript": "~5.7.1" }, "dependencies": { - "@endo/base64": "^1.0.8", - "@endo/init": "^1.1.6" + "@endo/base64": "^1.0.9", + "@endo/init": "^1.1.7", + "bech32": "^2.0.0", + "query-string": "^9.1.1" }, "resolutions": { "**/axios": "^1.6.7", diff --git a/packages/cosmic-proto/proto/agoric/swingset/swingset.proto b/packages/cosmic-proto/proto/agoric/swingset/swingset.proto index 7a7c7a16d14..fdfd5f722f4 100644 --- a/packages/cosmic-proto/proto/agoric/swingset/swingset.proto +++ b/packages/cosmic-proto/proto/agoric/swingset/swingset.proto @@ -82,6 +82,18 @@ message Params { repeated QueueSize queue_max = 5 [ (gogoproto.nullable) = false ]; + + // Vat cleanup budget values. + // These values are used by SwingSet to control the pace of removing data + // associated with a terminated vat as described at + // https://github.com/Agoric/agoric-sdk/blob/master/packages/SwingSet/docs/run-policy.md#terminated-vat-cleanup + // + // There is no required order to this list of entries, but all the chain + // nodes must all serialize and deserialize the existing order without + // permuting it. + repeated UintMapEntry vat_cleanup_budget = 6 [ + (gogoproto.nullable) = false + ]; } // The current state of the module. @@ -119,6 +131,7 @@ message PowerFlagFee { } // Map element of a string key to a size. +// TODO: Replace with UintMapEntry? message QueueSize { option (gogoproto.equal) = true; @@ -129,6 +142,18 @@ message QueueSize { int32 size = 2; } +// Map element of a string key to an unsigned integer. +// The value uses cosmos-sdk Uint rather than a native Go type to ensure that +// zeroes survive "omitempty" JSON serialization. +message UintMapEntry { + option (gogoproto.equal) = true; + string key = 1; + string value = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint", + (gogoproto.nullable) = false + ]; +} + // Egress is the format for a swingset egress. message Egress { option (gogoproto.equal) = false; diff --git a/packages/cosmic-proto/proto/agoric/vbank/vbank.proto b/packages/cosmic-proto/proto/agoric/vbank/vbank.proto index 7884abecc9a..4b47cf71c70 100644 --- a/packages/cosmic-proto/proto/agoric/vbank/vbank.proto +++ b/packages/cosmic-proto/proto/agoric/vbank/vbank.proto @@ -33,6 +33,13 @@ message Params { int64 reward_smoothing_blocks = 3 [ (gogoproto.moretags) = "yaml:\"reward_smoothing_blocks\"" ]; + + // allowed_monitoring_accounts is an array of account addresses that can be + // monitored for sends and receives. An element of `"*"` will permit any + // address. + repeated string allowed_monitoring_accounts = 4 [ + (gogoproto.moretags) = "yaml:\"allowed_monitoring_accounts\"" + ]; } // The current state of the module. diff --git a/packages/cosmic-proto/scripts/codegen.cjs b/packages/cosmic-proto/scripts/codegen.cjs index 62d68c7451e..296fcb07c2e 100644 --- a/packages/cosmic-proto/scripts/codegen.cjs +++ b/packages/cosmic-proto/scripts/codegen.cjs @@ -1,4 +1,6 @@ -const { exec, spawnSync } = require('child_process'); +#!/usr/bin/env node +/* eslint-env node */ +const { exec, execSync, spawnSync } = require('child_process'); const path = require('path'); const process = require('process'); const telescope = require('@cosmology/telescope').default; @@ -12,11 +14,12 @@ rimraf(outPath); * Make the JsonSafe type import compatible with TS verbatimImportSyntax * * @param {string} directory + * @param {boolean} gnuSed */ -function fixTypeImport(directory) { +function fixTypeImport(directory, gnuSed) { const fullPath = path.resolve(directory); const command = ` - find ${fullPath} -type f -exec sed -i '' \ + find ${fullPath} -type f -exec ${gnuSed ? 'sed -i' : 'sed -i ""'} \ -e 's/import { JsonSafe/import {type JsonSafe/g' \ -e 's/\\([{,]\\) \\([[:alnum:]_]*SDKType\\)/\\1 type \\2/g' {} + `; @@ -28,7 +31,6 @@ function fixTypeImport(directory) { } if (stderr) { console.error(`Standard error: ${stderr}`); - return; } }); } @@ -126,7 +128,11 @@ telescope({ console.log('🔨 code generated by Telescope'); // for all files under codegen/ replace "import { JsonSafe" with "import type { JsonSafe" - fixTypeImport('./src/codegen'); + const gnuSed = + execSync(`sed --help 2>&1 | sed 2q | grep -qe '-i ' || printf gnu`, { + encoding: 'utf8', + }) === 'gnu'; + fixTypeImport('./src/codegen', gnuSed); console.log('🔧 type keyword added'); spawnSync('yarn', ['prettier', '--write', 'src'], { diff --git a/packages/cosmic-proto/scripts/test-live.js b/packages/cosmic-proto/scripts/test-live.js deleted file mode 100755 index 80cc7d76529..00000000000 --- a/packages/cosmic-proto/scripts/test-live.js +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env node -// @ts-check -import '@endo/init'; - -import process from 'node:process'; -import assert from 'node:assert/strict'; - -import { agoric } from '../dist/codegen/index.js'; - -const rpcEndpoint = 'https://emerynet.rpc.agoric.net:443'; - -const testMain = async () => { - const client = await agoric.ClientFactory.createRPCQueryClient({ - rpcEndpoint, - }); - const { params } = await client.agoric.swingset.params(); - assert.deepEqual(Object.keys(params).sort(), [ - 'beansPerUnit', - 'bootstrapVatConfig', - 'feeUnitPrice', - 'powerFlagFees', - 'queueMax', - ]); - console.log('✅ SwingSet params query successful'); -}; - -process.exitCode = 1; -testMain().then( - () => { - process.exitCode = 0; - }, - err => { - console.error('Failed with', err); - process.exit(process.exitCode || 1); - }, -); diff --git a/packages/cosmic-proto/src/address-hooks.js b/packages/cosmic-proto/src/address-hooks.js new file mode 100644 index 00000000000..c1dcb2e415a --- /dev/null +++ b/packages/cosmic-proto/src/address-hooks.js @@ -0,0 +1,269 @@ +/** + * This module provides functions for encoding and decoding address hooks + * which are comprised of a bech32 base address with an HTTP query string, all + * wrapped in a bech32 envelope. + * + * @module address-hooks.js + * @example + * + * import { + * encodeAddressHook, + * decodeAddressHook, + * } from '@agoric/cosmic-proto/address-hooks.js'; + * + * const baseAddress = 'agoric1qqp0e5ys'; + * const query = { key: 'value', foo: ['bar', 'baz'] }; + * + * const addressHook = encodeAddressHook(baseAddress, query); + * // 'agoric10rchqqplvehk70tzv9ezven0du7kyct6ye4k27faweskcat9qqqstnf2eq' + * + * addressHook.startsWith('agoric10rch'); + * // true + * + * const decoded = decodeAddressHook(addressHook); + * // { + * // baseAddress: 'agoric1qqp0e5ys', + * // query: { foo: [ 'bar', 'baz' ], key: 'value' } + * // } + */ + +/* eslint-disable no-bitwise */ +import { bech32 } from 'bech32'; +import queryString from 'query-string'; + +/* global globalThis */ +/** @type {(x: T) => T} */ +const harden = globalThis.harden || Object.freeze; + +// ADDRESS_HOOK_VERSION is the version of the address hook format used in this +// module. +const ADDRESS_HOOK_VERSION = 0; + +if ((ADDRESS_HOOK_VERSION & 0x0f) !== ADDRESS_HOOK_VERSION) { + throw Error(`ADDRESS_HOOK_VERSION ${ADDRESS_HOOK_VERSION} exceeds 0x0f`); +} + +// ADDRESS_HOOK_BYTE_PREFIX is a magic prefix that identifies a hooked address. +// Chosen to make bech32 address hooks that look like "agoric10rch..." +const ADDRESS_HOOK_BYTE_PREFIX = [ + 0x78, + 0xf1, + 0x70, // | ADDRESS_HOOK_VERSION +]; +harden(ADDRESS_HOOK_BYTE_PREFIX); + +/** + * The default maximum number of characters in a bech32-encoded hooked address. + */ +export const DEFAULT_HOOKED_ADDRESS_CHAR_LIMIT = 1024; + +/** + * @typedef {Record} HookQuery A + * record of query keys mapped to query values. `null` values denote valueless + * keys. Array values denote multiple occurrences of a key: + * + * { key: null } // '?key' + * { key: 'value' } // '?key=value' + * { key: ['value1', 'value2', 'value3'] } // '?key=value1&key=value2&key=value3' + * { key: ['value1', null, 'value3'] } // '?key=value1&key&key=value3' + */ + +/** + * How many bytes are used to store the length of the base address. + */ +export const BASE_ADDRESS_LENGTH_BYTES = 2; + +/** + * @param {string} specimen + * @param {number} [charLimit] + * @returns {{ prefix: string; bytes: Uint8Array }} + */ +export const decodeBech32 = ( + specimen, + charLimit = DEFAULT_HOOKED_ADDRESS_CHAR_LIMIT, +) => { + const { prefix, words } = bech32.decode(specimen, charLimit); + const rawBytes = bech32.fromWords(words); + + const bytes = new Uint8Array(rawBytes); + return harden({ prefix, bytes }); +}; +harden(decodeBech32); + +/** + * @param {string} humanReadablePart + * @param {ArrayLike} bytes + * @param {number} [charLimit] + * @returns {string} + */ +export const encodeBech32 = ( + humanReadablePart, + bytes, + charLimit = DEFAULT_HOOKED_ADDRESS_CHAR_LIMIT, +) => { + const words = bech32.toWords(bytes); + return bech32.encode(humanReadablePart, words, charLimit); +}; +harden(encodeBech32); + +/** + * Join raw base address bytes and hook data into a bech32-encoded hooked + * address. The bech32-payload is: + * + * | offset | 0 | 3 | 3+len(baseAddress) | len(payload)-2 | + * | ------ | ----- | ----------- | ------------------ | ---------------- | + * | data | magic | baseAddress | hookData | len(baseAddress) | + * + * `magic` is a 3-byte prefix that identifies a hooked address and its version + * nibble, whose value is 4 bits (between 0 and 0xf (15)). Currently, the only + * supported version is 0. + * + * 0x78, 0xf1, (0x70 | ADDRESS_HOOK_VERSION), + * + * This magic prefix encodes as `0rch`, regardless of the version or HRP (e.g. + * `agoric10rch`). + * + * @param {string} baseAddress + * @param {ArrayLike} hookData + * @param {number} [charLimit] + * @returns {string} + */ +export const joinHookedAddress = ( + baseAddress, + hookData, + charLimit = DEFAULT_HOOKED_ADDRESS_CHAR_LIMIT, +) => { + const { prefix, bytes } = decodeBech32(baseAddress, charLimit); + + const baseAddressLength = bytes.length; + const b = baseAddressLength; + const hd = hookData.length; + + const maxBaseAddressLength = 2 ** (BASE_ADDRESS_LENGTH_BYTES * 8); + if (b >= maxBaseAddressLength) { + throw RangeError( + `Base address length 0x${b.toString(16)} exceeds maximum 0x${maxBaseAddressLength.toString(16)}`, + ); + } + + if (!Number.isSafeInteger(hd) || hd < 0) { + throw RangeError(`Hook data length ${hd} is not a non-negative integer`); + } + + const prefixLength = ADDRESS_HOOK_BYTE_PREFIX.length; + const hookBuf = new Uint8Array( + prefixLength + b + hd + BASE_ADDRESS_LENGTH_BYTES, + ); + hookBuf.set(ADDRESS_HOOK_BYTE_PREFIX, 0); + hookBuf[prefixLength - 1] |= ADDRESS_HOOK_VERSION; + hookBuf.set(bytes, prefixLength); + hookBuf.set(hookData, prefixLength + b); + + // Append the address length bytes, since we've already ensured these do not + // exceed maxBaseAddressLength above. These are big-endian because the length + // is at the end of the payload, so if we want to support more bytes for the + // length, we just need encroach further into the payload. We can do that + // without changing the meaning of the bytes at the end of existing payloads. + let len = b; + for (let i = 0; i < BASE_ADDRESS_LENGTH_BYTES; i += 1) { + hookBuf[hookBuf.length - 1 - i] = len & 0xff; + len >>>= 8; + } + + return encodeBech32(prefix, hookBuf, charLimit); +}; +harden(joinHookedAddress); + +/** + * @param {string} baseAddress + * @param {HookQuery} query + * @param {number} [charLimit] + */ +export const encodeAddressHook = (baseAddress, query, charLimit) => { + const queryStr = queryString.stringify(query); + + const te = new TextEncoder(); + const hookData = te.encode(`?${queryStr}`); + return joinHookedAddress(baseAddress, hookData, charLimit); +}; +harden(encodeAddressHook); + +/** + * @param {string} addressHook + * @param {number} [charLimit] + * @returns {{ baseAddress: string; query: HookQuery }} + * @throws {Error} if no hook string or hook string does not start with `?` + */ +export const decodeAddressHook = (addressHook, charLimit) => { + const { baseAddress, hookData } = splitHookedAddress(addressHook, charLimit); + const hookStr = new TextDecoder().decode(hookData); + if (hookStr && !hookStr.startsWith('?')) { + throw Error(`Hook data does not start with '?': ${hookStr}`); + } + + const parsedQuery = queryString.parse(hookStr); + + /** + * @type {HookQuery} + */ + const query = harden({ ...parsedQuery }); + return harden({ baseAddress, query }); +}; +harden(decodeAddressHook); + +/** + * @param {string} specimen + * @param {number} [charLimit] + * @returns {{ baseAddress: string; hookData: Uint8Array }} + */ +export const splitHookedAddress = ( + specimen, + charLimit = DEFAULT_HOOKED_ADDRESS_CHAR_LIMIT, +) => { + const { prefix, bytes } = decodeBech32(specimen, charLimit); + + const prefixLength = ADDRESS_HOOK_BYTE_PREFIX.length; + let version = 0xff; + for (let i = 0; i < prefixLength; i += 1) { + let maybeMagicByte = bytes[i]; + if (i === prefixLength - 1) { + // Final byte has a low version nibble and a high magic nibble. + version = maybeMagicByte & 0x0f; + maybeMagicByte &= 0xf0; + } + if (maybeMagicByte !== ADDRESS_HOOK_BYTE_PREFIX[i]) { + return harden({ baseAddress: specimen, hookData: new Uint8Array() }); + } + } + + if (version !== ADDRESS_HOOK_VERSION) { + throw TypeError(`Unsupported address hook version ${version}`); + } + + let len = 0; + for (let i = BASE_ADDRESS_LENGTH_BYTES - 1; i >= 0; i -= 1) { + const byte = bytes.at(-i - 1); + if (byte === undefined) { + throw TypeError( + `Cannot get base address length from byte ${-i - 1} of ${bytes.length}`, + ); + } + len <<= 8; + len |= byte; + } + + const b = len; + if (b > bytes.length - BASE_ADDRESS_LENGTH_BYTES - prefixLength) { + throw TypeError( + `Base address length 0x${b.toString(16)} is longer than specimen length ${bytes.length - BASE_ADDRESS_LENGTH_BYTES - prefixLength}`, + ); + } + + const baseAddressBuf = bytes.subarray(prefixLength, prefixLength + b); + const baseAddress = encodeBech32(prefix, baseAddressBuf, charLimit); + + const hookData = bytes.subarray(prefixLength + b, -BASE_ADDRESS_LENGTH_BYTES); + + return harden({ baseAddress, hookData }); +}; +harden(splitHookedAddress); diff --git a/packages/cosmic-proto/src/codegen/agoric/swingset/swingset.ts b/packages/cosmic-proto/src/codegen/agoric/swingset/swingset.ts index 29464d50d08..3f978f341fa 100644 --- a/packages/cosmic-proto/src/codegen/agoric/swingset/swingset.ts +++ b/packages/cosmic-proto/src/codegen/agoric/swingset/swingset.ts @@ -103,6 +103,17 @@ export interface Params { * permuting it. */ queueMax: QueueSize[]; + /** + * Vat cleanup budget values. + * These values are used by SwingSet to control the pace of removing data + * associated with a terminated vat as described at + * https://github.com/Agoric/agoric-sdk/blob/master/packages/SwingSet/docs/run-policy.md#terminated-vat-cleanup + * + * There is no required order to this list of entries, but all the chain + * nodes must all serialize and deserialize the existing order without + * permuting it. + */ + vatCleanupBudget: UintMapEntry[]; } export interface ParamsProtoMsg { typeUrl: '/agoric.swingset.Params'; @@ -115,6 +126,7 @@ export interface ParamsSDKType { bootstrap_vat_config: string; power_flag_fees: PowerFlagFeeSDKType[]; queue_max: QueueSizeSDKType[]; + vat_cleanup_budget: UintMapEntrySDKType[]; } /** The current state of the module. */ export interface State { @@ -162,7 +174,10 @@ export interface PowerFlagFeeSDKType { power_flag: string; fee: CoinSDKType[]; } -/** Map element of a string key to a size. */ +/** + * Map element of a string key to a size. + * TODO: Replace with UintMapEntry? + */ export interface QueueSize { /** What the size is for. */ key: string; @@ -173,11 +188,36 @@ export interface QueueSizeProtoMsg { typeUrl: '/agoric.swingset.QueueSize'; value: Uint8Array; } -/** Map element of a string key to a size. */ +/** + * Map element of a string key to a size. + * TODO: Replace with UintMapEntry? + */ export interface QueueSizeSDKType { key: string; size: number; } +/** + * Map element of a string key to an unsigned integer. + * The value uses cosmos-sdk Uint rather than a native Go type to ensure that + * zeroes survive "omitempty" JSON serialization. + */ +export interface UintMapEntry { + key: string; + value: string; +} +export interface UintMapEntryProtoMsg { + typeUrl: '/agoric.swingset.UintMapEntry'; + value: Uint8Array; +} +/** + * Map element of a string key to an unsigned integer. + * The value uses cosmos-sdk Uint rather than a native Go type to ensure that + * zeroes survive "omitempty" JSON serialization. + */ +export interface UintMapEntrySDKType { + key: string; + value: string; +} /** Egress is the format for a swingset egress. */ export interface Egress { nickname: string; @@ -388,6 +428,7 @@ function createBaseParams(): Params { bootstrapVatConfig: '', powerFlagFees: [], queueMax: [], + vatCleanupBudget: [], }; } export const Params = { @@ -411,6 +452,9 @@ export const Params = { for (const v of message.queueMax) { QueueSize.encode(v!, writer.uint32(42).fork()).ldelim(); } + for (const v of message.vatCleanupBudget) { + UintMapEntry.encode(v!, writer.uint32(50).fork()).ldelim(); + } return writer; }, decode(input: BinaryReader | Uint8Array, length?: number): Params { @@ -440,6 +484,11 @@ export const Params = { case 5: message.queueMax.push(QueueSize.decode(reader, reader.uint32())); break; + case 6: + message.vatCleanupBudget.push( + UintMapEntry.decode(reader, reader.uint32()), + ); + break; default: reader.skipType(tag & 7); break; @@ -464,6 +513,9 @@ export const Params = { queueMax: Array.isArray(object?.queueMax) ? object.queueMax.map((e: any) => QueueSize.fromJSON(e)) : [], + vatCleanupBudget: Array.isArray(object?.vatCleanupBudget) + ? object.vatCleanupBudget.map((e: any) => UintMapEntry.fromJSON(e)) + : [], }; }, toJSON(message: Params): JsonSafe { @@ -498,6 +550,13 @@ export const Params = { } else { obj.queueMax = []; } + if (message.vatCleanupBudget) { + obj.vatCleanupBudget = message.vatCleanupBudget.map(e => + e ? UintMapEntry.toJSON(e) : undefined, + ); + } else { + obj.vatCleanupBudget = []; + } return obj; }, fromPartial(object: Partial): Params { @@ -511,6 +570,8 @@ export const Params = { object.powerFlagFees?.map(e => PowerFlagFee.fromPartial(e)) || []; message.queueMax = object.queueMax?.map(e => QueueSize.fromPartial(e)) || []; + message.vatCleanupBudget = + object.vatCleanupBudget?.map(e => UintMapEntry.fromPartial(e)) || []; return message; }, fromProtoMsg(message: ParamsProtoMsg): Params { @@ -819,6 +880,78 @@ export const QueueSize = { }; }, }; +function createBaseUintMapEntry(): UintMapEntry { + return { + key: '', + value: '', + }; +} +export const UintMapEntry = { + typeUrl: '/agoric.swingset.UintMapEntry', + encode( + message: UintMapEntry, + writer: BinaryWriter = BinaryWriter.create(), + ): BinaryWriter { + if (message.key !== '') { + writer.uint32(10).string(message.key); + } + if (message.value !== '') { + writer.uint32(18).string(message.value); + } + return writer; + }, + decode(input: BinaryReader | Uint8Array, length?: number): UintMapEntry { + const reader = + input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUintMapEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = reader.string(); + break; + case 2: + message.value = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + fromJSON(object: any): UintMapEntry { + return { + key: isSet(object.key) ? String(object.key) : '', + value: isSet(object.value) ? String(object.value) : '', + }; + }, + toJSON(message: UintMapEntry): JsonSafe { + const obj: any = {}; + message.key !== undefined && (obj.key = message.key); + message.value !== undefined && (obj.value = message.value); + return obj; + }, + fromPartial(object: Partial): UintMapEntry { + const message = createBaseUintMapEntry(); + message.key = object.key ?? ''; + message.value = object.value ?? ''; + return message; + }, + fromProtoMsg(message: UintMapEntryProtoMsg): UintMapEntry { + return UintMapEntry.decode(message.value); + }, + toProto(message: UintMapEntry): Uint8Array { + return UintMapEntry.encode(message).finish(); + }, + toProtoMsg(message: UintMapEntry): UintMapEntryProtoMsg { + return { + typeUrl: '/agoric.swingset.UintMapEntry', + value: UintMapEntry.encode(message).finish(), + }; + }, +}; function createBaseEgress(): Egress { return { nickname: '', diff --git a/packages/cosmic-proto/src/codegen/agoric/vbank/vbank.ts b/packages/cosmic-proto/src/codegen/agoric/vbank/vbank.ts index 96d8b2bcd45..79cea356dd9 100644 --- a/packages/cosmic-proto/src/codegen/agoric/vbank/vbank.ts +++ b/packages/cosmic-proto/src/codegen/agoric/vbank/vbank.ts @@ -23,6 +23,12 @@ export interface Params { * reward_epoch_duration_blocks. */ rewardSmoothingBlocks: bigint; + /** + * allowed_monitoring_accounts is an array of account addresses that can be + * monitored for sends and receives. An element of `"*"` will permit any + * address. + */ + allowedMonitoringAccounts: string[]; } export interface ParamsProtoMsg { typeUrl: '/agoric.vbank.Params'; @@ -33,6 +39,7 @@ export interface ParamsSDKType { reward_epoch_duration_blocks: bigint; per_epoch_reward_fraction: string; reward_smoothing_blocks: bigint; + allowed_monitoring_accounts: string[]; } /** The current state of the module. */ export interface State { @@ -67,6 +74,7 @@ function createBaseParams(): Params { rewardEpochDurationBlocks: BigInt(0), perEpochRewardFraction: '', rewardSmoothingBlocks: BigInt(0), + allowedMonitoringAccounts: [], }; } export const Params = { @@ -88,6 +96,9 @@ export const Params = { if (message.rewardSmoothingBlocks !== BigInt(0)) { writer.uint32(24).int64(message.rewardSmoothingBlocks); } + for (const v of message.allowedMonitoringAccounts) { + writer.uint32(34).string(v!); + } return writer; }, decode(input: BinaryReader | Uint8Array, length?: number): Params { @@ -110,6 +121,9 @@ export const Params = { case 3: message.rewardSmoothingBlocks = reader.int64(); break; + case 4: + message.allowedMonitoringAccounts.push(reader.string()); + break; default: reader.skipType(tag & 7); break; @@ -128,6 +142,11 @@ export const Params = { rewardSmoothingBlocks: isSet(object.rewardSmoothingBlocks) ? BigInt(object.rewardSmoothingBlocks.toString()) : BigInt(0), + allowedMonitoringAccounts: Array.isArray( + object?.allowedMonitoringAccounts, + ) + ? object.allowedMonitoringAccounts.map((e: any) => String(e)) + : [], }; }, toJSON(message: Params): JsonSafe { @@ -142,6 +161,13 @@ export const Params = { (obj.rewardSmoothingBlocks = ( message.rewardSmoothingBlocks || BigInt(0) ).toString()); + if (message.allowedMonitoringAccounts) { + obj.allowedMonitoringAccounts = message.allowedMonitoringAccounts.map( + e => e, + ); + } else { + obj.allowedMonitoringAccounts = []; + } return obj; }, fromPartial(object: Partial): Params { @@ -157,6 +183,8 @@ export const Params = { object.rewardSmoothingBlocks !== null ? BigInt(object.rewardSmoothingBlocks.toString()) : BigInt(0); + message.allowedMonitoringAccounts = + object.allowedMonitoringAccounts?.map(e => e) || []; return message; }, fromProtoMsg(message: ParamsProtoMsg): Params { diff --git a/packages/cosmic-proto/test/address-hooks.test.js b/packages/cosmic-proto/test/address-hooks.test.js new file mode 100644 index 00000000000..a216fc3159d --- /dev/null +++ b/packages/cosmic-proto/test/address-hooks.test.js @@ -0,0 +1,298 @@ +import rawTest from '@endo/ses-ava/prepare-endo.js'; + +import bundleSourceAmbient from '@endo/bundle-source'; +import { importBundle } from '@endo/import-bundle'; + +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); + +/** + * @type {import('ava').TestFn<{ + * addressHooks: import('../src/address-hooks.js'); + * }>} + */ +const test = rawTest; + +const makeTestContext = async () => { + // Do all this work so that we test bundling and evaluation of the module in a + // fresh compartment. + const bundleSource = bundleSourceAmbient; + const loadBundle = async specifier => { + const modulePath = require.resolve(specifier); + const bundle = await bundleSource(modulePath); + return bundle; + }; + + const evaluateBundle = async (bundle, endowments = {}) => { + return importBundle(bundle, endowments); + }; + + const importSpecifier = async (specifier, endowments = {}) => { + const bundle = await loadBundle(specifier); + return evaluateBundle(bundle, endowments); + }; + + const addressHooks = await importSpecifier('../src/address-hooks.js'); + + return { addressHooks }; +}; + +test.before(async t => { + t.context = await makeTestContext(); +}); + +/** + * @type {import('ava').Macro< + * [addressHook: string, baseAddress: string, hookDataStr: string, error?: any], + * { addressHooks: import('../src/address-hooks.js') } + * >} + */ +const splitMacro = test.macro({ + title(providedTitle = '', addressHook, _baseAddress, _hookDataStr, _error) { + return `${providedTitle} split ${addressHook}`; + }, + exec(t, addressHook, baseAddress, hookDataStr, error) { + const { splitHookedAddress } = t.context.addressHooks; + if (error) { + t.throws(() => splitHookedAddress(addressHook), error); + return; + } + const { baseAddress: ba, hookData: hd } = splitHookedAddress(addressHook); + t.is(ba, baseAddress); + const hookData = new TextEncoder().encode(hookDataStr); + t.deepEqual(hd, hookData); + }, +}); + +test('empty', splitMacro, '', '', '', { message: ' too short' }); +test('no hook', splitMacro, 'agoric1qqp0e5ys', 'agoric1qqp0e5ys', '', ''); +test( + 'Fast USDC', + splitMacro, + 'agoric10rchp4vc53apxn32q42c3zryml8xq3xshyzuhjk6405wtxy7tl3d7e0f8az423padaek6me38qekget2vdhx66mtvy6kg7nrw5uhsaekd4uhwufswqex6dtsv44hxv3cd4jkuqpqvduyhf', + 'agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek', + '?EUD=osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', +); +test( + 'version 0', + splitMacro, + 'agoric10rchqqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9qx0p9wp', + 'agoric1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn3tn9p0', + '\x04\x03\x02\x01', +); +test( + 'version 1 reject', + splitMacro, + 'agoric10rchzqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q04n2fg', + '', + '', + { message: 'Unsupported address hook version 1' }, +); +test( + 'version 15 reject', + splitMacro, + 'agoric10rch7qqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q25ez2d', + '', + '', + { message: 'Unsupported address hook version 15' }, +); + +/** + * @type {import('ava').Macro< + * [string, ArrayLike | undefined, ArrayLike, string], + * { addressHooks: import('../src/address-hooks.js') } + * >} + */ +const roundtripMacro = test.macro({ + title(providedTitle = '', prefix, addrBytes, hookData) { + const space = providedTitle.endsWith(' ') ? '' : ' '; + return `${providedTitle}${space}prefix: ${prefix}, addrBytes: ${addrBytes}, hookData: ${hookData}`; + }, + exec(t, prefix, addrBytes, hookData, expected) { + const { encodeBech32, joinHookedAddress, splitHookedAddress } = + t.context.addressHooks; + const baseAddress = encodeBech32(prefix, addrBytes || []); + const encoded = joinHookedAddress(baseAddress, hookData); + t.deepEqual(encoded, expected); + const decoded = splitHookedAddress(encoded); + t.deepEqual(decoded, { + baseAddress, + hookData: new Uint8Array(hookData || []), + }); + }, +}); + +test( + 'roundtripEmpty', + roundtripMacro, + 'agoric', + [], + [], + 'agoric10rchqqqq8gt2j4', +); + +test( + 'roundtripEmptyHookData', + roundtripMacro, + 'agoric', + [0x01, 0x02, 0x03], + [], + 'agoric10rchqqgzqvqqxcc0kwx', +); + +test( + 'roundtripEmptyBaseAddress', + roundtripMacro, + 'agoric', + [], + [0x01, 0x02, 0x03], + 'agoric10rchqqgzqvqqqyhvnj3', +); + +test( + 'roundtrip', + roundtripMacro, + 'agoric', + [0x01, 0x02, 0x03], + [0x04, 0x05, 0x06], + 'agoric10rchqqgzqvzq2psqqv59f9cy', +); + +/** + * @type {import('ava').Macro< + * [ + * string, + * ArrayLike, + * ArrayLike, + * number | undefined, + * { message } | undefined, + * ] + * >} + */ +const lengthCheckMacro = test.macro({ + title(providedTitle = '', prefix, baseAddress, hookData, charLimit, throws) { + let sep = providedTitle.endsWith(' ') ? '' : ' '; + const limitDesc = charLimit ? `${sep}charLimit=${charLimit}` : ''; + if (limitDesc) sep = ' '; + const throwsDesc = throws ? `${sep}throws` : ''; + if (throwsDesc) sep = ' '; + return `${providedTitle}${limitDesc}${throwsDesc}`; + }, + exec(t, prefix, addrBytes, hookData, charLimit, throws) { + const { encodeBech32, joinHookedAddress, splitHookedAddress } = + t.context.addressHooks; + const baseAddress = encodeBech32(prefix, addrBytes, charLimit); + const make = () => joinHookedAddress(baseAddress, hookData, charLimit); + if (throws) { + t.throws(make, throws); + return; + } + const encoded = make(); + t.log('encoded', encoded, addrBytes); + const decoded = splitHookedAddress(encoded, charLimit); + t.deepEqual(decoded, { + baseAddress, + hookData, + }); + }, +}); + +{ + const charLimit = 90; + const prefix = 'agoric'; + const addrBytes = new Uint8Array(20); + for (let j = 0; j < addrBytes.length; j += 1) { + addrBytes[j] = j; + } + + for (let i = 0; i <= 30; i += 1) { + const hookData = new Uint8Array(i); + for (let j = 0; j < i; j += 1) { + hookData[j] = i - j; + } + test( + `${addrBytes.length}-byte baseAddress, ${i}-byte hookData`, + lengthCheckMacro, + prefix, + addrBytes, + hookData, + charLimit, + i > 23 ? { message: /Exceeds length limit/ } : undefined, + ); + } +} + +/** + * @type {import('ava').Macro< + * [ + * baseAddress: string, + * query: import('../src/address-hooks.js').HookQuery, + * expected: string, + * ] + * >} + */ +const addressHookMacro = test.macro({ + title(providedTitle = '', baseAddress, query) { + return `${providedTitle} ${baseAddress} ${JSON.stringify(query)}`; + }, + exec(t, baseAddress, query, expected) { + const { encodeAddressHook, splitHookedAddress, decodeAddressHook } = + t.context.addressHooks; + const encoded = encodeAddressHook(baseAddress, query); + t.log('encoded', encoded); + t.is(encoded, expected); + + const { baseAddress: ba1, hookData } = splitHookedAddress(encoded); + t.is(ba1, baseAddress); + + const td = new TextDecoder(); + t.log('splitHookedAddress', ba1 + td.decode(hookData)); + + const { baseAddress: decodedBaseAddress, query: decodedQuery } = + decodeAddressHook(encoded); + t.is(decodedBaseAddress, baseAddress); + t.deepEqual(decodedQuery, query); + }, +}); + +test( + 'agoric hook', + addressHookMacro, + 'agoric1qqp0e5ys', + { d: null, a: 'b', c: ['d', 'd2'] }, + 'agoric10rchqqplvy7kyfnr84jzvceavsezveqqqyu2w5lp', +); + +test( + 'cosmos hook', + addressHookMacro, + 'cosmos1qqxuevtt', + { + everything: null, + dst: ['a', 'b', 'c'], + }, + 'cosmos10rchqqplv3ehg0tpyej8xapavgnxgum5843jvetkv4e8jargd9hxwqqp4vx73n', +); + +test( + 'slideshow hook', + addressHookMacro, + 'agoric1qqp0e5ys', + { + stake: 'TIA', + strat: 'compound', + holder: 'agoric1adjbkubiukd', + }, + 'agoric10rchqqpldphkcer9wg7kzem0wf5kxvtpv34xy6m4vf5h26myyeehgcttv574gj2pyeehgunpws7kxmmdwphh2mnyqqqsc2lz8v', +); + +test( + 'Fast USDC hook', + addressHookMacro, + 'agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek', + { + EUD: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }, + 'agoric10rchp4vc53apxn32q42c3zryml8xq3xshyzuhjk6405wtxy7tl3d7e0f8az423padaek6me38qekget2vdhx66mtvy6kg7nrw5uhsaekd4uhwufswqex6dtsv44hxv3cd4jkuqpqvduyhf', +); diff --git a/packages/cosmic-proto/test/vatsafe.test.js b/packages/cosmic-proto/test/vatsafe.test.js index a184176e27d..5d5de4ee531 100644 --- a/packages/cosmic-proto/test/vatsafe.test.js +++ b/packages/cosmic-proto/test/vatsafe.test.js @@ -1,5 +1,4 @@ // @ts-check -/* eslint-disable import/no-extraneous-dependencies -- requiring the package itself to check exports map */ import test from '@endo/ses-ava/prepare-endo.js'; import { MsgDelegate } from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; diff --git a/packages/cosmic-proto/typedoc.json b/packages/cosmic-proto/typedoc.json new file mode 100644 index 00000000000..0193d155bf9 --- /dev/null +++ b/packages/cosmic-proto/typedoc.json @@ -0,0 +1,9 @@ +{ + "extends": [ + "../../typedoc.base.json" + ], + "entryPoints": [ + "src/*.js", + "src/helpers.ts" + ] +} diff --git a/packages/cosmic-swingset/package.json b/packages/cosmic-swingset/package.json index 6d7e5190d56..f0b00a293fe 100644 --- a/packages/cosmic-swingset/package.json +++ b/packages/cosmic-swingset/package.json @@ -11,7 +11,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -31,16 +31,16 @@ "@agoric/swingset-vat": "^0.33.0-u18.0", "@agoric/telemetry": "^0.6.3-u18.3", "@agoric/vm-config": "^0.1.1-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/env-options": "^1.1.7", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/import-bundle": "^1.3.1", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", + "@endo/bundle-source": "^3.5.0", + "@endo/env-options": "^1.1.8", + "@endo/errors": "^1.2.8", + "@endo/import-bundle": "^1.3.2", + "@endo/init": "^1.1.7", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", "@iarna/toml": "^2.2.3", "@opentelemetry/api": "~1.3.0", "@opentelemetry/sdk-metrics": "~1.9.0", @@ -51,7 +51,7 @@ }, "devDependencies": { "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "publishConfig": { "access": "public" @@ -69,6 +69,6 @@ "timeout": "20m" }, "typeCoverage": { - "atLeast": 80.55 + "atLeast": 83.84 } } diff --git a/packages/cosmic-swingset/scripts/single-node.sh b/packages/cosmic-swingset/scripts/single-node.sh index 711cf5b4c92..438339ed3a7 100755 --- a/packages/cosmic-swingset/scripts/single-node.sh +++ b/packages/cosmic-swingset/scripts/single-node.sh @@ -29,18 +29,7 @@ $DAEMON gentx --name validator $STAKE --keyring-backend="test" $DAEMON collect-gentxs # Silly old Darwin -case $(sed --help 2>&1 | sed -n 2p) in - "usage: sed script"*"[-i extension]"*) - sedi() { - sed -i '' ${1+"$@"} - } - ;; - *) - sedi() { - sed -i ${1+"$@"} - } - ;; -esac +alias sedi="sed -i $(sed --help 2>&1 | sed 2q | grep -qe '-i ' && echo "''")" case $DAEMON in ag-chain-cosmos) diff --git a/packages/cosmic-swingset/src/anylogger-agoric.js b/packages/cosmic-swingset/src/anylogger-agoric.js index d870c48cb3e..92353c40e0a 100644 --- a/packages/cosmic-swingset/src/anylogger-agoric.js +++ b/packages/cosmic-swingset/src/anylogger-agoric.js @@ -32,8 +32,8 @@ const selectedCode = anylogger.levels[selectedLevel]; const globalCode = selectedCode === undefined ? -Infinity : selectedCode; const oldExt = anylogger.ext; -anylogger.ext = (l, o) => { - l = oldExt(l, o); +anylogger.ext = logger => { + const l = oldExt(logger); l.enabledFor = lvl => globalCode >= anylogger.levels[lvl]; const prefix = l.name.replace(/:/g, ': '); diff --git a/packages/cosmic-swingset/src/chain-main.js b/packages/cosmic-swingset/src/chain-main.js index 10b669da82a..5f65f771e62 100644 --- a/packages/cosmic-swingset/src/chain-main.js +++ b/packages/cosmic-swingset/src/chain-main.js @@ -1,6 +1,6 @@ // @ts-check -import path from 'node:path'; +import nativePath from 'node:path'; import v8 from 'node:v8'; import process from 'node:process'; import fs from 'node:fs'; @@ -30,6 +30,7 @@ import { } from '@agoric/internal/src/lib-chainStorage.js'; import { makeShutdown } from '@agoric/internal/src/node/shutdown.js'; +import { makeInitMsg } from '@agoric/internal/src/chain-utils.js'; import * as STORAGE_PATH from '@agoric/internal/src/chain-storage-paths.js'; import * as ActionType from '@agoric/internal/src/action-types.js'; import { BridgeId, CosmosInitKeyToBridgeId } from '@agoric/internal'; @@ -104,32 +105,6 @@ const validateSwingsetConfig = swingsetConfig => { Fail`maxVatsOnline must be a positive integer`; }; -/** - * A boot message consists of cosmosInitAction fields that are subject to - * consensus. See cosmosInitAction in {@link ../../../golang/cosmos/app/app.go}. - * - * @param {any} initAction - */ -const makeBootMsg = initAction => { - const { - type, - blockTime, - blockHeight, - chainID, - params, - // NB: resolvedConfig is independent of consensus and MUST NOT be included - supplyCoins, - } = initAction; - return { - type, - blockTime, - blockHeight, - chainID, - params, - supplyCoins, - }; -}; - /** * @template {unknown} [T=unknown] * @param {(req: string) => string} call @@ -192,7 +167,11 @@ const makePrefixedBridgeStorage = ( }); }; -export default async function main(progname, args, { env, homedir, agcc }) { +export default async function main( + progname, + args, + { env, homedir, path = nativePath, agcc }, +) { const portNums = {}; // TODO: use the 'basedir' pattern @@ -247,7 +226,6 @@ export default async function main(progname, args, { env, homedir, agcc }) { // Actually run the main ag-chain-cosmos program. Before we start the daemon, // there will be a call to nodePort/AG_COSMOS_INIT, otherwise exit. - // eslint-disable-next-line no-use-before-define const nodePort = registerPortHandler(toSwingSet); // Need to keep the process alive until Go exits. @@ -454,16 +432,16 @@ export default async function main(progname, args, { env, homedir, agcc }) { }; const argv = { - bootMsg: makeBootMsg(initAction), + bootMsg: makeInitMsg(initAction), }; const getVatConfig = async () => { - const vatHref = await importMetaResolve( + const href = await importMetaResolve( env.CHAIN_BOOTSTRAP_VAT_CONFIG || argv.bootMsg.params.bootstrap_vat_config, import.meta.url, ); - const vatconfig = new URL(vatHref).pathname; - return vatconfig; + const { pathname } = new URL(href); + return pathname; }; // Delay makeShutdown to override the golang interrupts diff --git a/packages/cosmic-swingset/src/computron-counter.js b/packages/cosmic-swingset/src/computron-counter.js new file mode 100644 index 00000000000..c21f4150be1 --- /dev/null +++ b/packages/cosmic-swingset/src/computron-counter.js @@ -0,0 +1,112 @@ +// @ts-check + +import { assert } from '@endo/errors'; +import { + BeansPerBlockComputeLimit, + BeansPerVatCreation, + BeansPerXsnapComputron, +} from './sim-params.js'; + +const { hasOwn } = Object; + +/** + * @typedef {object} BeansPerUnit + * @property {bigint} blockComputeLimit + * @property {bigint} vatCreation + * @property {bigint} xsnapComputron + */ + +/** + * Return a stateful run policy that supports two phases: first allow + * non-cleanup work (presumably deliveries) until an overrideable computron + * budget is exhausted, then (iff no work was done and at least one vat cleanup + * budget field is positive) a cleanup phase that allows cleanup work (and + * presumably nothing else) until one of those fields is exhausted. + * https://github.com/Agoric/agoric-sdk/issues/8928#issuecomment-2053357870 + * + * @param {object} params + * @param {BeansPerUnit} params.beansPerUnit + * @param {import('@agoric/swingset-vat').CleanupBudget} [params.vatCleanupBudget] + * @param {boolean} [ignoreBlockLimit] + * @returns {import('./launch-chain.js').ChainRunPolicy} + */ +export function computronCounter( + { beansPerUnit, vatCleanupBudget }, + ignoreBlockLimit = false, +) { + const { + [BeansPerBlockComputeLimit]: blockComputeLimit, + [BeansPerVatCreation]: vatCreation, + [BeansPerXsnapComputron]: xsnapComputron, + } = beansPerUnit; + assert.typeof(blockComputeLimit, 'bigint'); + assert.typeof(vatCreation, 'bigint'); + assert.typeof(xsnapComputron, 'bigint'); + + let totalBeans = 0n; + const shouldRun = () => ignoreBlockLimit || totalBeans < blockComputeLimit; + + const remainingCleanups = { default: Infinity, ...vatCleanupBudget }; + const defaultCleanupBudget = remainingCleanups.default; + let cleanupStarted = false; + let cleanupDone = false; + const cleanupPossible = Object.values(remainingCleanups).some(n => n > 0); + if (!cleanupPossible) cleanupDone = true; + /** @type {() => (false | import('@agoric/swingset-vat').CleanupBudget)} */ + const allowCleanup = () => + cleanupStarted && !cleanupDone && { ...remainingCleanups }; + const startCleanup = () => { + assert(!cleanupStarted); + cleanupStarted = true; + return totalBeans === 0n && !cleanupDone; + }; + const didCleanup = details => { + for (const [phase, count] of Object.entries(details.cleanups)) { + if (phase === 'total') continue; + if (!hasOwn(remainingCleanups, phase)) { + // TODO: log unknown phases? + remainingCleanups[phase] = defaultCleanupBudget; + } + remainingCleanups[phase] -= count; + if (remainingCleanups[phase] <= 0) cleanupDone = true; + } + // We return true to allow processing of any BOYD/GC prompted by cleanup, + // even if cleanup as such is now done. + return true; + }; + + const policy = harden({ + vatCreated() { + totalBeans += vatCreation; + return shouldRun(); + }, + crankComplete(details = {}) { + assert.typeof(details, 'object'); + if (details.computrons) { + assert.typeof(details.computrons, 'bigint'); + + // TODO: xsnapComputron should not be assumed here. + // Instead, SwingSet should describe the computron model it uses. + totalBeans += details.computrons * xsnapComputron; + } + return shouldRun(); + }, + crankFailed() { + const failedComputrons = 1000000n; // who knows, 1M is as good as anything + totalBeans += failedComputrons * xsnapComputron; + return shouldRun(); + }, + emptyCrank() { + return shouldRun(); + }, + allowCleanup, + didCleanup, + + shouldRun, + remainingBeans: () => + ignoreBlockLimit ? undefined : blockComputeLimit - totalBeans, + totalBeans: () => totalBeans, + startCleanup, + }); + return policy; +} diff --git a/packages/cosmic-swingset/src/entrypoint.js b/packages/cosmic-swingset/src/entrypoint.js index 7e1b2de18b2..e6b305a496e 100755 --- a/packages/cosmic-swingset/src/entrypoint.js +++ b/packages/cosmic-swingset/src/entrypoint.js @@ -18,9 +18,9 @@ import main from './chain-main.js'; const log = anylogger('ag-chain-cosmos'); main(process.argv[1], process.argv.splice(2), { - path, - homedir: os.homedir(), env: process.env, + homedir: os.homedir(), + path, agcc, }).then( _res => 0, diff --git a/packages/cosmic-swingset/src/helpers/bufferedStorage.js b/packages/cosmic-swingset/src/helpers/bufferedStorage.js index 1b58c69b1b4..0233faa492d 100644 --- a/packages/cosmic-swingset/src/helpers/bufferedStorage.js +++ b/packages/cosmic-swingset/src/helpers/bufferedStorage.js @@ -5,7 +5,7 @@ import { assert, Fail } from '@endo/errors'; // XXX Do these "StorageAPI" functions belong in their own package? /** - * @template {unknown} [T=unknown] + * @template [T=unknown] * @typedef {{ * has: (key: string) => boolean, * get: (key: string) => T | undefined, @@ -15,6 +15,11 @@ import { assert, Fail } from '@endo/errors'; * }} KVStore */ +/** + * @template [T=unknown] + * @typedef {KVStore & {commit: () => void, abort: () => void}} BufferedKVStore + */ + /** * Assert function to ensure that an object implements the StorageAPI * interface: methods { has, getNextKey, get, set, delete } @@ -33,21 +38,186 @@ export function insistStorageAPI(kvStore) { } } +// TODO: Replace compareByCodePoints and makeKVStoreFromMap and +// provideEnhancedKVStore with imports when +// available. +// https://github.com/Agoric/agoric-sdk/pull/10299 + +const compareByCodePoints = (left, right) => { + const leftIter = left[Symbol.iterator](); + const rightIter = right[Symbol.iterator](); + for (;;) { + const { value: leftChar } = leftIter.next(); + const { value: rightChar } = rightIter.next(); + if (leftChar === undefined && rightChar === undefined) { + return 0; + } else if (leftChar === undefined) { + // left is a prefix of right. + return -1; + } else if (rightChar === undefined) { + // right is a prefix of left. + return 1; + } + const leftCodepoint = /** @type {number} */ (leftChar.codePointAt(0)); + const rightCodepoint = /** @type {number} */ (rightChar.codePointAt(0)); + if (leftCodepoint < rightCodepoint) return -1; + if (leftCodepoint > rightCodepoint) return 1; + } +}; + +/** + * @template [T=unknown] + * @param {Map} map + * @returns {KVStore} + */ +export const makeKVStoreFromMap = map => { + let sortedKeys; + let priorKeyReturned; + let priorKeyIndex; + + const ensureSorted = () => { + if (!sortedKeys) { + sortedKeys = [...map.keys()]; + sortedKeys.sort(compareByCodePoints); + } + }; + + const clearGetNextKeyCache = () => { + priorKeyReturned = undefined; + priorKeyIndex = -1; + }; + clearGetNextKeyCache(); + + const clearSorted = () => { + sortedKeys = undefined; + clearGetNextKeyCache(); + }; + + /** @type {KVStore} */ + const fakeStore = harden({ + has: key => map.has(key), + get: key => map.get(key), + getNextKey: priorKey => { + assert.typeof(priorKey, 'string'); + ensureSorted(); + const start = + compareByCodePoints(priorKeyReturned, priorKey) <= 0 + ? priorKeyIndex + 1 + : 0; + for (let i = start; i < sortedKeys.length; i += 1) { + const key = sortedKeys[i]; + if (compareByCodePoints(key, priorKey) <= 0) continue; + priorKeyReturned = key; + priorKeyIndex = i; + return key; + } + // reached end without finding the key, so clear our cache + clearGetNextKeyCache(); + return undefined; + }, + set: (key, value) => { + if (!map.has(key)) clearSorted(); + map.set(key, value); + }, + delete: key => { + if (map.has(key)) clearSorted(); + map.delete(key); + }, + }); + return fakeStore; +}; + +/** + * Return an object representing KVStore contents as both a KVStore and a Map. + * + * Iterating over the map while mutating it is "unsupported" (entries inserted + * that sort before the current iteration point will be skipped). + * + * The `size` property is not supported. + * + * @template [T=unknown] + * @param {Map | KVStore} [mapOrKvStore] + */ +export function provideEnhancedKVStore(mapOrKvStore = new Map()) { + if (!('getNextKey' in mapOrKvStore)) { + mapOrKvStore = makeKVStoreFromMap(mapOrKvStore); + } + + if (!('keys' in mapOrKvStore)) { + const kvStore = mapOrKvStore; + const map = harden({ + ...mapOrKvStore, + set(key, value) { + kvStore.set(key, value); + return map; + }, + delete(key) { + const had = kvStore.has(key); + kvStore.delete(key); + return had; + }, + clear() { + for (const key of map.keys()) { + kvStore.delete(key); + } + }, + /** @returns {number} */ + get size() { + throw new Error('size not implemented.'); + }, + *entries() { + for (const key of map.keys()) { + yield [key, /** @type {string} */ (kvStore.get(key))]; + } + }, + *keys() { + /** @type {string | undefined} */ + let key = ''; + if (kvStore.has(key)) { + yield key; + } + // eslint-disable-next-line no-cond-assign + while ((key = kvStore.getNextKey(key))) { + yield key; + } + }, + *values() { + for (const key of map.keys()) { + yield /** @type {string} */ (kvStore.get(key)); + } + }, + forEach(callbackfn, thisArg) { + for (const key of map.keys()) { + Reflect.apply(callbackfn, thisArg, [ + /** @type {string} */ (kvStore.get(key)), + key, + map, + ]); + } + }, + [Symbol.iterator]() { + return map.entries(); + }, + }); + mapOrKvStore = map; + } + + return /** @type {Map & KVStore} */ (mapOrKvStore); +} + /** * Create a StorageAPI object that buffers writes to a wrapped StorageAPI object * until told to commit (or abort) them. * - * @template {unknown} [T=unknown] - * @param {KVStore} kvStore The StorageAPI object to wrap - * @param {{ - * onGet?: (key: string, value: T) => void, // a callback invoked after getting a value from kvStore - * onPendingSet?: (key: string, value: T) => void, // a callback invoked after a new uncommitted value is set - * onPendingDelete?: (key: string) => void, // a callback invoked after a new uncommitted delete - * onCommit?: () => void, // a callback invoked after pending operations have been committed - * onAbort?: () => void, // a callback invoked after pending operations have been aborted - * }} listeners Optional callbacks to be invoked when respective events occur - * - * @returns {{kvStore: KVStore, commit: () => void, abort: () => void}} + * @template [T=unknown] + * @param {KVStore} kvStore the StorageAPI object to wrap + * @param {object} [listeners] optional callbacks to be invoked when respective events occur + * @param {(key: string, value: T | undefined) => void} [listeners.onGet] a callback invoked after getting a value from kvStore + * @param {(key: string, value: T) => void} [listeners.onPendingSet] a callback invoked after a new uncommitted value is set + * @param {(key: string) => void} [listeners.onPendingDelete] a callback invoked after a new uncommitted delete + * @param {() => void} [listeners.onCommit] a callback invoked after pending operations have been committed + * @param {() => void} [listeners.onAbort] a callback invoked after pending operations have been aborted + * @returns {{kvStore: KVStore} & Pick, 'commit' | 'abort'>} */ export function makeBufferedStorage(kvStore, listeners = {}) { insistStorageAPI(kvStore); @@ -59,6 +229,7 @@ export function makeBufferedStorage(kvStore, listeners = {}) { const additions = new Map(); const deletions = new Set(); + /** @type {KVStore} */ const buffered = { has(key) { assert.typeof(key, 'string'); @@ -71,7 +242,6 @@ export function makeBufferedStorage(kvStore, listeners = {}) { if (additions.has(key)) return additions.get(key); if (deletions.has(key)) return undefined; const value = kvStore.get(key); - // @ts-expect-error value may be undefined if (onGet !== undefined) onGet(key, value); return value; }, @@ -118,19 +288,21 @@ export function makeBufferedStorage(kvStore, listeners = {}) { /** * @template {unknown} [T=unknown] * @param {KVStore} kvStore + * @returns {BufferedKVStore} */ export const makeReadCachingStorage = kvStore => { // In addition to the wrapping write buffer, keep a simple cache of // read values for has and get. + const deleted = Symbol('deleted'); + const undef = Symbol('undefined'); + /** @typedef {(typeof deleted) | (typeof undef)} ReadCacheSentinel */ + /** @type {Map} */ let cache; function resetCache() { cache = new Map(); } resetCache(); - const deleted = Symbol('deleted'); - const undef = Symbol('undefined'); - /** @type {KVStore} */ const storage = harden({ has(key) { @@ -190,5 +362,5 @@ export const makeReadCachingStorage = kvStore => { onCommit: resetCache, onAbort: resetCache, }); - return harden({ ...buffered, commit, abort }); + return harden({ .../** @type {KVStore} */ (buffered), commit, abort }); }; diff --git a/packages/cosmic-swingset/src/helpers/json-stable-stringify.js b/packages/cosmic-swingset/src/helpers/json-stable-stringify.js index a2585b49c12..607630950df 100644 --- a/packages/cosmic-swingset/src/helpers/json-stable-stringify.js +++ b/packages/cosmic-swingset/src/helpers/json-stable-stringify.js @@ -47,12 +47,18 @@ export default function stableStringify(obj, opts) { })(opts.cmp); const seen = []; - return (function stringify(parent, key, node, level) { + /** + * @param {object | unknown[]} parent + * @param {PropertyKey} key + * @param {unknown} node + * @param {number} level + */ + const stringify = (parent, key, node, level) => { const indent = space ? `\n${new Array(level + 1).join(space)}` : ''; const colonSeparator = space ? ': ' : ':'; - if (node && node.toJSON && typeof node.toJSON === 'function') { - node = node.toJSON(); + if (node && typeof node === 'object' && 'toJSON' in node) { + if (typeof node.toJSON === 'function') node = node.toJSON(); } node = replacer.call(parent, key, node); @@ -90,5 +96,6 @@ export default function stableStringify(obj, opts) { } seen.splice(seen.indexOf(node), 1); return `{${out.join(',')}${indent}}`; - })({ '': obj }, '', obj, 0); + }; + return stringify({ '': obj }, '', obj, 0); } diff --git a/packages/cosmic-swingset/src/launch-chain.js b/packages/cosmic-swingset/src/launch-chain.js index c2211d66a4c..eccfbbc2a65 100644 --- a/packages/cosmic-swingset/src/launch-chain.js +++ b/packages/cosmic-swingset/src/launch-chain.js @@ -21,6 +21,7 @@ import { makeSwingsetController, loadBasedir, loadSwingsetConfigFile, + normalizeConfig, upgradeSwingset, } from '@agoric/swingset-vat'; import { waitUntilQuiescent } from '@agoric/internal/src/lib-nodejs/waitUntilQuiescent.js'; @@ -42,18 +43,17 @@ import { makeSlogCallbacks, } from './kernel-stats.js'; -import { - BeansPerBlockComputeLimit, - BeansPerVatCreation, - BeansPerXsnapComputron, -} from './sim-params.js'; import { parseParams } from './params.js'; import { makeQueue, makeQueueStorageMock } from './helpers/make-queue.js'; import { exportStorage } from './export-storage.js'; import { parseLocatedJson } from './helpers/json.js'; +import { computronCounter } from './computron-counter.js'; +/** @import { BlockInfo } from '@agoric/internal/src/chain-utils.js' */ /** @import { Mailbox, RunPolicy, SwingSetConfig } from '@agoric/swingset-vat' */ -/** @import { KVStore } from './helpers/bufferedStorage.js' */ +/** @import { KVStore, BufferedKVStore } from './helpers/bufferedStorage.js' */ + +/** @typedef {ReturnType>} InboundQueue */ const console = anylogger('launch-chain'); const blockManagerConsole = anylogger('block-manager'); @@ -87,6 +87,24 @@ const parseUpgradePlanInfo = (upgradePlan, prefix = '') => { * `chainStorageEntries: [ ['c.o', '"top"'], ['c.o.i'], ['c.o.i.n', '42'], ['c.o.w', '"moo"'] ]`). */ +/** + * @typedef {'leftover' | 'forced' | 'high-priority' | 'timer' | 'queued' | 'cleanup'} CrankerPhase + * - leftover: work from a previous block + * - forced: work that claims the entirety of the current block + * - high-priority: queued work the precedes timer advancement + * - intermission: needed to note state exports and update consistency hashes + * - queued: queued work the follows timer advancement + * - cleanup: for dealing with data from terminated vats + */ + +/** @type {CrankerPhase} */ +const CLEANUP = 'cleanup'; + +/** + * @typedef {(phase: CrankerPhase) => Promise} Cranker runs the kernel + * and reports if it is time to stop + */ + /** * Return the key in the reserved "host.*" section of the swing-store * @@ -96,9 +114,9 @@ const getHostKey = path => `host.${path}`; /** * @param {KVStore} mailboxStorage - * @param {((dstID: string, obj: any) => any)} bridgeOutbound + * @param {((destPort: string, msg: unknown) => unknown)} bridgeOutbound * @param {SwingStoreKernelStorage} kernelStorage - * @param {string | (() => string | Promise)} vatconfig absolute path or thunk + * @param {import('@endo/far').ERef | (() => ERef)} getVatConfig * @param {unknown} bootstrapArgs JSON-serializable data * @param {{}} env * @param {*} options @@ -107,7 +125,7 @@ export async function buildSwingset( mailboxStorage, bridgeOutbound, kernelStorage, - vatconfig, + getVatConfig, bootstrapArgs, env, { @@ -139,13 +157,19 @@ export async function buildSwingset( return; } - const configLocation = await (typeof vatconfig === 'function' - ? vatconfig() - : vatconfig); - let config = await loadSwingsetConfigFile(configLocation); - if (config === null) { - config = loadBasedir(configLocation); - } + const { config, configLocation } = await (async () => { + const objOrPath = await (typeof getVatConfig === 'function' + ? getVatConfig() + : getVatConfig); + if (typeof objOrPath === 'string') { + const path = objOrPath; + const configFromFile = await loadSwingsetConfigFile(path); + const obj = configFromFile || loadBasedir(path); + return { config: obj, configLocation: path }; + } + await normalizeConfig(objOrPath); + return { config: objOrPath, configLocation: undefined }; + })(); config.devices = { mailbox: { @@ -248,74 +272,55 @@ export async function buildSwingset( * shouldRun(): boolean; * remainingBeans(): bigint | undefined; * totalBeans(): bigint; + * startCleanup(): boolean; * }} ChainRunPolicy */ /** - * @typedef {object} BeansPerUnit - * @property {bigint} blockComputeLimit - * @property {bigint} vatCreation - * @property {bigint} xsnapComputron + * @template [T=unknown] + * @typedef {object} LaunchOptions + * @property {import('./helpers/make-queue.js').QueueStorage} actionQueueStorage + * @property {import('./helpers/make-queue.js').QueueStorage} highPriorityQueueStorage + * @property {string} [kernelStateDBDir] + * @property {import('@agoric/swing-store').SwingStore} [swingStore] + * @property {BufferedKVStore} mailboxStorage + * TODO: Merge together BufferedKVStore and QueueStorage (get/set/delete/commit/abort) + * @property {() => Promise} clearChainSends + * @property {() => void} replayChainSends + * @property {((destPort: string, msg: unknown) => unknown)} bridgeOutbound + * @property {() => ({publish: (value: unknown) => Promise})} [makeInstallationPublisher] + * @property {import('@endo/far').ERef | (() => ERef)} vatconfig + * either an object or a path to a file which JSON-decodes into an object, + * provided directly or through a thunk and/or promise. If the result is an + * object, it may be mutated to normalize and/or extend it. + * @property {unknown} argv for the bootstrap vat (and despite the name, usually + * an object rather than an array) + * @property {typeof process['env']} [env] + * @property {string} [debugName] + * @property {boolean} [verboseBlocks] + * @property {ReturnType} [metricsProvider] + * @property {import('@agoric/telemetry').SlogSender} [slogSender] + * @property {string} [swingStoreTraceFile] + * @property {(...args: unknown[]) => void} [swingStoreExportCallback] + * @property {boolean} [keepSnapshots] + * @property {boolean} [keepTranscripts] + * @property {ReturnType} [archiveSnapshot] + * @property {ReturnType} [archiveTranscript] + * @property {() => object | Promise} [afterCommitCallback] + * @property {import('./chain-main.js').CosmosSwingsetConfig} swingsetConfig + * TODO refactor to clarify relationship vs. import('@agoric/swingset-vat').SwingSetConfig + * --- maybe partition into in-consensus "config" vs. consensus-independent "options"? + * (which would mostly just require `bundleCachePath` to become a `buildSwingset` input) */ /** - * @param {BeansPerUnit} beansPerUnit - * @param {boolean} [ignoreBlockLimit] - * @returns {ChainRunPolicy} + * @param {LaunchOptions} options */ -function computronCounter( - { - [BeansPerBlockComputeLimit]: blockComputeLimit, - [BeansPerVatCreation]: vatCreation, - [BeansPerXsnapComputron]: xsnapComputron, - }, - ignoreBlockLimit = false, -) { - assert.typeof(blockComputeLimit, 'bigint'); - assert.typeof(vatCreation, 'bigint'); - assert.typeof(xsnapComputron, 'bigint'); - let totalBeans = 0n; - const shouldRun = () => ignoreBlockLimit || totalBeans < blockComputeLimit; - const remainingBeans = () => - ignoreBlockLimit ? undefined : blockComputeLimit - totalBeans; - - const policy = harden({ - vatCreated() { - totalBeans += vatCreation; - return shouldRun(); - }, - crankComplete(details = {}) { - assert.typeof(details, 'object'); - if (details.computrons) { - assert.typeof(details.computrons, 'bigint'); - - // TODO: xsnapComputron should not be assumed here. - // Instead, SwingSet should describe the computron model it uses. - totalBeans += details.computrons * xsnapComputron; - } - return shouldRun(); - }, - crankFailed() { - const failedComputrons = 1000000n; // who knows, 1M is as good as anything - totalBeans += failedComputrons * xsnapComputron; - return shouldRun(); - }, - emptyCrank() { - return shouldRun(); - }, - shouldRun, - remainingBeans, - totalBeans() { - return totalBeans; - }, - }); - return policy; -} - export async function launch({ actionQueueStorage, highPriorityQueueStorage, kernelStateDBDir, + swingStore, mailboxStorage, clearChainSends, replayChainSends, @@ -363,26 +368,36 @@ export async function launch({ // invoked sequentially like if they were awaited, and the block manager // synchronizes before finishing END_BLOCK let pendingSwingStoreExport = Promise.resolve(); - const swingStoreExportCallbackWithQueue = - swingStoreExportCallback && makeWithQueue()(swingStoreExportCallback); - const swingStoreExportSyncCallback = - swingStoreExportCallback && - (updates => { + const swingStoreExportSyncCallback = (() => { + if (!swingStoreExportCallback) return undefined; + const enqueueSwingStoreExportCallback = makeWithQueue()( + swingStoreExportCallback, + ); + return updates => { assert(allowExportCallback, 'export-data callback called at bad time'); - pendingSwingStoreExport = swingStoreExportCallbackWithQueue(updates); + pendingSwingStoreExport = enqueueSwingStoreExportCallback(updates); + }; + })(); + + if (swingStore) { + !swingStoreExportCallback || + Fail`swingStoreExportCallback is not compatible with a provided swingStore; either drop the former or allow launch to open the latter`; + kernelStateDBDir === undefined || + kernelStateDBDir === swingStore.internal.dirPath || + Fail`provided kernelStateDBDir does not match provided swingStore`; + } + const { kernelStorage, hostStorage } = + swingStore || + openSwingStore(/** @type {string} */ (kernelStateDBDir), { + traceFile: swingStoreTraceFile, + exportCallback: swingStoreExportSyncCallback, + keepSnapshots, + keepTranscripts, + archiveSnapshot, + archiveTranscript, }); - - const { kernelStorage, hostStorage } = openSwingStore(kernelStateDBDir, { - traceFile: swingStoreTraceFile, - exportCallback: swingStoreExportSyncCallback, - keepSnapshots, - keepTranscripts, - archiveSnapshot, - archiveTranscript, - }); const { kvStore, commit } = hostStorage; - /** @typedef {ReturnType>} InboundQueue */ /** @type {InboundQueue} */ const actionQueue = makeQueue(actionQueueStorage); /** @type {InboundQueue} */ @@ -450,15 +465,21 @@ export async function launch({ /** * @param {number} blockHeight * @param {ChainRunPolicy} runPolicy + * @returns {Cranker} */ function makeRunSwingset(blockHeight, runPolicy) { let runNum = 0; - async function runSwingset() { + async function runSwingset(phase) { + if (phase === CLEANUP) { + const allowCleanup = runPolicy.startCleanup(); + if (!allowCleanup) return false; + } const startBeans = runPolicy.totalBeans(); controller.writeSlogObject({ type: 'cosmic-swingset-run-start', blockHeight, runNum, + phase, startBeans, remainingBeans: runPolicy.remainingBeans(), }); @@ -475,6 +496,7 @@ export async function launch({ type: 'cosmic-swingset-run-finish', blockHeight, runNum, + phase, startBeans, finishBeans, usedBeans: finishBeans - startBeans, @@ -492,10 +514,10 @@ export async function launch({ timer.poll(blockTime); // This is before the initial block, we need to finish processing the // entire bootstrap before opening for business. - const runPolicy = computronCounter(params.beansPerUnit, true); + const runPolicy = computronCounter(params, true); const runSwingset = makeRunSwingset(blockHeight, runPolicy); - await runSwingset(); + await runSwingset('forced'); } async function saveChainState() { @@ -687,15 +709,16 @@ export async function launch({ * newly added, running the kernel to completion after each. * * @param {InboundQueue} inboundQueue - * @param {ReturnType} runSwingset + * @param {Cranker} runSwingset + * @param {CrankerPhase} phase */ - async function processActions(inboundQueue, runSwingset) { + async function processActions(inboundQueue, runSwingset, phase) { let keepGoing = true; for await (const { action, context } of inboundQueue.consumeAll()) { const inboundNum = `${context.blockHeight}-${context.txHash}-${context.msgIdx}`; inboundQueueMetrics.decStat(); await performAction(action, inboundNum); - keepGoing = await runSwingset(); + keepGoing = await runSwingset(phase); if (!keepGoing) { // any leftover actions will remain on the inbound queue for possible // processing in the next block @@ -705,20 +728,32 @@ export async function launch({ return keepGoing; } - async function runKernel(runSwingset, blockHeight, blockTime) { + /** + * Trigger the Swingset runs for this block, stopping when out of relevant + * work or when instructed to (whichever comes first). + * + * @param {Cranker} runSwingset + * @param {BlockInfo['blockHeight']} blockHeight + * @param {BlockInfo['blockTime']} blockTime + */ + async function processBlockActions(runSwingset, blockHeight, blockTime) { // First, complete leftover work, if any - let keepGoing = await runSwingset(); + let keepGoing = await runSwingset('leftover'); if (!keepGoing) return; // Then, if we have anything in the special runThisBlock queue, process // it and do no further work. if (runThisBlock.size()) { - await processActions(runThisBlock, runSwingset); + await processActions(runThisBlock, runSwingset, 'forced'); return; } // Then, process as much as we can from the priorityQueue. - keepGoing = await processActions(highPriorityQueue, runSwingset); + keepGoing = await processActions( + highPriorityQueue, + runSwingset, + 'high-priority', + ); if (!keepGoing) return; // Then, update the timer device with the new external time, which might @@ -737,11 +772,14 @@ export async function launch({ // We must run the kernel even if nothing was added since the kernel // only notes state exports and updates consistency hashes when attempting // to perform a crank. - keepGoing = await runSwingset(); + keepGoing = await runSwingset('timer'); if (!keepGoing) return; // Finally, process as much as we can from the actionQueue. - await processActions(actionQueue, runSwingset); + await processActions(actionQueue, runSwingset, 'queued'); + + // Cleanup after terminated vats as allowed. + await runSwingset('cleanup'); } async function endBlock(blockHeight, blockTime, params) { @@ -759,11 +797,11 @@ export async function launch({ // It will also run to completion any work that swingset still had pending. const neverStop = runThisBlock.size() > 0; - // make a runPolicy that will be shared across all cycles - const runPolicy = computronCounter(params.beansPerUnit, neverStop); + // Process the work for this block using a dedicated Cranker with a stateful + // run policy. + const runPolicy = computronCounter(params, neverStop); const runSwingset = makeRunSwingset(blockHeight, runPolicy); - - await runKernel(runSwingset, blockHeight, blockTime); + await processBlockActions(runSwingset, blockHeight, blockTime); if (END_BLOCK_SPIN_MS) { // Introduce a busy-wait to artificially put load on the chain. @@ -950,6 +988,7 @@ export async function launch({ case ActionType.AG_COSMOS_INIT: { allowExportCallback = true; // cleared by saveOutsideState in COMMIT_BLOCK const { blockHeight, isBootstrap, upgradeDetails } = action; + // TODO: parseParams(action.params), for validation? if (!blockNeedsExecution(blockHeight)) { return true; diff --git a/packages/cosmic-swingset/src/params.js b/packages/cosmic-swingset/src/params.js index f3a57b03749..31f9c6e92ed 100644 --- a/packages/cosmic-swingset/src/params.js +++ b/packages/cosmic-swingset/src/params.js @@ -1,9 +1,20 @@ // @ts-check // @jessie-check -import { Fail } from '@endo/errors'; +import { X, Fail, makeError } from '@endo/errors'; import { Nat, isNat } from '@endo/nat'; +/** + * @template {number | bigint} T + * @param {T} n + * @returns {T} + */ +const requireNat = n => (isNat(n) ? n : Fail`${n} must be a positive integer`); + +/** + * @param {string} s + * @returns {bigint} + */ export const stringToNat = s => { typeof s === 'string' || Fail`${s} must be a string`; const bint = BigInt(s); @@ -12,16 +23,33 @@ export const stringToNat = s => { return nat; }; -/** @param {{key: string, size: number}[]} queueSizeEntries */ -export const parseQueueSizes = queueSizeEntries => +/** + * @template T + * @template U + * @param {Array<[key: string, value: T]>} entries + * @param {(value: T) => U} [mapper] + */ +const recordFromEntries = ( + entries, + mapper = x => /** @type {U} */ (/** @type {unknown} */ (x)), +) => Object.fromEntries( - queueSizeEntries.map(({ key, size }) => { + entries.map(([key, value]) => { typeof key === 'string' || Fail`Key ${key} must be a string`; - isNat(size) || Fail`Size ${size} is not a positive integer`; - return [key, size]; + try { + return [key, mapper(value)]; + } catch (err) { + throw makeError(X`${key} value was invalid`, undefined, { cause: err }); + } }), ); +export const parseQueueSizes = entryRecords => + recordFromEntries( + entryRecords.map(({ key, size }) => [key, size]), + requireNat, + ); + /** @param {Record} queueSizes */ export const encodeQueueSizes = queueSizes => Object.entries(queueSizes).map(([key, size]) => { @@ -38,15 +66,16 @@ export const parseParams = params => { beans_per_unit: rawBeansPerUnit, fee_unit_price: rawFeeUnitPrice, queue_max: rawQueueMax, + vat_cleanup_budget: rawVatCleanupBudget, } = params; + Array.isArray(rawBeansPerUnit) || Fail`beansPerUnit must be an array, not ${rawBeansPerUnit}`; - const beansPerUnit = Object.fromEntries( - rawBeansPerUnit.map(({ key, beans }) => { - typeof key === 'string' || Fail`Key ${key} must be a string`; - return [key, stringToNat(beans)]; - }), + const beansPerUnit = recordFromEntries( + rawBeansPerUnit.map(({ key, beans }) => [key, beans]), + stringToNat, ); + Array.isArray(rawFeeUnitPrice) || Fail`feeUnitPrice ${rawFeeUnitPrice} must be an array`; const feeUnitPrice = rawFeeUnitPrice.map(({ denom, amount }) => { @@ -54,9 +83,20 @@ export const parseParams = params => { denom || Fail`denom ${denom} must be non-empty`; return { denom, amount: stringToNat(amount) }; }); + Array.isArray(rawQueueMax) || Fail`queueMax must be an array, not ${rawQueueMax}`; const queueMax = parseQueueSizes(rawQueueMax); - return { beansPerUnit, feeUnitPrice, queueMax }; + Array.isArray(rawVatCleanupBudget) || + Fail`vatCleanupBudget must be an array, not ${rawVatCleanupBudget}`; + const vatCleanupBudget = recordFromEntries( + rawVatCleanupBudget.map(({ key, value }) => [key, value]), + s => Number(stringToNat(s)), + ); + rawVatCleanupBudget.length === 0 || + vatCleanupBudget.default !== undefined || + Fail`vatCleanupBudget.default must be provided when vatCleanupBudget is not empty`; + + return { beansPerUnit, feeUnitPrice, queueMax, vatCleanupBudget }; }; diff --git a/packages/cosmic-swingset/src/sim-chain.js b/packages/cosmic-swingset/src/sim-chain.js index c665ebdc6c9..2ffecc93914 100644 --- a/packages/cosmic-swingset/src/sim-chain.js +++ b/packages/cosmic-swingset/src/sim-chain.js @@ -19,8 +19,11 @@ import { launch } from './launch-chain.js'; import { getTelemetryProviders } from './kernel-stats.js'; import { DEFAULT_SIM_SWINGSET_PARAMS, QueueInbound } from './sim-params.js'; import { parseQueueSizes } from './params.js'; +import { makeKVStoreFromMap } from './helpers/bufferedStorage.js'; import { makeQueue, makeQueueStorageMock } from './helpers/make-queue.js'; +/** @import { Mailbox } from '@agoric/swingset-vat' */ + const console = anylogger('fake-chain'); const TELEMETRY_SERVICE_NAME = 'sim-cosmos'; @@ -28,10 +31,11 @@ const TELEMETRY_SERVICE_NAME = 'sim-cosmos'; const PRETEND_BLOCK_DELAY = 5; const scaleBlockTime = ms => Math.floor(ms / 1000); -async function makeMapStorage(file) { - let content; +async function makeMailboxStorageFromFile(file) { + /** @type {Map} */ const map = new Map(); - map.commit = async () => { + const kvStore = makeKVStoreFromMap(map); + const commit = async () => { const obj = {}; for (const [k, v] of map.entries()) { obj[k] = exportMailbox(v); @@ -39,28 +43,33 @@ async function makeMapStorage(file) { const json = stringify(obj); await fs.promises.writeFile(file, json); }; - - await (async () => { - content = await fs.promises.readFile(file); + const read = async () => { + const content = await fs.promises.readFile(file, 'utf8'); return JSON.parse(content); - })().then( - obj => { - for (const [k, v] of Object.entries(obj)) { - map.set(k, importMailbox(v)); - } - }, - () => {}, - ); + }; + const load = async obj => { + map.clear(); + for (const [k, v] of Object.entries(obj)) { + map.set(k, importMailbox(v)); + } + }; + const reset = async () => { + const obj = await read(); + await load(obj); + }; + + await read().then(load, () => {}); - return map; + return { ...kvStore, commit, abort: reset }; } export async function connectToFakeChain(basedir, GCI, delay, inbound) { + const env = process.env; const initialHeight = 0; const mailboxFile = path.join(basedir, `fake-chain-${GCI}-mailbox.json`); const bootAddress = `${GCI}-client`; - const mailboxStorage = await makeMapStorage(mailboxFile); + const mailboxStorage = await makeMailboxStorageFromFile(mailboxFile); const argv = { giveMeAllTheAgoricPowers: true, @@ -75,13 +84,13 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { }; const getVatConfig = async () => { - const url = await importMetaResolve( - process.env.CHAIN_BOOTSTRAP_VAT_CONFIG || + const href = await importMetaResolve( + env.CHAIN_BOOTSTRAP_VAT_CONFIG || argv.bootMsg.params.bootstrap_vat_config, import.meta.url, ); - const vatconfig = new URL(url).pathname; - return vatconfig; + const { pathname } = new URL(href); + return pathname; }; const stateDBdir = path.join(basedir, `fake-chain-${GCI}-state`); function replayChainSends() { @@ -91,7 +100,6 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { return []; } - const env = process.env; const { metricsProvider } = getTelemetryProviders({ console, env, @@ -109,6 +117,7 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { const actionQueue = makeQueue(actionQueueStorage); const s = await launch({ + bridgeOutbound: /** @type {any} */ (undefined), actionQueueStorage, highPriorityQueueStorage, kernelStateDBDir: stateDBdir, @@ -120,13 +129,20 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { debugName: GCI, metricsProvider, slogSender, + swingsetConfig: {}, }); const { blockingSend, savedHeight } = s; let blockHeight = savedHeight; const intoChain = []; - let nextBlockTimeout = 0; + /** @type {undefined | ReturnType} */ + let nextBlockTimeout; + const resetNextBlockTimeout = () => { + if (nextBlockTimeout === undefined) return; + clearTimeout(nextBlockTimeout); + nextBlockTimeout = undefined; + }; const maximumDelay = (delay || PRETEND_BLOCK_DELAY) * 1000; @@ -172,8 +188,7 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { // Done processing, "commit the block". await blockingSend({ type: 'COMMIT_BLOCK', blockHeight, blockTime }); - clearTimeout(nextBlockTimeout); - // eslint-disable-next-line no-use-before-define + resetNextBlockTimeout(); nextBlockTimeout = setTimeout(simulateBlock, maximumDelay); // TODO: maybe add latency to the inbound messages. @@ -198,7 +213,7 @@ export async function connectToFakeChain(basedir, GCI, delay, inbound) { // Only actually simulate a block if we're not in bootstrap. let p; if (blockHeight && !delay) { - clearTimeout(nextBlockTimeout); + resetNextBlockTimeout(); p = simulateBlock(); } await p; diff --git a/packages/cosmic-swingset/src/sim-params.js b/packages/cosmic-swingset/src/sim-params.js index 441c223b950..4971fe6ed20 100644 --- a/packages/cosmic-swingset/src/sim-params.js +++ b/packages/cosmic-swingset/src/sim-params.js @@ -1,6 +1,7 @@ // @jessie-check // @ts-check +import { Fail } from '@endo/errors'; import { Nat } from '@endo/nat'; const makeStringBeans = (key, beans) => ({ key, beans: `${Nat(beans)}` }); @@ -69,13 +70,50 @@ export const defaultPowerFlagFees = [ ]; export const QueueInbound = 'inbound'; - export const defaultInboundQueueMax = 1_000; - export const defaultQueueMax = [ makeQueueSize(QueueInbound, defaultInboundQueueMax), ]; +/** + * @enum {(typeof VatCleanupPhase)[keyof typeof VatCleanupPhase]} + */ +export const VatCleanupPhase = /** @type {const} */ ({ + Default: 'default', + Exports: 'exports', + Imports: 'imports', + Promises: 'promises', + Kv: 'kv', + Snapshots: 'snapshots', + Transcripts: 'transcripts', +}); + +/** @typedef {Partial>} VatCleanupKeywordsRecord */ + +/** @type {VatCleanupKeywordsRecord} */ +export const VatCleanupDefaults = { + Default: 5, + Kv: 50, +}; + +/** + * @param {VatCleanupKeywordsRecord} keywordsRecord + * @returns {import('@agoric/cosmic-proto/swingset/swingset.js').ParamsSDKType['vat_cleanup_budget']} + */ +export const makeVatCleanupBudgetFromKeywords = keywordsRecord => { + return Object.entries(keywordsRecord).map(([keyName, value]) => { + Object.hasOwn(VatCleanupPhase, keyName) || + Fail`unknown vat cleanup phase keyword ${keyName}`; + return { + key: Reflect.get(VatCleanupPhase, keyName), + value: `${Nat(value)}`, + }; + }); +}; + +export const defaultVatCleanupBudget = + makeVatCleanupBudgetFromKeywords(VatCleanupDefaults); + /** * @type {import('@agoric/cosmic-proto/swingset/swingset.js').ParamsSDKType} */ @@ -85,4 +123,5 @@ export const DEFAULT_SIM_SWINGSET_PARAMS = { bootstrap_vat_config: defaultBootstrapVatConfig, power_flag_fees: defaultPowerFlagFees, queue_max: defaultQueueMax, + vat_cleanup_budget: defaultVatCleanupBudget, }; diff --git a/packages/cosmic-swingset/test/clean-core-eval.test.js b/packages/cosmic-swingset/test/clean-core-eval.test.js index 9c0a9717f76..e04cb24f401 100644 --- a/packages/cosmic-swingset/test/clean-core-eval.test.js +++ b/packages/cosmic-swingset/test/clean-core-eval.test.js @@ -5,6 +5,8 @@ import { } from '../scripts/clean-core-eval.js'; test('defangEvaluableCode is working', t => { + /** @typedef {import('ava').ThrowsExpectation} EvaluationExpectation */ + /** @type {Array<[string, string?, EvaluationExpectation?, EvaluationExpectation?]>} */ const samples = [ [''], [ diff --git a/packages/cosmic-swingset/test/gov-code.js b/packages/cosmic-swingset/test/gov-code.js index a66d2b11994..dd52188eeeb 100644 --- a/packages/cosmic-swingset/test/gov-code.js +++ b/packages/cosmic-swingset/test/gov-code.js @@ -1,4 +1,5 @@ /* global E */ +/// /** * This file, along with the companion `gov-permit.json`, are used to test "big * hammer" chain governance. They don't have a functional purpose outside of diff --git a/packages/cosmic-swingset/test/provision-smartwallet.test.js b/packages/cosmic-swingset/test/provision-smartwallet.test.js index 2162550fe82..8fdea18bd30 100644 --- a/packages/cosmic-swingset/test/provision-smartwallet.test.js +++ b/packages/cosmic-swingset/test/provision-smartwallet.test.js @@ -40,7 +40,7 @@ test.before(async t => { const io = { spawn: ambientSpawn, cwd: makefileDir }; const pspawnMake = pspawn('make', io); const pspawnAgd = pspawn('bin/ag-chain-cosmos', io); - const scenario2 = makeScenario2({ pspawnMake, pspawnAgd, delay, log: t.log }); + const scenario2 = makeScenario2({ pspawnMake, pspawnAgd, log: t.log }); const walletTool = makeWalletTool({ runMake: scenario2.runMake, pspawnAgd, @@ -65,6 +65,7 @@ test.before(async t => { // if run with the test above. // TODO: https://github.com/Agoric/agoric-sdk/issues/6766 test.skip('integration test: smart wallet provision', async t => { + // @ts-expect-error context has unknown type const { scenario2, walletTool, soloAddr } = t.context; const enoughBlocksToProvision = 7; diff --git a/packages/cosmic-swingset/test/run-policy.test.js b/packages/cosmic-swingset/test/run-policy.test.js new file mode 100644 index 00000000000..91157278905 --- /dev/null +++ b/packages/cosmic-swingset/test/run-policy.test.js @@ -0,0 +1,249 @@ +/* eslint-env node */ +import test from 'ava'; +import { assert, q, Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { BridgeId, deepCopyJsonable, objectMap } from '@agoric/internal'; +import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { + defaultBootstrapMessage, + defaultInitMessage, + makeCosmicSwingsetTestKit, +} from '../tools/test-kit.js'; +import { provideEnhancedKVStore } from '../src/helpers/bufferedStorage.js'; +import { + DEFAULT_SIM_SWINGSET_PARAMS, + makeVatCleanupBudgetFromKeywords, +} from '../src/sim-params.js'; + +/** @import { ManagerType, SwingSetConfig } from '@agoric/swingset-vat' */ +/** @import { KVStore } from '../src/helpers/bufferedStorage.js' */ + +/** + * Converts a Record into Record + * for defining e.g. a `bundles` group. + * + * @param {Record} src + * @returns {import('@agoric/swingset-vat').SwingSetConfigDescriptor} + */ +const makeSourceDescriptors = src => { + const hardened = objectMap(src, sourceSpec => ({ sourceSpec })); + return deepCopyJsonable(hardened); +}; + +/** + * @param {import('../src/sim-params.js').VatCleanupKeywordsRecord} budget + * @returns {import('@agoric/cosmic-proto/swingset/swingset.js').ParamsSDKType} + */ +const makeCleanupBudgetParams = budget => { + return { + ...DEFAULT_SIM_SWINGSET_PARAMS, + vat_cleanup_budget: makeVatCleanupBudgetFromKeywords(budget), + }; +}; + +test('cleanup work must be limited by vat_cleanup_budget', async t => { + let finish; + t.teardown(() => finish?.()); + // Make a test kit. + const fakeStorageKit = makeFakeStorageKit(''); + const { toStorage: handleVstorage } = fakeStorageKit; + const receiveBridgeSend = (destPort, msg) => { + switch (destPort) { + case BridgeId.STORAGE: { + return handleVstorage(msg); + } + default: + Fail`port ${q(destPort)} not implemented for message ${msg}`; + } + }; + const options = { + bundles: makeSourceDescriptors({ + puppet: '@agoric/swingset-vat/tools/vat-puppet.js', + }), + /** @type {Partial} */ + configOverrides: { + // Aggressive GC. + defaultReapInterval: 1, + // Ensure multiple spans and snapshots. + defaultManagerType: 'xsnap', + snapshotInitial: 2, + snapshotInterval: 4, + }, + fixupInitMessage: () => ({ + ...defaultBootstrapMessage, + params: makeCleanupBudgetParams({ Default: 0 }), + }), + }; + const testKit = await makeCosmicSwingsetTestKit(receiveBridgeSend, options); + const { pushCoreEval, runNextBlock, shutdown, swingStore } = testKit; + finish = shutdown; + await runNextBlock(); + + // Define helper functions for interacting with its swing store. + const mapStore = provideEnhancedKVStore( + /** @type {KVStore} */ (swingStore.kernelStorage.kvStore), + ); + /** @type {(key: string) => string} */ + const mustGet = key => { + const value = mapStore.get(key); + assert(value !== undefined, `kvStore entry for ${key} must exist`); + return value; + }; + + // Launch the new vat and capture its ID. + pushCoreEval( + `${async powers => { + const { bootstrap } = powers.vats; + await E(bootstrap).createVat('doomed', 'puppet'); + }}`, + ); + await runNextBlock(); + const vatIDs = JSON.parse(mustGet('vat.dynamicIDs')); + const vatID = vatIDs.at(-1); + t.is( + vatID, + 'v8', + `time to update expected vatID to ${JSON.stringify(vatIDs)}.at(-1)?`, + ); + t.false( + JSON.parse(mustGet('vats.terminated')).includes(vatID), + 'must not be terminated', + ); + // This key is/was used as a predicate for vat liveness. + // https://github.com/Agoric/agoric-sdk/blob/7ae1f278fa8cbeb0cfc777b7cebf507b1f07c958/packages/SwingSet/src/kernel/state/kernelKeeper.js#L1706 + const sentinelKey = `${vatID}.o.nextID`; + t.true(mapStore.has(sentinelKey)); + + // Define helper functions for interacting the vat's kvStore. + const getKV = () => + [...mapStore].filter(([key]) => key.startsWith(`${vatID}.`)); + const initialEntries = new Map(getKV()); + t.not(initialEntries.size, 0, 'initial kvStore entries must exist'); + + // Give the vat a big footprint. + pushCoreEval( + `${async powers => { + const { bootstrap } = powers.vats; + const doomed = await E(bootstrap).getVatRoot('doomed'); + + const makeArray = (length, makeElem) => Array.from({ length }, makeElem); + + // import 20 remotables and 10 promises + const doomedRemotableImports = await Promise.all( + makeArray(20, (_, i) => + E(bootstrap).makeRemotable(`doomed import ${i}`), + ), + ); + const doomedPromiseImports = ( + await Promise.all(makeArray(10, () => E(bootstrap).makePromiseKit())) + ).map(kit => kit.promise); + const doomedImports = [ + ...doomedRemotableImports, + ...doomedPromiseImports, + ]; + await E(doomed).holdInHeap(doomedImports); + + // export 20 remotables and 10 promises to bootstrap + const doomedRemotableExports = await Promise.all( + makeArray(20, (_, i) => E(doomed).makeRemotable(`doomed export ${i}`)), + ); + const doomedPromiseExports = ( + await Promise.all(makeArray(10, () => E(doomed).makePromiseKit())) + ).map(kit => { + const { promise } = kit; + void promise.catch(() => {}); + return promise; + }); + const doomedExports = [ + ...doomedRemotableExports, + ...doomedPromiseExports, + ]; + await E(bootstrap).holdInHeap(doomedExports); + + // make 20 extra vatstore entries + await E(doomed).holdInBaggage(...makeArray(20, (_, i) => i)); + }}`, + ); + await runNextBlock(); + t.false( + JSON.parse(mustGet('vats.terminated')).includes(vatID), + 'must not be terminated', + ); + const peakEntries = new Map(getKV()); + t.deepEqual( + [...peakEntries.keys()].filter(key => initialEntries.has(key)), + [...initialEntries.keys()], + 'initial kvStore keys must still exist', + ); + t.true( + peakEntries.size > initialEntries.size + 20, + `kvStore entry count must grow by more than 20: ${initialEntries.size} -> ${peakEntries.size}`, + ); + + // Terminate the vat and verify lack of cleanup. + pushCoreEval( + `${async powers => { + const { bootstrap } = powers.vats; + const adminNode = await E(bootstrap).getVatAdminNode('doomed'); + await E(adminNode).terminateWithFailure(); + }}`, + ); + await runNextBlock(); + t.true( + JSON.parse(mustGet('vats.terminated')).includes(vatID), + 'must be terminated', + ); + t.deepEqual( + [...getKV().map(([key]) => key)], + [...peakEntries.keys()], + 'kvStore keys must remain', + ); + + // Allow some cleanup. + // TODO: Verify snapshots and transcripts with `Default: 2` + // cf. packages/SwingSet/test/vat-admin/slow-termination/bootstrap-slow-terminate.js + await runNextBlock({ + params: makeCleanupBudgetParams({ Default: 2 ** 32, Kv: 0 }), + }); + const onlyKV = getKV(); + t.true( + onlyKV.length < peakEntries.size, + `kvStore entry count should have dropped from export/import cleanup: ${peakEntries.size} -> ${onlyKV.length}`, + ); + await runNextBlock({ + params: makeCleanupBudgetParams({ Default: 2 ** 32, Kv: 3 }), + }); + t.is(getKV().length, onlyKV.length - 3, 'initial kvStore deletion'); + let lastBlockInfo = await runNextBlock(); + t.is(getKV().length, onlyKV.length - 6, 'further kvStore deletion'); + + // Wait for the sentinel key to be removed, then re-instantiate the swingset + // and allow remaining cleanup. + while (mapStore.has(sentinelKey)) { + lastBlockInfo = await runNextBlock(); + } + await shutdown({ kernelOnly: true }); + finish = null; + { + // Pick up where we left off with the same data and block, + // but with a new budget. + const newOptions = { + ...options, + swingStore, + fixupInitMessage: () => ({ + ...defaultInitMessage, + ...lastBlockInfo, + params: makeCleanupBudgetParams({ Default: 2 ** 32 }), + }), + }; + // eslint-disable-next-line no-shadow + const { runNextBlock, shutdown } = await makeCosmicSwingsetTestKit( + receiveBridgeSend, + newOptions, + ); + finish = shutdown; + + await runNextBlock(); + t.is(getKV().length, 0, 'cleanup complete'); + } +}); diff --git a/packages/cosmic-swingset/test/scenario2.js b/packages/cosmic-swingset/test/scenario2.js index a489195be51..fa1a861302b 100644 --- a/packages/cosmic-swingset/test/scenario2.js +++ b/packages/cosmic-swingset/test/scenario2.js @@ -1,4 +1,6 @@ // @ts-check +import { text } from 'node:stream/consumers'; + const { freeze, entries } = Object; const onlyStderr = ['ignore', 'ignore', 'inherit']; @@ -10,13 +12,35 @@ export const pspawn = (bin, { spawn, cwd }) => { /** @type {import('child_process').ChildProcess} */ let child; const exit = new Promise((resolve, reject) => { - // console.debug('spawn', bin, args, { cwd: makefileDir, ...opts }); - child = spawn(bin, args, { cwd, ...opts }); - child.addListener('exit', code => { + // When stderr is otherwise ignored, spy on it for inclusion in error messages. + /** @type {Promise | undefined} */ + let stderrP; + // https://nodejs.org/docs/latest/api/child_process.html#optionsstdio + let { stdio = 'pipe' } = opts; + if (stdio === 'ignore' || stdio[2] === 'ignore') { + stdio = typeof stdio === 'string' ? [stdio, stdio, stdio] : [...stdio]; + stdio[2] = 'pipe'; + } else { + // The caller is not ignoring stderr, so we pretend it is empty here. + stderrP = Promise.resolve(''); + } + const resolvedOpts = { cwd, ...opts, stdio }; + // console.debug('spawn', bin, args, resolvedOpts); + child = spawn(bin, args, resolvedOpts); + if (!stderrP) { + assert(child.stderr); + stderrP = text(child.stderr); + child.stderr = null; + } + child.addListener('exit', async code => { if (code !== 0) { - // TODO: Include ~3 lines from child.stderr or child.stdout if present. - // see https://nodejs.org/api/child_process.html#child_processspawncommand-args-options - reject(Error(`exit ${code} from command: ${bin} ${args}`)); + let msg = `exit ${code} from command: ${bin} ${args}`; + const errStr = await stderrP; + if (errStr) { + const errTail = errStr.split('\n').slice(-3); + msg = `${msg}\n${errTail.map(line => ` ${line}`).join('\n')}`; + } + reject(Error(msg)); return; } resolve(0); diff --git a/packages/cosmic-swingset/tools/test-kit.js b/packages/cosmic-swingset/tools/test-kit.js new file mode 100644 index 00000000000..175038c291c --- /dev/null +++ b/packages/cosmic-swingset/tools/test-kit.js @@ -0,0 +1,392 @@ +/* eslint-env node */ + +import * as fsPromises from 'node:fs/promises'; +import * as pathNamespace from 'node:path'; +import { Fail } from '@endo/errors'; +import { + SwingsetMessageType, + QueuedActionType, +} from '@agoric/internal/src/action-types.js'; +import { makeInitMsg } from '@agoric/internal/src/chain-utils.js'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; +import { initSwingStore } from '@agoric/swing-store'; +import { makeSlogSender } from '@agoric/telemetry'; +import { launch } from '../src/launch-chain.js'; +import { DEFAULT_SIM_SWINGSET_PARAMS } from '../src/sim-params.js'; +import { + makeBufferedStorage, + makeKVStoreFromMap, +} from '../src/helpers/bufferedStorage.js'; +import { makeQueue, makeQueueStorageMock } from '../src/helpers/make-queue.js'; + +/** @import { BlockInfo, InitMsg } from '@agoric/internal/src/chain-utils.js' */ +/** @import { Mailbox, ManagerType, SwingSetConfig } from '@agoric/swingset-vat' */ +/** @import { KVStore } from '../src/helpers/bufferedStorage.js' */ +/** @import { InboundQueue } from '../src/launch-chain.js'; */ + +/** + * @template T + * @typedef {(input: T) => T} Replacer + */ + +/** @type {Replacer} */ +const stripUndefined = obj => + Object.fromEntries( + Object.entries(obj).filter(([_key, value]) => value !== undefined), + ); + +/** @type {InitMsg} */ +export const defaultInitMessage = harden( + makeInitMsg({ + type: SwingsetMessageType.AG_COSMOS_INIT, + blockHeight: 100, + blockTime: Math.floor(Date.parse('2020-01-01T00:00Z') / 1000), + chainID: 'localtest', + params: DEFAULT_SIM_SWINGSET_PARAMS, + supplyCoins: [], + + // cosmos-sdk module port mappings are generally ignored in testing, but + // relevant in live blockchains. + // Include them with unpredictable values. + ...Object.fromEntries( + Object.entries({ + storagePort: 0, + swingsetPort: 0, + vbankPort: 0, + vibcPort: 0, + }) + .sort(() => Math.random() - 0.5) + .map(([name, _zero], i) => [name, i + 1]), + ), + }), +); +/** @type {InitMsg} */ +export const defaultBootstrapMessage = harden({ + ...deepCopyJsonable(defaultInitMessage), + blockHeight: 1, + blockTime: Math.floor(Date.parse('2010-01-01T00:00Z') / 1000), + isBootstrap: true, + supplyCoins: [ + { denom: 'ubld', amount: `${50_000n * 10n ** 6n}` }, + { denom: 'uist', amount: `${1_000_000n * 10n ** 6n}` }, + ], +}); + +/** + * This is intended as the minimum practical definition needed for testing that + * runs with a mock chain on the other side of a bridge. The bootstrap vat is a + * generic object that exposes reflective methods for inspecting and + * interacting with devices and other vats, and is also capable of handling + * 'CORE_EVAL' requests containing a list of { json_permits, js_code } 'evals' + * by evaluating the code in an environment constrained by the permits (and it + * registers itself with the bridge vat as the recipient of such requests). + * + * @type {SwingSetConfig} + */ +const baseConfig = harden({ + defaultReapInterval: 'never', + defaultReapGCKrefs: 'never', + defaultManagerType: undefined, + bootstrap: 'bootstrap', + vats: { + bootstrap: { + sourceSpec: '@agoric/vats/tools/bootstrap-chain-reflective.js', + creationOptions: { + critical: true, + }, + parameters: { + baseManifest: 'MINIMAL', + }, + }, + }, + bundles: { + agoricNames: { + sourceSpec: '@agoric/vats/src/vat-agoricNames.js', + }, + bridge: { + sourceSpec: '@agoric/vats/src/vat-bridge.js', + }, + }, +}); + +/** + * Start a SwingSet kernel to be used by tests and benchmarks, returning objects + * and functions for representing a (mock) blockchain to which it is connected. + * + * Not all `launch`/`buildSwingset` inputs are exposed as inputs here, but that + * should be fixed if/when the need arises (while continuing to construct + * defaults as appropriate). + * + * The shutdown() function _must_ be called after the test or benchmarks are + * complete, else V8 will see the xsnap workers still running, and will never + * exit (leading to a timeout error). Ava tests should use + * t.after.always(shutdown), because the normal t.after() hooks are not run if a + * test fails. + * + * @param {((destPort: string, msg: unknown) => unknown)} receiveBridgeSend + * @param {object} [options] + * @param {string | null} [options.bundleDir] relative to working directory + * @param {SwingSetConfig['bundles']} [options.bundles] extra bundles configuration + * @param {Partial} [options.configOverrides] extensions to the + * default SwingSet configuration (may be overridden by more specific options + * such as `defaultManagerType`) + * @param {string} [options.debugName] + * @param {ManagerType} [options.defaultManagerType] As documented at + * {@link ../../../docs/env.md#swingset_worker_type}, the implicit default of + * 'local' can be overridden by a SWINGSET_WORKER_TYPE environment variable. + * @param {typeof process['env']} [options.env] + * @param {Replacer} [options.fixupInitMessage] a final opportunity to make + * any changes + * @param {Replacer} [options.fixupConfig] a final opportunity + * to make any changes + * @param {import('@agoric/telemetry').SlogSender} [options.slogSender] + * @param {import('../src/chain-main.js').CosmosSwingsetConfig} [options.swingsetConfig] + * @param {import('@agoric/swing-store').SwingStore} [options.swingStore] + * defaults to a new in-memory store + * @param {SwingSetConfig['vats']} [options.vats] extra static vat configuration + * @param {string} [options.baseBootstrapManifest] identifies the colletion of + * "behaviors" to run at bootstrap for creating and configuring the initial + * population of vats (see + * {@link ../../vats/tools/bootstrap-chain-reflective.js}) + * @param {string[]} [options.addBootstrapBehaviors] additional specific + * behavior functions to augment the selected manifest (see + * {@link ../../vats/src/core}) + * @param {string[]} [options.bootstrapCoreEvals] code defining functions to be + * called with a set of powers, each in their own isolated compartment + * @param {object} [powers] + * @param {Pick} [powers.fsp] + * @param {typeof import('node:path').resolve} [powers.resolvePath] + */ +export const makeCosmicSwingsetTestKit = async ( + receiveBridgeSend, + { + // Options for the SwingSet controller/kernel. + bundleDir = 'bundles', + bundles, + configOverrides, + defaultManagerType, + debugName, + env = process.env, + fixupInitMessage, + fixupConfig, + slogSender, + swingsetConfig = {}, + swingStore, + vats, + + // Options for vats (particularly the reflective bootstrap vat). + baseBootstrapManifest, + addBootstrapBehaviors, + bootstrapCoreEvals, + } = {}, + { fsp = fsPromises, resolvePath = pathNamespace.resolve } = {}, +) => { + await null; + /** @type {SwingSetConfig} */ + let config = { + ...deepCopyJsonable(baseConfig), + ...configOverrides, + ...stripUndefined({ defaultManagerType }), + }; + if (bundleDir) { + bundleDir = resolvePath(bundleDir); + config.bundleCachePath = bundleDir; + await fsp.mkdir(bundleDir, { recursive: true }); + } + config.bundles = { ...config.bundles, ...bundles }; + config.vats = { ...config.vats, ...vats }; + + // @ts-expect-error we assume that config.bootstrap is not undefined + const bootstrapVatDesc = config.vats[config.bootstrap]; + Object.assign( + bootstrapVatDesc.parameters, + stripUndefined({ + baseManifest: baseBootstrapManifest, + addBehaviors: addBootstrapBehaviors, + coreProposalCodeSteps: bootstrapCoreEvals, + }), + ); + + if (fixupConfig) config = fixupConfig(config); + + let initMessage = deepCopyJsonable(defaultInitMessage); + if (fixupInitMessage) initMessage = fixupInitMessage(initMessage); + initMessage?.type === SwingsetMessageType.AG_COSMOS_INIT || + Fail`initMessage must be AG_COSMOS_INIT`; + if (initMessage.isBootstrap === undefined && !swingStore) { + initMessage.isBootstrap = true; + } + + if (!swingStore) swingStore = initSwingStore(); // in-memory + const { hostStorage } = swingStore; + + const actionQueueStorage = makeQueueStorageMock().storage; + const highPriorityQueueStorage = makeQueueStorageMock().storage; + const { kvStore: mailboxKVStore, ...mailboxBufferMethods } = + makeBufferedStorage( + /** @type {KVStore} */ (makeKVStoreFromMap(new Map())), + ); + const mailboxStorage = { ...mailboxKVStore, ...mailboxBufferMethods }; + + const savedChainSends = []; + const clearChainSends = async () => savedChainSends.splice(0); + const replayChainSends = (..._args) => { + throw Error('not implemented'); + }; + + if (!slogSender && (env.SLOGFILE || env.SLOGSENDER)) { + slogSender = await makeSlogSender({ env }); + } + + const launchResult = await launch({ + swingStore, + actionQueueStorage, + highPriorityQueueStorage, + mailboxStorage, + clearChainSends, + replayChainSends, + bridgeOutbound: receiveBridgeSend, + vatconfig: config, + argv: { bootMsg: initMessage }, + env, + debugName, + slogSender, + swingsetConfig, + }); + const { blockingSend, shutdown: shutdownKernel } = launchResult; + /** @type {(options?: { kernelOnly?: boolean }) => Promise} */ + const shutdown = async ({ kernelOnly = false } = {}) => { + await shutdownKernel(); + if (kernelOnly) return; + await hostStorage.close(); + }; + + // Remember information about the current block, starting with the init + // message. + let { + isBootstrap: needsBootstrap, + blockHeight: lastBlockHeight, + blockTime: lastBlockTime, + params: lastBlockParams, + } = initMessage; + let lastBlockWalltime = Date.now(); + await blockingSend(initMessage); + + /** + * @returns {BlockInfo} + */ + const getLastBlockInfo = () => ({ + blockHeight: lastBlockHeight, + blockTime: lastBlockTime, + params: lastBlockParams, + }); + + // Advance block time at a nominal rate of one second per real millisecond, + // but introduce discontinuities as necessary to maintain monotonicity. + const nextBlockTime = () => { + const delta = Math.floor(Date.now() - lastBlockWalltime); + return lastBlockTime + (delta > 0 ? delta : 1); + }; + + let blockTxCount = 0; + + /** + * @param {Partial} [blockInfo] + */ + const runNextBlock = async ({ + blockHeight = needsBootstrap ? lastBlockHeight : lastBlockHeight + 1, + blockTime = needsBootstrap ? lastBlockTime : nextBlockTime(), + params = lastBlockParams, + } = {}) => { + needsBootstrap || + blockHeight > lastBlockHeight || + Fail`blockHeight ${blockHeight} must be greater than ${lastBlockHeight}`; + needsBootstrap || + blockTime > lastBlockTime || + Fail`blockTime ${blockTime} must be greater than ${lastBlockTime}`; + needsBootstrap = false; + lastBlockWalltime = Date.now(); + lastBlockHeight = blockHeight; + lastBlockTime = blockTime; + lastBlockParams = params; + blockTxCount = 0; + const context = { blockHeight, blockTime }; + await blockingSend({ + type: SwingsetMessageType.BEGIN_BLOCK, + ...context, + params, + }); + await blockingSend({ type: SwingsetMessageType.END_BLOCK, ...context }); + await blockingSend({ type: SwingsetMessageType.COMMIT_BLOCK, ...context }); + await blockingSend({ + type: SwingsetMessageType.AFTER_COMMIT_BLOCK, + ...context, + }); + return getLastBlockInfo(); + }; + + /** @type {InboundQueue} */ + const actionQueue = makeQueue(actionQueueStorage); + /** @type {InboundQueue} */ + const highPriorityQueue = makeQueue(highPriorityQueueStorage); + /** + * @param {{ type: QueuedActionType } & Record} action + * @param {InboundQueue} [queue] + */ + const pushQueueRecord = (action, queue = actionQueue) => { + blockTxCount += 1; + queue.push({ + action, + context: { + blockHeight: lastBlockHeight + 1, + txHash: blockTxCount, + msgIdx: '', + }, + }); + }; + /** + * @param {string} fnText must evaluate to a function that will be invoked in + * a core eval compartment with a "powers" argument as attenuated by + * `jsonPermits` (with no attenuation by default). + * @param {string} [jsonPermits] must deserialize into a BootstrapManifestPermit + * @param {InboundQueue} [queue] + */ + const pushCoreEval = ( + fnText, + jsonPermits = 'true', + queue = highPriorityQueue, + ) => { + // Fail noisily if fnText does not evaluate to a function. + // This must be refactored if there is ever a need for such input. + const fn = new Compartment().evaluate(fnText); + typeof fn === 'function' || Fail`text must evaluate to a function`; + /** @type {import('@agoric/vats/src/core/lib-boot.js').BootstrapManifestPermit} */ + // eslint-disable-next-line no-unused-vars + const permit = JSON.parse(jsonPermits); + /** @type {import('@agoric/cosmic-proto/swingset/swingset.js').CoreEvalSDKType} */ + const coreEvalDesc = { + json_permits: jsonPermits, + js_code: fnText, + }; + const action = { + type: QueuedActionType.CORE_EVAL, + evals: [coreEvalDesc], + }; + pushQueueRecord(action, queue); + }; + + return { + // SwingSet-oriented references. + actionQueue, + highPriorityQueue, + mailboxStorage, + shutdown, + swingStore, + + // Functions specific to this kit. + getLastBlockInfo, + pushQueueRecord, + pushCoreEval, + runNextBlock, + }; +}; diff --git a/packages/cosmic-swingset/tsconfig.json b/packages/cosmic-swingset/tsconfig.json index 993dde391d7..ac54f062118 100644 --- a/packages/cosmic-swingset/tsconfig.json +++ b/packages/cosmic-swingset/tsconfig.json @@ -1,9 +1,6 @@ // This file can contain .js-specific Typescript compiler config. { "extends": "../../tsconfig.json", - "compilerOptions": { - "checkJs": false, - }, "include": [ "calc-*.js", "src/**/*.js", diff --git a/packages/create-dapp/package.json b/packages/create-dapp/package.json index 81c7517a73c..927b8a9f233 100644 --- a/packages/create-dapp/package.json +++ b/packages/create-dapp/package.json @@ -12,7 +12,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -21,7 +21,7 @@ }, "devDependencies": { "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "dependencies": { "agoric": "^0.22.0-u18.5" diff --git a/packages/deploy-script-support/README.md b/packages/deploy-script-support/README.md index c1bafafb10a..f541fc01a7f 100644 --- a/packages/deploy-script-support/README.md +++ b/packages/deploy-script-support/README.md @@ -19,7 +19,10 @@ the proposal. Here's a simple example: -``` +```js +import { makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForGame1 } from '@agoric/smart-wallet/test/start-game1-proposal.js'; + /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ const game1ProposalBuilder = async ({ publishRef, install }) => { return harden({ @@ -45,28 +48,42 @@ export default async (homeP, endowments) => { }; ``` -The first element of `getManifestCall` is interpreted as the name of a function -defining a behavior. The second element of `getManifestCall` produces the -`options` argument passed to the function (`{ game1Red }` in the example -above). A common thing to want to pass in `options` is a reference to code to be -installed on-chain. The example above shows how. `publishRef(install())` -is built from sources in agoric-sdk, and passed as a `bundleRef`, which contains -a `bundleID` suitable for passing to Zoe (for contracts) or `vatAdminService` -(for non-contract vat code). - -The CoreEvalBuilder says the proposal to run is -'@agoric/smart-wallet/test/start-game1-proposal.js'. It says the manifest can be -produced by running `getManifestForGame1`, and directs the creation of bundles -from `@agoric/smart-wallet/test/gameAssetContract.js` which will be made -available to the proposal as `game1Ref` in `options`. - -The manifest gives permissions for accessing objects in promise space, and -passes installations to the proposalBuilder. Notice that `game1Ref` from the -proposalBuilder is passed to `getManifestForGame1`, which adds it to -`installations`, with the name `game1`. The name provided for installations will -also be used to register the installation in `agoricNames`. +This CoreEvalBuilder returns an object whose "sourceSpec" indicates that the +proposal to run is "@agoric/smart-wallet/test/start-game1-proposal.js" and whose +"getManifestCall" is a [functionName, ...args] array describing an invocation of +`getManifestForGame1` exported from that file which is expected to return an +object including a "manifest" as described below (but the actual invocation will +insert as the first argument a "powers" object that includes functions such as +`restoreRef`). A common thing to want to pass in `args` is a reference to code +to be installed on-chain, and the example above shows how. +`publishRef(install(...))` is built from sources in agoric-sdk, and passed as a +`bundleRef`, which contains a `bundleID` suitable for passing to Zoe (for +contracts) or `vatAdminService` (for non-contract vat code). + +The manifest from such an invocation is a JSON-serializable object in which each +key is the name of a function to itself be invoked and the corresponding value +is a "permit" describing an attenuation of the core-eval promise space to be +provided as its first argument. A permit is either `true` or a string (_both +meaning no attenuation of the respective subtree of the promise space, with a +string serving as a grouping label for convenience and/or diagram generation_), +or an object whose keys identify child properties and whose corresponding values +are theirselves (recursive) permits. See `BootstrapManifiest` in +[lib-boot.js](../vats/src/core/lib-boot.js). + +The object returned from a "getManifestCall" invocation may also include +"installations" to register in `agoricNames`, as is done here with name "game1" +using the reference passed in via the invocation argument: +```js +/** @type {import('@agoric/vats/src/core/lib-boot').BootstrapManifest} */ +const gameManifest = harden({ + [startGameContract.name]: { + consume: {...}, + brand: {...}, + issuer: {...}, + ... + }, +}); -``` export const getManifestForGame1 = ({ restoreRef }, { game1Ref }) => { return harden({ manifest: gameManifest, diff --git a/packages/deploy-script-support/package.json b/packages/deploy-script-support/package.json index 069f2af354f..4e409e0584e 100644 --- a/packages/deploy-script-support/package.json +++ b/packages/deploy-script-support/package.json @@ -34,6 +34,7 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/import-manager": "^0.3.12-u18.0", "@agoric/internal": "^0.4.0-u18.0", @@ -41,18 +42,17 @@ "@agoric/store": "^0.9.3-u18.0", "@agoric/time": "^0.3.3-u18.0", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/base64": "^1.0.8", - "@endo/bundle-source": "^3.4.2", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7", - "@endo/zip": "^1.0.8" + "@endo/base64": "^1.0.9", + "@endo/bundle-source": "^3.5.0", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8", + "@endo/zip": "^1.0.9" }, "devDependencies": { "@agoric/vats": "^0.16.0-u18.4", - "@endo/init": "^1.1.6", + "@endo/init": "^1.1.7", "ava": "^5.3.0", "import-meta-resolve": "^2.2.1" }, @@ -72,6 +72,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 82.6 + "atLeast": 83.71 } } diff --git a/packages/deployment/package.json b/packages/deployment/package.json index 362710deabf..b50ff5a797b 100644 --- a/packages/deployment/package.json +++ b/packages/deployment/package.json @@ -19,9 +19,9 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { - "@endo/errors": "^1.2.7", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", + "@endo/errors": "^1.2.8", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", "better-sqlite3": "^9.1.1", "chalk": "^5.2.0", "deterministic-json": "^1.0.5", diff --git a/packages/deployment/src/init.js b/packages/deployment/src/init.js index df9fcd7c316..b8590ff93c6 100644 --- a/packages/deployment/src/init.js +++ b/packages/deployment/src/init.js @@ -423,7 +423,6 @@ const doInit = } // Allocate the datacenters. - // eslint-disable-next-line no-constant-condition while (true) { const dcsWithNodeCount = dcs && diff --git a/packages/deployment/src/main.js b/packages/deployment/src/main.js index f550e9a37d7..f9c442edf8e 100644 --- a/packages/deployment/src/main.js +++ b/packages/deployment/src/main.js @@ -216,7 +216,6 @@ show-config display the client connection parameters }); await guardFile(`${PROVISION_DIR}/ssh_known_hosts.stamp`, async () => { - // eslint-disable-next-line no-constant-condition while (true) { const code = await reMain(['play', 'update_known_hosts']); if (code === 0) { diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 41b77a2a321..a971316799b 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -25,17 +25,17 @@ "eslint-config.*" ], "peerDependencies": { - "@endo/eslint-plugin": "^2.2.2", + "@endo/eslint-plugin": "^2.2.3", "@jessie.js/eslint-plugin": "^0.4.1", + "typescript-eslint": "^8.17.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-github": "^5.1.4", "eslint-config-jessie": "^0.0.6", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-github": "^4.10.0", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsdoc": "^46.4.3", "eslint-plugin-prettier": "^5.0.0", - "prettier": "^3.0.3", - "typescript-eslint": "^7.13.1" + "prettier": "^3.4.2" } } diff --git a/packages/fast-usdc/README.md b/packages/fast-usdc/README.md index 76a23f4c329..f242d8cc12a 100644 --- a/packages/fast-usdc/README.md +++ b/packages/fast-usdc/README.md @@ -3,12 +3,6 @@ Development package for the Fast USDC product. Here in agoric-sdk as a convenience for integration testing and iterating on the SDK affordances required for the product. -# Naming - -The package is `fast-usdc`, not `@agoric/fast-usdc`, because it's not part of the SDK. - -It should not appear in the NPM directory. To this end the package is marked as private. - # Factoring This package is meant to contain all the code for the Fast USDC product. However there are some constraints: @@ -23,3 +17,85 @@ Over time we can update our tooling to decouple this more from the `packages` di 2. Export bootstrap testing utilities from `@agoric/boot`, allowing this to be above `@agoric/boot` in the package graph 3. Update CI to support packages that aren't under `packages/`, eg. a top-level `dapps` directory 4. Move this package out of agoric-sdk + +# Transaction feed + +## Oracles interface + +Oracles run off-chain and interact with the contract via an Agoric smart wallet bridge. +```mermaid +sequenceDiagram + title Becoming an oracle operator + participant OW as Operator N
Smart Wallet + participant FUC as Fast USDC
Contract Exo + participant CE as Core Eval + + CE->>FUC: makeOperatorInvitation() + FUC-->>CE: operatorInvitation + CE->>+OW: deposit(operatorInvitation) + + Note left of FUC: Off-chain wallet accepts the operator invitation + + OW->>+FUC: offer(operatorInvitation) + FUC-->>OW: operator invitationMakers: {SubmitEvidence} + + Note left of FUC: Off-chain watcher detects evidence + OW->>+FUC: offer(SubmitEvidence, evidence) +``` + +```mermaid +sequenceDiagram + title Receiving evidence + participant W as Operator N
Smart Wallet + participant A as Operator N
Admin Oexo + participant TF as Transaction
Feed + + W->>A: offer(SubmitEvidence, evidence) + + Note left of A: Once 3 operators push the same… + + A->>TF: notify(evidence) +``` + +# Status Manager + +### Pending Advance State Diagram + +*Transactions are qualified by the OCW and EventFeed before arriving to the Advancer.* + +```mermaid +stateDiagram-v2 + [*] --> Observed: observe() + [*] --> Advancing: advancing() + + Advancing --> Advanced: advanceOutcome(...true) + Advancing --> AdvanceFailed: advanceOutcome(...false) + + Observed --> [*]: dequeueStatus() + Advanced --> [*]: dequeueStatus() + AdvanceFailed --> [*]: dequeueStatus() + + note right of [*] + After dequeueStatus(): + Transaction is removed + from pendingTxs store. + Settler will .disburse() + or .forward() + end note +``` + +### Complete state diagram (starting from Transaction Feed into Advancer) + +```mermaid +stateDiagram-v2 + Observed --> AdvanceSkipped : Risks identified + Observed --> Advancing : No risks, can advance + Observed --> Forwarding : No risks, Mint deposited before advance + Forwarding --> Forwarded + Advancing --> Advanced + Advanced --> Disbursed + AdvanceSkipped --> Forwarding : Mint deposited + AdvanceFailed --> Forwarding : Mint deposited + Advancing --> AdvanceFailed + Forwarding --> ForwardFailed +``` diff --git a/packages/fast-usdc/demo/testnet/config.json b/packages/fast-usdc/demo/testnet/config.json new file mode 100644 index 00000000000..67a26f2a6d7 --- /dev/null +++ b/packages/fast-usdc/demo/testnet/config.json @@ -0,0 +1,18 @@ +{ + "nobleSeed": "stamp later develop betray boss ranch abstract puzzle calm right bounce march orchard edge correct canal fault miracle void dutch lottery lucky observe armed", + "ethSeed": "a4b7f431465df5dc1458cd8a9be10c42da8e3729e3ce53f18814f48ae2a98a08", + "nobleToAgoricChannel": "channel-21", + "agoricRpc": "https://main.rpc.agoric.net", + "nobleRpc": "https://noble-rpc.polkachu.com", + "nobleApi": "https://noble-api.polkachu.com", + "ethRpc": "https://sepolia.drpc.org", + "tokenMessengerAddress": "0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5", + "tokenAddress": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", + "destinationChains": [ + { + "bech32prefix": "osmo", + "api": "https://lcd.osmosis.zone", + "USDCDenom": "ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4" + } + ] +} diff --git a/packages/fast-usdc/package.json b/packages/fast-usdc/package.json index 965170f3cab..990fd4541c8 100644 --- a/packages/fast-usdc/package.json +++ b/packages/fast-usdc/package.json @@ -1,20 +1,20 @@ { - "name": "fast-usdc", - "private": true, + "name": "@agoric/fast-usdc", "version": "0.1.1-u18.5", - "description": "Create an Agoric Javascript smart contract application", + "description": "CLI and library for Fast USDC product", "type": "module", "files": [ "contract", - "src" + "src", + "tools" ], "bin": { - "fast-usdc": "./src/cli.js" + "fast-usdc": "./src/cli/bin.js" }, "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -22,13 +22,43 @@ "lint:eslint": "eslint ." }, "devDependencies": { + "@agoric/swingset-liveslots": "^0.10.3-u18.0", + "@agoric/vats": "^0.16.0-u18.4", + "@agoric/zone": "^0.3.0-u18.0", + "@fast-check/ava": "^2.0.1", "ava": "^5.3.0", - "c8": "^9.1.0", - "ts-blank-space": "^0.4.1" + "c8": "^10.1.2", + "execa": "9.1.0", + "ts-blank-space": "^0.4.4" }, "dependencies": { - "agoric": "^0.22.0-u18.5", - "commander": "^12.1.0" + "@agoric/client-utils": "^0.1.0", + "@agoric/cosmic-proto": "^0.5.0-u18.4", + "@agoric/ertp": "^0.16.3-u18.0", + "@agoric/internal": "^0.4.0-u18.0", + "@agoric/notifier": "^0.7.0-u18.0", + "@agoric/orchestration": "^0.2.0-u18.4", + "@agoric/store": "^0.9.3-u18.0", + "@agoric/vat-data": "^0.5.3-u18.0", + "@agoric/vow": "^0.2.0-u18.0", + "@agoric/zoe": "^0.26.3-u18.0", + "@cosmjs/proto-signing": "^0.32.4", + "@cosmjs/stargate": "^0.32.4", + "@endo/base64": "^1.0.9", + "@endo/common": "^1.2.8", + "@endo/errors": "^1.2.8", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", + "@nick134-bit/noblejs": "0.0.2", + "bech32": "^2.0.0", + "commander": "^12.1.0", + "ethers": "^6.13.4" }, "ava": { "extensions": { @@ -46,5 +76,9 @@ "@endo/init/debug.js" ], "timeout": "20m" + }, + "license": "Apache-2.0", + "publishConfig": { + "access": "public" } } diff --git a/packages/fast-usdc/src/cli.js b/packages/fast-usdc/src/cli.js deleted file mode 100755 index 24846841cb7..00000000000 --- a/packages/fast-usdc/src/cli.js +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node - -import { Command } from 'commander'; -import { readFileSync } from 'fs'; -import { fileURLToPath } from 'url'; -import { dirname, resolve } from 'path'; - -const packageJson = JSON.parse( - readFileSync( - resolve(dirname(fileURLToPath(import.meta.url)), '../package.json'), - 'utf8', - ), -); - -const program = new Command(); - -program - .name('fast-usdc') - .description('CLI to interact with Fast USDC liquidity pool') - .version(packageJson.version); - -program - .command('deposit') - .description('Offer assets to the liquidity pool') - .action(() => { - console.error('TODO actually send deposit'); - // TODO: Implement deposit logic - }); - -program - .command('withdraw') - .description('Withdraw assets from the liquidity pool') - .action(() => { - console.error('TODO actually send withdrawal'); - // TODO: Implement withdraw logic - }); - -program.parse(); diff --git a/packages/fast-usdc/src/cli/bin.js b/packages/fast-usdc/src/cli/bin.js new file mode 100755 index 00000000000..61aa8abd6ff --- /dev/null +++ b/packages/fast-usdc/src/cli/bin.js @@ -0,0 +1,6 @@ +#!/usr/bin/env node +import '@endo/init/legacy.js'; +import { initProgram } from './cli.js'; + +const program = initProgram(); +program.parse(); diff --git a/packages/fast-usdc/src/cli/bridge-action.js b/packages/fast-usdc/src/cli/bridge-action.js new file mode 100644 index 00000000000..45a53351b8c --- /dev/null +++ b/packages/fast-usdc/src/cli/bridge-action.js @@ -0,0 +1,40 @@ +import { boardSlottingMarshaller } from '@agoric/client-utils'; + +/** + * @import {BridgeAction} from '@agoric/smart-wallet/src/smartWallet.js'; + */ + +const defaultMarshaller = boardSlottingMarshaller(); + +/** @typedef {ReturnType} BoardSlottingMarshaller */ + +/** + * @param {BridgeAction} bridgeAction + * @param {Pick} stdout + * @param {BoardSlottingMarshaller} marshaller + */ +const outputAction = (bridgeAction, stdout, marshaller) => { + const capData = marshaller.toCapData(harden(bridgeAction)); + stdout.write(JSON.stringify(capData)); + stdout.write('\n'); +}; + +export const sendHint = + 'Now use `agoric wallet send ...` to sign and broadcast the offer.\n'; + +/** + * @param {BridgeAction} bridgeAction + * @param {{ + * stdout: Pick, + * stderr: Pick, + * }} io + * @param {BoardSlottingMarshaller | undefined} marshaller + */ +export const outputActionAndHint = ( + bridgeAction, + { stdout, stderr }, + marshaller = defaultMarshaller, +) => { + outputAction(bridgeAction, stdout, marshaller); + stderr.write(sendHint); +}; diff --git a/packages/fast-usdc/src/cli/cli.js b/packages/fast-usdc/src/cli/cli.js new file mode 100644 index 00000000000..18acb636fe9 --- /dev/null +++ b/packages/fast-usdc/src/cli/cli.js @@ -0,0 +1,104 @@ +/* eslint-env node */ +/* global globalThis */ +import { Command } from 'commander'; +import { existsSync, mkdirSync, readFileSync } from 'fs'; +import { fileURLToPath } from 'url'; +import { dirname, resolve } from 'path'; +import { homedir } from 'os'; +import { + readFile as readAsync, + writeFile as writeAsync, +} from 'node:fs/promises'; +import { addConfigCommands } from './config-commands.js'; +import { addOperatorCommands } from './operator-commands.js'; +import * as configLib from './config.js'; +import transferLib from './transfer.js'; +import { makeFile } from '../util/file.js'; +import { addLPCommands } from './lp-commands.js'; + +const packageJson = JSON.parse( + readFileSync( + resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json'), + 'utf8', + ), +); + +const defaultHome = homedir(); + +export const initProgram = ( + configHelpers = configLib, + transferHelpers = transferLib, + readFile = readAsync, + writeFile = writeAsync, + mkdir = mkdirSync, + exists = existsSync, + fetch = globalThis.fetch, + stdout = process.stdout, + stderr = process.stderr, + env = process.env, + now = () => Date.now(), +) => { + const program = new Command(); + + program + .name('fast-usdc') + .description('CLI to interact with Fast USDC liquidity pool') + .version(packageJson.version) + .option( + '--home ', + `Home directory to use for config`, + `${defaultHome}/.fast-usdc/`, + ); + + const makeConfigFile = () => { + const getConfigPath = () => { + const { home: configDir } = program.opts(); + return `${configDir}config.json`; + }; + return makeFile(getConfigPath(), readFile, writeFile, mkdir, exists); + }; + + program.addHelpText( + 'afterAll', + ` + Agoric test networks provide configuration info at, for example, + + https://devnet.agoric.net/network-config + + To use RPC endpoints from such a configuration, use: + export AGORIC_NET=devnet + + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal. + `, + ); + addConfigCommands(program, configHelpers, makeConfigFile); + addOperatorCommands(program, { + fetch, + stdout, + stderr, + env, + now, + }); + addLPCommands(program, { fetch, stdout, stderr, env, now }); + + program + .command('transfer') + .description('Transfer USDC from Ethereum/L2 to Cosmos via Fast USDC') + .argument('amount', 'Amount to transfer denominated in uusdc') + .argument('dest', 'Destination address in Cosmos') + .action( + async ( + /** @type {string} */ amount, + /** @type {string} */ destination, + ) => { + const start = now(); + await transferHelpers.transfer(makeConfigFile(), amount, destination); + const duration = now() - start; + stdout.write( + `Transfer finished in ${(duration / 1000).toFixed(1)} seconds`, + ); + }, + ); + + return program; +}; diff --git a/packages/fast-usdc/src/cli/config-commands.js b/packages/fast-usdc/src/cli/config-commands.js new file mode 100644 index 00000000000..e2f39d6f7d0 --- /dev/null +++ b/packages/fast-usdc/src/cli/config-commands.js @@ -0,0 +1,108 @@ +/** + * @import {Command} from 'commander'; + * @import {File} from '../util/file.js'; + * @import * as ConfigHelpers from './config.js'; + */ +/** + * + * @param {Command} program + * @param {ConfigHelpers} configHelpers + * @param {() => File} makeConfigFile + */ +export const addConfigCommands = (program, configHelpers, makeConfigFile) => { + const config = program.command('config').description('Manage config'); + + config + .command('show') + .description('Show current config') + .action(async () => { + await configHelpers.show(makeConfigFile()); + }); + + config + .command('init') + .description('Set initial config values') + .requiredOption( + '--noble-seed ', + 'Seed phrase for Noble account. CAUTION: Stored unencrypted in file system', + ) + .requiredOption( + '--eth-seed ', + 'Seed phrase for Ethereum account. CAUTION: Stored unencrypted in file system', + ) + .requiredOption( + '--agoric-seed ', + 'Seed phrase for Agoric LP account. CAUTION: Stored unencrypted in file system', + ) + .option( + '--agoric-rpc [url]', + 'Agoric RPC endpoint', + 'http://127.0.0.1:26656', + ) + .option( + '--agoric-api [url]', + 'Agoric RPC endpoint', + 'http://127.0.0.1:1317', + ) + .option('--noble-rpc [url]', 'Noble RPC endpoint', 'http://127.0.0.1:26657') + .option('--noble-api [url]', 'Noble API endpoint', 'http://127.0.0.1:1318') + .option('--eth-rpc [url]', 'Ethereum RPC Endpoint', 'http://127.0.0.1:8545') + .option( + '--noble-to-agoric-channel [channel]', + 'Channel ID on Noble for Agoric', + 'channel-21', + ) + .option( + '--token-messenger-address [address]', + 'Address of TokenMessenger contract', + // Default to ETH mainnet contract address. For ETH sepolia, use 0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5 + '0xbd3fa81b58ba92a82136038b25adec7066af3155', + ) + .option( + '--token-contract-address [address]', + 'Address of USDC token contract', + // Detault to ETH mainnet token address. For ETH sepolia, use 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 + '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + ) + .action(async options => { + await configHelpers.init(makeConfigFile(), options); + }); + + config + .command('update') + .description('Update config values') + .option( + '--noble-seed [string]', + 'Seed phrase for Noble account. CAUTION: Stored unencrypted in file system', + ) + .option( + '--eth-seed [string]', + 'Seed phrase for Ethereum account. CAUTION: Stored unencrypted in file system', + ) + .option( + '--agoric-seed ', + 'Seed phrase for Agoric LP account. CAUTION: Stored unencrypted in file system', + ) + .option('--agoric-rpc [url]', 'Agoric RPC endpoint') + .option('--agoric-api [url]', 'Agoric API endpoint') + .option('--noble-rpc [url]', 'Noble RPC endpoint') + .option('--noble-api [url]', 'Noble API endpoint') + .option('--eth-rpc [url]', 'Ethereum RPC Endpoint') + .option( + '--noble-to-agoric-channel [channel]', + 'Channel ID on Noble for Agoric', + ) + .option( + '--token-messenger-address [address]', + 'Address of TokenMessenger contract', + ) + .option( + '--token-contract-address [address]', + 'Address of USDC token contract', + ) + .action(async options => { + await configHelpers.update(makeConfigFile(), options); + }); + + return config; +}; diff --git a/packages/fast-usdc/src/cli/config.js b/packages/fast-usdc/src/cli/config.js new file mode 100644 index 00000000000..c59e6c8fc13 --- /dev/null +++ b/packages/fast-usdc/src/cli/config.js @@ -0,0 +1,107 @@ +import * as readline from 'node:readline/promises'; +import { stdin as input, stdout as output } from 'node:process'; + +/** + @typedef {{ + bech32Prefix: string, + api: string, + USDCDenom: string + }} DestinationChain + */ + +/** + @typedef {{ + nobleSeed: string, + ethSeed: string, + nobleToAgoricChannel: string, + nobleApi: string, + nobleRpc: string, + ethRpc: string, + tokenMessengerAddress: string, + tokenAddress: string + destinationChains?: DestinationChain[] + }} ConfigOpts + */ + +/** @import { File } from '../util/file' */ + +export const init = async ( + /** @type {File} */ configFile, + /** @type {ConfigOpts} */ options, + out = console, + rl = readline.createInterface({ input, output }), +) => { + const showOverrideWarning = async () => { + const answer = await rl.question( + `Config at ${configFile.path} already exists. Override it? (To partially update, use "update", or set "--home" to use a different config path.) y/N: `, + ); + rl.close(); + const confirmed = ['y', 'yes'].includes(answer.toLowerCase()); + if (!confirmed) { + throw new Error('User cancelled'); + } + }; + + const writeConfig = async () => { + await null; + try { + await configFile.write(JSON.stringify(options, null, 2)); + out.log(`Config initialized at ${configFile.path}`); + } catch (error) { + out.error(`An unexpected error has occurred: ${error}`); + throw error; + } + }; + + await null; + if (configFile.exists()) { + await showOverrideWarning(); + } + await writeConfig(); +}; + +export const update = async ( + /** @type {File} */ configFile, + /** @type {Partial} */ options, + out = console, +) => { + const updateConfig = async (/** @type {ConfigOpts} */ data) => { + await null; + const stringified = JSON.stringify(data, null, 2); + try { + await configFile.write(stringified); + out.log(`Config updated at ${configFile.path}`); + out.log(stringified); + } catch (error) { + out.error(`An unexpected error has occurred: ${error}`); + throw error; + } + }; + + let file; + await null; + try { + file = await configFile.read(); + } catch { + out.error( + `No config found at ${configFile.path}. Use "init" to create one, or "--home" to specify config location.`, + ); + throw new Error(); + } + await updateConfig({ ...JSON.parse(file), ...options }); +}; + +export const show = async (/** @type {File} */ configFile, out = console) => { + let contents; + await null; + try { + contents = await configFile.read(); + } catch { + out.error( + `No config found at ${configFile.path}. Use "init" to create one, or "--home" to specify config location.`, + ); + throw new Error(); + } + out.log(`Config found at ${configFile.path}:`); + out.log(contents); +}; diff --git a/packages/fast-usdc/src/cli/lp-commands.js b/packages/fast-usdc/src/cli/lp-commands.js new file mode 100644 index 00000000000..afcbd063650 --- /dev/null +++ b/packages/fast-usdc/src/cli/lp-commands.js @@ -0,0 +1,178 @@ +/* eslint-env node */ +/** + * @import {Command} from 'commander'; + * @import {OfferSpec} from '@agoric/smart-wallet/src/offers.js'; + * @import {ExecuteOfferAction} from '@agoric/smart-wallet/src/smartWallet.js'; + * @import {USDCProposalShapes} from '../pool-share-math.js'; + */ + +import { + fetchEnvNetworkConfig, + makeSmartWalletKit, +} from '@agoric/client-utils'; +import { AmountMath } from '@agoric/ertp'; +import { + assertParsableNumber, + ceilDivideBy, + multiplyBy, + parseRatio, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import { InvalidArgumentError } from 'commander'; +import { outputActionAndHint } from './bridge-action.js'; + +export const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + +/** @param {string} arg */ +const parseDecimal = arg => { + try { + assertParsableNumber(arg); + const n = Number(arg); + return n; + } catch { + throw new InvalidArgumentError('Not a number'); + } +}; + +/** + * @param {string} amountString + * @param {Brand} usdc + */ +const parseUSDCAmount = (amountString, usdc) => { + const USDC_DECIMALS = 6; + const unit = AmountMath.make(usdc, 10n ** BigInt(USDC_DECIMALS)); + return multiplyBy(unit, parseRatio(amountString, usdc)); +}; + +/** + * @param {Command} program + * @param {{ + * fetch?: Window['fetch']; + * smartWalletKit?: import('@agoric/client-utils').SmartWalletKit; + * stdout: typeof process.stdout; + * stderr: typeof process.stderr; + * env: typeof process.env; + * now: typeof Date.now; + * }} io + */ +export const addLPCommands = ( + program, + { fetch, smartWalletKit, stderr, stdout, env, now }, +) => { + const loadSwk = async () => { + if (smartWalletKit) { + return smartWalletKit; + } + assert(fetch); + const networkConfig = await fetchEnvNetworkConfig({ env, fetch }); + return makeSmartWalletKit({ delay, fetch }, networkConfig); + }; + /** @type {undefined | ReturnType} */ + let swkP; + + program + .command('deposit') + .description('Deposit USDC into pool') + .addHelpText( + 'after', + '\nPipe the STDOUT to a file such as deposit.json, then use the Agoric CLI to broadcast it:\n agoric wallet send --offer deposit.json --from gov1 --keyring-backend="test"', + ) + .requiredOption('--amount ', 'USDC amount', parseDecimal) + .option('--offerId ', 'Offer id', String, `lpDeposit-${now()}`) + .action(async opts => { + swkP ||= loadSwk(); + const swk = await swkP; + /** @type {Brand<'nat'>} */ + // @ts-expect-error it doesnt recognize usdc as a Brand type + const usdc = swk.agoricNames.brand.USDC; + assert(usdc, 'USDC brand not in agoricNames'); + + const usdcAmount = parseUSDCAmount(opts.amount, usdc); + + /** @type {USDCProposalShapes['deposit']} */ + const proposal = { + give: { + USDC: usdcAmount, + }, + }; + + /** @type {OfferSpec} */ + const offer = { + id: opts.offerId, + invitationSpec: { + source: 'agoricContract', + instancePath: ['fastUsdc'], + callPipe: [['makeDepositInvitation', []]], + }, + proposal, + }; + + /** @type {ExecuteOfferAction} */ + const bridgeAction = { + method: 'executeOffer', + offer, + }; + + outputActionAndHint(bridgeAction, { stderr, stdout }, swk.marshaller); + }); + + program + .command('withdraw') + .description("Withdraw USDC from the LP's pool share") + .addHelpText( + 'after', + '\nPipe the STDOUT to a file such as withdraw.json, then use the Agoric CLI to broadcast it:\n agoric wallet send --offer withdraw.json --from gov1 --keyring-backend="test"', + ) + .requiredOption('--amount ', 'USDC amount', parseDecimal) + .option('--offerId ', 'Offer id', String, `lpWithdraw-${now()}`) + .action(async opts => { + swkP ||= loadSwk(); + swkP ||= loadSwk(); + const swk = await swkP; + + /** @type {Brand<'nat'>} */ + // @ts-expect-error it doesnt recognize FastLP as a Brand type + const poolShare = swk.agoricNames.brand.FastLP; + assert(poolShare, 'FastLP brand not in agoricNames'); + + /** @type {Brand<'nat'>} */ + // @ts-expect-error it doesnt recognize usdc as a Brand type + const usdc = swk.agoricNames.brand.USDC; + assert(usdc, 'USDC brand not in agoricNames'); + + const usdcAmount = parseUSDCAmount(opts.amount, usdc); + + /** @type {import('../types.js').PoolMetrics} */ + // @ts-expect-error it treats this as "unknown" + const metrics = await swk.readPublished('fastUsdc.poolMetrics'); + const fastLPAmount = ceilDivideBy(usdcAmount, metrics.shareWorth); + + /** @type {USDCProposalShapes['withdraw']} */ + const proposal = { + give: { + PoolShare: fastLPAmount, + }, + want: { + USDC: usdcAmount, + }, + }; + + /** @type {OfferSpec} */ + const offer = { + id: opts.offerId, + invitationSpec: { + source: 'agoricContract', + instancePath: ['fastUsdc'], + callPipe: [['makeWithdrawInvitation', []]], + }, + proposal, + }; + + outputActionAndHint( + { method: 'executeOffer', offer }, + { stderr, stdout }, + swk.marshaller, + ); + }); + + return program; +}; diff --git a/packages/fast-usdc/src/cli/operator-commands.js b/packages/fast-usdc/src/cli/operator-commands.js new file mode 100644 index 00000000000..6a4db0a1c98 --- /dev/null +++ b/packages/fast-usdc/src/cli/operator-commands.js @@ -0,0 +1,145 @@ +/* eslint-env node */ +/** + * @import {Command} from 'commander'; + * @import {OfferSpec} from '@agoric/smart-wallet/src/offers.js'; + * @import {ExecuteOfferAction} from '@agoric/smart-wallet/src/smartWallet.js'; + * @import {OperatorKit} from '../exos/operator-kit.js'; + */ + +import { + fetchEnvNetworkConfig, + makeSmartWalletKit, +} from '@agoric/client-utils'; +import { mustMatch } from '@agoric/internal'; +import { Nat } from '@endo/nat'; +import { InvalidArgumentError } from 'commander'; +import { INVITATION_MAKERS_DESC } from '../exos/transaction-feed.js'; +import { CctpTxEvidenceShape } from '../type-guards.js'; +import { outputActionAndHint } from './bridge-action.js'; + +export const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + +/** @param {string} arg */ +const parseNat = arg => { + const n = Nat(BigInt(arg)); + return n; +}; + +/** @param {string} arg */ +const parseHex = arg => { + if (!arg.startsWith('0x')) throw new InvalidArgumentError('not a hex string'); + return arg; +}; + +/** + * @param {Command} program + * @param {{ + * fetch: Window['fetch']; + * stdout: typeof process.stdout; + * stderr: typeof process.stderr; + * env: typeof process.env; + * now: typeof Date.now; + * }} io + */ +export const addOperatorCommands = ( + program, + { fetch, stderr, stdout, env, now }, +) => { + const operator = program + .command('operator') + .description('Oracle operator commands'); + + operator + .command('accept') + .description('Accept invitation to be an operator') + .addHelpText( + 'after', + '\nPipe the STDOUT to a file such as accept.json, then use the Agoric CLI to broadcast it:\n agoric wallet send --offer accept.json --from gov1 --keyring-backend="test"', + ) + .option('--offerId ', 'Offer id', String, `operatorAccept-${now()}`) + .action(async opts => { + const networkConfig = await fetchEnvNetworkConfig({ env, fetch }); + + const swk = await makeSmartWalletKit({ delay, fetch }, networkConfig); + const instance = swk.agoricNames.instance.fastUsdc; + assert(instance, 'fastUsdc instance not in agoricNames'); + + /** @type {OfferSpec} */ + const offer = { + id: opts.offerId, + invitationSpec: { + source: 'purse', + instance, + description: INVITATION_MAKERS_DESC, + }, + proposal: {}, + }; + + /** @type {ExecuteOfferAction} */ + const bridgeAction = { + method: 'executeOffer', + offer, + }; + + outputActionAndHint(bridgeAction, { stderr, stdout }); + }); + + operator + .command('attest') + .description('Attest to an observed Fast USDC transfer') + .addHelpText( + 'after', + '\nPipe the STDOUT to a file such as attest.json, then use the Agoric CLI to broadcast it:\n agoric wallet send --offer attest.json --from gov1 --keyring-backend="test"', + ) + .requiredOption('--previousOfferId ', 'Offer id', String) + .requiredOption('--forwardingChannel ', 'Channel id', String) + .requiredOption('--recipientAddress ', 'bech32 address', String) + .requiredOption('--blockHash <0xhex>', 'hex hash', parseHex) + .requiredOption('--blockNumber ', 'number', parseNat) + .requiredOption('--chainId ', 'chain id', Number) + .requiredOption('--amount ', 'number', parseNat) + .requiredOption('--forwardingAddress ', 'bech32 address', String) + .requiredOption('--sender ', 'Ethereum address initiating', String) + .requiredOption('--txHash <0xhexo>', 'hex hash', parseHex) + .option('--offerId ', 'Offer id', String, `operatorAttest-${now()}`) + .action(async opts => { + const { + offerId, + previousOfferId, + forwardingChannel, + recipientAddress, + amount, + forwardingAddress, + sender, + ...flat + } = opts; + + const evidence = harden({ + aux: { forwardingChannel, recipientAddress }, + tx: { amount, forwardingAddress, sender }, + ...flat, + }); + mustMatch(evidence, CctpTxEvidenceShape); + + /** @type {OfferSpec} */ + const offer = { + id: offerId, + invitationSpec: { + source: 'continuing', + previousOffer: previousOfferId, + /** @type {string & keyof OperatorKit['invitationMakers'] } */ + invitationMakerName: 'SubmitEvidence', + /** @type {Parameters } */ + invitationArgs: [evidence], + }, + proposal: {}, + }; + + outputActionAndHint( + { method: 'executeOffer', offer }, + { stderr, stdout }, + ); + }); + + return operator; +}; diff --git a/packages/fast-usdc/src/cli/transfer.js b/packages/fast-usdc/src/cli/transfer.js new file mode 100644 index 00000000000..31b8e212f65 --- /dev/null +++ b/packages/fast-usdc/src/cli/transfer.js @@ -0,0 +1,141 @@ +/* eslint-env node */ +/* global globalThis */ + +import { + fetchEnvNetworkConfig, + makeVStorage, + pickEndpoint, +} from '@agoric/client-utils'; +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { queryFastUSDCLocalChainAccount } from '../util/agoric.js'; +import { depositForBurn, makeProvider } from '../util/cctp.js'; +import { + makeSigner, + queryForwardingAccount, + registerFwdAccount, +} from '../util/noble.js'; +import { queryUSDCBalance } from '../util/bank.js'; + +/** @import { File } from '../util/file' */ +/** @import { VStorage } from '@agoric/client-utils' */ +/** @import { SigningStargateClient } from '@cosmjs/stargate' */ +/** @import { JsonRpcProvider as ethProvider } from 'ethers' */ + +const transfer = async ( + /** @type {File} */ configFile, + /** @type {string} */ amount, + /** @type {string} */ EUD, + out = console, + fetch = globalThis.fetch, + /** @type {VStorage | undefined} */ vstorage, + /** @type {{signer: SigningStargateClient, address: string} | undefined} */ nobleSigner, + /** @type {ethProvider | undefined} */ ethProvider, + env = process.env, + setTimeout = globalThis.setTimeout, +) => { + const execute = async ( + /** @type {import('./config').ConfigOpts} */ config, + ) => { + const netConfig = await fetchEnvNetworkConfig({ env, fetch }); + vstorage ||= makeVStorage( + { fetch }, + { chainName: 'agoric', rpcAddrs: [pickEndpoint(netConfig)] }, + ); + const agoricAddr = await queryFastUSDCLocalChainAccount(vstorage, out); + const encodedAddr = encodeAddressHook(agoricAddr, { EUD }); + out.log(`forwarding destination ${encodedAddr}`); + + const { exists, address } = await queryForwardingAccount( + config.nobleApi, + config.nobleToAgoricChannel, + encodedAddr, + out, + fetch, + ); + + if (!exists) { + nobleSigner ||= await makeSigner(config.nobleSeed, config.nobleRpc, out); + const { address: signerAddress, signer } = nobleSigner; + try { + const res = await registerFwdAccount( + signer, + signerAddress, + config.nobleToAgoricChannel, + encodedAddr, + out, + ); + out.log(res); + } catch (e) { + out.error( + `Error registering noble forwarding account for ${encodedAddr} on channel ${config.nobleToAgoricChannel}`, + ); + throw e; + } + } + + const destChain = config.destinationChains?.find(chain => + EUD.startsWith(chain.bech32Prefix), + ); + if (!destChain) { + out.error( + `No destination chain found in config with matching bech32 prefix for ${EUD}, cannot query destination address`, + ); + throw new Error(); + } + const { api, USDCDenom } = destChain; + const startingBalance = await queryUSDCBalance(EUD, api, USDCDenom, fetch); + + ethProvider ||= makeProvider(config.ethRpc); + await depositForBurn( + ethProvider, + config.ethSeed, + config.tokenMessengerAddress, + config.tokenAddress, + address, + amount, + out, + ); + + const refreshDelayMS = 1200; + const completeP = /** @type {Promise} */ ( + new Promise((res, rej) => { + const refreshUSDCBalance = async () => { + out.log('polling usdc balance'); + const currentBalance = await queryUSDCBalance( + EUD, + api, + USDCDenom, + fetch, + ); + if (currentBalance !== startingBalance) { + res(); + } else { + setTimeout(() => refreshUSDCBalance().catch(rej), refreshDelayMS); + } + }; + refreshUSDCBalance().catch(rej); + }) + ).catch(e => { + out.error( + 'Error checking destination address balance, could not detect completion of transfer.', + ); + out.error(e.message); + }); + + await completeP; + }; + + let config; + await null; + try { + config = JSON.parse(await configFile.read()); + } catch { + out.error( + `No config found at ${configFile.path}. Use "config init" to create one, or "--home" to specify config location.`, + ); + throw new Error(); + } + await execute(config); +}; + +export default { transfer }; diff --git a/packages/fast-usdc/src/constants.js b/packages/fast-usdc/src/constants.js new file mode 100644 index 00000000000..baeb178df71 --- /dev/null +++ b/packages/fast-usdc/src/constants.js @@ -0,0 +1,50 @@ +/** + * Status values for FastUSDC. + * + * @enum {(typeof TxStatus)[keyof typeof TxStatus]} + */ +export const TxStatus = /** @type {const} */ ({ + /** tx was observed but not advanced */ + Observed: 'OBSERVED', + /** IBC transfer is initiated */ + Advancing: 'ADVANCING', + /** IBC transfer is complete */ + Advanced: 'ADVANCED', + /** IBC transfer failed (timed out) */ + AdvanceFailed: 'ADVANCE_FAILED', + /** Advance skipped and waiting for forward */ + AdvanceSkipped: 'ADVANCE_SKIPPED', + /** settlement for matching advance received and funds disbursed */ + Disbursed: 'DISBURSED', + /** fallback: do not collect fees */ + Forwarded: 'FORWARDED', + /** failed to forward to EUD */ + ForwardFailed: 'FORWARD_FAILED', +}); +harden(TxStatus); + +// According to the state diagram +export const TerminalTxStatus = { + [TxStatus.Forwarded]: true, + [TxStatus.ForwardFailed]: true, + [TxStatus.Disbursed]: true, +}; + +/** + * Status values for the StatusManager. + * + * @enum {(typeof PendingTxStatus)[keyof typeof PendingTxStatus]} + */ +export const PendingTxStatus = /** @type {const} */ ({ + /** tx was observed but not advanced */ + Observed: 'OBSERVED', + /** IBC transfer is initiated */ + Advancing: 'ADVANCING', + /** IBC transfer failed (timed out) */ + AdvanceFailed: 'ADVANCE_FAILED', + /** IBC transfer is complete */ + Advanced: 'ADVANCED', + /** Advance skipped and waiting for forward */ + AdvanceSkipped: 'ADVANCE_SKIPPED', +}); +harden(PendingTxStatus); diff --git a/packages/fast-usdc/src/exos/advancer.js b/packages/fast-usdc/src/exos/advancer.js new file mode 100644 index 00000000000..9620d93aa9c --- /dev/null +++ b/packages/fast-usdc/src/exos/advancer.js @@ -0,0 +1,301 @@ +import { decodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { AmountMath } from '@agoric/ertp'; +import { assertAllDefined, makeTracer } from '@agoric/internal'; +import { AnyNatAmountShape, ChainAddressShape } from '@agoric/orchestration'; +import { pickFacet } from '@agoric/vat-data'; +import { VowShape } from '@agoric/vow'; +import { E } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { Fail, q } from '@endo/errors'; +import { + AddressHookShape, + EvmHashShape, + EvidenceWithRiskShape, +} from '../type-guards.js'; +import { makeFeeTools } from '../utils/fees.js'; + +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {TypedPattern} from '@agoric/internal' + * @import {NatAmount} from '@agoric/ertp'; + * @import {ChainAddress, ChainHub, Denom, OrchestrationAccount} from '@agoric/orchestration'; + * @import {ZoeTools} from '@agoric/orchestration/src/utils/zoe-tools.js'; + * @import {VowTools} from '@agoric/vow'; + * @import {Zone} from '@agoric/zone'; + * @import {CctpTxEvidence, AddressHook, EvmHash, FeeConfig, LogFn, NobleAddress, EvidenceWithRisk} from '../types.js'; + * @import {StatusManager} from './status-manager.js'; + * @import {LiquidityPoolKit} from './liquidity-pool.js'; + */ + +/** + * @typedef {{ + * chainHub: ChainHub; + * feeConfig: FeeConfig; + * localTransfer: ZoeTools['localTransfer']; + * log?: LogFn; + * statusManager: StatusManager; + * usdc: { brand: Brand<'nat'>; denom: Denom; }; + * vowTools: VowTools; + * zcf: ZCF; + * }} AdvancerKitPowers + */ + +/** @type {TypedPattern} */ +const AdvancerVowCtxShape = M.splitRecord( + { + fullAmount: AnyNatAmountShape, + advanceAmount: AnyNatAmountShape, + destination: ChainAddressShape, + forwardingAddress: M.string(), + txHash: EvmHashShape, + }, + { tmpSeat: M.remotable() }, +); + +/** type guards internal to the AdvancerKit */ +const AdvancerKitI = harden({ + advancer: M.interface('AdvancerI', { + handleTransactionEvent: M.callWhen(EvidenceWithRiskShape).returns(), + setIntermediateRecipient: M.call(ChainAddressShape).returns(), + }), + depositHandler: M.interface('DepositHandlerI', { + onFulfilled: M.call(M.undefined(), AdvancerVowCtxShape).returns(VowShape), + onRejected: M.call(M.error(), AdvancerVowCtxShape).returns(), + }), + transferHandler: M.interface('TransferHandlerI', { + // TODO confirm undefined, and not bigint (sequence) + onFulfilled: M.call(M.undefined(), AdvancerVowCtxShape).returns( + M.undefined(), + ), + onRejected: M.call(M.error(), AdvancerVowCtxShape).returns(M.undefined()), + }), +}); + +/** + * @typedef {{ + * fullAmount: NatAmount; + * advanceAmount: NatAmount; + * destination: ChainAddress; + * forwardingAddress: NobleAddress; + * txHash: EvmHash; + * }} AdvancerVowCtx + */ + +/** + * @param {Zone} zone + * @param {AdvancerKitPowers} caps + */ +export const prepareAdvancerKit = ( + zone, + { + chainHub, + feeConfig, + localTransfer, + log = makeTracer('Advancer', true), + statusManager, + usdc, + vowTools: { watch, when }, + zcf, + }, +) => { + assertAllDefined({ + chainHub, + feeConfig, + statusManager, + watch, + when, + }); + const feeTools = makeFeeTools(feeConfig); + /** @param {bigint} value */ + const toAmount = value => AmountMath.make(usdc.brand, value); + + return zone.exoClassKit( + 'Fast USDC Advancer', + AdvancerKitI, + /** + * @param {{ + * notifyFacet: import('./settler.js').SettlerKit['notify']; + * borrowerFacet: LiquidityPoolKit['borrower']; + * poolAccount: HostInterface>; + * settlementAddress: ChainAddress; + * intermediateRecipient?: ChainAddress; + * }} config + */ + config => + harden({ + ...config, + // make sure the state record has this property, perhaps with an undefined value + intermediateRecipient: config.intermediateRecipient, + }), + { + advancer: { + /** + * Must perform a status update for every observed transaction. + * + * We do not expect any callers to depend on the settlement of + * `handleTransactionEvent` - errors caught are communicated to the + * `StatusManager` - so we don't need to concern ourselves with + * preserving the vow chain for callers. + * + * @param {EvidenceWithRisk} evidenceWithRisk + */ + async handleTransactionEvent({ evidence, risk }) { + await null; + try { + if (statusManager.hasBeenObserved(evidence)) { + log('txHash already seen:', evidence.txHash); + return; + } + + if (risk.risksIdentified?.length) { + log('risks identified, skipping advance'); + statusManager.skipAdvance(evidence, risk.risksIdentified); + return; + } + + const { borrowerFacet, poolAccount, settlementAddress } = + this.state; + const { recipientAddress } = evidence.aux; + const decoded = decodeAddressHook(recipientAddress); + mustMatch(decoded, AddressHookShape); + if (decoded.baseAddress !== settlementAddress.value) { + throw Fail`⚠️ baseAddress of address hook ${q(decoded.baseAddress)} does not match the expected address ${q(settlementAddress.value)}`; + } + const { EUD } = /** @type {AddressHook['query']} */ (decoded.query); + log(`decoded EUD: ${EUD}`); + // throws if the bech32 prefix is not found + const destination = chainHub.makeChainAddress(EUD); + + const fullAmount = toAmount(evidence.tx.amount); + // throws if requested does not exceed fees + const advanceAmount = feeTools.calculateAdvance(fullAmount); + + const { zcfSeat: tmpSeat } = zcf.makeEmptySeatKit(); + // throws if the pool has insufficient funds + borrowerFacet.borrow(tmpSeat, advanceAmount); + + // this cannot throw since `.isSeen()` is called in the same turn + statusManager.advance(evidence); + + const depositV = localTransfer( + tmpSeat, + // @ts-expect-error LocalAccountMethods vs OrchestrationAccount + poolAccount, + harden({ USDC: advanceAmount }), + ); + void watch(depositV, this.facets.depositHandler, { + advanceAmount, + destination, + forwardingAddress: evidence.tx.forwardingAddress, + fullAmount, + tmpSeat, + txHash: evidence.txHash, + }); + } catch (error) { + log('Advancer error:', error); + statusManager.observe(evidence); + } + }, + /** @param {ChainAddress} intermediateRecipient */ + setIntermediateRecipient(intermediateRecipient) { + this.state.intermediateRecipient = intermediateRecipient; + }, + }, + depositHandler: { + /** + * @param {undefined} result + * @param {AdvancerVowCtx & { tmpSeat: ZCFSeat }} ctx + */ + onFulfilled(result, ctx) { + const { poolAccount, intermediateRecipient } = this.state; + const { destination, advanceAmount, ...detail } = ctx; + const transferV = E(poolAccount).transfer( + destination, + { denom: usdc.denom, value: advanceAmount.value }, + { forwardOpts: { intermediateRecipient } }, + ); + return watch(transferV, this.facets.transferHandler, { + destination, + advanceAmount, + ...detail, + }); + }, + /** + * We do not expect this to be a common failure. it should only occur + * if USDC is not registered in vbank or the tmpSeat has less than + * `advanceAmount`. + * + * If we do hit this path, we return funds to the Liquidity Pool and + * notify of Advancing failure. + * + * @param {Error} error + * @param {AdvancerVowCtx & { tmpSeat: ZCFSeat }} ctx + */ + onRejected(error, { tmpSeat, advanceAmount, ...restCtx }) { + log( + '⚠️ deposit to localOrchAccount failed, attempting to return payment to LP', + error, + ); + try { + const { borrowerFacet, notifyFacet } = this.state; + notifyFacet.notifyAdvancingResult(restCtx, false); + borrowerFacet.returnToPool(tmpSeat, advanceAmount); + } catch (e) { + log('🚨 deposit to localOrchAccount failure recovery failed', e); + } + }, + }, + transferHandler: { + /** + * @param {unknown} result TODO confirm this is not a bigint (sequence) + * @param {AdvancerVowCtx} ctx + */ + onFulfilled(result, ctx) { + const { notifyFacet } = this.state; + const { advanceAmount, destination, ...detail } = ctx; + log('Advance transfer fulfilled', { + advanceAmount, + destination, + result, + }); + // During development, due to a bug, this call threw. + // The failure was silent (no diagnostics) due to: + // - #10576 Vows do not report unhandled rejections + // For now, the advancer kit relies on consistency between + // notifyFacet, statusManager, and callers of handleTransactionEvent(). + // TODO: revisit #10576 during #10510 + notifyFacet.notifyAdvancingResult({ destination, ...detail }, true); + }, + /** + * @param {Error} error + * @param {AdvancerVowCtx} ctx + */ + onRejected(error, ctx) { + const { notifyFacet } = this.state; + log('Advance transfer rejected', error); + notifyFacet.notifyAdvancingResult(ctx, false); + }, + }, + }, + { + stateShape: harden({ + notifyFacet: M.remotable(), + borrowerFacet: M.remotable(), + poolAccount: M.remotable(), + intermediateRecipient: M.opt(ChainAddressShape), + settlementAddress: M.opt(ChainAddressShape), + }), + }, + ); +}; +harden(prepareAdvancerKit); + +/** + * @param {Zone} zone + * @param {AdvancerKitPowers} caps + */ +export const prepareAdvancer = (zone, caps) => { + const makeAdvancerKit = prepareAdvancerKit(zone, caps); + return pickFacet(makeAdvancerKit, 'advancer'); +}; +harden(prepareAdvancer); diff --git a/packages/fast-usdc/src/exos/liquidity-pool.js b/packages/fast-usdc/src/exos/liquidity-pool.js new file mode 100644 index 00000000000..5df4c86bbf2 --- /dev/null +++ b/packages/fast-usdc/src/exos/liquidity-pool.js @@ -0,0 +1,367 @@ +import { AmountMath } from '@agoric/ertp'; +import { + makeRecorderTopic, + TopicsRecordShape, +} from '@agoric/zoe/src/contractSupport/topics.js'; +import { SeatShape } from '@agoric/zoe/src/typeGuards.js'; +import { M } from '@endo/patterns'; +import { Fail, q } from '@endo/errors'; +import { + borrowCalc, + depositCalc, + makeParity, + repayCalc, + withdrawCalc, +} from '../pool-share-math.js'; +import { + makeNatAmountShape, + makeProposalShapes, + PoolMetricsShape, +} from '../type-guards.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {Remote} from '@agoric/internal' + * @import {StorageNode} from '@agoric/internal/src/lib-chainStorage.js' + * @import {MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js' + * @import {USDCProposalShapes, ShareWorth} from '../pool-share-math.js' + * @import {PoolStats} from '../types.js'; + */ + +const { add, isEqual, isGTE, makeEmpty } = AmountMath; + +/** @param {Brand} brand */ +const makeDust = brand => AmountMath.make(brand, 1n); + +/** + * Verifies that the total pool balance (unencumbered + encumbered) matches the + * shareWorth numerator. The total pool balance consists of: + * 1. unencumbered balance - USDC available in the pool for borrowing + * 2. encumbered balance - USDC currently lent out + * + * A negligible `dust` amount is used to initialize shareWorth with a non-zero + * denominator. It must remain in the pool at all times. + * + * @param {ZCFSeat} poolSeat + * @param {ShareWorth} shareWorth + * @param {Brand} USDC + * @param {Amount<'nat'>} encumberedBalance + */ +const checkPoolBalance = (poolSeat, shareWorth, USDC, encumberedBalance) => { + const unencumberedBalance = poolSeat.getAmountAllocated('USDC', USDC); + const dust = makeDust(USDC); + const grossBalance = add(add(unencumberedBalance, dust), encumberedBalance); + isEqual(grossBalance, shareWorth.numerator) || + Fail`🚨 pool balance ${q(unencumberedBalance)} and encumbered balance ${q(encumberedBalance)} inconsistent with shareWorth ${q(shareWorth)}`; +}; + +/** + * @typedef {{ + * Principal: Amount<'nat'>; + * PoolFee: Amount<'nat'>; + * ContractFee: Amount<'nat'>; + * }} RepayAmountKWR + */ + +/** + * @typedef {{ + * Principal: Payment<'nat'>; + * PoolFee: Payment<'nat'>; + * ContractFee: Payment<'nat'>; + * }} RepayPaymentKWR + */ + +/** + * @param {Zone} zone + * @param {ZCF} zcf + * @param {Brand<'nat'>} USDC + * @param {{ + * makeRecorderKit: MakeRecorderKit; + * }} tools + */ +export const prepareLiquidityPoolKit = (zone, zcf, USDC, tools) => { + return zone.exoClassKit( + 'Liquidity Pool', + { + borrower: M.interface('borrower', { + borrow: M.call(SeatShape, makeNatAmountShape(USDC, 1n)).returns(), + returnToPool: M.call(SeatShape, makeNatAmountShape(USDC, 1n)).returns(), + }), + repayer: M.interface('repayer', { + repay: M.call( + SeatShape, + harden({ + Principal: makeNatAmountShape(USDC, 1n), + PoolFee: makeNatAmountShape(USDC, 0n), + ContractFee: makeNatAmountShape(USDC, 0n), + }), + ).returns(), + }), + external: M.interface('external', { + publishPoolMetrics: M.call().returns(), + }), + depositHandler: M.interface('depositHandler', { + handle: M.call(SeatShape, M.any()).returns(M.promise()), + }), + withdrawHandler: M.interface('withdrawHandler', { + handle: M.call(SeatShape, M.any()).returns(M.promise()), + }), + public: M.interface('public', { + makeDepositInvitation: M.call().returns(M.promise()), + makeWithdrawInvitation: M.call().returns(M.promise()), + getPublicTopics: M.call().returns(TopicsRecordShape), + }), + }, + /** + * @param {ZCFMint<'nat'>} shareMint + * @param {Remote} node + */ + (shareMint, node) => { + const { brand: PoolShares } = shareMint.getIssuerRecord(); + const proposalShapes = makeProposalShapes({ USDC, PoolShares }); + const shareWorth = makeParity(makeDust(USDC), PoolShares); + const { zcfSeat: poolSeat } = zcf.makeEmptySeatKit(); + const { zcfSeat: feeSeat } = zcf.makeEmptySeatKit(); + const poolMetricsRecorderKit = tools.makeRecorderKit( + node, + PoolMetricsShape, + ); + const encumberedBalance = makeEmpty(USDC); + /** @type {PoolStats} */ + const poolStats = harden({ + totalBorrows: makeEmpty(USDC), + totalContractFees: makeEmpty(USDC), + totalPoolFees: makeEmpty(USDC), + totalRepays: makeEmpty(USDC), + }); + return { + /** used for `checkPoolBalance` invariant. aka 'outstanding borrows' */ + encumberedBalance, + feeSeat, + poolStats, + poolMetricsRecorderKit, + poolSeat, + PoolShares, + proposalShapes, + shareMint, + shareWorth, + }; + }, + { + borrower: { + /** + * @param {ZCFSeat} toSeat + * @param {Amount<'nat'>} amount + */ + borrow(toSeat, amount) { + const { encumberedBalance, poolSeat, poolStats } = this.state; + + // Validate amount is available in pool + const post = borrowCalc( + amount, + poolSeat.getAmountAllocated('USDC', USDC), + encumberedBalance, + poolStats, + ); + + // COMMIT POINT + // UNTIL #10684: ability to terminate an incarnation w/o terminating the contract + zcf.atomicRearrange(harden([[poolSeat, toSeat, { USDC: amount }]])); + + Object.assign(this.state, post); + this.facets.external.publishPoolMetrics(); + }, + /** + * If something fails during advance, return funds to the pool. + * + * @param {ZCFSeat} borrowSeat + * @param {Amount<'nat'>} amount + */ + returnToPool(borrowSeat, amount) { + const { zcfSeat: repaySeat } = zcf.makeEmptySeatKit(); + const returnAmounts = harden({ + Principal: amount, + PoolFee: makeEmpty(USDC), + ContractFee: makeEmpty(USDC), + }); + const borrowSeatAllocation = borrowSeat.getCurrentAllocation(); + isGTE(borrowSeatAllocation.USDC, amount) || + Fail`⚠️ borrowSeatAllocation ${q(borrowSeatAllocation)} less than amountKWR ${q(amount)}`; + // arrange payments in a format repay is expecting + zcf.atomicRearrange( + harden([[borrowSeat, repaySeat, { USDC: amount }, returnAmounts]]), + ); + return this.facets.repayer.repay(repaySeat, returnAmounts); + }, + }, + repayer: { + /** + * @param {ZCFSeat} fromSeat + * @param {RepayAmountKWR} amounts + */ + repay(fromSeat, amounts) { + const { + encumberedBalance, + feeSeat, + poolSeat, + poolStats, + shareWorth, + } = this.state; + checkPoolBalance(poolSeat, shareWorth, USDC, encumberedBalance); + + const fromSeatAllocation = fromSeat.getCurrentAllocation(); + // Validate allocation equals amounts and Principal <= encumberedBalance + const post = repayCalc( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, + ); + + const { ContractFee, ...rest } = amounts; + + // COMMIT POINT + // UNTIL #10684: ability to terminate an incarnation w/o terminating the contract + zcf.atomicRearrange( + harden([ + [ + fromSeat, + poolSeat, + rest, + { USDC: add(amounts.PoolFee, amounts.Principal) }, + ], + [fromSeat, feeSeat, { ContractFee }, { USDC: ContractFee }], + ]), + ); + + Object.assign(this.state, post); + this.facets.external.publishPoolMetrics(); + }, + }, + external: { + publishPoolMetrics() { + const { poolStats, shareWorth, encumberedBalance } = this.state; + const { recorder } = this.state.poolMetricsRecorderKit; + // Consumers of this .write() are off-chain / outside the VM. + // And there's no way to recover from a failed write. + // So don't await. + void recorder.write({ + encumberedBalance, + shareWorth, + ...poolStats, + }); + }, + }, + + depositHandler: { + /** @param {ZCFSeat} lp */ + async handle(lp) { + const { shareWorth, shareMint, poolSeat, encumberedBalance } = + this.state; + const { external } = this.facets; + + /** @type {USDCProposalShapes['deposit']} */ + // @ts-expect-error ensured by proposalShape + const proposal = lp.getProposal(); + checkPoolBalance(poolSeat, shareWorth, USDC, encumberedBalance); + const post = depositCalc(shareWorth, proposal); + + // COMMIT POINT + const mint = shareMint.mintGains(post.payouts); + try { + this.state.shareWorth = post.shareWorth; + zcf.atomicRearrange( + harden([ + // zoe guarantees lp has proposal.give allocated + [lp, poolSeat, proposal.give], + // mintGains() above establishes that mint has post.payouts + [mint, lp, post.payouts], + ]), + ); + } catch (cause) { + // UNTIL #10684: ability to terminate an incarnation w/o terminating the contract + throw new Error('🚨 cannot commit deposit', { cause }); + } finally { + lp.exit(); + mint.exit(); + } + external.publishPoolMetrics(); + }, + }, + withdrawHandler: { + /** @param {ZCFSeat} lp */ + async handle(lp) { + const { shareWorth, shareMint, poolSeat, encumberedBalance } = + this.state; + const { external } = this.facets; + + /** @type {USDCProposalShapes['withdraw']} */ + // @ts-expect-error ensured by proposalShape + const proposal = lp.getProposal(); + const { zcfSeat: burn } = zcf.makeEmptySeatKit(); + checkPoolBalance(poolSeat, shareWorth, USDC, encumberedBalance); + const post = withdrawCalc(shareWorth, proposal); + + // COMMIT POINT + try { + this.state.shareWorth = post.shareWorth; + zcf.atomicRearrange( + harden([ + // zoe guarantees lp has proposal.give allocated + [lp, burn, proposal.give], + // checkPoolBalance() + withdrawCalc() guarantee poolSeat has enough + [poolSeat, lp, post.payouts], + ]), + ); + shareMint.burnLosses(proposal.give, burn); + } catch (cause) { + // UNTIL #10684: ability to terminate an incarnation w/o terminating the contract + throw new Error('🚨 cannot commit withdraw', { cause }); + } finally { + lp.exit(); + burn.exit(); + } + external.publishPoolMetrics(); + }, + }, + public: { + makeDepositInvitation() { + return zcf.makeInvitation( + this.facets.depositHandler, + 'Deposit', + undefined, + this.state.proposalShapes.deposit, + ); + }, + makeWithdrawInvitation() { + return zcf.makeInvitation( + this.facets.withdrawHandler, + 'Withdraw', + undefined, + this.state.proposalShapes.withdraw, + ); + }, + getPublicTopics() { + const { poolMetricsRecorderKit } = this.state; + return { + poolMetrics: makeRecorderTopic( + 'poolMetrics', + poolMetricsRecorderKit, + ), + }; + }, + }, + }, + { + finish: ({ facets: { external } }) => { + void external.publishPoolMetrics(); + }, + }, + ); +}; +harden(prepareLiquidityPoolKit); + +/** + * @typedef {ReturnType>} LiquidityPoolKit + */ diff --git a/packages/fast-usdc/src/exos/operator-kit.js b/packages/fast-usdc/src/exos/operator-kit.js new file mode 100644 index 00000000000..eb221c71d92 --- /dev/null +++ b/packages/fast-usdc/src/exos/operator-kit.js @@ -0,0 +1,126 @@ +import { makeTracer } from '@agoric/internal'; +import { Fail } from '@endo/errors'; +import { M } from '@endo/patterns'; +import { CctpTxEvidenceShape, RiskAssessmentShape } from '../type-guards.js'; + +const trace = makeTracer('TxOperator'); + +/** + * @import {Zone} from '@agoric/zone'; + * @import {CctpTxEvidence, RiskAssessment} from '../types.js'; + */ + +/** + * @typedef {object} OperatorPowers + * @property {(evidence: CctpTxEvidence, riskAssessment: RiskAssessment, operatorId: string) => void} attest + */ + +/** + * @typedef {object} OperatorStatus + * @property {boolean} [disabled] + * @property {string} operatorId + */ + +/** + * @typedef {Readonly<{ operatorId: string, powers: OperatorPowers }> & {disabled: boolean}} State + */ + +const OperatorKitI = { + admin: M.interface('Admin', { + disable: M.call().returns(), + }), + + invitationMakers: M.interface('InvitationMakers', { + SubmitEvidence: M.call(CctpTxEvidenceShape) + .optional(RiskAssessmentShape) + .returns(M.promise()), + }), + + operator: M.interface('Operator', { + submitEvidence: M.call(CctpTxEvidenceShape) + .optional(RiskAssessmentShape) + .returns(), + getStatus: M.call().returns(M.record()), + }), +}; + +/** + * @param {Zone} zone + * @param {{ makeInertInvitation: Function }} staticPowers + */ +export const prepareOperatorKit = (zone, staticPowers) => + zone.exoClassKit( + 'Operator Kit', + OperatorKitI, + /** + * @param {string} operatorId + * @param {OperatorPowers} powers facet of the durable transaction feed + * @returns {State} + */ + (operatorId, powers) => { + return { + operatorId, + powers, + disabled: false, + }; + }, + { + admin: { + disable() { + trace(`operator ${this.state.operatorId} disabled`); + this.state.disabled = true; + }, + }, + /** + * NB: when this kit is an offer result, the smart-wallet will detect the `invitationMakers` + * key and save it for future offers. + */ + invitationMakers: { + /** + * Provide an API call in the form of an invitation maker, so that the + * capability is available in the smart-wallet bridge. + * + * NB: The `Invitation` object is evidence that the operation took + * place, rather than as a means of performing it as in the + * fluxAggregator contract used for price oracles. + * + * @param {CctpTxEvidence} evidence + * @param {RiskAssessment} [riskAssessment] + * @returns {Promise} + */ + async SubmitEvidence(evidence, riskAssessment) { + const { operator } = this.facets; + // TODO(bootstrap integration): cause this call to throw and confirm that it + // shows up in the the smart-wallet UpdateRecord `error` property + operator.submitEvidence(evidence, riskAssessment); + return staticPowers.makeInertInvitation( + 'evidence was pushed in the invitation maker call', + ); + }, + }, + operator: { + /** + * submit evidence from this operator + * + * @param {CctpTxEvidence} evidence + * @param {RiskAssessment} [riskAssessment] + * @returns {void} + */ + submitEvidence(evidence, riskAssessment = {}) { + const { state } = this; + !state.disabled || Fail`submitEvidence for disabled operator`; + state.powers.attest(evidence, riskAssessment, state.operatorId); + }, + /** @returns {OperatorStatus} */ + getStatus() { + const { state } = this; + return { + operatorId: state.operatorId, + disabled: state.disabled, + }; + }, + }, + }, + ); + +/** @typedef {ReturnType>} OperatorKit */ diff --git a/packages/fast-usdc/src/exos/settler.js b/packages/fast-usdc/src/exos/settler.js new file mode 100644 index 00000000000..7b3b3de2e6f --- /dev/null +++ b/packages/fast-usdc/src/exos/settler.js @@ -0,0 +1,334 @@ +import { AmountMath } from '@agoric/ertp'; +import { assertAllDefined, makeTracer } from '@agoric/internal'; +import { ChainAddressShape } from '@agoric/orchestration'; +import { atob } from '@endo/base64'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; + +import { decodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { PendingTxStatus } from '../constants.js'; +import { makeFeeTools } from '../utils/fees.js'; +import { EvmHashShape } from '../type-guards.js'; + +/** + * @import {FungibleTokenPacketData} from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; + * @import {Denom, OrchestrationAccount, ChainHub, ChainAddress} from '@agoric/orchestration'; + * @import {WithdrawToSeat} from '@agoric/orchestration/src/utils/zoe-tools' + * @import {IBCChannelID, VTransferIBCEvent} from '@agoric/vats'; + * @import {Zone} from '@agoric/zone'; + * @import {HostOf, HostInterface} from '@agoric/async-flow'; + * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js'; + * @import {NobleAddress, LiquidityPoolKit, FeeConfig, EvmHash, LogFn} from '../types.js'; + * @import {StatusManager} from './status-manager.js'; + */ + +/** + * NOTE: not meant to be parsable. + * + * @param {NobleAddress} addr + * @param {bigint} amount + */ +const makeMintedEarlyKey = (addr, amount) => + `pendingTx:${JSON.stringify([addr, String(amount)])}`; + +/** + * @param {Zone} zone + * @param {object} caps + * @param {StatusManager} caps.statusManager + * @param {Brand<'nat'>} caps.USDC + * @param {Pick} caps.zcf + * @param {FeeConfig} caps.feeConfig + * @param {HostOf} caps.withdrawToSeat + * @param {import('@agoric/vow').VowTools} caps.vowTools + * @param {ChainHub} caps.chainHub + * @param {LogFn} [caps.log] + */ +export const prepareSettler = ( + zone, + { + chainHub, + feeConfig, + log = makeTracer('Settler', true), + statusManager, + USDC, + vowTools, + withdrawToSeat, + zcf, + }, +) => { + assertAllDefined({ statusManager }); + return zone.exoClassKit( + 'Fast USDC Settler', + { + creator: M.interface('SettlerCreatorI', { + monitorMintingDeposits: M.callWhen().returns(M.any()), + setIntermediateRecipient: M.call(ChainAddressShape).returns(), + }), + tap: M.interface('SettlerTapI', { + receiveUpcall: M.call(M.record()).returns(M.promise()), + }), + notify: M.interface('SettlerNotifyI', { + notifyAdvancingResult: M.call( + M.record(), // XXX fill in details TODO + M.boolean(), + ).returns(), + }), + self: M.interface('SettlerSelfI', { + disburse: M.call(EvmHashShape, M.string(), M.nat()).returns( + M.promise(), + ), + forward: M.call( + M.opt(EvmHashShape), + M.string(), + M.nat(), + M.string(), + ).returns(), + }), + transferHandler: M.interface('SettlerTransferI', { + onFulfilled: M.call(M.any(), M.record()).returns(), + onRejected: M.call(M.any(), M.record()).returns(), + }), + }, + /** + * @param {{ + * sourceChannel: IBCChannelID; + * remoteDenom: Denom; + * repayer: LiquidityPoolKit['repayer']; + * settlementAccount: HostInterface> + * intermediateRecipient?: ChainAddress; + * }} config + */ + config => { + log('config', config); + return { + ...config, + // make sure the state record has this property, perhaps with an undefined value + intermediateRecipient: config.intermediateRecipient, + /** @type {HostInterface|undefined} */ + registration: undefined, + /** @type {SetStore>} */ + mintedEarly: zone.detached().setStore('mintedEarly'), + }; + }, + { + creator: { + async monitorMintingDeposits() { + const { settlementAccount } = this.state; + const registration = await vowTools.when( + settlementAccount.monitorTransfers(this.facets.tap), + ); + assert.typeof(registration, 'object'); + this.state.registration = registration; + }, + /** @param {ChainAddress} intermediateRecipient */ + setIntermediateRecipient(intermediateRecipient) { + this.state.intermediateRecipient = intermediateRecipient; + }, + }, + tap: { + /** @param {VTransferIBCEvent} event */ + async receiveUpcall(event) { + log('upcall event', event.packet.sequence, event.blockTime); + const { sourceChannel, remoteDenom } = this.state; + const { packet } = event; + if (packet.source_channel !== sourceChannel) { + const { source_channel: actual } = packet; + log('unexpected channel', { actual, expected: sourceChannel }); + return; + } + + // TODO: why is it safe to cast this without a runtime check? + const tx = /** @type {FungibleTokenPacketData} */ ( + JSON.parse(atob(packet.data)) + ); + + // given the sourceChannel check, we can be certain of this cast + const nfa = /** @type {NobleAddress} */ (tx.sender); + + if (tx.denom !== remoteDenom) { + const { denom: actual } = tx; + log('unexpected denom', { actual, expected: remoteDenom }); + return; + } + + let EUD; + try { + ({ EUD } = decodeAddressHook(tx.receiver).query); + if (!EUD) { + log('no EUD parameter', tx.receiver); + return; + } + if (typeof EUD !== 'string') { + log('EUD is not a string', EUD); + return; + } + } catch (e) { + log('no query params', tx.receiver); + return; + } + + const amount = BigInt(tx.amount); // TODO: what if this throws? + + const { self } = this.facets; + const found = statusManager.dequeueStatus(nfa, amount); + log('dequeued', found, 'for', nfa, amount); + switch (found?.status) { + case PendingTxStatus.Advanced: + return self.disburse(found.txHash, nfa, amount); + + case PendingTxStatus.Advancing: + this.state.mintedEarly.add(makeMintedEarlyKey(nfa, amount)); + return; + + case PendingTxStatus.Observed: + case PendingTxStatus.AdvanceSkipped: + case PendingTxStatus.AdvanceFailed: + return self.forward(found.txHash, nfa, amount, EUD); + + case undefined: + default: + log('⚠️ tap: no status for ', nfa, amount); + } + }, + }, + notify: { + /** + * @param {object} ctx + * @param {EvmHash} ctx.txHash + * @param {NobleAddress} ctx.forwardingAddress + * @param {Amount<'nat'>} ctx.fullAmount + * @param {ChainAddress} ctx.destination + * @param {boolean} success + * @returns {void} + */ + notifyAdvancingResult( + { txHash, forwardingAddress, fullAmount, destination }, + success, + ) { + const { mintedEarly } = this.state; + const { value: fullValue } = fullAmount; + const key = makeMintedEarlyKey(forwardingAddress, fullValue); + if (mintedEarly.has(key)) { + mintedEarly.delete(key); + if (success) { + void this.facets.self.disburse( + txHash, + forwardingAddress, + fullValue, + ); + } else { + void this.facets.self.forward( + txHash, + forwardingAddress, + fullValue, + destination.value, + ); + } + } else { + statusManager.advanceOutcome(forwardingAddress, fullValue, success); + } + }, + }, + self: { + /** + * @param {EvmHash} txHash + * @param {NobleAddress} nfa + * @param {NatValue} fullValue + */ + async disburse(txHash, nfa, fullValue) { + const { repayer, settlementAccount } = this.state; + const received = AmountMath.make(USDC, fullValue); + const { zcfSeat: settlingSeat } = zcf.makeEmptySeatKit(); + const { calculateSplit } = makeFeeTools(feeConfig); + const split = calculateSplit(received); + log('disbursing', split); + + // If this throws, which arguably can't occur since we don't ever + // withdraw more than has been deposited (as denoted by + // `FungibleTokenPacketData`), funds will remain in the + // `settlementAccount`. A remediation can occur in a future upgrade. + await vowTools.when( + withdrawToSeat( + // @ts-expect-error LocalAccountMethods vs OrchestrationAccount + settlementAccount, + settlingSeat, + harden({ In: received }), + ), + ); + zcf.atomicRearrange( + harden([[settlingSeat, settlingSeat, { In: received }, split]]), + ); + repayer.repay(settlingSeat, split); + + // update status manager, marking tx `SETTLED` + statusManager.disbursed(txHash, split); + }, + /** + * @param {EvmHash} txHash + * @param {NobleAddress} nfa + * @param {NatValue} fullValue + * @param {string} EUD + */ + forward(txHash, nfa, fullValue, EUD) { + const { settlementAccount, intermediateRecipient } = this.state; + + const dest = chainHub.makeChainAddress(EUD); + + // TODO? statusManager.forwarding(txHash, sender, amount); + const txfrV = E(settlementAccount).transfer( + dest, + AmountMath.make(USDC, fullValue), + { forwardOpts: { intermediateRecipient } }, + ); + void vowTools.watch(txfrV, this.facets.transferHandler, { + txHash, + nfa, + fullValue, + }); + }, + }, + transferHandler: { + /** + * @param {unknown} _result + * @param {SettlerTransferCtx} ctx + * + * @typedef {{ + * txHash: EvmHash; + * nfa: NobleAddress; + * fullValue: NatValue; + * }} SettlerTransferCtx + */ + onFulfilled(_result, ctx) { + const { txHash, nfa, fullValue } = ctx; + statusManager.forwarded(txHash, nfa, fullValue); + }, + /** + * @param {unknown} reason + * @param {SettlerTransferCtx} ctx + */ + onRejected(reason, ctx) { + log('⚠️ transfer rejected!', reason, ctx); + // const { txHash, nfa, amount } = ctx; + // TODO(#10510): statusManager.forwardFailed(txHash, nfa, amount); + }, + }, + }, + { + stateShape: harden({ + repayer: M.remotable('Repayer'), + settlementAccount: M.remotable('Account'), + registration: M.or(M.undefined(), M.remotable('Registration')), + sourceChannel: M.string(), + remoteDenom: M.string(), + mintedEarly: M.remotable('mintedEarly'), + intermediateRecipient: M.opt(ChainAddressShape), + }), + }, + ); +}; +harden(prepareSettler); + +/** + * XXX consider using pickFacet (do we have pickFacets?) + * @typedef {ReturnType>} SettlerKit + */ diff --git a/packages/fast-usdc/src/exos/status-manager.js b/packages/fast-usdc/src/exos/status-manager.js new file mode 100644 index 00000000000..c261ec599a8 --- /dev/null +++ b/packages/fast-usdc/src/exos/status-manager.js @@ -0,0 +1,389 @@ +import { makeTracer } from '@agoric/internal'; +import { appendToStoredArray } from '@agoric/store/src/stores/store-utils.js'; +import { AmountKeywordRecordShape } from '@agoric/zoe/src/typeGuards.js'; +import { Fail, makeError, q } from '@endo/errors'; +import { E } from '@endo/eventual-send'; +import { M } from '@endo/patterns'; +import { PendingTxStatus, TerminalTxStatus, TxStatus } from '../constants.js'; +import { + CctpTxEvidenceShape, + EvmHashShape, + PendingTxShape, +} from '../type-guards.js'; + +/** + * @import {MapStore, SetStore} from '@agoric/store'; + * @import {Zone} from '@agoric/zone'; + * @import {CctpTxEvidence, NobleAddress, PendingTx, EvmHash, LogFn, TransactionRecord, EvidenceWithRisk, RiskAssessment} from '../types.js'; + */ + +/** + * @typedef {`pendingTx:${bigint}:${NobleAddress}`} PendingTxKey + * The string template is for developer visibility but not meant to ever be parsed. + */ + +/** + * Create the key for the pendingTxs MapStore. + * + * The key is a composite but not meant to be parsable. + * + * @param {NobleAddress} nfa Noble Forwarding Account (implies EUD) + * @param {bigint} amount + * @returns {PendingTxKey} + */ +const makePendingTxKey = (nfa, amount) => + // amount can't contain colon + `pendingTx:${amount}:${nfa}`; + +/** + * Get the key for the pendingTxs MapStore. + * + * @param {CctpTxEvidence} evidence + * @returns {PendingTxKey} + */ +const pendingTxKeyOf = evidence => { + const { amount, forwardingAddress } = evidence.tx; + return makePendingTxKey(forwardingAddress, amount); +}; + +/** + * @typedef {{ + * log?: LogFn; + * marshaller: ERef; + * }} StatusManagerPowers + */ + +/** + * The `StatusManager` keeps track of Pending and Seen Transactions + * via {@link PendingTxStatus} states, aiding in coordination between the `Advancer` + * and `Settler`. + * + * XXX consider separate facets for `Advancing` and `Settling` capabilities. + * + * @param {Zone} zone + * @param {ERef} txnsNode + * @param {StatusManagerPowers} caps + */ +export const prepareStatusManager = ( + zone, + txnsNode, + { + marshaller, + log = makeTracer('Advancer', true), + } = /** @type {StatusManagerPowers} */ ({}), +) => { + /** + * Keyed by a tuple of the Noble Forwarding Account and amount. + * @type {MapStore} + */ + const pendingTxs = zone.mapStore('PendingTxs', { + keyShape: M.string(), + valueShape: M.arrayOf(PendingTxShape), + }); + + /** + * Transactions seen *ever* by the contract. + * + * Note that like all durable stores, this SetStore is stored in IAVL. It + * grows without bound (though the amount of growth per incoming message to + * the contract is bounded). At some point in the future we may want to prune. + * @type {SetStore} + */ + const seenTxs = zone.setStore('SeenTxs', { + keyShape: M.string(), + }); + + /** + * Transactions that have completed, but are still in vstorage. + * + * @type {SetStore} + */ + const storedCompletedTxs = zone.setStore('StoredCompletedTxs', { + keyShape: M.string(), + }); + + /** + * @param {EvmHash} txId + * @param {TransactionRecord} record + * @returns {Promise} + */ + const publishTxnRecord = async (txId, record) => { + const txNode = E(txnsNode).makeChildNode(txId, { + sequence: true, // avoid overwriting other output in the block + }); + + // XXX awkward for publish* to update a store, but it's temporary + if (record.status && TerminalTxStatus[record.status]) { + // UNTIL https://github.com/Agoric/agoric-sdk/issues/7405 + // Queue it for deletion later because if we deleted it now the earlier + // writes in this block would be wiped. For now we keep track of what to + // delete when we know it'll be another block. + storedCompletedTxs.add(txId); + } + + const capData = await E(marshaller).toCapData(record); + + await E(txNode).setValue(JSON.stringify(capData)); + }; + + /** + * @param {CctpTxEvidence['txHash']} hash + * @param {CctpTxEvidence} evidence + */ + const publishEvidence = (hash, evidence) => { + // Don't await, just writing to vstorage. + void publishTxnRecord( + hash, + harden({ evidence, status: TxStatus.Observed }), + ); + }; + + /** + * Ensures that `txHash+chainId` has not been processed + * and adds entry to `seenTxs` set. + * + * Also records the CctpTxEvidence and status in `pendingTxs`. + * + * @param {CctpTxEvidence} evidence + * @param {PendingTxStatus} status + * @param {string[]} [risksIdentified] + */ + const initPendingTx = (evidence, status, risksIdentified) => { + const { txHash } = evidence; + if (seenTxs.has(txHash)) { + throw makeError(`Transaction already seen: ${q(txHash)}`); + } + seenTxs.add(txHash); + + appendToStoredArray( + pendingTxs, + pendingTxKeyOf(evidence), + harden({ ...evidence, status }), + ); + publishEvidence(txHash, evidence); + if (status === PendingTxStatus.AdvanceSkipped) { + void publishTxnRecord(txHash, harden({ status, risksIdentified })); + } else if (status !== PendingTxStatus.Observed) { + // publishEvidence publishes Observed + void publishTxnRecord(txHash, harden({ status })); + } + }; + + /** + * Update the pending transaction status. + * + * @param {{nfa: NobleAddress, amount: bigint}} keyParts + * @param {PendingTxStatus} status + */ + function setPendingTxStatus({ nfa, amount }, status) { + const key = makePendingTxKey(nfa, amount); + pendingTxs.has(key) || Fail`no advancing tx with ${{ nfa, amount }}`; + const pending = pendingTxs.get(key); + const ix = pending.findIndex(tx => tx.status === PendingTxStatus.Advancing); + ix >= 0 || Fail`no advancing tx with ${{ nfa, amount }}`; + const [prefix, tx, suffix] = [ + pending.slice(0, ix), + pending[ix], + pending.slice(ix + 1), + ]; + const txpost = { ...tx, status }; + pendingTxs.set(key, harden([...prefix, txpost, ...suffix])); + void publishTxnRecord(tx.txHash, harden({ status })); + } + + return zone.exo( + 'Fast USDC Status Manager', + M.interface('StatusManagerI', { + // TODO: naming scheme for transition events + advance: M.call(CctpTxEvidenceShape).returns(M.undefined()), + advanceOutcome: M.call(M.string(), M.nat(), M.boolean()).returns(), + skipAdvance: M.call(CctpTxEvidenceShape, M.arrayOf(M.string())).returns( + M.undefined(), + ), + observe: M.call(CctpTxEvidenceShape).returns(M.undefined()), + hasBeenObserved: M.call(CctpTxEvidenceShape).returns(M.boolean()), + deleteCompletedTxs: M.call().returns(M.undefined()), + dequeueStatus: M.call(M.string(), M.bigint()).returns( + M.or( + { + txHash: EvmHashShape, + status: M.or( + PendingTxStatus.Advanced, + PendingTxStatus.AdvanceSkipped, + PendingTxStatus.AdvanceFailed, + PendingTxStatus.Observed, + ), + }, + M.undefined(), + ), + ), + disbursed: M.call(EvmHashShape, AmountKeywordRecordShape).returns( + M.undefined(), + ), + forwarded: M.call(M.opt(EvmHashShape), M.string(), M.nat()).returns( + M.undefined(), + ), + lookupPending: M.call(M.string(), M.bigint()).returns( + M.arrayOf(PendingTxShape), + ), + }), + { + /** + * Add a new transaction with ADVANCING status + * + * NB: this acts like observe() but subsequently records an ADVANCING + * state + * + * @param {CctpTxEvidence} evidence + */ + advance(evidence) { + initPendingTx(evidence, PendingTxStatus.Advancing); + }, + + /** + * Add a new transaction with ADVANCE_SKIPPED status + * + * NB: this acts like observe() but subsequently records an + * ADVANCE_SKIPPED state along with risks identified + * + * @param {CctpTxEvidence} evidence + * @param {string[]} risksIdentified + */ + skipAdvance(evidence, risksIdentified) { + initPendingTx( + evidence, + PendingTxStatus.AdvanceSkipped, + risksIdentified, + ); + }, + + /** + * Record result of ADVANCING + * + * @param {NobleAddress} nfa Noble Forwarding Account + * @param {import('@agoric/ertp').NatValue} amount + * @param {boolean} success - Advanced vs. AdvanceFailed + * @throws {Error} if nothing to advance + */ + advanceOutcome(nfa, amount, success) { + setPendingTxStatus( + { nfa, amount }, + success ? PendingTxStatus.Advanced : PendingTxStatus.AdvanceFailed, + ); + }, + + /** + * Add a new transaction with OBSERVED status + * @param {CctpTxEvidence} evidence + */ + observe(evidence) { + initPendingTx(evidence, PendingTxStatus.Observed); + }, + + /** + * Note: ADVANCING state implies tx has been OBSERVED + * + * @param {CctpTxEvidence} evidence + */ + hasBeenObserved(evidence) { + return seenTxs.has(evidence.txHash); + }, + + // UNTIL https://github.com/Agoric/agoric-sdk/issues/7405 + deleteCompletedTxs() { + for (const txHash of storedCompletedTxs.values()) { + // As of now, setValue('') on a non-sequence node will delete it + const txNode = E(txnsNode).makeChildNode(txHash, { + sequence: false, + }); + void E(txNode) + .setValue('') + .then(() => storedCompletedTxs.delete(txHash)); + } + }, + + /** + * Remove and return an `ADVANCED` or `OBSERVED` tx waiting to be `SETTLED`. + * + * @param {NobleAddress} nfa + * @param {bigint} amount + * @returns {Pick | undefined} undefined if nothing + * with this address and amount has been marked pending. + */ + dequeueStatus(nfa, amount) { + const key = makePendingTxKey(nfa, amount); + if (!pendingTxs.has(key)) return undefined; + const pending = pendingTxs.get(key); + + const dequeueIdx = pending.findIndex( + x => x.status !== PendingTxStatus.Advancing, + ); + if (dequeueIdx < 0) return undefined; + + if (pending.length > 1) { + const pendingCopy = [...pending]; + pendingCopy.splice(dequeueIdx, 1); + pendingTxs.set(key, harden(pendingCopy)); + } else { + pendingTxs.delete(key); + } + + const { status, txHash } = pending[dequeueIdx]; + // TODO: store txHash -> evidence for txs pending settlement? + // If necessary for vstorage writes in `forwarded` and `settled` + return harden({ status, txHash }); + }, + + /** + * Mark a transaction as `DISBURSED` + * + * @param {EvmHash} txHash + * @param {import('./liquidity-pool.js').RepayAmountKWR} split + */ + disbursed(txHash, split) { + void publishTxnRecord( + txHash, + harden({ split, status: TxStatus.Disbursed }), + ); + }, + + /** + * Mark a transaction as `FORWARDED` + * + * @param {EvmHash | undefined} txHash - undefined in case mint before observed + * @param {NobleAddress} nfa + * @param {bigint} amount + */ + forwarded(txHash, nfa, amount) { + if (txHash) { + void publishTxnRecord(txHash, harden({ status: TxStatus.Forwarded })); + } else { + // TODO store (early) `Minted` transactions to check against incoming evidence + log( + `⚠️ Forwarded minted amount ${amount} from account ${nfa} before it was observed.`, + ); + } + }, + + /** + * Lookup all pending entries for a given address and amount + * + * XXX only used in tests. should we remove? + * + * @param {NobleAddress} nfa + * @param {bigint} amount + * @returns {PendingTx[]} + */ + lookupPending(nfa, amount) { + const key = makePendingTxKey(nfa, amount); + if (!pendingTxs.has(key)) { + return harden([]); + } + return pendingTxs.get(key); + }, + }, + ); +}; +harden(prepareStatusManager); + +/** @typedef {ReturnType} StatusManager */ diff --git a/packages/fast-usdc/src/exos/transaction-feed.js b/packages/fast-usdc/src/exos/transaction-feed.js new file mode 100644 index 00000000000..3adb69bb0f1 --- /dev/null +++ b/packages/fast-usdc/src/exos/transaction-feed.js @@ -0,0 +1,238 @@ +import { makeTracer } from '@agoric/internal'; +import { prepareDurablePublishKit } from '@agoric/notifier'; +import { keyEQ, M } from '@endo/patterns'; +import { Fail } from '@endo/errors'; +import { CctpTxEvidenceShape, RiskAssessmentShape } from '../type-guards.js'; +import { defineInertInvitation } from '../utils/zoe.js'; +import { prepareOperatorKit } from './operator-kit.js'; + +/** + * @import {Zone} from '@agoric/zone'; + * @import {MapStore} from '@agoric/store'; + * @import {OperatorKit} from './operator-kit.js'; + * @import {CctpTxEvidence, EvidenceWithRisk, RiskAssessment} from '../types.js'; + */ + +const trace = makeTracer('TxFeed', true); + +/** Name in the invitation purse (keyed also by this contract instance) */ +export const INVITATION_MAKERS_DESC = 'oracle operator invitation'; + +const TransactionFeedKitI = harden({ + operatorPowers: M.interface('Transaction Feed Admin', { + attest: M.call( + CctpTxEvidenceShape, + RiskAssessmentShape, + M.string(), + ).returns(), + }), + creator: M.interface('Transaction Feed Creator', { + // TODO narrow the return shape to OperatorKit + initOperator: M.call(M.string()).returns(M.record()), + makeOperatorInvitation: M.call(M.string()).returns(M.promise()), + removeOperator: M.call(M.string()).returns(), + }), + public: M.interface('Transaction Feed Public', { + getEvidenceSubscriber: M.call().returns(M.remotable()), + }), +}); + +/** + * @param {MapStore[]} riskStores + * @param {string} txHash + */ +const allRisksIdentified = (riskStores, txHash) => { + /** @type {Set} */ + const setOfRisks = new Set(); + for (const store of riskStores) { + const next = store.get(txHash); + for (const risk of next.risksIdentified ?? []) { + setOfRisks.add(risk); + } + } + return [...setOfRisks.values()].sort(); +}; + +/** + * @param {Zone} zone + * @param {ZCF} zcf + */ +export const prepareTransactionFeedKit = (zone, zcf) => { + const kinds = zone.mapStore('Kinds'); + const makeDurablePublishKit = prepareDurablePublishKit( + kinds, + 'Transaction Feed', + ); + /** @type {PublishKit} */ + const { publisher, subscriber } = makeDurablePublishKit(); + + const makeInertInvitation = defineInertInvitation(zcf, 'submitting evidence'); + + const makeOperatorKit = prepareOperatorKit(zone, { + makeInertInvitation, + }); + + return zone.exoClassKit( + 'Fast USDC Feed', + TransactionFeedKitI, + () => { + /** @type {MapStore} */ + const operators = zone.mapStore('operators'); + /** @type {MapStore>} */ + const pending = zone.mapStore('pending'); + /** @type {MapStore>} */ + const risks = zone.mapStore('risks'); + return { operators, pending, risks }; + }, + { + creator: { + /** + * An "operator invitation" is an invitation to be an operator in the + * oracle network, with the able to submit data to submit evidence of + * CCTP transactions. + * + * @param {string} operatorId unique per contract instance + * @returns {Promise>} + */ + makeOperatorInvitation(operatorId) { + const { creator } = this.facets; + trace('makeOperatorInvitation', operatorId); + + return zcf.makeInvitation( + /** @type {OfferHandler} */ + seat => { + seat.exit(); + return creator.initOperator(operatorId); + }, + INVITATION_MAKERS_DESC, + ); + }, + /** @param {string} operatorId */ + initOperator(operatorId) { + const { operators, pending, risks } = this.state; + trace('initOperator', operatorId); + + const operatorKit = makeOperatorKit( + operatorId, + this.facets.operatorPowers, + ); + operators.init(operatorId, operatorKit); + pending.init( + operatorId, + zone.detached().mapStore('pending evidence'), + ); + risks.init(operatorId, zone.detached().mapStore('risk assessments')); + + return operatorKit; + }, + + /** @param {string} operatorId */ + async removeOperator(operatorId) { + const { operators } = this.state; + trace('removeOperator', operatorId); + const operatorKit = operators.get(operatorId); + operatorKit.admin.disable(); + operators.delete(operatorId); + }, + }, + operatorPowers: { + /** + * Add evidence from an operator. + * + * NB: the operatorKit is responsible for + * + * @param {CctpTxEvidence} evidence + * @param {RiskAssessment} riskAssessment + * @param {string} operatorId + */ + attest(evidence, riskAssessment, operatorId) { + const { operators, pending, risks } = this.state; + trace('attest', operatorId, evidence); + + // TODO https://github.com/Agoric/agoric-sdk/pull/10720 + // TODO validate that it's a valid for Fast USDC before accepting + // E.g. that the `recipientAddress` is the FU settlement account and that + // the EUD is a chain supported by FU. + const { txHash } = evidence; + + // accept the evidence + { + const pendingStore = pending.get(operatorId); + if (pendingStore.has(txHash)) { + trace(`operator ${operatorId} already reported ${txHash}`); + } else { + pendingStore.init(txHash, evidence); + // accept the risk assessment as well + const riskStore = risks.get(operatorId); + riskStore.init(txHash, riskAssessment); + } + } + + // check agreement + const found = [...pending.values()].filter(store => + store.has(txHash), + ); + const minAttestations = Math.ceil(operators.getSize() / 2); + trace( + 'transaction', + txHash, + 'has', + found.length, + 'of', + minAttestations, + 'necessary attestations', + ); + if (found.length < minAttestations) { + return; + } + + let lastEvidence; + for (const store of found) { + const next = store.get(txHash); + if (lastEvidence) { + if (keyEQ(lastEvidence, next)) { + lastEvidence = next; + } else { + trace( + '🚨 conflicting evidence for', + txHash, + ':', + lastEvidence, + '!=', + next, + ); + Fail`conflicting evidence for ${txHash}`; + } + } + lastEvidence = next; + } + + const riskStores = [...risks.values()].filter(store => + store.has(txHash), + ); + // take the union of risks identified from all operators + const risksIdentified = allRisksIdentified(riskStores, txHash); + + // sufficient agreement, so remove from pending risks, then publish + for (const store of found) { + store.delete(txHash); + } + for (const store of riskStores) { + store.delete(txHash); + } + trace('publishing evidence', evidence, risksIdentified); + publisher.publish({ + evidence, + risk: { risksIdentified }, + }); + }, + }, + public: { + getEvidenceSubscriber: () => subscriber, + }, + }, + ); +}; +harden(prepareTransactionFeedKit); + +/** @typedef {ReturnType>} TransactionFeedKit */ diff --git a/packages/fast-usdc/src/fast-usdc-policy.core.js b/packages/fast-usdc/src/fast-usdc-policy.core.js new file mode 100644 index 00000000000..1a8af06d5ac --- /dev/null +++ b/packages/fast-usdc/src/fast-usdc-policy.core.js @@ -0,0 +1,75 @@ +/** @file core-eval to publish update to Fast USDC feedPolicy */ + +import { E } from '@endo/far'; +import { fromExternalConfig } from './utils/config-marshal.js'; +import { FeedPolicyShape } from './type-guards.js'; + +/** + * @import {Passable} from '@endo/pass-style' + * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js' + * @import {LegibleCapData} from './utils/config-marshal.js' + * @import {FeedPolicy} from './types.js' + */ + +const contractName = 'fastUsdc'; +const FEED_POLICY = 'feedPolicy'; + +/** + * XXX copied from fast-usdc.start.js + * + * @param {ERef} node + * @param {FeedPolicy} policy + */ +const publishFeedPolicy = async (node, policy) => { + const feedPolicy = E(node).makeChildNode(FEED_POLICY); + await E(feedPolicy).setValue(JSON.stringify(policy)); +}; + +/** + * @param {BootstrapPowers & + * { consume: { chainStorage: Promise }} + * } powers + * @param {{ options: LegibleCapData<{feedPolicy: FeedPolicy & Passable}> }} config + */ +export const updateFastUsdcPolicy = async ( + { consume: { agoricNames, chainStorage } }, + config, +) => { + /** @type {Issuer<'nat'>} */ + const USDCissuer = await E(agoricNames).lookup('issuer', 'USDC'); + const brands = harden({ + USDC: await E(USDCissuer).getBrand(), + }); + const { feedPolicy } = fromExternalConfig( + config.options, + brands, + harden({ feedPolicy: FeedPolicyShape }), + ); + + const storageNode = await E(chainStorage).makeChildNode(contractName); + + await publishFeedPolicy(storageNode, feedPolicy); +}; + +/** + * @param {unknown} _utils + * @param {{ + * options: LegibleCapData<{feedPolicy: FeedPolicy & Passable}>; + * }} param1 + */ +export const getManifestForUpdateFastUsdcPolicy = (_utils, { options }) => { + return { + /** @type {BootstrapManifest} */ + manifest: { + [updateFastUsdcPolicy.name]: { + consume: { + chainStorage: true, + + // widely shared: name services + agoricNames: true, + }, + }, + }, + options, + }; +}; diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js new file mode 100644 index 00000000000..cbac54c5acc --- /dev/null +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -0,0 +1,324 @@ +import { AssetKind } from '@agoric/ertp'; +import { makeTracer } from '@agoric/internal'; +import { observeIteration, subscribeEach } from '@agoric/notifier'; +import { + CosmosChainInfoShape, + DenomDetailShape, + DenomShape, + OrchestrationPowersShape, + registerChainsAndAssets, + withOrchestration, +} from '@agoric/orchestration'; +import { makeZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; +import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js'; +import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { prepareAdvancer } from './exos/advancer.js'; +import { prepareLiquidityPoolKit } from './exos/liquidity-pool.js'; +import { prepareSettler } from './exos/settler.js'; +import { prepareStatusManager } from './exos/status-manager.js'; +import { prepareTransactionFeedKit } from './exos/transaction-feed.js'; +import * as flows from './fast-usdc.flows.js'; +import { FastUSDCTermsShape, FeeConfigShape } from './type-guards.js'; +import { defineInertInvitation } from './utils/zoe.js'; + +const trace = makeTracer('FastUsdc'); + +const TXNS_NODE = 'txns'; +const FEE_NODE = 'feeConfig'; +const ADDRESSES_BAGGAGE_KEY = 'addresses'; + +/** + * @import {HostInterface} from '@agoric/async-flow'; + * @import {ChainAddress, CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount} from '@agoric/orchestration'; + * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; + * @import {Remote} from '@agoric/internal'; + * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js' + * @import {Zone} from '@agoric/zone'; + * @import {OperatorKit} from './exos/operator-kit.js'; + * @import {CctpTxEvidence, FeeConfig, RiskAssessment} from './types.js'; + */ + +/** + * @typedef {{ + * usdcDenom: Denom; + * }} FastUsdcTerms + */ + +/** @type {ContractMeta} */ +export const meta = { + // @ts-expect-error TypedPattern not recognized as record + customTermsShape: FastUSDCTermsShape, + privateArgsShape: { + // @ts-expect-error TypedPattern not recognized as record + ...OrchestrationPowersShape, + assetInfo: M.arrayOf([DenomShape, DenomDetailShape]), + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), + feeConfig: FeeConfigShape, + marshaller: M.remotable(), + poolMetricsNode: M.remotable(), + }, +}; +harden(meta); + +/** + * @param {Remote} node + * @param {ERef} marshaller + * @param {FeeConfig} feeConfig + */ +const publishFeeConfig = async (node, marshaller, feeConfig) => { + const feeNode = E(node).makeChildNode(FEE_NODE); + const value = await E(marshaller).toCapData(feeConfig); + return E(feeNode).setValue(JSON.stringify(value)); +}; + +/** + * @param {Remote} contractNode + * @param {{ + * poolAccount: ChainAddress['value']; + * settlementAccount: ChainAddress['value']; + * }} addresses + */ +const publishAddresses = (contractNode, addresses) => { + return E(contractNode).setValue(JSON.stringify(addresses)); +}; + +/** + * @param {ZCF} zcf + * @param {OrchestrationPowers & { + * assetInfo: [Denom, DenomDetail & { brandKey?: string}][]; + * chainInfo: Record; + * feeConfig: FeeConfig; + * marshaller: Marshaller; + * poolMetricsNode: Remote; + * }} privateArgs + * @param {Zone} zone + * @param {OrchestrationTools} tools + */ +export const contract = async (zcf, privateArgs, zone, tools) => { + assert(tools, 'no tools'); + const terms = zcf.getTerms(); + assert('USDC' in terms.brands, 'no USDC brand'); + assert('usdcDenom' in terms, 'no usdcDenom'); + + const { feeConfig, marshaller, storageNode } = privateArgs; + const { makeRecorderKit } = prepareRecorderKitMakers( + zone.mapStore('vstorage'), + marshaller, + ); + + const statusManager = prepareStatusManager( + zone, + E(storageNode).makeChildNode(TXNS_NODE), + { marshaller }, + ); + + const { USDC } = terms.brands; + const { withdrawToSeat } = tools.zoeTools; + const { baggage, chainHub, orchestrateAll, vowTools } = tools; + const makeSettler = prepareSettler(zone, { + statusManager, + USDC, + withdrawToSeat, + feeConfig, + vowTools: tools.vowTools, + zcf, + chainHub, + }); + + const { localTransfer } = makeZoeTools(zcf, vowTools); + const makeAdvancer = prepareAdvancer(zone, { + chainHub, + feeConfig, + localTransfer, + usdc: harden({ + brand: terms.brands.USDC, + denom: terms.usdcDenom, + }), + statusManager, + vowTools, + zcf, + }); + + const makeFeedKit = prepareTransactionFeedKit(zone, zcf); + + const makeLiquidityPoolKit = prepareLiquidityPoolKit( + zone, + zcf, + terms.brands.USDC, + { makeRecorderKit }, + ); + + const makeTestInvitation = defineInertInvitation( + zcf, + 'test of forcing evidence', + ); + + const { makeLocalAccount, makeNobleAccount } = orchestrateAll(flows, {}); + + const creatorFacet = zone.exo('Fast USDC Creator', undefined, { + /** @type {(operatorId: string) => Promise>} */ + async makeOperatorInvitation(operatorId) { + return feedKit.creator.makeOperatorInvitation(operatorId); + }, + async connectToNoble() { + return vowTools.when(nobleAccountV, nobleAccount => { + trace('nobleAccount', nobleAccount); + return vowTools.when( + E(nobleAccount).getAddress(), + intermediateRecipient => { + trace('intermediateRecipient', intermediateRecipient); + advancer.setIntermediateRecipient(intermediateRecipient); + settlerKit.creator.setIntermediateRecipient(intermediateRecipient); + return intermediateRecipient; + }, + ); + }); + }, + async publishAddresses() { + !baggage.has(ADDRESSES_BAGGAGE_KEY) || Fail`Addresses already published`; + const [poolAccountAddress] = await vowTools.when( + vowTools.all([E(poolAccount).getAddress()]), + ); + const addresses = harden({ + poolAccount: poolAccountAddress.value, + settlementAccount: settlementAddress.value, + }); + baggage.init(ADDRESSES_BAGGAGE_KEY, addresses); + await publishAddresses(storageNode, addresses); + return addresses; + }, + }); + + const publicFacet = zone.exo('Fast USDC Public', undefined, { + // XXX to be removed before production + /** + * NB: Any caller with access to this invitation maker has the ability to + * force handling of evidence. + * + * Provide an API call in the form of an invitation maker, so that the + * capability is available in the smart-wallet bridge during UI testing. + * + * @param {CctpTxEvidence} evidence + * @param {RiskAssessment} [risk] + */ + makeTestPushInvitation(evidence, risk = {}) { + void advancer.handleTransactionEvent({ evidence, risk }); + return makeTestInvitation(); + }, + makeDepositInvitation() { + return poolKit.public.makeDepositInvitation(); + }, + makeWithdrawInvitation() { + return poolKit.public.makeWithdrawInvitation(); + }, + getPublicTopics() { + return poolKit.public.getPublicTopics(); + }, + getStaticInfo() { + baggage.has(ADDRESSES_BAGGAGE_KEY) || + Fail`no addresses. creator must 'publishAddresses' first`; + return harden({ + [ADDRESSES_BAGGAGE_KEY]: baggage.get(ADDRESSES_BAGGAGE_KEY), + }); + }, + }); + + // ^^^ Define all kinds above this line. Keep remote calls below. vvv + + // NOTE: Using a ZCFMint is helpful for the usual reasons ( + // synchronous mint/burn, keeping assets out of contract vats, ...). + // And there's just one pool, which suggests building it with zone.exo(). + // + // But zone.exo() defines a kind and + // all kinds have to be defined before any remote calls, + // such as the one to the zoe vat as part of making a ZCFMint. + // + // So we use zone.exoClassKit above to define the liquidity pool kind + // and pass the shareMint into the maker / init function. + + void publishFeeConfig(storageNode, marshaller, feeConfig); + + const shareMint = await provideSingleton( + zone.mapStore('mint'), + 'PoolShare', + () => + zcf.makeZCFMint('PoolShares', AssetKind.NAT, { + decimalPlaces: 6, + }), + ); + + const poolKit = zone.makeOnce('Liquidity Pool kit', () => + makeLiquidityPoolKit(shareMint, privateArgs.poolMetricsNode), + ); + + /** Chain, connection, and asset info can only be registered once */ + const firstIncarnationKey = 'firstIncarnationKey'; + if (!baggage.has(firstIncarnationKey)) { + baggage.init(firstIncarnationKey, true); + registerChainsAndAssets( + chainHub, + terms.brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + } + + const nobleAccountV = zone.makeOnce('NobleAccount', () => makeNobleAccount()); + + const feedKit = zone.makeOnce('Feed Kit', () => makeFeedKit()); + + const poolAccountV = zone.makeOnce('PoolAccount', () => makeLocalAccount()); + const settleAccountV = zone.makeOnce('SettleAccount', () => + makeLocalAccount(), + ); + // when() is OK here since this clearly resolves promptly. + /** @type {[HostInterface>, HostInterface>]} */ + const [poolAccount, settlementAccount] = await vowTools.when( + vowTools.all([poolAccountV, settleAccountV]), + ); + trace('settlementAccount', settlementAccount); + trace('poolAccount', poolAccount); + const settlementAddress = await E(settlementAccount).getAddress(); + trace('settlementAddress', settlementAddress); + + const [_agoric, _noble, agToNoble] = await vowTools.when( + chainHub.getChainsAndConnection('agoric', 'noble'), + ); + const settlerKit = makeSettler({ + repayer: poolKit.repayer, + sourceChannel: agToNoble.transferChannel.counterPartyChannelId, + remoteDenom: 'uusdc', + settlementAccount, + }); + + const advancer = zone.makeOnce('Advancer', () => + makeAdvancer({ + borrowerFacet: poolKit.borrower, + notifyFacet: settlerKit.notify, + poolAccount, + settlementAddress, + }), + ); + // Connect evidence stream to advancer + void observeIteration(subscribeEach(feedKit.public.getEvidenceSubscriber()), { + updateState(evidenceWithRisk) { + try { + void advancer.handleTransactionEvent(evidenceWithRisk); + } catch (err) { + trace('🚨 Error handling transaction event', err); + } + }, + }); + + await settlerKit.creator.monitorMintingDeposits(); + + return harden({ creatorFacet, publicFacet }); +}; +harden(contract); + +export const start = withOrchestration(contract); +harden(start); +/** @typedef {typeof start} FastUsdcSF */ diff --git a/packages/fast-usdc/src/fast-usdc.flows.js b/packages/fast-usdc/src/fast-usdc.flows.js new file mode 100644 index 00000000000..a9aedd6228e --- /dev/null +++ b/packages/fast-usdc/src/fast-usdc.flows.js @@ -0,0 +1,23 @@ +/** + * @import {Orchestrator, OrchestrationFlow} from '@agoric/orchestration'; + */ + +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + */ +export const makeLocalAccount = async orch => { + const agoricChain = await orch.getChain('agoric'); + return agoricChain.makeAccount(); +}; +harden(makeLocalAccount); + +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + */ +export const makeNobleAccount = async orch => { + const nobleChain = await orch.getChain('noble'); + return nobleChain.makeAccount(); +}; +harden(makeNobleAccount); diff --git a/packages/fast-usdc/src/fast-usdc.start.js b/packages/fast-usdc/src/fast-usdc.start.js new file mode 100644 index 00000000000..44a2838a130 --- /dev/null +++ b/packages/fast-usdc/src/fast-usdc.start.js @@ -0,0 +1,314 @@ +import { deeplyFulfilledObject, makeTracer, objectMap } from '@agoric/internal'; +import { + CosmosChainInfoShape, + DenomDetailShape, + DenomShape, +} from '@agoric/orchestration'; +import { Fail } from '@endo/errors'; +import { E } from '@endo/far'; +import { makeMarshal } from '@endo/marshal'; +import { M } from '@endo/patterns'; +import { + FastUSDCTermsShape, + FeeConfigShape, + FeedPolicyShape, +} from './type-guards.js'; +import { fromExternalConfig } from './utils/config-marshal.js'; + +/** + * @import {DepositFacet} from '@agoric/ertp/src/types.js' + * @import {TypedPattern} from '@agoric/internal' + * @import {Instance, StartParams} from '@agoric/zoe/src/zoeService/utils' + * @import {Board} from '@agoric/vats' + * @import {ManifestBundleRef} from '@agoric/deploy-script-support/src/externalTypes.js' + * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js' + * @import {LegibleCapData} from './utils/config-marshal.js' + * @import {FastUsdcSF} from './fast-usdc.contract.js' + * @import {FeedPolicy, FastUSDCConfig} from './types.js' + */ + +const ShareAssetInfo = /** @type {const} */ harden({ + issuerName: 'FastLP', + denom: 'ufastlp', + assetKind: 'nat', + decimalPlaces: 6, +}); + +const trace = makeTracer('FUSD-Start', true); + +const contractName = 'fastUsdc'; + +/** @type {TypedPattern} */ +export const FastUSDCConfigShape = M.splitRecord({ + terms: FastUSDCTermsShape, + oracles: M.recordOf(M.string(), M.string()), + feeConfig: FeeConfigShape, + feedPolicy: FeedPolicyShape, + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), + assetInfo: M.arrayOf([DenomShape, DenomDetailShape]), +}); + +/** + * XXX Shouldn't the bridge or board vat handle this? + * + * @param {string} path + * @param {{ + * chainStorage: ERef; + * board: ERef; + * }} io + */ +const makePublishingStorageKit = async (path, { chainStorage, board }) => { + const storageNode = await E(chainStorage).makeChildNode(path); + + const marshaller = await E(board).getPublishingMarshaller(); + return { storageNode, marshaller }; +}; + +const BOARD_AUX = 'boardAux'; +const marshalData = makeMarshal(_val => Fail`data only`); +/** + * @param {Brand} brand + * @param {Pick} powers + */ +const publishDisplayInfo = async (brand, { board, chainStorage }) => { + // chainStorage type includes undefined, which doesn't apply here. + // @ts-expect-error UNTIL https://github.com/Agoric/agoric-sdk/issues/8247 + const boardAux = E(chainStorage).makeChildNode(BOARD_AUX); + const [id, displayInfo, allegedName] = await Promise.all([ + E(board).getId(brand), + E(brand).getDisplayInfo(), + E(brand).getAllegedName(), + ]); + const node = E(boardAux).makeChildNode(id); + const aux = marshalData.toCapData(harden({ allegedName, displayInfo })); + await E(node).setValue(JSON.stringify(aux)); +}; + +const FEED_POLICY = 'feedPolicy'; +const POOL_METRICS = 'poolMetrics'; + +/** + * @param {ERef} node + * @param {FeedPolicy} policy + */ +const publishFeedPolicy = async (node, policy) => { + const feedPolicy = E(node).makeChildNode(FEED_POLICY); + await E(feedPolicy).setValue(JSON.stringify(policy)); +}; + +/** + * @typedef { PromiseSpaceOf<{ + * fastUsdcKit: FastUSDCKit + * }> & { + * installation: PromiseSpaceOf<{ fastUsdc: Installation }>; + * instance: PromiseSpaceOf<{ fastUsdc: Instance }>; + * issuer: PromiseSpaceOf<{ FastLP: Issuer }>; + * brand: PromiseSpaceOf<{ FastLP: Brand }>; + * }} FastUSDCCorePowers + * + * @typedef {StartedInstanceKitWithLabel & { + * privateArgs: StartParams['privateArgs']; + * }} FastUSDCKit + */ + +/** + * @throws if oracle smart wallets are not yet provisioned + * + * @param {BootstrapPowers & FastUSDCCorePowers } powers + * @param {{ options: LegibleCapData }} config + */ +export const startFastUSDC = async ( + { + produce: { fastUsdcKit }, + consume: { + agoricNames, + namesByAddress, + bankManager, + board, + chainStorage, + chainTimerService: timerService, + localchain, + cosmosInterchainService, + startUpgradable, + zoe, + }, + issuer: { + produce: { FastLP: produceShareIssuer }, + }, + brand: { + produce: { FastLP: produceShareBrand }, + }, + installation: { + consume: { fastUsdc }, + }, + instance: { + produce: { fastUsdc: produceInstance }, + }, + }, + config, +) => { + trace('startFastUSDC'); + + await null; + /** @type {Issuer<'nat'>} */ + const USDCissuer = await E(agoricNames).lookup('issuer', 'USDC'); + const brands = harden({ + USDC: await E(USDCissuer).getBrand(), + }); + + const { terms, oracles, feeConfig, feedPolicy, ...net } = fromExternalConfig( + config.options, + brands, + FastUSDCConfigShape, + ); + trace('using terms', terms); + trace('using fee config', feeConfig); + + trace('look up oracle deposit facets'); + const oracleDepositFacets = await deeplyFulfilledObject( + objectMap(oracles, async address => { + /** @type {DepositFacet} */ + const depositFacet = await E(namesByAddress).lookup( + address, + 'depositFacet', + ); + return depositFacet; + }), + ); + + const { storageNode, marshaller } = await makePublishingStorageKit( + contractName, + { + board, + // @ts-expect-error Promise case is vestigial + chainStorage, + }, + ); + const poolMetricsNode = await E(storageNode).makeChildNode(POOL_METRICS); + + const privateArgs = await deeplyFulfilledObject( + harden({ + agoricNames, + feeConfig, + localchain, + orchestrationService: cosmosInterchainService, + poolMetricsNode, + storageNode, + timerService, + marshaller, + chainInfo: net.chainInfo, + assetInfo: net.assetInfo, + }), + ); + + const kit = await E(startUpgradable)({ + label: contractName, + installation: fastUsdc, + issuerKeywordRecord: harden({ USDC: USDCissuer }), + terms, + privateArgs, + }); + fastUsdcKit.resolve(harden({ ...kit, privateArgs })); + const { instance, creatorFacet } = kit; + + await publishFeedPolicy(storageNode, feedPolicy); + + const { + issuers: fastUsdcIssuers, + brands: { PoolShares: shareBrand }, + } = await E(zoe).getTerms(instance); + /** @type {{ PoolShares: Issuer<'nat'> }} */ + // @ts-expect-error see zcf.makeZCFMint(...) in fast-usdc.contract.js + const { PoolShares: shareIssuer } = fastUsdcIssuers; + produceShareIssuer.resolve(shareIssuer); + produceShareBrand.resolve(shareBrand); + await publishDisplayInfo(shareBrand, { board, chainStorage }); + + const { denom, issuerName } = ShareAssetInfo; + trace('addAsset', denom, shareBrand); + await E(bankManager).addAsset(denom, issuerName, issuerName, { + issuer: shareIssuer, + brand: shareBrand, + }); + + await Promise.all( + Object.entries(oracleDepositFacets).map(async ([name, depositFacet]) => { + const address = oracles[name]; + trace('making invitation for', name, address); + const toWatch = await E(creatorFacet).makeOperatorInvitation(address); + + const amt = await E(depositFacet).receive(toWatch); + trace('sent', amt, 'to', name); + }), + ); + + produceInstance.reset(); + produceInstance.resolve(instance); + + const addresses = await E(kit.creatorFacet).publishAddresses(); + trace('contract orch account addresses', addresses); + if (!net.noNoble) { + const addr = await E(kit.creatorFacet).connectToNoble(); + trace('noble intermediate recipient', addr); + } + trace('startFastUSDC done', instance); +}; +harden(startFastUSDC); + +/** + * @param {{ + * restoreRef: (b: ERef) => Promise; + * }} utils + * @param {{ + * installKeys: { fastUsdc: ERef }; + * options: LegibleCapData; + * }} param1 + */ +export const getManifestForFastUSDC = ( + { restoreRef }, + { installKeys, options }, +) => { + return { + /** @type {BootstrapManifest} */ + manifest: { + [startFastUSDC.name]: { + produce: { + fastUsdcKit: true, + }, + consume: { + bankManager: true, // to add FastLP as vbank asset + + chainStorage: true, + chainTimerService: true, + localchain: true, + cosmosInterchainService: true, + + // limited distribution durin MN2: contract installation + startUpgradable: true, + zoe: true, // only getTerms() is needed. XXX should be split? + + // widely shared: name services + agoricNames: true, + namesByAddress: true, + board: true, + }, + issuer: { + produce: { FastLP: true }, // UNTIL #10432 + }, + brand: { + produce: { FastLP: true }, // UNTIL #10432 + }, + instance: { + produce: { fastUsdc: true }, + }, + installation: { + consume: { fastUsdc: true }, + }, + }, + }, + installations: { + fastUsdc: restoreRef(installKeys.fastUsdc), + }, + options, + }; +}; diff --git a/packages/fast-usdc/src/pool-share-math.js b/packages/fast-usdc/src/pool-share-math.js new file mode 100644 index 00000000000..7c5df36f567 --- /dev/null +++ b/packages/fast-usdc/src/pool-share-math.js @@ -0,0 +1,189 @@ +import { AmountMath } from '@agoric/ertp/src/amountMath.js'; +import { + divideBy, + makeRatio, + makeRatioFromAmounts, + multiplyBy, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import { Fail, q } from '@endo/errors'; + +const { getValue, add, isEmpty, isEqual, isGTE, subtract } = AmountMath; + +/** + * @import {PoolStats} from './types'; + * @import {RepayAmountKWR} from './exos/liquidity-pool'; + */ + +/** + * Invariant: shareWorth is the pool balance divided by shares outstanding. + * + * Use `makeParity(make(USDC, epsilon), PoolShares)` for an initial + * value, for some negligible `epsilon` such as 1n. + * + * @typedef {Ratio} ShareWorth + */ + +/** + * Make a 1-to-1 ratio between amounts of 2 brands. + * + * @param {Amount<'nat'>} numerator + * @param {Brand<'nat'>} denominatorBrand + */ +export const makeParity = (numerator, denominatorBrand) => { + const value = getValue(numerator.brand, numerator); + return makeRatio(value, numerator.brand, value, denominatorBrand); +}; + +/** + * @typedef {{ + * deposit: { + * give: { USDC: Amount<'nat'> }, + * want?: { PoolShare: Amount<'nat'> } + * }, + * withdraw: { + * give: { PoolShare: Amount<'nat'> } + * want: { USDC: Amount<'nat'> }, + * } + * }} USDCProposalShapes + */ + +/** + * Compute Shares payout from a deposit proposal, as well as updated shareWorth. + * + * Clearly: + * + * sharesOutstanding' = sharesOutstanding + Shares + * poolBalance' = poolBalance + ToPool + * shareWorth' = poolBalance' / sharesOutstanding' + * + * In order to maintain the ShareWorth invariant, we need: + * + * Shares = ToPool / shareWorth' + * + * Solving for Shares gives: + * + * Shares = ToPool * sharesOutstanding / poolBalance + * + * that is: + * + * Shares = ToPool / shareWorth + * + * @param {ShareWorth} shareWorth previous to the deposit + * @param {USDCProposalShapes['deposit']} proposal + * @returns {{ payouts: { PoolShare: Amount<'nat'> }; shareWorth: ShareWorth }} + */ +export const depositCalc = (shareWorth, { give, want }) => { + assert(!isEmpty(give.USDC)); // nice diagnostic provided by proposalShape + + const { denominator: sharesOutstanding, numerator: poolBalance } = shareWorth; + + const fairPoolShare = divideBy(give.USDC, shareWorth); + if (want?.PoolShare) { + isGTE(fairPoolShare, want.PoolShare) || + Fail`deposit cannot pay out ${q(want.PoolShare)}; ${q(give.USDC)} only gets ${q(fairPoolShare)}`; + } + const outstandingPost = add(sharesOutstanding, fairPoolShare); + const balancePost = add(poolBalance, give.USDC); + const worthPost = makeRatioFromAmounts(balancePost, outstandingPost); + return harden({ + payouts: { PoolShare: fairPoolShare }, + shareWorth: worthPost, + }); +}; + +/** + * Compute payout from a withdraw proposal, along with updated shareWorth + * + * @param {ShareWorth} shareWorth + * @param {USDCProposalShapes['withdraw']} proposal + * @returns {{ shareWorth: ShareWorth, payouts: { USDC: Amount<'nat'> }}} + */ +export const withdrawCalc = (shareWorth, { give, want }) => { + assert(!isEmpty(give.PoolShare)); + assert(!isEmpty(want.USDC)); + + const payout = multiplyBy(give.PoolShare, shareWorth); + isGTE(payout, want.USDC) || + Fail`cannot withdraw ${q(want.USDC)}; ${q(give.PoolShare)} only worth ${q(payout)}`; + const { denominator: sharesOutstanding, numerator: poolBalance } = shareWorth; + !isGTE(want.USDC, poolBalance) || + Fail`cannot withdraw ${q(want.USDC)}; only ${q(poolBalance)} in pool`; + const balancePost = subtract(poolBalance, payout); + // giving more shares than are outstanding is impossible, + // so it's not worth a custom diagnostic. subtract will fail + const outstandingPost = subtract(sharesOutstanding, give.PoolShare); + + const worthPost = makeRatioFromAmounts(balancePost, outstandingPost); + return harden({ shareWorth: worthPost, payouts: { USDC: payout } }); +}; + +/** + * @param {ShareWorth} shareWorth + * @param {Amount<'nat'>} fees + */ +export const withFees = (shareWorth, fees) => { + const balancePost = add(shareWorth.numerator, fees); + return makeRatioFromAmounts(balancePost, shareWorth.denominator); +}; + +/** + * + * @param {Amount<'nat'>} requested + * @param {Amount<'nat'>} poolSeatAllocation + * @param {Amount<'nat'>} encumberedBalance + * @param {PoolStats} poolStats + * @throws {Error} if requested is not less than poolSeatAllocation + */ +export const borrowCalc = ( + requested, + poolSeatAllocation, + encumberedBalance, + poolStats, +) => { + // pool must never go empty + !isGTE(requested, poolSeatAllocation) || + Fail`Cannot borrow. Requested ${q(requested)} must be less than pool balance ${q(poolSeatAllocation)}.`; + + return harden({ + encumberedBalance: add(encumberedBalance, requested), + poolStats: { + ...poolStats, + totalBorrows: add(poolStats.totalBorrows, requested), + }, + }); +}; + +/** + * @param {ShareWorth} shareWorth + * @param {Allocation} fromSeatAllocation + * @param {RepayAmountKWR} amounts + * @param {Amount<'nat'>} encumberedBalance aka 'outstanding borrows' + * @param {PoolStats} poolStats + * @throws {Error} if allocations do not match amounts or Principal exceeds encumberedBalance + */ +export const repayCalc = ( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, +) => { + (isEqual(fromSeatAllocation.Principal, amounts.Principal) && + isEqual(fromSeatAllocation.PoolFee, amounts.PoolFee) && + isEqual(fromSeatAllocation.ContractFee, amounts.ContractFee)) || + Fail`Cannot repay. From seat allocation ${q(fromSeatAllocation)} does not equal amounts ${q(amounts)}.`; + + isGTE(encumberedBalance, amounts.Principal) || + Fail`Cannot repay. Principal ${q(amounts.Principal)} exceeds encumberedBalance ${q(encumberedBalance)}.`; + + return harden({ + shareWorth: withFees(shareWorth, amounts.PoolFee), + encumberedBalance: subtract(encumberedBalance, amounts.Principal), + poolStats: { + ...poolStats, + totalRepays: add(poolStats.totalRepays, amounts.Principal), + totalPoolFees: add(poolStats.totalPoolFees, amounts.PoolFee), + totalContractFees: add(poolStats.totalContractFees, amounts.ContractFee), + }, + }); +}; diff --git a/packages/fast-usdc/src/type-guards.js b/packages/fast-usdc/src/type-guards.js new file mode 100644 index 00000000000..0a0c915358f --- /dev/null +++ b/packages/fast-usdc/src/type-guards.js @@ -0,0 +1,145 @@ +import { AmountShape, BrandShape, RatioShape } from '@agoric/ertp'; +import { M } from '@endo/patterns'; +import { PendingTxStatus } from './constants.js'; + +/** + * @import {TypedPattern} from '@agoric/internal'; + * @import {FastUsdcTerms} from './fast-usdc.contract.js'; + * @import {USDCProposalShapes} from './pool-share-math.js'; + * @import {CctpTxEvidence, FeeConfig, PendingTx, PoolMetrics, ChainPolicy, FeedPolicy, AddressHook, EvmAddress, EvmHash, RiskAssessment, EvidenceWithRisk} from './types.js'; + */ + +/** + * @param {Brand} brand must be a 'nat' brand, not checked + * @param {NatValue} [min] + */ +export const makeNatAmountShape = (brand, min) => + harden({ brand, value: min ? M.gte(min) : M.nat() }); + +/** @param {Record<'PoolShares' | 'USDC', Brand<'nat'>>} brands */ +export const makeProposalShapes = ({ PoolShares, USDC }) => { + /** @type {TypedPattern} */ + const deposit = M.splitRecord( + { give: { USDC: makeNatAmountShape(USDC, 1n) } }, + { want: M.splitRecord({}, { PoolShare: makeNatAmountShape(PoolShares) }) }, + ); + /** @type {TypedPattern} */ + const withdraw = M.splitRecord({ + give: { PoolShare: makeNatAmountShape(PoolShares, 1n) }, + want: { USDC: makeNatAmountShape(USDC, 1n) }, + }); + return harden({ deposit, withdraw }); +}; + +/** @type {TypedPattern} */ +export const FastUSDCTermsShape = harden({ + usdcDenom: M.string(), +}); + +/** @type {TypedPattern} */ +export const EvmAddressShape = M.string({ + // 0x + 40 hex digits + stringLengthLimit: 42, +}); +harden(EvmAddressShape); + +/** @type {TypedPattern} */ +export const EvmHashShape = M.string({ + stringLengthLimit: 66, +}); +harden(EvmHashShape); + +/** @type {TypedPattern} */ +export const RiskAssessmentShape = M.splitRecord( + {}, + { + risksIdentified: M.arrayOf(M.string()), + }, +); +harden(RiskAssessmentShape); + +/** @type {TypedPattern} */ +export const CctpTxEvidenceShape = { + aux: { + forwardingChannel: M.string(), + recipientAddress: M.string(), + }, + blockHash: EvmHashShape, + blockNumber: M.nat(), + chainId: M.number(), + tx: { + amount: M.nat(), + forwardingAddress: M.string(), + sender: EvmAddressShape, + }, + txHash: EvmHashShape, +}; +harden(CctpTxEvidenceShape); + +/** @type {TypedPattern} */ +export const EvidenceWithRiskShape = { + evidence: CctpTxEvidenceShape, + risk: RiskAssessmentShape, +}; +harden(EvidenceWithRiskShape); + +/** @type {TypedPattern} */ +// @ts-expect-error TypedPattern not recognized as record +export const PendingTxShape = { + ...CctpTxEvidenceShape, + status: M.or(...Object.values(PendingTxStatus)), +}; +harden(PendingTxShape); + +/** @type {TypedPattern} */ +export const AddressHookShape = { + baseAddress: M.string(), + query: { EUD: M.string() }, +}; +harden(AddressHookShape); + +const NatAmountShape = { brand: BrandShape, value: M.nat() }; +/** @type {TypedPattern} */ +export const FeeConfigShape = { + flat: NatAmountShape, + variableRate: RatioShape, + maxVariable: NatAmountShape, + contractRate: RatioShape, +}; +harden(FeeConfigShape); + +/** @type {TypedPattern} */ +export const PoolMetricsShape = { + encumberedBalance: AmountShape, + shareWorth: RatioShape, + totalContractFees: AmountShape, + totalPoolFees: AmountShape, + totalBorrows: AmountShape, + totalRepays: AmountShape, +}; +harden(PoolMetricsShape); + +/** @type {TypedPattern} */ +export const ChainPolicyShape = { + attenuatedCttpBridgeAddress: EvmHashShape, + cctpTokenMessengerAddress: EvmHashShape, + confirmations: M.number(), + chainId: M.number(), +}; +harden(ChainPolicyShape); + +/** + * @type {TypedPattern} + * + * Should be JSON serializable so CLI can specify policy. E.g. no bigint, + * undefined, remotable, etc. + */ +export const FeedPolicyShape = M.splitRecord( + { + nobleDomainId: M.number(), + nobleAgoricChannelId: M.string(), + chainPolicies: M.recordOf(M.string(), ChainPolicyShape), + }, + { eventFilter: M.string() }, +); +harden(FeedPolicyShape); diff --git a/packages/fast-usdc/src/types-index.d.ts b/packages/fast-usdc/src/types-index.d.ts new file mode 100644 index 00000000000..06c33f562f4 --- /dev/null +++ b/packages/fast-usdc/src/types-index.d.ts @@ -0,0 +1 @@ +export type * from './types.js'; diff --git a/packages/fast-usdc/src/types-index.js b/packages/fast-usdc/src/types-index.js new file mode 100644 index 00000000000..cb0ff5c3b54 --- /dev/null +++ b/packages/fast-usdc/src/types-index.js @@ -0,0 +1 @@ +export {}; diff --git a/packages/fast-usdc/src/types.ts b/packages/fast-usdc/src/types.ts new file mode 100644 index 00000000000..433ea135d97 --- /dev/null +++ b/packages/fast-usdc/src/types.ts @@ -0,0 +1,121 @@ +import type { + ChainAddress, + CosmosChainInfo, + Denom, + DenomDetail, +} from '@agoric/orchestration'; +import type { IBCChannelID } from '@agoric/vats'; +import type { Amount } from '@agoric/ertp'; +import type { CopyRecord, Passable } from '@endo/pass-style'; +import type { PendingTxStatus, TxStatus } from './constants.js'; +import type { FastUsdcTerms } from './fast-usdc.contract.js'; +import type { RepayAmountKWR } from './exos/liquidity-pool.js'; + +export type EvmHash = `0x${string}`; +export type EvmAddress = `0x${string & { length: 40 }}`; +export type NobleAddress = `noble1${string}`; +export type EvmChainID = number; +export type EvmChainName = string; + +export interface RiskAssessment { + risksIdentified?: string[]; +} + +export interface CctpTxEvidence { + /** from Noble RPC */ + aux: { + forwardingChannel: IBCChannelID; + recipientAddress: ChainAddress['value']; + }; + blockHash: EvmHash; + blockNumber: bigint; + chainId: number; + /** data covered by signature (aka txHash) */ + tx: { + amount: bigint; + forwardingAddress: NobleAddress; + sender: EvmAddress; + }; + txHash: EvmHash; +} + +export interface EvidenceWithRisk { + evidence: CctpTxEvidence; + risk: RiskAssessment; +} + +/** + * 'evidence' only available when it's first observed and not in subsequent + * updates. + */ +export interface TransactionRecord extends CopyRecord { + evidence?: CctpTxEvidence; + split?: RepayAmountKWR; + risksIdentified?: string[]; + status: TxStatus; +} + +export type LogFn = (...args: unknown[]) => void; + +export interface PendingTx extends CctpTxEvidence { + status: PendingTxStatus; +} + +export type FeeConfig = { + flat: Amount<'nat'>; + variableRate: Ratio; + maxVariable: Amount<'nat'>; + contractRate: Ratio; +}; + +export interface PoolStats { + totalBorrows: Amount<'nat'>; + totalContractFees: Amount<'nat'>; + totalPoolFees: Amount<'nat'>; + totalRepays: Amount<'nat'>; +} + +export interface PoolMetrics extends PoolStats { + encumberedBalance: Amount<'nat'>; + shareWorth: Ratio; +} + +export interface ChainPolicy { + /** `msg.sender` of DepositAndBurn to TokenMessenger must be an attenuated wrapper contract that does not contain `replaceDepositForBurn` */ + attenuatedCttpBridgeAddress: EvmHash; + /** @see {@link https://developers.circle.com/stablecoins/evm-smart-contracts} */ + cctpTokenMessengerAddress: EvmHash; + /** e.g., `1` for ETH mainnet 42161 for Arbitrum One. @see {@link https://chainlist.org/} */ + chainId: EvmChainID; + /** the number of block confirmations to observe before reporting */ + confirmations: number; +} + +export interface FeedPolicy { + nobleDomainId: number; + nobleAgoricChannelId: string; + chainPolicies: Record; + eventFilter?: string; +} + +export type FastUSDCConfig = { + terms: FastUsdcTerms; + oracles: Record; + feeConfig: FeeConfig; + feedPolicy: FeedPolicy & Passable; + noNoble: boolean; // support a3p-integration, which has no noble chain + chainInfo: Record; + assetInfo: [Denom, DenomDetail & { brandKey?: string }][]; +} & CopyRecord; + +/** decoded address hook parameters */ +export type AddressHook = { + baseAddress: string; + query: { + /** end user destination address */ + EUD: string; + }; +}; + +export type * from './constants.js'; +export type { LiquidityPoolKit } from './exos/liquidity-pool.js'; diff --git a/packages/fast-usdc/src/util/agoric.js b/packages/fast-usdc/src/util/agoric.js new file mode 100644 index 00000000000..4f7e4d65254 --- /dev/null +++ b/packages/fast-usdc/src/util/agoric.js @@ -0,0 +1,12 @@ +/** @import { VStorage } from '@agoric/client-utils' */ + +export const queryFastUSDCLocalChainAccount = async ( + /** @type {VStorage} */ vstorage, + out = console, +) => { + const agoricAddr = await vstorage.readLatest( + 'published.fastUsdc.settlementAccount', + ); + out.log(`Got Fast USDC Local Chain Account ${agoricAddr}`); + return agoricAddr; +}; diff --git a/packages/fast-usdc/src/util/bank.js b/packages/fast-usdc/src/util/bank.js new file mode 100644 index 00000000000..24f1ced5265 --- /dev/null +++ b/packages/fast-usdc/src/util/bank.js @@ -0,0 +1,12 @@ +export const queryUSDCBalance = async ( + /** @type {string} */ address, + /** @type {string} */ api, + /** @type {string} */ denom, + /** @type {typeof globalThis.fetch} */ fetch, +) => { + const query = `${api}/cosmos/bank/v1beta1/balances/${address}`; + const json = await fetch(query).then(res => res.json()); + const amount = json.balances?.find(b => b.denom === denom)?.amount ?? '0'; + + return BigInt(amount); +}; diff --git a/packages/fast-usdc/src/util/cctp.js b/packages/fast-usdc/src/util/cctp.js new file mode 100644 index 00000000000..761e5221f69 --- /dev/null +++ b/packages/fast-usdc/src/util/cctp.js @@ -0,0 +1,71 @@ +import { Buffer } from 'node:buffer'; +import { bech32 } from 'bech32'; +import { ethers } from 'ethers'; + +/** + * Adapted from https://docs.noble.xyz/cctp/mint#encoding + * + * @param {string} address + * @returns {string} + */ +export const encodeBech32Address = address => { + const decoded = bech32.decode(address); + const rawBytes = Buffer.from(bech32.fromWords(decoded.words)); + + const padded = Buffer.alloc(32); + rawBytes.copy(padded, 32 - rawBytes.length); + + return `0x${padded.toString('hex')}`; +}; + +const tokenAbi = ['function approve(address spender, uint256 value) external']; + +const contractAbi = [ + 'function depositForBurn(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken) external', +]; + +export const makeProvider = (/** @type {string} */ rpc) => + new ethers.JsonRpcProvider(rpc); + +const USDC_DECIMALS = 6; +// For CCTP, noble's domain is universally "4" +const NOBLE_DOMAIN = 4; + +export const depositForBurn = async ( + /** @type {ethers.JsonRpcProvider} */ provider, + /** @type {string} */ ethSeed, + /** @type {string} */ tokenMessengerAddress, + /** @type {string} */ tokenAddress, + /** @type {string} */ destination, + /** @type {string} */ amount, + out = console, +) => { + const privateKey = ethSeed; + const wallet = new ethers.Wallet(privateKey, provider); + const contractAddress = tokenMessengerAddress; + const token = new ethers.Contract(tokenAddress, tokenAbi, wallet); + const contract = new ethers.Contract(contractAddress, contractAbi, wallet); + const parsedAmount = ethers.parseUnits(amount, USDC_DECIMALS); + out.log('approving'); + const approveTx = await token.approve(contractAddress, parsedAmount); + out.log('Transaction sent, waiting for confirmation...'); + const approveReceipt = await approveTx.wait(); + out.log('Transaction confirmed in block', approveReceipt.blockNumber); + out.log('Transaction hash:', approveReceipt.hash); + + const mintRecipient = encodeBech32Address(destination); + out.log('depositing for burn', parsedAmount, 4, mintRecipient, tokenAddress); + const tx = await contract.depositForBurn( + parsedAmount, + NOBLE_DOMAIN, + mintRecipient, + tokenAddress, + ); + + out.log('Transaction sent, waiting for confirmation...'); + const receipt = await tx.wait(); + + out.log('Transaction confirmed in block', receipt.blockNumber); + out.log('Transaction hash:', receipt.hash); + out.log('USDC transfer initiated successfully'); +}; diff --git a/packages/fast-usdc/src/util/file.js b/packages/fast-usdc/src/util/file.js new file mode 100644 index 00000000000..fd8134b420b --- /dev/null +++ b/packages/fast-usdc/src/util/file.js @@ -0,0 +1,30 @@ +import { dirname } from 'path'; + +/** @import { readFile as readAsync } from 'node:fs/promises' */ +/** @import { writeFile as writeAsync } from 'node:fs/promises' */ +/** @import { mkdirSync } from 'node:fs' */ +/** @import { existsSync } from 'node:fs' */ + +export const makeFile = ( + /** @type {string} */ path, + /** @type {readAsync} */ readFile, + /** @type {writeAsync} */ writeFile, + /** @type {mkdirSync} */ mkdir, + /** @type {existsSync} */ pathExists, +) => { + const read = () => readFile(path, 'utf-8'); + + const write = async (/** @type {string} */ data) => { + const dir = dirname(path); + if (!pathExists(dir)) { + mkdir(dir); + } + await writeFile(path, data); + }; + + const exists = () => pathExists(path); + + return { read, write, exists, path }; +}; + +/** @typedef {ReturnType} File */ diff --git a/packages/fast-usdc/src/util/noble.js b/packages/fast-usdc/src/util/noble.js new file mode 100644 index 00000000000..3411c5827d9 --- /dev/null +++ b/packages/fast-usdc/src/util/noble.js @@ -0,0 +1,110 @@ +/* global globalThis */ + +import { DirectSecp256k1HdWallet, Registry } from '@cosmjs/proto-signing'; +import { AminoTypes, SigningStargateClient } from '@cosmjs/stargate'; +import { nobleAminoConverters, nobleProtoRegistry } from '@nick134-bit/noblejs'; + +export const makeSigner = async ( + /** @type {string} */ nobleSeed, + /** @type {string} */ nobleRpc, + out = console, +) => { + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(nobleSeed, { + prefix: 'noble', + }); + out.log('got noble wallet from seed'); + const accounts = await wallet.getAccounts(); + const address = accounts[0].address; + const signer = await SigningStargateClient.connectWithSigner( + nobleRpc, + wallet, + { + aminoTypes: new AminoTypes({ + ...nobleAminoConverters, + }), + registry: new Registry([...nobleProtoRegistry]), + }, + ); + return { address, signer }; +}; + +const createMsgRegisterAccount = ( + /** @type {string} */ signer, + /** @type {string} */ recipient, + /** @type {string} */ channel, +) => { + return { + typeUrl: '/noble.forwarding.v1.MsgRegisterAccount', + value: { + signer, + recipient, + channel, + }, + }; +}; + +export const registerFwdAccount = async ( + /** @type {SigningStargateClient} */ nobleSigner, + /** @type {string} */ nobleAddress, + /** @type {string} */ nobleToAgoricChannel, + /** @type {string} */ recipient, + out = console, +) => { + out.log('registering fwd account on noble'); + const msg = createMsgRegisterAccount( + nobleAddress, + recipient, + nobleToAgoricChannel, + ); + const fee = { + amount: [ + { + denom: 'uusdc', + amount: '20000', + }, + ], + gas: '200000', + }; + out.log('signing message', msg); + const txResult = await nobleSigner.signAndBroadcast( + nobleAddress, + [msg], + fee, + 'Register Account Transaction', + ); + if (txResult.code !== undefined && txResult.code !== 0) { + throw new Error( + `Transaction failed with code ${txResult.code}: ${txResult.events || ''}`, + ); + } + return `Transaction successful with hash: ${txResult.transactionHash}`; +}; + +export const queryForwardingAccount = async ( + /** @type {string} */ nobleApi, + /** @type {string} */ nobleToAgoricChannel, + /** @type {string} */ agoricAddr, + out = console, + fetch = globalThis.fetch, +) => { + /** + * https://github.com/noble-assets/forwarding/blob/9d7657a/proto/noble/forwarding/v1/query.proto + * v2.0.0 10 Nov 2024 + */ + const query = `${nobleApi}/noble/forwarding/v1/address/${nobleToAgoricChannel}/${encodeURIComponent(agoricAddr)}/`; + out.log(`querying forward address details from noble api: ${query}`); + let forwardingAddressRes; + await null; + try { + forwardingAddressRes = await fetch(query).then(res => res.json()); + } catch (e) { + out.error(`Error querying forwarding address from ${query}`); + throw e; + } + /** @type {{ address: string, exists: boolean }} */ + const { address, exists } = forwardingAddressRes; + out.log( + `got forwarding address details: ${JSON.stringify(forwardingAddressRes)}`, + ); + return { address, exists }; +}; diff --git a/packages/fast-usdc/src/utils/config-marshal.js b/packages/fast-usdc/src/utils/config-marshal.js new file mode 100644 index 00000000000..5bcc353e9f0 --- /dev/null +++ b/packages/fast-usdc/src/utils/config-marshal.js @@ -0,0 +1,130 @@ +import { Fail } from '@endo/errors'; +import { makeMarshal } from '@endo/marshal'; +import { mustMatch } from '@endo/patterns'; + +// TODO(#7309): move to make available beyond fast-usdc. + +/** + * @import {Marshal, CapData, Passable} from '@endo/marshal'; + * @import { RemotableBrand } from '@endo/eventual-send'; + * @import {TypedPattern} from '@agoric/internal' + */ +const { entries } = Object; + +/** + * To configure amounts such as terms or ratios, + * we need to refer to objects such as brands. + * + * If parties agree on names, any party that doesn't have + * an actual presence for an object can make one up: + * + * const remotes = { USDC: Far('USDC Brand') }; + * + * and use it in local computation: + * + * const terms = { fee1: AmountMath.make(remotes.USDC, 1234n) } + * + * Then we can pass references across using marshal conventions, using + * the names as slots. + * + * @param {Record} slotToVal a record that gives names to stand-ins for objects in another vat + * @returns {Marshal} + */ +export const makeMarshalFromRecord = slotToVal => { + const convertSlotToVal = slot => { + slot in slotToVal || Fail`unknown slot ${slot}`; + return slotToVal[slot]; + }; + const valToSlot = new Map(entries(slotToVal).map(([k, v]) => [v, k])); + const convertValToSlot = v => { + valToSlot.has(v) || Fail`unknown value: ${v}`; + return valToSlot.get(v); + }; + return makeMarshal(convertValToSlot, convertSlotToVal, { + serializeBodyFormat: 'smallcaps', + }); +}; + +/** + * @typedef {`\$${number}${string}`} SmallCapsSlotRef + */ + +/** + * @template T + * @typedef {{ [KeyType in keyof T]: T[KeyType] } & {}} Simplify flatten the + * type output to improve type hints shown in editors + * https://github.com/sindresorhus/type-fest/blob/main/source/simplify.d.ts + */ + +/** + * @template T + * @template R + * @typedef {T extends R + * ? SmallCapsSlotRef + * : T extends {} + * ? Simplify> + * : Awaited} SmallCapsStructureOf + */ + +/** + * The smallCaps body is a string, which simplifies some usage. + * But it's hard to read and write. + * + * The parsed structure makes a convenient notation for configuration etc. + * + * @template {Passable} [T=Passable] + * @template [R=RemotableBrand] + * @typedef {{ + * structure: SmallCapsStructureOf; + * slots: string[]; + * }} LegibleCapData + */ + +/** + * @template {Passable} [T=Passable] + * @template [R=RemotableBrand] + * @param {CapData} capData + * @returns {LegibleCapData} + */ +export const toLegible = ({ body, slots }) => + harden({ structure: JSON.parse(body.replace(/^#/, '')), slots }); + +/** + * @template {Passable} [T=Passable] + * @template [R=RemotableBrand] + * @param {LegibleCapData} legible + * @returns {CapData} + */ +export const fromLegible = ({ structure, slots }) => + harden({ body: `#${JSON.stringify(structure)}`, slots }); + +/** + * @template {Passable} [T=Passable] + * @template [R=RemotableBrand] + * @param {T} config + * @param {Record} context + * @param {TypedPattern} [shape] + * @returns {LegibleCapData} + */ +export const toExternalConfig = (config, context, shape) => { + if (shape) { + mustMatch(config, shape); + } + return toLegible(makeMarshalFromRecord(context).toCapData(config)); +}; + +/** + * @template {Passable} [T=Passable] + * @template [R=RemotableBrand] + * @param {LegibleCapData} repr + * @param {Record} context + * @param {TypedPattern} [shape] + * @returns {T} + */ +export const fromExternalConfig = (repr, context, shape) => { + const config = makeMarshalFromRecord(context).fromCapData(fromLegible(repr)); + if (shape) { + mustMatch(config, shape); + } + return config; +}; diff --git a/packages/fast-usdc/src/utils/deploy-config.js b/packages/fast-usdc/src/utils/deploy-config.js new file mode 100644 index 00000000000..22b2cd5a593 --- /dev/null +++ b/packages/fast-usdc/src/utils/deploy-config.js @@ -0,0 +1,166 @@ +import { denomHash, withChainCapabilities } from '@agoric/orchestration'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; + +/** + * @import {FastUSDCConfig} from '@agoric/fast-usdc/src/types.js' + * @import {Passable} from '@endo/marshal'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; + */ + +/** @type {[Denom, DenomDetail & { brandKey?: string}][]} */ +export const defaultAssetInfo = [ + [ + 'uusdc', + { + baseName: 'noble', + chainName: 'noble', + baseDenom: 'uusdc', + }, + ], + [ + `ibc/${denomHash({ denom: 'uusdc', channelId: fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId })}`, + { + baseName: 'noble', + chainName: 'agoric', + baseDenom: 'uusdc', + brandKey: 'USDC', + }, + ], + [ + `ibc/${denomHash({ denom: 'uusdc', channelId: fetchedChainInfo.osmosis.connections['noble-1'].transferChannel.channelId })}`, + { + baseName: 'noble', + chainName: 'osmosis', + baseDenom: 'uusdc', + }, + ], +]; +harden(defaultAssetInfo); + +const agoricAssetInfo = defaultAssetInfo.filter( + ([_d, i]) => i.chainName === 'agoric', +); + +/** + * @type {Record>} + * + * TODO: determine OCW operator addresses + * meanwhile, use price oracle addresses (from updatePriceFeeds.js). + */ +export const configurations = { + /** + * NOTE: The a3p-integration runtime does _not_ include + * a noble chain; this limits functionality to advancing + * to the Agoric chain. + */ + A3P_INTEGRATION: { + oracles: { + gov1: 'agoric1ee9hr0jyrxhy999y755mp862ljgycmwyp4pl7q', + gov2: 'agoric1wrfh296eu2z34p6pah7q04jjuyj3mxu9v98277', + gov3: 'agoric1ydzxwh6f893jvpaslmaz6l8j2ulup9a7x8qvvq', + }, + feedPolicy: { + nobleAgoricChannelId: 'channel-does-not-exist', + nobleDomainId: 4, + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: + '0xe298b93ffB5eA1FB628e0C0D55A43aeaC268e347', + cctpTokenMessengerAddress: + '0x19330d10D9Cc8751218eaf51E8885D058642E08A', + chainId: 42161, + confirmations: 2, + }, + }, + }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities({ + agoric: fetchedChainInfo.agoric, + // registering USDC-on-agoric requires registering the noble chain + noble: fetchedChainInfo.noble, + }) + ), + assetInfo: agoricAssetInfo, + }, + MAINNET: { + oracles: { + '01node': 'agoric19uscwxdac6cf6z7d5e26e0jm0lgwstc47cpll8', + 'Simply Staking': 'agoric1krunjcqfrf7la48zrvdfeeqtls5r00ep68mzkr', + P2P: 'agoric1n4fcxsnkxe4gj6e24naec99hzmc4pjfdccy5nj', + }, + feedPolicy: { + nobleAgoricChannelId: 'channel-21', + nobleDomainId: 4, + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: + '0xe298b93ffB5eA1FB628e0C0D55A43aeaC268e347', + cctpTokenMessengerAddress: + '0x19330d10D9Cc8751218eaf51E8885D058642E08A', + chainId: 42161, + confirmations: 2, + }, + }, + }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) + ), + assetInfo: defaultAssetInfo, + }, + DEVNET: { + oracles: { + DSRV: 'agoric1lw4e4aas9q84tq0q92j85rwjjjapf8dmnllnft', + Stakin: 'agoric1zj6vrrrjq4gsyr9lw7dplv4vyejg3p8j2urm82', + '01node': 'agoric1ra0g6crtsy6r3qnpu7ruvm7qd4wjnznyzg5nu4', + 'Simply Staking': 'agoric1qj07c7vfk3knqdral0sej7fa6eavkdn8vd8etf', + P2P: 'agoric10vjkvkmpp9e356xeh6qqlhrny2htyzp8hf88fk', + }, + feedPolicy: { + nobleAgoricChannelId: 'TODO', + nobleDomainId: 4, + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: '0xTODO', + cctpTokenMessengerAddress: '0xTODO', + chainId: 421614, + confirmations: 2, + }, + }, + }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) // TODO: use devnet values + ), + assetInfo: defaultAssetInfo, // TODO: use emerynet values + }, + EMERYNET: { + oracles: { + gov1: 'agoric1ldmtatp24qlllgxmrsjzcpe20fvlkp448zcuce', + gov2: 'agoric140dmkrz2e42ergjj7gyvejhzmjzurvqeq82ang', + }, + feedPolicy: { + nobleAgoricChannelId: 'TODO', + nobleDomainId: 4, + chainPolicies: { + Arbitrum: { + attenuatedCttpBridgeAddress: '0xTODO', + cctpTokenMessengerAddress: '0xTODO', + chainId: 421614, + confirmations: 2, + }, + }, + }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) // TODO: use emerynet values + ), + assetInfo: defaultAssetInfo, // TODO: use emerynet values + }, +}; +harden(configurations); + +// Constraints on the configurations +const MAINNET_EXPECTED_ORACLES = 3; +assert( + new Set(Object.values(configurations.MAINNET.oracles)).size === + MAINNET_EXPECTED_ORACLES, + `Mainnet must have exactly ${MAINNET_EXPECTED_ORACLES} oracles`, +); diff --git a/packages/fast-usdc/src/utils/fees.js b/packages/fast-usdc/src/utils/fees.js new file mode 100644 index 00000000000..08b14c81991 --- /dev/null +++ b/packages/fast-usdc/src/utils/fees.js @@ -0,0 +1,58 @@ +import { AmountMath } from '@agoric/ertp'; +import { multiplyBy } from '@agoric/zoe/src/contractSupport/ratio.js'; +import { Fail } from '@endo/errors'; +import { mustMatch } from '@endo/patterns'; +import { FeeConfigShape } from '../type-guards.js'; + +const { add, isGTE, min, subtract } = AmountMath; + +/** + * @import {Amount} from '@agoric/ertp'; + * @import {FeeConfig} from '../types.js'; + * @import {RepayAmountKWR} from '../exos/liquidity-pool.js'; + */ + +/** @param {FeeConfig} feeConfig */ +export const makeFeeTools = feeConfig => { + mustMatch(feeConfig, FeeConfigShape, 'Must provide feeConfig'); + const { flat, variableRate, maxVariable } = feeConfig; + const feeTools = harden({ + /** + * Calculate the net amount to advance after withholding fees. + * + * @param {Amount<'nat'>} requested + * @throws {Error} if requested does not exceed fees + */ + calculateAdvance(requested) { + const fee = feeTools.calculateAdvanceFee(requested); + return subtract(requested, fee); + }, + /** + * Calculate the total fee to charge for the advance. + * + * @param {Amount<'nat'>} requested + * @throws {Error} if requested does not exceed fees + */ + calculateAdvanceFee(requested) { + const variable = min(multiplyBy(requested, variableRate), maxVariable); + const fee = add(variable, flat); + !isGTE(fee, requested) || Fail`Request must exceed fees.`; + return fee; + }, + /** + * Calculate the split of fees between pool and contract. + * + * @param {Amount<'nat'>} requested + * @returns {RepayAmountKWR} an {@link AmountKeywordRecord} + * @throws {Error} if requested does not exceed fees + */ + calculateSplit(requested) { + const fee = feeTools.calculateAdvanceFee(requested); + const Principal = subtract(requested, fee); + const ContractFee = multiplyBy(fee, feeConfig.contractRate); + const PoolFee = subtract(fee, ContractFee); + return harden({ Principal, PoolFee, ContractFee }); + }, + }); + return feeTools; +}; diff --git a/packages/fast-usdc/src/utils/zoe.js b/packages/fast-usdc/src/utils/zoe.js new file mode 100644 index 00000000000..d951bbef865 --- /dev/null +++ b/packages/fast-usdc/src/utils/zoe.js @@ -0,0 +1,28 @@ +import { makeTracer } from '@agoric/internal'; + +const trace = makeTracer('ZoeUtils'); + +/** + * Used for "continuing offer" invitations in which the caller does not need + * anything in return. In those cases there is no Zoe offer safety and the + * invitation making function can perform the request itself. + * + * But smart-wallet expects an invitation maker to make an invitation, so this + * function abstracts making such an inert invitation and logs consistently when + * it is used. + * + * When this is used by an invitation maker that performs the operation, receiving + * one of these invitations is evidence that the operation took place. + * + * @param {ZCF} zcf + * @param {string} description @see {@link ZCF.makeInvitation} + * @returns {() => Promise} an arg-less invitation maker + */ +export const defineInertInvitation = (zcf, description) => { + return () => + zcf.makeInvitation(seat => { + trace(`ℹ️ An offer was made on an inert invitation for ${description}`); + seat.exit(); + return 'inert; nothing should be expected from this offer'; + }, description); +}; diff --git a/packages/fast-usdc/test/cli.test.ts b/packages/fast-usdc/test/cli.test.ts deleted file mode 100644 index f14e70fa161..00000000000 --- a/packages/fast-usdc/test/cli.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import test from 'ava'; -import { spawn } from 'child_process'; -import { fileURLToPath } from 'url'; -import { dirname, join } from 'path'; - -const dir = dirname(fileURLToPath(import.meta.url)); -const CLI_PATH = join(dir, '../src/cli.js'); - -test('CLI shows help when run without arguments', async t => { - const output = await new Promise(resolve => { - const child = spawn('node', [CLI_PATH]); - let stderr = ''; - - child.stderr.on('data', data => { - stderr += data.toString(); - }); - - child.on('close', () => { - resolve(stderr); - }); - }); - - t.snapshot(output); -}); diff --git a/packages/fast-usdc/test/cli/cli.test.ts b/packages/fast-usdc/test/cli/cli.test.ts new file mode 100644 index 00000000000..026c8d01dac --- /dev/null +++ b/packages/fast-usdc/test/cli/cli.test.ts @@ -0,0 +1,327 @@ +import test from 'ava'; +import { execa } from 'execa'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; +import { initProgram } from '../../src/cli/cli.js'; + +const dir = dirname(fileURLToPath(import.meta.url)); +const CLI_PATH = join(dir, '../../src/cli/bin.js'); + +const runCli = async (args: string[]) => { + await null; + try { + const { stdout } = await execa(CLI_PATH, args); + return stdout; + } catch (error: any) { + return error.stderr || error.stdout || error.message; + } +}; + +const mockConfig = () => { + let initArgs: any[]; + let updateArgs: any[]; + let showArgs: any[]; + return { + init: async (...args: any[]) => { + initArgs = args; + }, + update: async (...args: any[]) => { + updateArgs = args; + }, + show: async (...args: any[]) => { + showArgs = args; + }, + getInitArgs: () => initArgs, + getUpdateArgs: () => updateArgs, + getShowArgs: () => showArgs, + }; +}; + +const mockTransfer = () => { + let transferArgs: any[]; + return { + transfer: async (...args: any[]) => { + transferArgs = args; + }, + getTransferArgs: () => transferArgs, + }; +}; + +test('shows help when run without arguments', async t => { + const output = await runCli([]); + // Replace home path (e.g. "/home/samsiegart/.fast-usdc") with "~/.fast-usdc" so snapshots work on different machines. + const regex = /"\/(.+\/)?\.fast-usdc\/"/g; + const result = output.replace(regex, '"~/.fast-usdc"'); + + t.snapshot(result); +}); + +test('shows help for transfer command', async t => { + const output = await runCli(['transfer', '-h']); + t.snapshot(output); +}); + +test('shows help for config command', async t => { + const output = await runCli(['config', '-h']); + t.snapshot(output); +}); + +test('shows help for config init command', async t => { + const output = await runCli(['config', 'init', '-h']); + t.snapshot(output); +}); + +test('shows help for config update command', async t => { + const output = await runCli(['config', 'update', '-h']); + t.snapshot(output); +}); + +test('shows help for config show command', async t => { + const output = await runCli(['config', 'show', '-h']); + t.snapshot(output); +}); + +test('shows error when deposit command is run without options', async t => { + const output = await runCli(['deposit']); + t.snapshot(output); +}); + +test('shows error when deposit command is run with invalid amount', async t => { + const output = await runCli(['deposit', '--amount', 'not-a-number']); + t.snapshot(output); +}); + +test('shows error when withdraw command is run without options', async t => { + const output = await runCli(['withdraw']); + t.snapshot(output); +}); + +test('shows error when withdraw command is run with invalid amount', async t => { + const output = await runCli(['withdraw', '--amount', 'not-a-number']); + t.snapshot(output); +}); + +test('shows error when config init command is run without options', async t => { + const output = await runCli(['config', 'init']); + t.snapshot(output); +}); + +test('shows error when transfer command is run without options', async t => { + const output = await runCli(['transfer']); + t.snapshot(output); +}); + +test('shows error when config init command is run without eth seed', async t => { + const output = await runCli([ + 'config', + 'init', + '--noble-seed', + 'foo', + '--agoric-seed', + 'bar', + ]); + t.snapshot(output); +}); + +test('shows error when config init command is run without agoric seed', async t => { + const output = await runCli([ + 'config', + 'init', + '--noble-seed', + 'foo', + '--eth-seed', + 'bar', + ]); + t.snapshot(output); +}); + +test('shows error when config init command is run without noble seed', async t => { + const output = await runCli([ + 'config', + 'init', + '--agoric-seed', + 'foo', + '--eth-seed', + 'bar', + ]); + t.snapshot(output); +}); + +test('calls config init with default args', t => { + const homeDir = './test/.fast-usdc/'; + const config = mockConfig(); + const program = initProgram(config, mockTransfer()); + + program.parse([ + 'node', + CLI_PATH, + '--home', + homeDir, + 'config', + 'init', + '--noble-seed', + 'foo', + '--eth-seed', + 'bar', + '--agoric-seed', + 'bazinga', + ]); + + const args = config.getInitArgs(); + t.is(args.shift().path, `${homeDir}config.json`); + t.deepEqual(args, [ + { + agoricSeed: 'bazinga', + agoricApi: 'http://127.0.0.1:1317', + agoricRpc: 'http://127.0.0.1:26656', + ethRpc: 'http://127.0.0.1:8545', + ethSeed: 'bar', + nobleRpc: 'http://127.0.0.1:26657', + nobleSeed: 'foo', + nobleApi: 'http://127.0.0.1:1318', + nobleToAgoricChannel: 'channel-21', + tokenMessengerAddress: '0xbd3fa81b58ba92a82136038b25adec7066af3155', + tokenContractAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }, + ]); +}); + +test('calls config init with optional args', t => { + const homeDir = './test/.fast-usdc/'; + const config = mockConfig(); + const program = initProgram(config, mockTransfer()); + + program.parse([ + 'node', + CLI_PATH, + '--home', + homeDir, + 'config', + 'init', + '--noble-seed', + 'foo', + '--eth-seed', + 'bar', + '--agoric-seed', + 'bazinga', + '--agoric-api', + '127.0.0.1:0000', + '--agoric-rpc', + '127.0.0.1:1111', + '--eth-rpc', + '127.0.0.1:2222', + '--noble-rpc', + '127.0.0.1:3333', + '--noble-api', + '127.0.0.1:4444', + '--noble-to-agoric-channel', + 'channel-101', + '--token-messenger-address', + '0xmessenger123', + '--token-contract-address', + '0xtoken123', + ]); + + const args = config.getInitArgs(); + t.is(args.shift().path, `${homeDir}config.json`); + t.deepEqual(args, [ + { + agoricApi: '127.0.0.1:0000', + agoricSeed: 'bazinga', + agoricRpc: '127.0.0.1:1111', + ethRpc: '127.0.0.1:2222', + ethSeed: 'bar', + nobleRpc: '127.0.0.1:3333', + nobleSeed: 'foo', + nobleApi: '127.0.0.1:4444', + nobleToAgoricChannel: 'channel-101', + tokenMessengerAddress: '0xmessenger123', + tokenContractAddress: '0xtoken123', + }, + ]); +}); + +test('calls config update with args', t => { + const homeDir = './test/.fast-usdc/'; + const config = mockConfig(); + const program = initProgram(config, mockTransfer()); + + program.parse([ + 'node', + CLI_PATH, + '--home', + homeDir, + 'config', + 'update', + '--noble-seed', + 'foo', + '--eth-seed', + 'bar', + '--agoric-seed', + 'bazinga', + '--agoric-api', + '127.0.0.1:0000', + '--agoric-rpc', + '127.0.0.1:1111', + '--eth-rpc', + '127.0.0.1:2222', + '--noble-rpc', + '127.0.0.1:3333', + '--noble-api', + '127.0.0.1:4444', + '--noble-to-agoric-channel', + 'channel-101', + '--token-messenger-address', + '0xmessenger123', + '--token-contract-address', + '0xtoken123', + ]); + + const args = config.getUpdateArgs(); + t.is(args.shift().path, `${homeDir}config.json`); + t.deepEqual(args, [ + { + agoricSeed: 'bazinga', + agoricApi: '127.0.0.1:0000', + agoricRpc: '127.0.0.1:1111', + ethRpc: '127.0.0.1:2222', + ethSeed: 'bar', + nobleRpc: '127.0.0.1:3333', + nobleSeed: 'foo', + nobleApi: '127.0.0.1:4444', + nobleToAgoricChannel: 'channel-101', + tokenMessengerAddress: '0xmessenger123', + tokenContractAddress: '0xtoken123', + }, + ]); +}); + +test('calls config show', t => { + const homeDir = './test/.fast-usdc/'; + const config = mockConfig(); + const program = initProgram(config, mockTransfer()); + + program.parse(['node', CLI_PATH, '--home', homeDir, 'config', 'show']); + + t.is(config.getShowArgs()[0].path, './test/.fast-usdc/config.json'); +}); + +test('calls transfer with args', t => { + const homeDir = './test/.fast-usdc/'; + const transfer = mockTransfer(); + const program = initProgram(mockConfig(), transfer); + + program.parse([ + 'node', + CLI_PATH, + '--home', + homeDir, + 'transfer', + '450000', + 'dydx123456', + ]); + + const args = transfer.getTransferArgs(); + t.is(args.shift().path, `${homeDir}config.json`); + t.deepEqual(args, ['450000', 'dydx123456']); +}); diff --git a/packages/fast-usdc/test/cli/config.test.ts b/packages/fast-usdc/test/cli/config.test.ts new file mode 100644 index 00000000000..a592ceca73e --- /dev/null +++ b/packages/fast-usdc/test/cli/config.test.ts @@ -0,0 +1,116 @@ +import test from 'ava'; +import * as config from '../../src/cli/config.js'; +import { mockOut, mockrl, mockFile } from '../../testing/mocks.js'; + +test('show reads the config file', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const val = JSON.stringify({ hello: 'world!' }, null, 2); + const file = mockFile(path, val); + const out = mockOut(); + + // @ts-expect-error mocking partial Console + await config.show(file, out); + + t.is(out.getErrOut(), ''); + t.is(out.getLogOut(), `Config found at ${path}:\n${val}\n`); +}); + +test('show shows error if no config file', async t => { + const path = 'missing-config/dir/.fast-usdc/config.json'; + const out = mockOut(); + const file = mockFile(path); + + // @ts-expect-error mocking partial Console + await t.throwsAsync(config.show(file, out)); + + t.is( + out.getErrOut(), + `No config found at ${path}. Use "init" to create one, or "--home" to specify config location.\n`, + ); + t.is(out.getLogOut(), ''); +}); + +test('init creates the config file', async t => { + const dir = 'config/dir/.fast-usdc'; + const path = `${dir}/config.json`; + const file = mockFile(path); + const out = mockOut(); + const options = { foo: 'bar' }; + + // @ts-expect-error mock partial Console + await config.init(file, options, out, mockrl()); + + t.is(out.getLogOut(), `Config initialized at ${path}\n`); + t.is(out.getErrOut(), ''); + t.is(await file.read(), JSON.stringify(options, null, 2)); +}); + +test('init overwrites if config exists and user says yes', async t => { + const dir = 'config/dir/.fast-usdc'; + const path = `${dir}/config.json`; + const oldVal = JSON.stringify({ hello: 'world!' }, null, 2); + const file = mockFile(path, oldVal); + const out = mockOut(); + // Answer yes to prompt + const rl = mockrl('y'); + const newVal = { hello: 'universe!' }; + + // @ts-expect-error mock partial Console + await config.init(file, newVal, out, rl); + + t.is(out.getErrOut(), ''); + t.is(out.getLogOut(), `Config initialized at ${path}\n`); + t.is(await file.read(), JSON.stringify(newVal, null, 2)); +}); + +test('init does not overwrite if config exists and user says no', async t => { + const dir = 'config/dir/.fast-usdc'; + const path = `${dir}/config.json`; + const oldVal = JSON.stringify({ hello: 'world!' }, null, 2); + const file = mockFile(path, oldVal); + const out = mockOut(); + // Answer no to prompt + const rl = mockrl('n'); + const newVal = { hello: 'universe!' }; + + // @ts-expect-error mock partial Console + await t.throwsAsync(config.init(file, newVal, out, rl)); + + t.is(out.getErrOut(), ''); + t.is(out.getLogOut(), ''); + t.is(await file.read(), oldVal); +}); + +test('update errors if config does not exist', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + // Path doesn't exist + const file = mockFile(path); + const out = mockOut(); + const newVal = { hello: 'universe!' }; + + // @ts-expect-error mock partial Console + await t.throwsAsync(config.update(file, newVal, out)); + + t.is( + out.getErrOut(), + `No config found at ${path}. Use "init" to create one, or "--home" to specify config location.\n`, + ); + t.is(out.getLogOut(), ''); + t.false(file.exists()); +}); + +test('update can update the config partially', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const oldVal = JSON.stringify({ hello: 'world!' }, null, 2); + const file = mockFile(path, oldVal); + const out = mockOut(); + const newVal = { hello: 'universe!', goodbye: 'world!' }; + const newValString = JSON.stringify(newVal, null, 2); + + // @ts-expect-error mock partial Console + await config.update(file, newVal, out); + + t.is(out.getErrOut(), ''); + t.is(out.getLogOut(), `Config updated at ${path}\n${newValString}\n`); + t.is(await file.read(), newValString); +}); diff --git a/packages/fast-usdc/test/cli/lp-commands.test.ts b/packages/fast-usdc/test/cli/lp-commands.test.ts new file mode 100644 index 00000000000..0ca642aa704 --- /dev/null +++ b/packages/fast-usdc/test/cli/lp-commands.test.ts @@ -0,0 +1,123 @@ +import { Far, makeMarshal } from '@endo/marshal'; +import anyTest, { type TestFn } from 'ava'; +import { Command } from 'commander'; +import { makeRatio } from '@agoric/zoe/src/contractSupport/ratio.js'; +import { flags } from '../../tools/cli-tools.js'; +import { mockStream } from '../../tools/mock-io.js'; +import { addLPCommands } from '../../src/cli/lp-commands.js'; + +const makeTestContext = () => { + const program = new Command(); + program.exitOverride(); + const out = [] as string[]; + const err = [] as string[]; + + const USDC = Far('usdcbrand'); + const FastLP = Far('fastlpbrand'); + const slotToVal = { + '0': USDC, + '1': FastLP, + }; + const valToSlot = val => { + if (val === USDC) { + return '0'; + } + if (val === FastLP) { + return '1'; + } + return 'none'; + }; + + const marshaller = makeMarshal(valToSlot, slot => slotToVal[slot]); + const now = () => 1234; + + addLPCommands(program, { + smartWalletKit: { + // @ts-expect-error fake brands + agoricNames: { brand: { FastLP, USDC } }, + marshaller, + // @ts-expect-error ignore fancy return type + readPublished: async (path: string) => { + if (path === 'fastUsdc.poolMetrics') { + // @ts-expect-error not real brands + return { shareWorth: makeRatio(110n, USDC, 100n, FastLP) }; + } + return {}; + }, + }, + stdout: mockStream(out), + stderr: mockStream(err), + env: {}, + now, + }); + + return { program, marshaller, out, err, USDC, FastLP, now }; +}; + +const test = anyTest as TestFn>>; +test.beforeEach(async t => (t.context = await makeTestContext())); + +test('fast-usdc deposit command', async t => { + const { program, marshaller, out, err, USDC } = t.context; + const amount = 100.05; + const argv = [...`node fast-usdc deposit`.split(' '), ...flags({ amount })]; + t.log(...argv); + await program.parseAsync(argv); + + const action = marshaller.fromCapData(JSON.parse(out.join(''))); + t.deepEqual(action, { + method: 'executeOffer', + offer: { + id: `lpDeposit-1234`, + invitationSpec: { + source: 'agoricContract', + instancePath: ['fastUsdc'], + callPipe: [['makeDepositInvitation', []]], + }, + proposal: { + give: { + USDC: { brand: USDC, value: 100_050_000n }, + }, + }, + }, + }); + + t.is( + err.join(''), + 'Now use `agoric wallet send ...` to sign and broadcast the offer.\n', + ); +}); + +test('fast-usdc withdraw command', async t => { + const { program, marshaller, out, err, FastLP, USDC } = t.context; + const amount = 100; + const argv = [...`node fast-usdc withdraw`.split(' '), ...flags({ amount })]; + t.log(...argv); + await program.parseAsync(argv); + + const action = marshaller.fromCapData(JSON.parse(out.join(''))); + t.deepEqual(action, { + method: 'executeOffer', + offer: { + id: `lpWithdraw-1234`, + invitationSpec: { + source: 'agoricContract', + instancePath: ['fastUsdc'], + callPipe: [['makeWithdrawInvitation', []]], + }, + proposal: { + give: { + PoolShare: { brand: FastLP, value: 90_909_091n }, + }, + want: { + USDC: { brand: USDC, value: 100_000_000n }, + }, + }, + }, + }); + + t.is( + err.join(''), + 'Now use `agoric wallet send ...` to sign and broadcast the offer.\n', + ); +}); diff --git a/packages/fast-usdc/test/cli/operator-commands.test.ts b/packages/fast-usdc/test/cli/operator-commands.test.ts new file mode 100644 index 00000000000..36c645adb8a --- /dev/null +++ b/packages/fast-usdc/test/cli/operator-commands.test.ts @@ -0,0 +1,53 @@ +import { makeMarshal } from '@endo/marshal'; +import test from 'ava'; +import { Command } from 'commander'; +import { addOperatorCommands } from '../../src/cli/operator-commands.js'; +import { flags } from '../../tools/cli-tools.js'; +import { mockStream } from '../../tools/mock-io.js'; +import { MockCctpTxEvidences } from '../fixtures.js'; + +const marshalData = makeMarshal(_v => assert.fail('data only')); + +test('fast-usdc operator attest sub-command', async t => { + const evidence = harden(MockCctpTxEvidences.AGORIC_PLUS_DYDX()); + const { aux, tx, ...flat } = evidence; + const argv = [ + ...`node fast-usdc operator attest`.split(' '), + ...flags({ previousOfferId: 123, ...aux, ...tx, ...flat }), + ]; + t.log(...argv); + const program = new Command(); + program.exitOverride(); + const out = [] as string[]; + const err = [] as string[]; + + addOperatorCommands(program, { + fetch: null as unknown as Window['fetch'], + stdout: mockStream(out), + stderr: mockStream(err), + env: {}, + now: () => 1234, + }); + + await program.parseAsync(argv); + + const action = marshalData.fromCapData(JSON.parse(out.join(''))); + t.deepEqual(action, { + method: 'executeOffer', + offer: { + id: 'operatorAttest-1234', + invitationSpec: { + invitationArgs: [evidence], + invitationMakerName: 'SubmitEvidence', + previousOffer: '123', + source: 'continuing', + }, + proposal: {}, + }, + }); + + t.is( + err.join(''), + 'Now use `agoric wallet send ...` to sign and broadcast the offer.\n', + ); +}); diff --git a/packages/fast-usdc/test/cli/snapshots/cli.test.ts.md b/packages/fast-usdc/test/cli/snapshots/cli.test.ts.md new file mode 100644 index 00000000000..f16dfdfe658 --- /dev/null +++ b/packages/fast-usdc/test/cli/snapshots/cli.test.ts.md @@ -0,0 +1,248 @@ +# Snapshot report for `test/cli/cli.test.ts` + +The actual snapshot is saved in `cli.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## shows help when run without arguments + +> Snapshot 1 + + `Usage: fast-usdc [options] [command]␊ + ␊ + CLI to interact with Fast USDC liquidity pool␊ + ␊ + Options:␊ + -V, --version output the version number␊ + --home Home directory to use for config (default:␊ + "~/.fast-usdc")␊ + -h, --help display help for command␊ + ␊ + Commands:␊ + config Manage config␊ + operator Oracle operator commands␊ + deposit [options] Deposit USDC into pool␊ + withdraw [options] Withdraw USDC from the LP's pool share␊ + transfer Transfer USDC from Ethereum/L2 to Cosmos via Fast␊ + USDC␊ + help [command] display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows help for transfer command + +> Snapshot 1 + + `Usage: fast-usdc transfer [options] ␊ + ␊ + Transfer USDC from Ethereum/L2 to Cosmos via Fast USDC␊ + ␊ + Arguments:␊ + amount Amount to transfer denominated in uusdc␊ + dest Destination address in Cosmos␊ + ␊ + Options:␊ + -h, --help display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows help for config command + +> Snapshot 1 + + `Usage: fast-usdc config [options] [command]␊ + ␊ + Manage config␊ + ␊ + Options:␊ + -h, --help display help for command␊ + ␊ + Commands:␊ + show Show current config␊ + init [options] Set initial config values␊ + update [options] Update config values␊ + help [command] display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows help for config init command + +> Snapshot 1 + + `Usage: fast-usdc config init [options]␊ + ␊ + Set initial config values␊ + ␊ + Options:␊ + --noble-seed Seed phrase for Noble account. CAUTION:␊ + Stored unencrypted in file system␊ + --eth-seed Seed phrase for Ethereum account.␊ + CAUTION: Stored unencrypted in file␊ + system␊ + --agoric-seed Seed phrase for Agoric LP account.␊ + CAUTION: Stored unencrypted in file␊ + system␊ + --agoric-rpc [url] Agoric RPC endpoint (default:␊ + "http://127.0.0.1:26656")␊ + --agoric-api [url] Agoric RPC endpoint (default:␊ + "http://127.0.0.1:1317")␊ + --noble-rpc [url] Noble RPC endpoint (default:␊ + "http://127.0.0.1:26657")␊ + --noble-api [url] Noble API endpoint (default:␊ + "http://127.0.0.1:1318")␊ + --eth-rpc [url] Ethereum RPC Endpoint (default:␊ + "http://127.0.0.1:8545")␊ + --noble-to-agoric-channel [channel] Channel ID on Noble for Agoric (default:␊ + "channel-21")␊ + --token-messenger-address [address] Address of TokenMessenger contract␊ + (default:␊ + "0xbd3fa81b58ba92a82136038b25adec7066af3155")␊ + --token-contract-address [address] Address of USDC token contract (default:␊ + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48")␊ + -h, --help display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows help for config update command + +> Snapshot 1 + + `Usage: fast-usdc config update [options]␊ + ␊ + Update config values␊ + ␊ + Options:␊ + --noble-seed [string] Seed phrase for Noble account. CAUTION:␊ + Stored unencrypted in file system␊ + --eth-seed [string] Seed phrase for Ethereum account.␊ + CAUTION: Stored unencrypted in file␊ + system␊ + --agoric-seed Seed phrase for Agoric LP account.␊ + CAUTION: Stored unencrypted in file␊ + system␊ + --agoric-rpc [url] Agoric RPC endpoint␊ + --agoric-api [url] Agoric API endpoint␊ + --noble-rpc [url] Noble RPC endpoint␊ + --noble-api [url] Noble API endpoint␊ + --eth-rpc [url] Ethereum RPC Endpoint␊ + --noble-to-agoric-channel [channel] Channel ID on Noble for Agoric␊ + --token-messenger-address [address] Address of TokenMessenger contract␊ + --token-contract-address [address] Address of USDC token contract␊ + -h, --help display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows help for config show command + +> Snapshot 1 + + `Usage: fast-usdc config show [options]␊ + ␊ + Show current config␊ + ␊ + Options:␊ + -h, --help display help for command␊ + ␊ + Agoric test networks provide configuration info at, for example,␊ + ␊ + https://devnet.agoric.net/network-config␊ + ␊ + To use RPC endpoints from such a configuration, use:␊ + export AGORIC_NET=devnet␊ + ␊ + Use AGORIC_NET=local or leave it unset to use localhost and chain id agoriclocal.␊ + ` + +## shows error when deposit command is run without options + +> Snapshot 1 + + 'error: required option \'--amount \' not specified' + +## shows error when deposit command is run with invalid amount + +> Snapshot 1 + + 'error: option \'--amount \' argument \'not-a-number\' is invalid. Not a number' + +## shows error when withdraw command is run without options + +> Snapshot 1 + + 'error: required option \'--amount \' not specified' + +## shows error when withdraw command is run with invalid amount + +> Snapshot 1 + + 'error: option \'--amount \' argument \'not-a-number\' is invalid. Not a number' + +## shows error when config init command is run without options + +> Snapshot 1 + + 'error: required option \'--noble-seed \' not specified' + +## shows error when transfer command is run without options + +> Snapshot 1 + + 'error: missing required argument \'amount\'' + +## shows error when config init command is run without eth seed + +> Snapshot 1 + + 'error: required option \'--eth-seed \' not specified' + +## shows error when config init command is run without agoric seed + +> Snapshot 1 + + 'error: required option \'--agoric-seed \' not specified' + +## shows error when config init command is run without noble seed + +> Snapshot 1 + + 'error: required option \'--noble-seed \' not specified' diff --git a/packages/fast-usdc/test/cli/snapshots/cli.test.ts.snap b/packages/fast-usdc/test/cli/snapshots/cli.test.ts.snap new file mode 100644 index 00000000000..568f68f3b33 Binary files /dev/null and b/packages/fast-usdc/test/cli/snapshots/cli.test.ts.snap differ diff --git a/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.md b/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.md new file mode 100644 index 00000000000..156d050eba9 --- /dev/null +++ b/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.md @@ -0,0 +1,33 @@ +# Snapshot report for `test/cli/transfer.test.ts` + +The actual snapshot is saved in `transfer.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## Transfer registers the noble forwarding account if it does not exist + +> Snapshot 1 + + [ + 'noble09876', + [ + { + typeUrl: '/noble.forwarding.v1.MsgRegisterAccount', + value: { + channel: 'channel-test-7', + recipient: 'agoric10rchp4vc53apxn32q42c3zryml8xq3xshyzuhjk6405wtxy7tl3d7e0f8az423pav3ukg7p3xgengqpq4066gy', + signer: 'noble09876', + }, + }, + ], + { + amount: [ + { + amount: '20000', + denom: 'uusdc', + }, + ], + gas: '200000', + }, + 'Register Account Transaction', + ] diff --git a/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.snap b/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.snap new file mode 100644 index 00000000000..816eae48527 Binary files /dev/null and b/packages/fast-usdc/test/cli/snapshots/transfer.test.ts.snap differ diff --git a/packages/fast-usdc/test/cli/transfer.test.ts b/packages/fast-usdc/test/cli/transfer.test.ts new file mode 100644 index 00000000000..bdac4d4117a --- /dev/null +++ b/packages/fast-usdc/test/cli/transfer.test.ts @@ -0,0 +1,210 @@ +import test from 'ava'; +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import transfer from '../../src/cli/transfer.js'; +import { + mockOut, + mockFile, + makeVstorageMock, + makeFetchMock, + makeMockSigner, +} from '../../testing/mocks.js'; +import { settlementAddress } from '../fixtures.js'; + +test('Errors if config missing', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const out = mockOut(); + const file = mockFile(path); + + // @ts-expect-error mocking partial Console + await t.throwsAsync(transfer.transfer(file, '1500000', 'noble1234', out)); + + t.is( + out.getErrOut(), + `No config found at ${path}. Use "config init" to create one, or "--home" to specify config location.\n`, + ); + t.is(out.getLogOut(), ''); +}); + +const makeMockEthProvider = () => { + const txnArgs: any[] = []; + const provider = { + getTransactionCount: () => {}, + estimateGas: () => {}, + getNetwork: () => ({ chainId: 123 }), + getFeeData: () => ({ gasPrice: 1 }), + broadcastTransaction: (...args) => { + txnArgs.push(args); + return { + blockNumber: 9000, + }; + }, + getTransactionReceipt: () => ({ + blockNumber: 9000, + hash: 'SUCCESSHASH', + confirmations: () => [9000], + logs: [], + }), + }; + + return { provider, getTxnArgs: () => harden([...txnArgs]) }; +}; + +test('Transfer registers the noble forwarding account if it does not exist', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const nobleApi = 'http://api.noble.test'; + const nobleToAgoricChannel = 'channel-test-7'; + const destinationChainApi = 'http://api.dydx.fake-test'; + const destinationUSDCDenom = 'ibc/USDCDENOM'; + const config = { + agoricRpc: 'http://rpc.agoric.test', + nobleApi, + nobleToAgoricChannel, + nobleSeed: 'test noble seed', + ethRpc: 'http://rpc.eth.test', + ethSeed: 'a4b7f431465df5dc1458cd8a9be10c42da8e3729e3ce53f18814f48ae2a98a08', + tokenMessengerAddress: '0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5', + tokenAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', + destinationChains: [ + { + bech32Prefix: 'dydx', + api: destinationChainApi, + USDCDenom: destinationUSDCDenom, + }, + ], + }; + const out = mockOut(); + const file = mockFile(path, JSON.stringify(config)); + const agoricSettlementAccount = settlementAddress.value; + const settlementAccountVstoragePath = 'published.fastUsdc.settlementAccount'; + const vstorageMock = makeVstorageMock({ + [settlementAccountVstoragePath]: agoricSettlementAccount, + }); + const amount = '150'; + const EUD = 'dydx1234'; + const nobleFwdAccountQuery = `${nobleApi}/noble/forwarding/v1/address/${nobleToAgoricChannel}/${encodeAddressHook( + agoricSettlementAccount, + { EUD }, + )}/`; + const destinationBankQuery = `${destinationChainApi}/cosmos/bank/v1beta1/balances/${EUD}`; + let balanceQueryCount = 0; + const fetchMock = makeFetchMock((query: string) => { + if (query === nobleFwdAccountQuery) { + return { + address: 'noble14lwerrcfzkzrv626w49pkzgna4dtga8c5x479h', + exists: false, + }; + } + if (query === destinationBankQuery) { + if (balanceQueryCount > 1) { + return { + balances: [{ denom: destinationUSDCDenom, amount }], + }; + } else { + balanceQueryCount += 1; + return {}; + } + } + }); + const nobleSignerAddress = 'noble09876'; + const signerMock = makeMockSigner(); + const mockEthProvider = makeMockEthProvider(); + + await transfer.transfer( + file, + amount, + EUD, + // @ts-expect-error mocking console + out, + fetchMock.fetch, + vstorageMock.vstorage, + { signer: signerMock.signer, address: nobleSignerAddress }, + mockEthProvider.provider, + ); + t.is(vstorageMock.getQueryCounts()[settlementAccountVstoragePath], 1); + t.is(fetchMock.getQueryCounts()[nobleFwdAccountQuery], 1); + t.snapshot(signerMock.getSigned()); +}); + +test('Transfer signs and broadcasts the depositForBurn message on Ethereum', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const nobleApi = 'http://api.noble.test'; + const nobleToAgoricChannel = 'channel-test-7'; + const destinationChainApi = 'http://api.dydx.fake-test'; + const destinationUSDCDenom = 'ibc/USDCDENOM'; + const config = { + agoricRpc: 'http://rpc.agoric.test', + nobleApi, + nobleToAgoricChannel, + nobleSeed: 'test noble seed', + ethRpc: 'http://rpc.eth.test', + ethSeed: 'a4b7f431465df5dc1458cd8a9be10c42da8e3729e3ce53f18814f48ae2a98a08', + tokenMessengerAddress: '0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5', + tokenAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', + destinationChains: [ + { + bech32Prefix: 'dydx', + api: destinationChainApi, + USDCDenom: destinationUSDCDenom, + }, + ], + }; + const out = mockOut(); + const file = mockFile(path, JSON.stringify(config)); + const agoricSettlementAccount = settlementAddress.value; + const settlementAccountVstoragePath = 'published.fastUsdc.settlementAccount'; + const vstorageMock = makeVstorageMock({ + [settlementAccountVstoragePath]: agoricSettlementAccount, + }); + const amount = '150'; + const EUD = 'dydx1234'; + const nobleFwdAccountQuery = `${nobleApi}/noble/forwarding/v1/address/${nobleToAgoricChannel}/${encodeAddressHook( + agoricSettlementAccount, + { EUD }, + )}/`; + const destinationBankQuery = `${destinationChainApi}/cosmos/bank/v1beta1/balances/${EUD}`; + let balanceQueryCount = 0; + const fetchMock = makeFetchMock((query: string) => { + if (query === nobleFwdAccountQuery) { + return { + address: 'noble14lwerrcfzkzrv626w49pkzgna4dtga8c5x479h', + exists: true, + }; + } + if (query === destinationBankQuery) { + if (balanceQueryCount > 1) { + return { + balances: [{ denom: destinationUSDCDenom, amount }], + }; + } else { + balanceQueryCount += 1; + return {}; + } + } + }); + const nobleSignerAddress = 'noble09876'; + const signerMock = makeMockSigner(); + const mockEthProvider = makeMockEthProvider(); + + await transfer.transfer( + file, + amount, + EUD, + // @ts-expect-error mocking console + out, + fetchMock.fetch, + vstorageMock.vstorage, + { signer: signerMock.signer, address: nobleSignerAddress }, + mockEthProvider.provider, + {}, + ); + + t.is(signerMock.getSigned(), undefined); + t.deepEqual(mockEthProvider.getTxnArgs()[0], [ + '0xf8a4800180941c7d4b196cb0c7b01d743fbc6116a902379c723880b844095ea7b30000000000000000000000009f3b8679c73c2fef8b59b4f3444d4e156fb70aa50000000000000000000000000000000000000000000000000000000008f0d18082011aa0b2d87eeb1cb36243f95662739e2a7bd4bddc2b8afe189ac4848ec71cc314335ba068136695c644f69474e2e30ea7059f9b380fbb1a09beb3580f73d3ea349912ab', + ]); + // Can be decoded using a tool like https://rawtxdecode.in/ and an ABI https://github.com/circlefin/evm-cctp-contracts/blob/e4e6e2fccd6820002eb4a5b4fabdc8ea11031ad9/docs/abis/cctp/TokenMessenger.json + t.deepEqual(mockEthProvider.getTxnArgs()[1], [ + '0xf8e4800180949f3b8679c73c2fef8b59b4f3444d4e156fb70aa580b8846fd3504e0000000000000000000000000000000000000000000000000000000008f0d1800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000afdd918f09158436695a754a1b0913ed5ab474f80000000000000000000000001c7d4b196cb0c7b01d743fbc6116a902379c723882011aa09fc97790b2ba23fbb974554dbcee00df1a1f50e9fec4fdf370454773604aa477a038a1d86afc2a7afdc78088878a912f1a7c678b10c3120d308f8260a277b135a3', + ]); + t.is(fetchMock.getQueryCounts()[destinationBankQuery], 3); +}); diff --git a/packages/fast-usdc/test/config-marshal.test.js b/packages/fast-usdc/test/config-marshal.test.js new file mode 100644 index 00000000000..dbb7bfaf40f --- /dev/null +++ b/packages/fast-usdc/test/config-marshal.test.js @@ -0,0 +1,70 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { Far } from '@endo/pass-style'; +import { mustMatch } from '@endo/patterns'; +import { AmountMath } from '@agoric/ertp'; +import { makeRatio } from '@agoric/zoe/src/contractSupport/ratio.js'; +import { FeeConfigShape } from '../src/type-guards.js'; +import { + fromLegible, + makeMarshalFromRecord, + toLegible, +} from '../src/utils/config-marshal.js'; + +/** @import {SmallCapsStructureOf} from '../src/utils/config-marshal.js' */ + +const testMatches = (t, specimen, pattern) => { + t.notThrows(() => mustMatch(specimen, pattern)); +}; + +test('cross-vat configuration of Fast USDC FeeConfig', t => { + const context = /** @type {const} */ ({ + /** @type {Brand<'nat'>} */ + USDC: Far('USDC Brand'), + }); + + const { USDC } = context; + const { make } = AmountMath; + const config = harden({ + flat: make(USDC, 100n), + variableRate: makeRatio(1n, USDC), + maxVariable: make(USDC, 100_000n), + contractRate: makeRatio(20n, USDC), + }); + testMatches(t, config, FeeConfigShape); + + const m = makeMarshalFromRecord(context); + /** @type {any} */ // XXX struggling with recursive type + const legible = toLegible(m.toCapData(config)); + + t.deepEqual(legible, { + structure: { + contractRate: { + denominator: { + brand: '$0.Alleged: USDC Brand', + value: '+100', + }, + numerator: { + brand: '$0', + value: '+20', + }, + }, + flat: { brand: '$0', value: '+100' }, + maxVariable: { brand: '$0', value: '+100000' }, + variableRate: { + denominator: { + brand: '$0', + value: '+100', + }, + numerator: { + brand: '$0', + value: '+1', + }, + }, + }, + slots: ['USDC'], + }); + t.deepEqual(legible.slots, Object.keys(context)); + + const actual = m.fromCapData(fromLegible(legible)); + t.deepEqual(actual, config); +}); diff --git a/packages/fast-usdc/test/constants.test.ts b/packages/fast-usdc/test/constants.test.ts new file mode 100644 index 00000000000..b2daefd0f9e --- /dev/null +++ b/packages/fast-usdc/test/constants.test.ts @@ -0,0 +1,12 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { TxStatus, PendingTxStatus } from '../src/constants.js'; + +const { values } = Object; + +test('PendingTxStatus is a subset of TxStatus', t => { + const txStatuses = values(TxStatus); + const difference = values(PendingTxStatus).filter( + status => !txStatuses.includes(status), + ); + t.deepEqual(difference, [], 'PendingTxStatus value(s) not in TxStatus'); +}); diff --git a/packages/fast-usdc/test/exos/advancer.test.ts b/packages/fast-usdc/test/exos/advancer.test.ts new file mode 100644 index 00000000000..e8ee9c1a626 --- /dev/null +++ b/packages/fast-usdc/test/exos/advancer.test.ts @@ -0,0 +1,661 @@ +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; + +import { + decodeAddressHook, + encodeAddressHook, +} from '@agoric/cosmic-proto/address-hooks.js'; +import type { NatAmount } from '@agoric/ertp'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { denomHash } from '@agoric/orchestration'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import { type ZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; +import { q } from '@endo/errors'; +import { Far } from '@endo/pass-style'; +import type { TestFn } from 'ava'; +import { makeTracer } from '@agoric/internal'; +import { PendingTxStatus } from '../../src/constants.js'; +import { prepareAdvancer } from '../../src/exos/advancer.js'; +import type { SettlerKit } from '../../src/exos/settler.js'; +import { prepareStatusManager } from '../../src/exos/status-manager.js'; +import type { LiquidityPoolKit } from '../../src/types.js'; +import { makeFeeTools } from '../../src/utils/fees.js'; +import { + MockCctpTxEvidences, + settlementAddress, + intermediateRecipient, +} from '../fixtures.js'; +import { + makeTestFeeConfig, + makeTestLogger, + prepareMockOrchAccounts, +} from '../mocks.js'; +import { commonSetup } from '../supports.js'; + +const trace = makeTracer('AdvancerTest', false); + +const LOCAL_DENOM = `ibc/${denomHash({ + denom: 'uusdc', + channelId: + fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId, +})}`; + +type CommonSetup = Awaited>; + +const createTestExtensions = (t, common: CommonSetup) => { + const { + bootstrap: { rootZone, vowTools }, + facadeServices: { chainHub }, + brands: { usdc }, + commonPrivateArgs: { storageNode }, + } = common; + + const { log, inspectLogs } = makeTestLogger(t.log); + + chainHub.registerChain('dydx', fetchedChainInfo.dydx); + chainHub.registerChain('osmosis', fetchedChainInfo.osmosis); + + const statusManager = prepareStatusManager( + rootZone.subZone('status-manager'), + storageNode.makeChildNode('txns'), + { marshaller: common.commonPrivateArgs.marshaller }, + ); + + const mockAccounts = prepareMockOrchAccounts(rootZone.subZone('accounts'), { + vowTools, + log: t.log, + usdc, + }); + + const mockZCF = Far('MockZCF', { + makeEmptySeatKit: () => ({ zcfSeat: Far('MockZCFSeat', {}) }), + }); + + const localTransferVK = vowTools.makeVowKit(); + const resolveLocalTransferV = () => { + // pretend funds move from tmpSeat to poolAccount + localTransferVK.resolver.resolve(); + }; + const rejectLocalTransfeferV = () => { + localTransferVK.resolver.reject( + new Error('One or more deposits failed: simulated error'), + ); + }; + const mockZoeTools = Far('MockZoeTools', { + localTransfer(...args: Parameters) { + trace('ZoeTools.localTransfer called with', args); + return localTransferVK.vow; + }, + }); + + const feeConfig = makeTestFeeConfig(usdc); + const makeAdvancer = prepareAdvancer(rootZone.subZone('advancer'), { + chainHub, + feeConfig, + localTransfer: mockZoeTools.localTransfer, + log, + statusManager, + usdc: harden({ + brand: usdc.brand, + denom: LOCAL_DENOM, + }), + vowTools, + // @ts-expect-error mocked zcf + zcf: mockZCF, + }); + + type NotifyArgs = Parameters; + const notifyAdvancingResultCalls: NotifyArgs[] = []; + const mockNotifyF = Far('Settler Notify Facet', { + notifyAdvancingResult: (...args: NotifyArgs) => { + trace('Settler.notifyAdvancingResult called with', args); + notifyAdvancingResultCalls.push(args); + }, + }); + + const mockBorrowerFacetCalls: { + borrow: Parameters[]; + returnToPool: Parameters[]; + } = { borrow: [], returnToPool: [] }; + + const mockBorrowerF = Far('LiquidityPool Borrow Facet', { + borrow: (seat: ZCFSeat, amount: NatAmount) => { + mockBorrowerFacetCalls.borrow.push([seat, amount]); + }, + returnToPool: (seat: ZCFSeat, amount: NatAmount) => { + mockBorrowerFacetCalls.returnToPool.push([seat, amount]); + }, + }); + + const advancer = makeAdvancer({ + borrowerFacet: mockBorrowerF, + notifyFacet: mockNotifyF, + poolAccount: mockAccounts.mockPoolAccount.account, + intermediateRecipient, + settlementAddress, + }); + + return { + constants: { + localDenom: LOCAL_DENOM, + feeConfig, + }, + helpers: { + inspectLogs, + inspectNotifyCalls: () => harden(notifyAdvancingResultCalls), + inspectBorrowerFacetCalls: () => harden(mockBorrowerFacetCalls), + }, + mocks: { + ...mockAccounts, + mockBorrowerF, + mockNotifyF, + resolveLocalTransferV, + rejectLocalTransfeferV, + }, + services: { + advancer, + makeAdvancer, + statusManager, + feeTools: makeFeeTools(feeConfig), + }, + } as const; +}; + +type TestContext = CommonSetup & { + extensions: ReturnType; +}; + +const test = anyTest as TestFn; + +test.beforeEach(async t => { + const common = await commonSetup(t); + t.context = { + ...common, + extensions: createTestExtensions(t, common), + }; +}); + +test('updates status to ADVANCING in happy path', async t => { + const { + extensions: { + services: { advancer, feeTools }, + helpers: { inspectLogs, inspectNotifyCalls }, + mocks: { mockPoolAccount, resolveLocalTransferV }, + }, + brands: { usdc }, + bootstrap: { storage }, + } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + void advancer.handleTransactionEvent({ evidence, risk: {} }); + + // pretend borrow succeeded and funds were depositing to the LCA + resolveLocalTransferV(); + // pretend the IBC Transfer settled + mockPoolAccount.transferVResolver.resolve(); + // wait for handleTransactionEvent to do work + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [ + { evidence, status: PendingTxStatus.Observed }, + { status: PendingTxStatus.Advancing }, + ], + 'ADVANCED status in happy path', + ); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + [ + 'Advance transfer fulfilled', + { + advanceAmount: { + brand: usdc.brand, + value: 146999999n, + }, + destination: { + chainId: 'osmosis-1', + encoding: 'bech32', + value: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }, + result: undefined, + }, + ], + ]); + + // We expect to see an `Advanced` update, but that is now Settler's job. + // but we can ensure it's called + t.like(inspectNotifyCalls(), [ + [ + { + txHash: evidence.txHash, + forwardingAddress: evidence.tx.forwardingAddress, + fullAmount: usdc.make(evidence.tx.amount), + destination: { + value: decodeAddressHook(evidence.aux.recipientAddress).query.EUD, + }, + }, + true, // indicates transfer succeeded + ], + ]); +}); + +test('updates status to OBSERVED on insufficient pool funds', async t => { + const { + brands: { usdc }, + bootstrap: { storage }, + extensions: { + services: { makeAdvancer }, + helpers: { inspectLogs }, + mocks: { mockPoolAccount, mockNotifyF }, + }, + } = t.context; + + const mockBorrowerFacet = Far('LiquidityPool Borrow Facet', { + borrow: (seat: ZCFSeat, amount: NatAmount) => { + throw new Error( + `Cannot borrow. Requested ${q(amount)} must be less than pool balance ${q(usdc.make(1n))}.`, + ); + }, + returnToPool: () => {}, // not expecting this to be called + }); + + // make a new advancer that intentionally throws + const advancer = makeAdvancer({ + borrowerFacet: mockBorrowerFacet, + notifyFacet: mockNotifyF, + poolAccount: mockPoolAccount.account, + intermediateRecipient, + settlementAddress, + }); + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + void advancer.handleTransactionEvent({ evidence, risk: {} }); + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [{ evidence, status: PendingTxStatus.Observed }], + 'OBSERVED status on insufficient pool funds', + ); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: dydx183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + [ + 'Advancer error:', + Error( + `Cannot borrow. Requested ${q(usdc.make(294999999n))} must be less than pool balance ${q(usdc.make(1n))}.`, + ), + ], + ]); +}); + +test('updates status to OBSERVED if makeChainAddress fails', async t => { + const { + bootstrap: { storage }, + extensions: { + services: { advancer }, + helpers: { inspectLogs }, + }, + } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_UNKNOWN_EUD(); + await advancer.handleTransactionEvent({ evidence, risk: {} }); + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [{ evidence, status: PendingTxStatus.Observed }], + 'OBSERVED status on makeChainAddress failure', + ); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: random1addr'], + [ + 'Advancer error:', + Error('Chain info not found for bech32Prefix "random"'), + ], + ]); +}); + +test('calls notifyAdvancingResult (AdvancedFailed) on failed transfer', async t => { + const { + bootstrap: { storage }, + extensions: { + services: { advancer, feeTools }, + helpers: { inspectLogs, inspectNotifyCalls }, + mocks: { mockPoolAccount, resolveLocalTransferV }, + }, + brands: { usdc }, + } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + void advancer.handleTransactionEvent({ evidence, risk: {} }); + + // pretend borrow and deposit to LCA succeed + resolveLocalTransferV(); + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [ + { evidence, status: PendingTxStatus.Observed }, + { status: PendingTxStatus.Advancing }, + ], + 'tx is Advancing', + ); + + mockPoolAccount.transferVResolver.reject(new Error('simulated error')); + await eventLoopIteration(); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: dydx183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + ['Advance transfer rejected', Error('simulated error')], + ]); + + // We expect to see an `AdvancedFailed` update, but that is now Settler's job. + // but we can ensure it's called + t.like(inspectNotifyCalls(), [ + [ + { + txHash: evidence.txHash, + forwardingAddress: evidence.tx.forwardingAddress, + fullAmount: usdc.make(evidence.tx.amount), + advanceAmount: feeTools.calculateAdvance(usdc.make(evidence.tx.amount)), + destination: { + value: decodeAddressHook(evidence.aux.recipientAddress).query.EUD, + }, + }, + false, // this indicates transfer failed + ], + ]); +}); + +test('updates status to OBSERVED if pre-condition checks fail', async t => { + const { + bootstrap: { storage }, + extensions: { + services: { advancer }, + helpers: { inspectLogs }, + }, + } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_NO_PARAMS(); + + await advancer.handleTransactionEvent({ evidence, risk: {} }); + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [{ evidence, status: PendingTxStatus.Observed }], + 'tx is recorded as OBSERVED', + ); + + t.deepEqual(inspectLogs(), [ + [ + 'Advancer error:', + Error('query: {} - Must have missing properties ["EUD"]'), + ], + ]); + + await advancer.handleTransactionEvent({ + evidence: { + ...MockCctpTxEvidences.AGORIC_NO_PARAMS( + encodeAddressHook(settlementAddress.value, { + EUD: 'osmo1234', + extra: 'value', + }), + ), + txHash: + '0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761799', + }, + risk: {}, + }); + + const [, ...remainingLogs] = inspectLogs(); + t.deepEqual(remainingLogs, [ + [ + 'Advancer error:', + Error( + 'query: {"EUD":"osmo1234","extra":"value"} - Must not have unexpected properties: ["extra"]', + ), + ], + ]); +}); + +test('updates status to ADVANCE_SKIPPED if risks identified', async t => { + const { + bootstrap: { storage }, + extensions: { + services: { advancer }, + helpers: { inspectLogs }, + }, + } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + await advancer.handleTransactionEvent({ + evidence, + risk: { risksIdentified: ['TOO_LARGE_AMOUNT'] }, + }); + await eventLoopIteration(); + + t.deepEqual( + storage.getDeserialized(`fun.txns.${evidence.txHash}`), + [ + { evidence, status: PendingTxStatus.Observed }, + { + status: PendingTxStatus.AdvanceSkipped, + risksIdentified: ['TOO_LARGE_AMOUNT'], + }, + ], + 'tx is recorded as ADVANCE_SKIPPED', + ); + + t.deepEqual(inspectLogs(), [['risks identified, skipping advance']]); +}); + +test('will not advance same txHash:chainId evidence twice', async t => { + const { + extensions: { + services: { advancer }, + helpers: { inspectLogs }, + mocks: { mockPoolAccount, resolveLocalTransferV }, + }, + brands: { usdc }, + } = t.context; + + const mockEvidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + + // First attempt + void advancer.handleTransactionEvent({ evidence: mockEvidence, risk: {} }); + resolveLocalTransferV(); + mockPoolAccount.transferVResolver.resolve(); + await eventLoopIteration(); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + [ + 'Advance transfer fulfilled', + { + advanceAmount: { brand: usdc.brand, value: 146999999n }, + destination: { + chainId: 'osmosis-1', + encoding: 'bech32', + value: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }, + result: undefined, + }, + ], + ]); + + // Second attempt + void advancer.handleTransactionEvent({ evidence: mockEvidence, risk: {} }); + await eventLoopIteration(); + const [, , ...remainingLogs] = inspectLogs(); + t.deepEqual(remainingLogs, [ + [ + 'txHash already seen:', + '0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702', + ], + ]); +}); + +test('returns payment to LP if zoeTools.localTransfer fails', async t => { + const { + extensions: { + services: { advancer }, + helpers: { inspectLogs, inspectBorrowerFacetCalls, inspectNotifyCalls }, + mocks: { rejectLocalTransfeferV }, + }, + brands: { usdc }, + } = t.context; + const mockEvidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + + void advancer.handleTransactionEvent({ evidence: mockEvidence, risk: {} }); + rejectLocalTransfeferV(); + + await eventLoopIteration(); + + t.deepEqual( + inspectLogs(), + [ + ['decoded EUD: osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + [ + '⚠️ deposit to localOrchAccount failed, attempting to return payment to LP', + Error('One or more deposits failed: simulated error'), + ], + ], + 'contract logs report error', + ); + + const { borrow, returnToPool } = inspectBorrowerFacetCalls(); + + const expectedArguments = [ + Far('MockZCFSeat', {}), + usdc.make(146999999n), // net of fees + ]; + + t.is(borrow.length, 1, 'borrow is called before zt.localTransfer fails'); + t.deepEqual(borrow[0], expectedArguments, 'borrow arguments match expected'); + + t.is( + returnToPool.length, + 1, + 'returnToPool is called after zt.localTransfer fails', + ); + t.deepEqual( + returnToPool[0], + expectedArguments, + 'same amount borrowed is returned to LP', + ); + + t.like( + inspectNotifyCalls(), + [ + [ + { + txHash: mockEvidence.txHash, + forwardingAddress: mockEvidence.tx.forwardingAddress, + }, + false, // indicates advance failed + ], + ], + 'Advancing tx is recorded as AdvanceFailed', + ); +}); + +test('alerts if `returnToPool` fallback fails', async t => { + const { + brands: { usdc }, + extensions: { + services: { makeAdvancer }, + helpers: { inspectLogs, inspectNotifyCalls }, + mocks: { mockPoolAccount, mockNotifyF, rejectLocalTransfeferV }, + }, + } = t.context; + + const mockBorrowerFacet = Far('LiquidityPool Borrow Facet', { + borrow: (seat: ZCFSeat, amount: NatAmount) => { + // note: will not be tracked by `inspectBorrowerFacetCalls` + }, + returnToPool: (seat: ZCFSeat, amount: NatAmount) => { + throw new Error( + `⚠️ borrowSeatAllocation ${q({ USDC: usdc.make(0n) })} less than amountKWR ${q(amount)}`, + ); + }, + }); + + // make a new advancer that intentionally throws during returnToPool + const advancer = makeAdvancer({ + borrowerFacet: mockBorrowerFacet, + notifyFacet: mockNotifyF, + poolAccount: mockPoolAccount.account, + intermediateRecipient, + settlementAddress, + }); + + const mockEvidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + void advancer.handleTransactionEvent({ evidence: mockEvidence, risk: {} }); + rejectLocalTransfeferV(); + + await eventLoopIteration(); + + t.deepEqual(inspectLogs(), [ + ['decoded EUD: osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men'], + [ + '⚠️ deposit to localOrchAccount failed, attempting to return payment to LP', + Error('One or more deposits failed: simulated error'), + ], + [ + '🚨 deposit to localOrchAccount failure recovery failed', + Error( + `⚠️ borrowSeatAllocation ${q({ USDC: usdc.make(0n) })} less than amountKWR ${q(usdc.make(146999999n))}`, + ), + ], + ]); + + await eventLoopIteration(); + + t.like( + inspectNotifyCalls(), + [ + [ + { + txHash: mockEvidence.txHash, + forwardingAddress: mockEvidence.tx.forwardingAddress, + }, + false, // indicates advance failed + ], + ], + 'Advancing tx is recorded as AdvanceFailed', + ); +}); + +test('rejects advances to unknown settlementAccount', async t => { + const { + extensions: { + services: { advancer }, + helpers: { inspectLogs }, + }, + } = t.context; + + const invalidSettlementAcct = + 'agoric1ax7hmw49tmqrdld7emc5xw3wf43a49rtkacr9d5nfpqa0y7k6n0sl8v94h'; + t.not(settlementAddress.value, invalidSettlementAcct); + const mockEvidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO( + encodeAddressHook(invalidSettlementAcct, { + EUD: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }), + ); + + void advancer.handleTransactionEvent({ evidence: mockEvidence, risk: {} }); + await eventLoopIteration(); + t.deepEqual(inspectLogs(), [ + [ + 'Advancer error:', + Error( + '⚠️ baseAddress of address hook "agoric1ax7hmw49tmqrdld7emc5xw3wf43a49rtkacr9d5nfpqa0y7k6n0sl8v94h" does not match the expected address "agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek"', + ), + ], + ]); +}); diff --git a/packages/fast-usdc/test/exos/settler.test.ts b/packages/fast-usdc/test/exos/settler.test.ts new file mode 100644 index 00000000000..5a8d9928385 --- /dev/null +++ b/packages/fast-usdc/test/exos/settler.test.ts @@ -0,0 +1,453 @@ +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import type { TestFn } from 'ava'; + +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import type { Zone } from '@agoric/zone'; +import { defaultMarshaller } from '@agoric/internal/src/storage-test-utils.js'; +import { PendingTxStatus } from '../../src/constants.js'; +import { prepareSettler } from '../../src/exos/settler.js'; +import { prepareStatusManager } from '../../src/exos/status-manager.js'; +import type { CctpTxEvidence } from '../../src/types.js'; +import { makeFeeTools } from '../../src/utils/fees.js'; +import { + MockCctpTxEvidences, + MockVTransferEvents, + intermediateRecipient, +} from '../fixtures.js'; +import { makeTestLogger, prepareMockOrchAccounts } from '../mocks.js'; +import { commonSetup } from '../supports.js'; + +const mockZcf = (zone: Zone) => { + const callLog = [] as any[]; + + const makeSeatKit = zone.exoClassKit('MockSeatKit', undefined, () => ({}), { + zcfSeat: { + getCurrentAllocation() { + return {}; + }, + }, + userSeat: {}, + }); + + const zcf = zone.exo('MockZCF', undefined, { + atomicRearrange(parts) { + callLog.push({ method: 'atomicRearrange', parts }); + }, + makeEmptySeatKit() { + const kit = makeSeatKit() as unknown as ZcfSeatKit; + return kit; + }, + }); + return { zcf, callLog }; +}; + +const makeTestContext = async t => { + const common = await commonSetup(t); + const { rootZone: zone } = common.bootstrap; + const { log, inspectLogs } = makeTestLogger(t.log); + const statusManager = prepareStatusManager( + zone.subZone('status-manager'), + common.commonPrivateArgs.storageNode.makeChildNode('txns'), + { marshaller: defaultMarshaller, log }, + ); + const { zcf, callLog } = mockZcf(zone.subZone('Mock ZCF')); + + const { rootZone, vowTools } = common.bootstrap; + const { usdc } = common.brands; + const mockAccounts = prepareMockOrchAccounts(rootZone.subZone('accounts'), { + vowTools, + log: t.log, + usdc, + }); + + const mockWithdrawToSeat = (account, seat, amounts) => { + callLog.push( + harden({ + function: 'withdrawToSeat', + account, + allocations: seat.getCurrentAllocation(), + amounts, + }), + ); + return vowTools.asVow(() => {}); + }; + + const { chainHub } = common.facadeServices; + chainHub.registerChain('dydx', fetchedChainInfo.dydx); + chainHub.registerChain('osmosis', fetchedChainInfo.osmosis); + const makeSettler = prepareSettler(zone.subZone('settler'), { + statusManager, + USDC: usdc.brand, + zcf, + withdrawToSeat: mockWithdrawToSeat, + feeConfig: common.commonPrivateArgs.feeConfig, + vowTools: common.bootstrap.vowTools, + chainHub, + log, + }); + + const defaultSettlerParams = harden({ + sourceChannel: + fetchedChainInfo.agoric.connections['noble-1'].transferChannel + .counterPartyChannelId, + remoteDenom: 'uusdc', + intermediateRecipient, + }); + + const simulate = harden({ + advance: (evidence?: CctpTxEvidence) => { + const cctpTxEvidence: CctpTxEvidence = { + ...MockCctpTxEvidences.AGORIC_PLUS_OSMO(), + ...evidence, + }; + t.log('Mock CCTP Evidence:', cctpTxEvidence); + t.log('Pretend we initiated advance, mark as `ADVANCED`'); + statusManager.advance(cctpTxEvidence); + const { forwardingAddress, amount } = cctpTxEvidence.tx; + statusManager.advanceOutcome(forwardingAddress, BigInt(amount), true); + + return cctpTxEvidence; + }, + + skipAdvance: (risksIdentified: string[], evidence?: CctpTxEvidence) => { + const cctpTxEvidence: CctpTxEvidence = { + ...MockCctpTxEvidences.AGORIC_PLUS_OSMO(), + ...evidence, + }; + t.log('Mock CCTP Evidence:', cctpTxEvidence); + t.log('Mark as `ADVANCE_SKIPPED`'); + statusManager.skipAdvance(cctpTxEvidence, risksIdentified ?? []); + + return cctpTxEvidence; + }, + + observe: (evidence?: CctpTxEvidence) => { + const cctpTxEvidence: CctpTxEvidence = { + ...MockCctpTxEvidences.AGORIC_PLUS_OSMO(), + ...evidence, + }; + t.log('Mock CCTP Evidence:', cctpTxEvidence); + t.log('Pretend we `OBSERVED`'); + statusManager.observe(cctpTxEvidence); + + return cctpTxEvidence; + }, + }); + + const repayer = zone.exo('Repayer Mock', undefined, { + repay(fromSeat: ZCFSeat, amounts: AmountKeywordRecord) { + callLog.push(harden({ method: 'repay', fromSeat, amounts })); + }, + }); + + return { + common, + makeSettler, + statusManager, + defaultSettlerParams, + simulate, + repayer, + peekCalls: () => harden([...callLog]), + inspectLogs, + accounts: mockAccounts, + storage: common.bootstrap.storage, + }; +}; + +const test = anyTest as TestFn>>; + +test.beforeEach(async t => (t.context = await makeTestContext(t))); + +test('happy path: disburse to LPs; StatusManager removes tx', async t => { + const { + common, + makeSettler, + statusManager, + defaultSettlerParams, + repayer, + simulate, + accounts, + peekCalls, + } = t.context; + const { usdc } = common.brands; + const { feeConfig } = common.commonPrivateArgs; + + const settler = makeSettler({ + repayer, + settlementAccount: accounts.settlement.account, + ...defaultSettlerParams, + }); + + const cctpTxEvidence = simulate.advance(); + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [{ ...cctpTxEvidence, status: PendingTxStatus.Advanced }], + 'statusManager shows this tx advanced', + ); + + t.log('Simulate incoming IBC settlement'); + void settler.tap.receiveUpcall(MockVTransferEvents.AGORIC_PLUS_OSMO()); + await eventLoopIteration(); + + t.log('Funds were disbursed to LP.'); + const calls = peekCalls(); + t.is(calls.length, 3); + const [withdraw, rearrange, repay] = calls; + + t.deepEqual( + withdraw, + { + function: 'withdrawToSeat', + account: accounts.settlement.account, + allocations: {}, + amounts: { In: usdc.units(150) }, + }, + '1. settler called withdrawToSeat', + ); + + // see also AGORIC_PLUS_OSMO in fees.test.ts + const In = usdc.units(150); + const expectedSplit = makeFeeTools(feeConfig).calculateSplit(In); + t.deepEqual(expectedSplit, { + ContractFee: usdc.make(600000n), + PoolFee: usdc.make(2400001n), + Principal: usdc.make(146999999n), + }); + + t.like( + rearrange, + { method: 'atomicRearrange' }, + '2. settler called atomicRearrange ', + ); + t.is(rearrange.parts.length, 1); + const [s1, s2, a1, a2] = rearrange.parts[0]; + t.is(s1, s2, 'src and dest seat are the same'); + t.deepEqual([a1, a2], [{ In }, expectedSplit]); + + t.like( + repay, + { + method: 'repay', + amounts: expectedSplit, + }, + '3. settler called repay() on liquidity pool repayer facet', + ); + t.is(repay.fromSeat, s1); + + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [], + 'SETTLED entry removed from StatusManger', + ); + await eventLoopIteration(); + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${cctpTxEvidence.txHash}`), [ + { evidence: cctpTxEvidence, status: 'OBSERVED' }, + { status: 'ADVANCING' }, + { status: 'ADVANCED' }, + { split: expectedSplit, status: 'DISBURSED' }, + ]); + + // Check deletion of DISBURSED transactions + statusManager.deleteCompletedTxs(); + await eventLoopIteration(); + t.is(storage.data.get(`fun.txns.${cctpTxEvidence.txHash}`), undefined); +}); + +test('slow path: forward to EUD; remove pending tx', async t => { + const { + common, + makeSettler, + statusManager, + defaultSettlerParams, + repayer, + simulate, + accounts, + peekCalls, + } = t.context; + const { usdc } = common.brands; + + const settler = makeSettler({ + repayer, + settlementAccount: accounts.settlement.account, + ...defaultSettlerParams, + }); + + const cctpTxEvidence = simulate.observe(); + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [{ ...cctpTxEvidence, status: PendingTxStatus.Observed }], + 'statusManager shows this tx is only observed', + ); + + t.log('Simulate incoming IBC settlement'); + void settler.tap.receiveUpcall(MockVTransferEvents.AGORIC_PLUS_OSMO()); + await eventLoopIteration(); + + t.log('funds are forwarded; no interaction with LP'); + t.deepEqual(peekCalls(), []); + t.deepEqual(accounts.settlement.callLog, [ + [ + 'transfer', + { + chainId: 'osmosis-1', + encoding: 'bech32', + value: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }, + usdc.units(150), + { + forwardOpts: { + intermediateRecipient: { + chainId: 'noble-1', + encoding: 'bech32', + value: 'noble1test', + }, + }, + }, + ], + ]); + + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [], + 'SETTLED entry removed from StatusManger', + ); + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${cctpTxEvidence.txHash}`), [ + { evidence: cctpTxEvidence, status: 'OBSERVED' }, + { status: 'FORWARDED' }, + ]); + + // Check deletion of FORWARDED transactions + statusManager.deleteCompletedTxs(); + await eventLoopIteration(); + t.is(storage.data.get(`fun.txns.${cctpTxEvidence.txHash}`), undefined); +}); + +test('skip advance: forward to EUD; remove pending tx', async t => { + const { + common, + makeSettler, + statusManager, + defaultSettlerParams, + repayer, + simulate, + accounts, + peekCalls, + } = t.context; + const { usdc } = common.brands; + + const settler = makeSettler({ + repayer, + settlementAccount: accounts.settlement.account, + ...defaultSettlerParams, + }); + + const cctpTxEvidence = simulate.skipAdvance(['TOO_LARGE_AMOUNT']); + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [{ ...cctpTxEvidence, status: PendingTxStatus.AdvanceSkipped }], + 'statusManager shows this tx is skipped', + ); + + t.log('Simulate incoming IBC settlement'); + void settler.tap.receiveUpcall(MockVTransferEvents.AGORIC_PLUS_OSMO()); + await eventLoopIteration(); + + t.log('funds are forwarded; no interaction with LP'); + t.deepEqual(peekCalls(), []); + t.deepEqual(accounts.settlement.callLog, [ + [ + 'transfer', + { + chainId: 'osmosis-1', + encoding: 'bech32', + value: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }, + usdc.units(150), + { + forwardOpts: { + intermediateRecipient: { + chainId: 'noble-1', + encoding: 'bech32', + value: 'noble1test', + }, + }, + }, + ], + ]); + + t.deepEqual( + statusManager.lookupPending( + cctpTxEvidence.tx.forwardingAddress, + cctpTxEvidence.tx.amount, + ), + [], + 'FORWARDED entry removed from StatusManger', + ); + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${cctpTxEvidence.txHash}`), [ + { evidence: cctpTxEvidence, status: 'OBSERVED' }, + { status: 'ADVANCE_SKIPPED', risksIdentified: ['TOO_LARGE_AMOUNT'] }, + { status: 'FORWARDED' }, + ]); + + // Check deletion of FORWARDED transactions + statusManager.deleteCompletedTxs(); + await eventLoopIteration(); + t.is(storage.data.get(`fun.txns.${cctpTxEvidence.txHash}`), undefined); +}); + +test('Settlement for unknown transaction', async t => { + const { + common, + makeSettler, + defaultSettlerParams, + repayer, + accounts, + peekCalls, + inspectLogs, + } = t.context; + + const settler = makeSettler({ + repayer, + settlementAccount: accounts.settlement.account, + ...defaultSettlerParams, + }); + + t.log('Simulate incoming IBC settlement'); + void settler.tap.receiveUpcall(MockVTransferEvents.AGORIC_PLUS_OSMO()); + await eventLoopIteration(); + + t.log('Nothing was transferrred'); + t.deepEqual(peekCalls(), []); + t.deepEqual(accounts.settlement.callLog, []); + t.like(inspectLogs(), [ + ['config', { sourceChannel: 'channel-21' }], + ['upcall event'], + ['dequeued', undefined], + [ + '⚠️ tap: no status for ', + 'noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelqkd', + 150000000n, + ], + ]); +}); + +test.todo("StatusManager does not receive update when we can't settle"); diff --git a/packages/fast-usdc/test/exos/status-manager.test.ts b/packages/fast-usdc/test/exos/status-manager.test.ts new file mode 100644 index 00000000000..2c76fefa205 --- /dev/null +++ b/packages/fast-usdc/test/exos/status-manager.test.ts @@ -0,0 +1,402 @@ +import type { TestFn } from 'ava'; + +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import type { StorageNode } from '@agoric/internal/src/lib-chainStorage.js'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { defaultMarshaller } from '@agoric/internal/src/storage-test-utils.js'; +import { PendingTxStatus } from '../../src/constants.js'; +import { + prepareStatusManager, + type StatusManager, +} from '../../src/exos/status-manager.js'; +import { commonSetup, provideDurableZone } from '../supports.js'; +import { MockCctpTxEvidences } from '../fixtures.js'; +import type { CctpTxEvidence } from '../../src/types.js'; + +type Common = Awaited>; +type TestContext = { + statusManager: StatusManager; + storage: Common['bootstrap']['storage']; +}; + +const test = anyTest as TestFn; + +test.beforeEach(async t => { + const common = await commonSetup(t); + const zone = provideDurableZone('status-test'); + const txnsNode = common.commonPrivateArgs.storageNode.makeChildNode('txns'); + const statusManager = prepareStatusManager( + zone.subZone('status-manager'), + txnsNode, + { marshaller: defaultMarshaller }, + ); + t.context = { + statusManager, + storage: common.bootstrap.storage, + }; +}); + +test('advance creates new entry with ADVANCED status', t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.advance(evidence); + + const entries = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + + t.is(entries[0]?.status, PendingTxStatus.Advancing); +}); + +test('ADVANCED transactions are published to vstorage', async t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.advance(evidence); + await eventLoopIteration(); + + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${evidence.txHash}`), [ + { evidence, status: 'OBSERVED' }, + { status: 'ADVANCING' }, + ]); +}); + +test('skipAdvance creates new entry with ADVANCE_SKIPPED status', t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.skipAdvance(evidence, ['RISK1']); + + const entries = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + + t.is(entries[0]?.status, PendingTxStatus.AdvanceSkipped); +}); + +test('ADVANCE_SKIPPED transactions are published to vstorage', async t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.skipAdvance(evidence, ['RISK1']); + await eventLoopIteration(); + + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${evidence.txHash}`), [ + { evidence, status: 'OBSERVED' }, + { status: 'ADVANCE_SKIPPED', risksIdentified: ['RISK1'] }, + ]); +}); + +test('observe creates new entry with OBSERVED status', t => { + const { statusManager } = t.context; + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.observe(evidence); + + const entries = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + + t.is(entries[0]?.status, PendingTxStatus.Observed); +}); + +test('OBSERVED transactions are published to vstorage', async t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.observe(evidence); + await eventLoopIteration(); + + const { storage } = t.context; + t.deepEqual(storage.getDeserialized(`fun.txns.${evidence.txHash}`), [ + { evidence, status: 'OBSERVED' }, + ]); +}); + +test('cannot process same tx twice', t => { + const { statusManager } = t.context; + + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + statusManager.advance(evidence); + + t.throws(() => statusManager.advance(evidence), { + message: + 'Transaction already seen: "0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702"', + }); + + t.throws(() => statusManager.observe(evidence), { + message: + 'Transaction already seen: "0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702"', + }); + + // new txHash should not throw + t.notThrows(() => statusManager.advance({ ...evidence, txHash: '0xtest2' })); +}); + +test('isSeen checks if a tx has been processed', t => { + const { statusManager } = t.context; + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + t.false(statusManager.hasBeenObserved(e1)); + statusManager.advance(e1); + t.true(statusManager.hasBeenObserved(e1)); + + const e2 = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + t.false(statusManager.hasBeenObserved(e2)); + statusManager.observe(e2); + t.true(statusManager.hasBeenObserved(e2)); +}); + +test('dequeueStatus removes entries from PendingTxs', t => { + const { statusManager } = t.context; + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + const e2 = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + + statusManager.advance(e1); + statusManager.advanceOutcome(e1.tx.forwardingAddress, e1.tx.amount, true); + statusManager.advance(e2); + statusManager.advanceOutcome(e2.tx.forwardingAddress, e2.tx.amount, false); + statusManager.observe({ ...e1, txHash: '0xtest1' }); + + t.deepEqual( + statusManager.dequeueStatus(e1.tx.forwardingAddress, e1.tx.amount), + { + txHash: e1.txHash, + status: PendingTxStatus.Advanced, + }, + ); + + t.deepEqual( + statusManager.dequeueStatus(e2.tx.forwardingAddress, e2.tx.amount), + { + txHash: e2.txHash, + status: PendingTxStatus.AdvanceFailed, + }, + ); + + t.deepEqual( + statusManager.dequeueStatus(e1.tx.forwardingAddress, e1.tx.amount), + { + txHash: '0xtest1', + status: PendingTxStatus.Observed, + }, + ); + + t.is( + statusManager.lookupPending(e1.tx.forwardingAddress, e1.tx.amount).length, + 0, + 'Settled entries should be deleted', + ); + + t.is( + statusManager.lookupPending(e2.tx.forwardingAddress, e2.tx.amount).length, + 0, + 'Settled entry should be deleted', + ); +}); + +test('cannot advanceOutcome without ADVANCING entry', t => { + const { statusManager } = t.context; + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + const advanceOutcomeFn = () => + statusManager.advanceOutcome(e1.tx.forwardingAddress, e1.tx.amount, true); + const expectedErrMsg = + 'no advancing tx with {"amount":"[150000000n]","nfa":"noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelqkd"}'; + + t.throws(advanceOutcomeFn, { + message: expectedErrMsg, + }); + + statusManager.observe(e1); + t.throws(advanceOutcomeFn, { + message: expectedErrMsg, + }); + + const e2 = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + statusManager.advance(e2); + t.notThrows(() => + statusManager.advanceOutcome(e2.tx.forwardingAddress, e2.tx.amount, true), + ); +}); + +test('advanceOutcome transitions to ADVANCED and ADVANCE_FAILED', async t => { + const { storage } = t.context; + const { statusManager } = t.context; + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + const e2 = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + + statusManager.advance(e1); + statusManager.advanceOutcome(e1.tx.forwardingAddress, e1.tx.amount, true); + t.like(statusManager.lookupPending(e1.tx.forwardingAddress, e1.tx.amount), [ + { + status: PendingTxStatus.Advanced, + }, + ]); + await eventLoopIteration(); + t.deepEqual(storage.getDeserialized(`fun.txns.${e1.txHash}`), [ + { evidence: e1, status: 'OBSERVED' }, + { status: 'ADVANCING' }, + { status: 'ADVANCED' }, + ]); + + statusManager.advance(e2); + statusManager.advanceOutcome(e2.tx.forwardingAddress, e2.tx.amount, false); + t.like(statusManager.lookupPending(e2.tx.forwardingAddress, e2.tx.amount), [ + { + status: PendingTxStatus.AdvanceFailed, + }, + ]); + await eventLoopIteration(); + t.deepEqual(storage.getDeserialized(`fun.txns.${e2.txHash}`), [ + { evidence: e2, status: 'OBSERVED' }, + { status: 'ADVANCING' }, + { status: 'ADVANCE_FAILED' }, + ]); +}); + +test('dequeueStatus returns undefined when nothing is settleable', t => { + const { statusManager } = t.context; + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + + t.is( + statusManager.dequeueStatus(e1.tx.forwardingAddress, e1.tx.amount), + undefined, + ); +}); + +test('dequeueStatus returns first (earliest) matched entry', async t => { + const { statusManager } = t.context; + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + + // advance two txs + statusManager.advance(evidence); + statusManager.advance({ ...evidence, txHash: '0xtest2' }); + + // cannot dequeue ADVANCING pendingTx + t.is( + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ), + undefined, + ); + + statusManager.advanceOutcome( + evidence.tx.forwardingAddress, + evidence.tx.amount, + true, + ); + statusManager.advanceOutcome( + evidence.tx.forwardingAddress, + evidence.tx.amount, + true, + ); + + // also can dequeue OBSERVED statuses + statusManager.observe({ ...evidence, txHash: '0xtest3' }); + + // dequeue will return the first match + t.like( + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ), + { + status: PendingTxStatus.Advanced, + }, + ); + const entries0 = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + t.is(entries0.length, 2); + t.is( + entries0?.[0].status, + PendingTxStatus.Advanced, + 'first settled entry deleted', + ); + t.deepEqual( + entries0?.[1].status, + PendingTxStatus.Observed, + 'order of remaining entries preserved', + ); + + // dequeue again wih same args to settle 2nd advance + t.like( + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ), + { + status: 'ADVANCED', + }, + ); + // dequeue again wih same ags to settle remaining observe + t.like( + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ), + { + status: 'OBSERVED', + }, + ); + const entries1 = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + t.is(entries1?.length, 0, 'settled entries are deleted'); + + t.is( + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ), + undefined, + 'No more matches to settle', + ); +}); + +test('lookupPending returns empty array when presented a key it has not seen', t => { + const { statusManager } = t.context; + t.deepEqual(statusManager.lookupPending('noble123', 1n), []); +}); + +test('StatusManagerKey logic handles addresses with hyphens', t => { + const { statusManager } = t.context; + const evidence: CctpTxEvidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + evidence.tx.forwardingAddress = 'noble1-foo'; + + statusManager.advance(evidence); + + const entries = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + + t.is(entries.length, 1); + t.is(entries[0]?.status, PendingTxStatus.Advancing); + + statusManager.advanceOutcome( + evidence.tx.forwardingAddress, + evidence.tx.amount, + true, + ); + + statusManager.dequeueStatus( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + const remainingEntries = statusManager.lookupPending( + evidence.tx.forwardingAddress, + evidence.tx.amount, + ); + t.is(remainingEntries.length, 0, 'Entry should be dequeued from pending'); +}); + +test.todo('ADVANCE_FAILED -> FORWARDED transition'); diff --git a/packages/fast-usdc/test/exos/transaction-feed.test.ts b/packages/fast-usdc/test/exos/transaction-feed.test.ts new file mode 100644 index 00000000000..e3cb8df299b --- /dev/null +++ b/packages/fast-usdc/test/exos/transaction-feed.test.ts @@ -0,0 +1,205 @@ +// Must be first to set up globals +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; + +import { deeplyFulfilledObject } from '@agoric/internal'; +import { makeHeapZone } from '@agoric/zone'; +import { + prepareTransactionFeedKit, + type TransactionFeedKit, +} from '../../src/exos/transaction-feed.js'; +import { MockCctpTxEvidences } from '../fixtures.js'; + +const nullZcf = null as any; + +const makeFeedKit = () => { + const zone = makeHeapZone(); + const makeKit = prepareTransactionFeedKit(zone, nullZcf); + return makeKit(); +}; + +const makeOperators = (feedKit: TransactionFeedKit) => { + const operators = Object.fromEntries( + ['op1', 'op2', 'op3'].map(name => [ + name, + feedKit.creator.initOperator(name), + ]), + ); + return deeplyFulfilledObject(harden(operators)); +}; + +test('facets', t => { + const kit = makeFeedKit(); + t.deepEqual(Object.keys(kit).sort(), ['creator', 'operatorPowers', 'public']); +}); + +test('status shape', async t => { + const { op1 } = await makeOperators(makeFeedKit()); + + // status shape + t.deepEqual(op1.operator.getStatus(), { + disabled: false, + operatorId: 'op1', + }); +}); + +test('happy aggregation', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + + const { op1, op2, op3 } = await makeOperators(feedKit); + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + op1.operator.submitEvidence(e1); + op2.operator.submitEvidence(e1); + + // Publishes with 2 of 3 + const accepted = await evidenceSubscriber.getUpdateSince(0); + t.deepEqual(accepted, { + value: { evidence: e1, risk: { risksIdentified: [] } }, + updateCount: 1n, + }); + + // Now third operator catches up with same evidence already published + op3.operator.submitEvidence(e1); + t.like(await evidenceSubscriber.getUpdateSince(0), { + // The confirming evidence doesn't change anything + updateCount: 1n, + }); + + const e2 = MockCctpTxEvidences.AGORIC_PLUS_DYDX(); + assert(e1.txHash !== e2.txHash); + op1.operator.submitEvidence(e2); + t.like(await evidenceSubscriber.getUpdateSince(0), { + // op1 attestation insufficient + updateCount: 1n, + }); +}); + +test('takes union of risk assessments', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + + const { op1, op2 } = await makeOperators(feedKit); + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + op1.operator.submitEvidence(e1, { risksIdentified: ['RISK1'] }); + op2.operator.submitEvidence(e1, { risksIdentified: ['RISK2'] }); + + // Publishes with 2 of 3 + const accepted = await evidenceSubscriber.getUpdateSince(0); + t.deepEqual(accepted, { + value: { evidence: e1, risk: { risksIdentified: ['RISK1', 'RISK2'] } }, + updateCount: 1n, + }); +}); + +test('takes union of risk assessments pt. 2', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + + const { op1, op2 } = await makeOperators(feedKit); + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + op1.operator.submitEvidence(e1, { risksIdentified: ['RISK1'] }); + op2.operator.submitEvidence(e1); + + // Publishes with 2 of 3 + const accepted = await evidenceSubscriber.getUpdateSince(0); + t.deepEqual(accepted, { + value: { evidence: e1, risk: { risksIdentified: ['RISK1'] } }, + updateCount: 1n, + }); +}); + +test('takes union of risk assessments pt. 3', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + + const { op1, op2 } = await makeOperators(feedKit); + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + op1.operator.submitEvidence(e1, { risksIdentified: ['RISK1'] }); + op2.operator.submitEvidence(e1, { risksIdentified: ['RISK1'] }); + + // Publishes with 2 of 3 + const accepted = await evidenceSubscriber.getUpdateSince(0); + t.deepEqual(accepted, { + value: { evidence: e1, risk: { risksIdentified: ['RISK1'] } }, + updateCount: 1n, + }); +}); + +test('takes union of risk assessments pt. 4', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + + const { op1, op2 } = await makeOperators(feedKit); + + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + op1.operator.submitEvidence(e1); + op2.operator.submitEvidence(e1); + + // Publishes with 2 of 3 + const accepted = await evidenceSubscriber.getUpdateSince(0); + t.deepEqual(accepted, { + value: { evidence: e1, risk: { risksIdentified: [] } }, + updateCount: 1n, + }); +}); + +test('disagreement', async t => { + const feedKit = makeFeedKit(); + const { op1, op2 } = await makeOperators(feedKit); + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + const e1bad = { ...e1, tx: { ...e1.tx, amount: 999_999_999n } }; + assert(e1.txHash === e1bad.txHash); + op1.operator.submitEvidence(e1); + + t.throws(() => op2.operator.submitEvidence(e1bad), { + message: + 'conflicting evidence for "0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702"', + }); +}); + +test('disagreement after publishing', async t => { + const feedKit = makeFeedKit(); + const evidenceSubscriber = feedKit.public.getEvidenceSubscriber(); + const { op1, op2, op3 } = await makeOperators(feedKit); + const e1 = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + const e1bad = { ...e1, tx: { ...e1.tx, amount: 999_999_999n } }; + assert(e1.txHash === e1bad.txHash); + op1.operator.submitEvidence(e1); + op2.operator.submitEvidence(e1); + + t.like(await evidenceSubscriber.getUpdateSince(0), { + updateCount: 1n, + }); + + // it's simply ignored + t.notThrows(() => op3.operator.submitEvidence(e1bad)); + t.like(await evidenceSubscriber.getUpdateSince(0), { + updateCount: 1n, + }); + + // now another op repeats the bad evidence, so it's published to the stream. + // It's the responsibility of the Advancer to fail because it has already processed that tx hash. + op1.operator.submitEvidence(e1bad); + t.like(await evidenceSubscriber.getUpdateSince(0), { + updateCount: 2n, + }); +}); + +test('disabled operator', async t => { + const feedKit = makeFeedKit(); + const { op1 } = await makeOperators(feedKit); + const evidence = MockCctpTxEvidences.AGORIC_PLUS_OSMO(); + + // works before disabling + op1.operator.submitEvidence(evidence); + + op1.admin.disable(); + + t.throws(() => op1.operator.submitEvidence(evidence), { + message: 'submitEvidence for disabled operator', + }); +}); diff --git a/packages/fast-usdc/test/fast-usdc.contract.test.ts b/packages/fast-usdc/test/fast-usdc.contract.test.ts new file mode 100644 index 00000000000..9d333a40531 --- /dev/null +++ b/packages/fast-usdc/test/fast-usdc.contract.test.ts @@ -0,0 +1,852 @@ +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import type { ExecutionContext, TestFn } from 'ava'; + +import { + decodeAddressHook, + encodeAddressHook, +} from '@agoric/cosmic-proto/address-hooks.js'; +import { AmountMath } from '@agoric/ertp/src/amountMath.js'; +import type { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { + eventLoopIteration, + inspectMapStore, +} from '@agoric/internal/src/testing-utils.js'; +import { + makePublishKit, + observeIteration, + subscribeEach, + type Subscriber, +} from '@agoric/notifier'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; +import { heapVowE as VE } from '@agoric/vow/vat.js'; +import { + divideBy, + multiplyBy, + parseRatio, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import type { Instance } from '@agoric/zoe/src/zoeService/utils.js'; +import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { E } from '@endo/far'; +import { matches } from '@endo/patterns'; +import { makePromiseKit } from '@endo/promise-kit'; +import path from 'path'; +import type { OperatorKit } from '../src/exos/operator-kit.js'; +import type { FastUsdcSF } from '../src/fast-usdc.contract.js'; +import { CctpTxEvidenceShape, PoolMetricsShape } from '../src/type-guards.js'; +import type { CctpTxEvidence, FeeConfig, PoolMetrics } from '../src/types.js'; +import { makeFeeTools } from '../src/utils/fees.js'; +import { MockCctpTxEvidences } from './fixtures.js'; +import { commonSetup, uusdcOnAgoric } from './supports.js'; + +const dirname = path.dirname(new URL(import.meta.url).pathname); + +const contractFile = `${dirname}/../src/fast-usdc.contract.js`; + +const agToNoble = fetchedChainInfo.agoric.connections['noble-1']; + +const { add, isGTE, make, subtract, min } = AmountMath; + +const getInvitationProperties = async ( + zoe: ZoeService, + invitation: Invitation, +) => { + const invitationIssuer = E(zoe).getInvitationIssuer(); + const amount = await E(invitationIssuer).getAmountOf(invitation); + return amount.value[0]; +}; + +// Spec for Mainnet. Other values are covered in unit tests of TransactionFeed. +const operatorQty = 3; + +type CommonSetup = Awaited>; +const startContract = async ( + common: Pick, +) => { + const { + brands: { usdc }, + commonPrivateArgs, + } = common; + + const { zoe, bundleAndInstall } = await setUpZoeForTest(); + const installation: Installation = + await bundleAndInstall(contractFile); + + const startKit = await E(zoe).startInstance( + installation, + { USDC: usdc.issuer }, + { usdcDenom: uusdcOnAgoric }, + commonPrivateArgs, + ); + + const terms = await E(zoe).getTerms(startKit.instance); + + const { subscriber: metricsSub } = E.get( + E.get(E(startKit.publicFacet).getPublicTopics()).poolMetrics, + ); + + const opInvs = await Promise.all( + [...Array(operatorQty).keys()].map(opIx => + E(startKit.creatorFacet).makeOperatorInvitation(`operator-${opIx}`), + ), + ); + await E(startKit.creatorFacet).connectToNoble(); + await E(startKit.creatorFacet).publishAddresses(); + + return { + ...startKit, + terms, + zoe, + metricsSub, + invitations: { operator: opInvs }, + }; +}; + +const makeTestContext = async (t: ExecutionContext) => { + const common = await commonSetup(t); + await E(common.mocks.ibcBridge).setAddressPrefix('noble'); + + const startKit = await startContract(common); + + const { transferBridge } = common.mocks; + const evm = makeEVM(); + + const { inspectBankBridge, inspectLocalBridge } = common.utils; + const snapshot = () => ({ + bank: inspectBankBridge().length, + local: inspectLocalBridge().length, + }); + const since = ix => ({ + bank: inspectBankBridge().slice(ix.bank), + local: inspectLocalBridge().slice(ix.local), + }); + + const sync = { + ocw: makePromiseKit>[]>(), + lp: makePromiseKit>>(), + }; + + const { brands, utils } = common; + const { bankManager } = common.bootstrap; + const receiveUSDCAt = async (addr: string, amount: NatValue) => { + const pmt = await utils.pourPayment(make(brands.usdc.brand, amount)); + const purse = E(E(bankManager).getBankForAddress(addr)).getPurse( + brands.usdc.brand, + ); + return E(purse).deposit(pmt); + }; + + const mint = async (e: CctpTxEvidence) => { + const accountsData = common.bootstrap.storage.data.get('fun'); + const { settlementAccount } = JSON.parse( + JSON.parse(accountsData!).values[0], + ); + const rxd = await receiveUSDCAt(settlementAccount, e.tx.amount); + await VE(transferBridge).fromBridge( + buildVTransferEvent({ + receiver: e.aux.recipientAddress, + target: settlementAccount, + sourceChannel: agToNoble.transferChannel.counterPartyChannelId, + denom: 'uusdc', + amount: e.tx.amount, + sender: e.tx.forwardingAddress, + }), + ); + await eventLoopIteration(); // let settler do work + return rxd; + }; + + return { bridges: { snapshot, since }, common, evm, mint, startKit, sync }; +}; + +type FucContext = Awaited>; +const test = anyTest as TestFn; +test.before(async t => (t.context = await makeTestContext(t))); + +test('baggage', async t => { + const { + brands: { usdc }, + commonPrivateArgs, + } = await commonSetup(t); + + let contractBaggage; + const setJig = ({ baggage }) => { + contractBaggage = baggage; + }; + + const { zoe, bundleAndInstall } = await setUpZoeForTest({ setJig }); + const installation: Installation = + await bundleAndInstall(contractFile); + + await E(zoe).startInstance( + installation, + { USDC: usdc.issuer }, + { usdcDenom: uusdcOnAgoric }, + commonPrivateArgs, + ); + + const tree = inspectMapStore(contractBaggage); + t.snapshot(tree, 'contract baggage after start'); +}); + +test('getStaticInfo', async t => { + const { startKit } = t.context; + const { publicFacet } = startKit; + + t.deepEqual(await E(publicFacet).getStaticInfo(), { + addresses: { + poolAccount: makeTestAddress(), + settlementAccount: makeTestAddress(1), + }, + }); +}); + +const purseOf = + (issuer: Issuer, { pourPayment }) => + async (value: bigint) => { + const brand = await E(issuer).getBrand(); + const purse = E(issuer).makeEmptyPurse(); + const pmt = await pourPayment(make(brand, value)); + await E(purse).deposit(pmt); + return purse; + }; + +const makeOracleOperator = async ( + opInv: Invitation, + txSubscriber: Subscriber, + zoe: ZoeService, + t: ExecutionContext, +) => { + let done = 0; + const failures = [] as any[]; + t.like(await getInvitationProperties(zoe, opInv), { + description: 'oracle operator invitation', + }); + + // operator only gets `.invitationMakers` + // but for testing, we need `.admin` too. UNTIL #????? + const operatorKit = await E(E(zoe).offer(opInv)).getOfferResult(); + t.deepEqual(Object.keys(operatorKit), [ + 'admin', + 'invitationMakers', + 'operator', + ]); + const { invitationMakers } = operatorKit; + + let active = true; + + return harden({ + watch: () => { + void observeIteration(subscribeEach(txSubscriber), { + updateState: ({ evidence, isRisk }) => { + if (!active) { + return; + } + // KLUDGE: tx wouldn't include aux. OCW looks it up + return E.when( + E(invitationMakers).SubmitEvidence( + evidence, + isRisk ? { risksIdentified: ['RISK1'] } : {}, + ), + inv => + E.when(E(E(zoe).offer(inv)).getOfferResult(), res => { + t.is(res, 'inert; nothing should be expected from this offer'); + done += 1; + }), + reason => { + failures.push(reason.message); + }, + ); + }, + }); + }, + getDone: () => done, + getFailures: () => harden([...failures]), + // operator only gets .invitationMakers + getKit: () => operatorKit, + setActive: flag => { + active = flag; + }, + }); +}; + +const logAmt = amt => [ + Number(amt.value), + // numberWithCommas(Number(amt.value)), + amt.brand + .toString() + .replace(/^\[object Alleged:/, '') + .replace(/ brand]$/, ''), +]; +const scaleAmount = (frac: number, amount: Amount<'nat'>) => { + const asRatio = parseRatio(frac, amount.brand); + return multiplyBy(amount, asRatio); +}; + +const makeLP = async ( + name: string, + usdcPurse: ERef, + zoe: ZoeService, + instance: Instance, +) => { + const publicFacet = E(zoe).getPublicFacet(instance); + const { subscriber } = E.get( + E.get(E(publicFacet).getPublicTopics()).poolMetrics, + ); + const terms = await E(zoe).getTerms(instance); + const { USDC } = terms.brands; + const sharePurse = E(terms.issuers.PoolShares).makeEmptyPurse(); + let investment = AmountMath.makeEmpty(USDC); + const me = harden({ + deposit: async (t: ExecutionContext, qty: bigint) => { + const { + value: { shareWorth }, + } = await E(subscriber).getUpdateSince(); + const give = { USDC: make(USDC, qty) }; + const proposal = harden({ + give, + want: { PoolShare: divideBy(give.USDC, shareWorth) }, + }); + t.log(name, 'deposits', ...logAmt(proposal.give.USDC)); + const toDeposit = await E(publicFacet).makeDepositInvitation(); + const payments = { USDC: await E(usdcPurse).withdraw(give.USDC) }; + const payout = await E(zoe) + .offer(toDeposit, proposal, payments) + .then(seat => E(seat).getPayout('PoolShare')) + .then(pmt => E(sharePurse).deposit(pmt)) + .then(a => a as Amount<'nat'>); + t.log(name, 'deposit payout', ...logAmt(payout)); + t.true(isGTE(payout, proposal.want.PoolShare)); + investment = add(investment, give.USDC); + }, + + withdraw: async (t: ExecutionContext, portion: number) => { + const myShares = await E(sharePurse) + .getCurrentAmount() + .then(a => a as Amount<'nat'>); + const give = { PoolShare: scaleAmount(portion, myShares) }; + const { + value: { shareWorth }, + } = await E(subscriber).getUpdateSince(); + const myUSDC = multiplyBy(myShares, shareWorth); + const myFees = subtract(myUSDC, investment); + t.log(name, 'sees fees earned', ...logAmt(myFees)); + const proposal = harden({ + give, + want: { USDC: multiplyBy(give.PoolShare, shareWorth) }, + }); + const pct = portion * 100; + t.log(name, 'withdraws', pct, '%:', ...logAmt(proposal.give.PoolShare)); + const toWithdraw = await E(publicFacet).makeWithdrawInvitation(); + const usdcPmt = await E(sharePurse) + .withdraw(proposal.give.PoolShare) + .then(pmt => E(zoe).offer(toWithdraw, proposal, { PoolShare: pmt })) + .then(seat => E(seat).getPayout('USDC')); + const amt = await E(usdcPurse).deposit(usdcPmt); + t.log(name, 'withdraw payout', ...logAmt(amt)); + t.true(isGTE(amt, proposal.want.USDC)); + // min() in case things changed between checking metrics and withdrawing + investment = subtract(investment, min(amt, investment)); + return amt; + }, + }); + return me; +}; + +const makeEVM = (template = MockCctpTxEvidences.AGORIC_PLUS_OSMO()) => { + let nonce = 0; + + const makeTx = (amount: bigint, recipientAddress: string): CctpTxEvidence => { + nonce += 1; + + const tx: CctpTxEvidence = harden({ + ...template, + txHash: `0x00000${nonce}`, + blockNumber: template.blockNumber + BigInt(nonce), + tx: { ...template.tx, amount }, + // KLUDGE: CCTP doesn't know about aux; it would be added by OCW + aux: { ...template.aux, recipientAddress }, + }); + return tx; + }; + + const txPub = makePublishKit(); + + return harden({ cctp: { makeTx }, txPub }); +}; + +/** + * We pass around evidence along with a flag to indicate whether it should be + * treated as risky for testing purposes. + */ +interface TxWithRisk { + evidence: CctpTxEvidence; + isRisk: boolean; +} + +const makeCustomer = ( + who: string, + cctp: ReturnType['cctp'], + txPublisher: Publisher, + feeConfig: FeeConfig, // TODO: get from vstorage (or at least: a subscriber) +) => { + const USDC = feeConfig.flat.brand; + const feeTools = makeFeeTools(feeConfig); + const sent = [] as TxWithRisk[]; + + const me = harden({ + checkPoolAvailable: async ( + t: ExecutionContext, + want: NatValue, + metricsSub: ERef>, + ) => { + const { value: m } = await E(metricsSub).getUpdateSince(); + const { numerator: poolBalance } = m.shareWorth; // XXX awkward API? + const enough = poolBalance.value > want; + t.log(who, 'sees', poolBalance.value, enough ? '>' : 'NOT >', want); + return enough; + }, + sendFast: async ( + t: ExecutionContext, + amount: bigint, + EUD: string, + isRisk = false, + ) => { + const { storage } = t.context.common.bootstrap; + const accountsData = storage.data.get('fun'); + const { settlementAccount } = JSON.parse( + JSON.parse(accountsData!).values[0], + ); + const recipientAddress = encodeAddressHook(settlementAccount, { EUD }); + // KLUDGE: UI would ask noble for a forwardingAddress + // "cctp" here has some noble stuff mixed in. + const tx = cctp.makeTx(amount, recipientAddress); + t.log(who, 'signs CCTP for', amount, 'uusdc w/EUD:', EUD); + txPublisher.publish({ evidence: tx, isRisk }); + sent.push({ evidence: tx, isRisk }); + await eventLoopIteration(); + return tx; + }, + checkSent: ( + t: ExecutionContext, + { bank = [] as any[], local = [] as any[] } = {}, + forward?: unknown, + ) => { + const next = sent.shift(); + if (!next) throw t.fail('nothing sent'); + const { evidence } = next; + + // C3 - Contract MUST calculate AdvanceAmount by ... + // Mostly, see unit tests for calculateAdvance, calculateSplit + const toReceive = forward + ? { value: evidence.tx.amount } + : feeTools.calculateAdvance(AmountMath.make(USDC, evidence.tx.amount)); + + if (forward) { + t.log(who, 'waits for fallback / forward'); + t.deepEqual(bank, []); // no vbank GIVE / GRAB + } + + const { EUD } = decodeAddressHook(evidence.aux.recipientAddress).query; + + const myMsg = local.find(lm => { + if (lm.type !== 'VLOCALCHAIN_EXECUTE_TX') return false; + const [ibcTransferMsg] = lm.messages; + // support advances to noble + other chains + const receiver = + ibcTransferMsg.receiver === 'noble1test' // intermediateRecipient value + ? JSON.parse(ibcTransferMsg.memo).forward.receiver + : ibcTransferMsg.receiver; + return ( + ibcTransferMsg['@type'] === + '/ibc.applications.transfer.v1.MsgTransfer' && receiver === EUD + ); + }); + if (!myMsg) { + if (forward) return; + throw t.fail(`no MsgTransfer to ${EUD}`); + } + const [ibcTransferMsg] = myMsg.messages; + // C4 - Contract MUST release funds to the end user destination address + // in response to invocation by the off-chain watcher that + // an acceptable Fast USDC Transaction has been initiated. + t.deepEqual( + ibcTransferMsg.token, + { amount: String(toReceive.value), denom: uusdcOnAgoric }, + 'C4', + ); + t.log(who, 'sees', ibcTransferMsg.token, 'sent to', EUD); + if (!(EUD as string).startsWith('noble')) { + t.like( + JSON.parse(ibcTransferMsg.memo), + { + forward: { + receiver: EUD, + }, + }, + 'PFM receiver is EUD', + ); + } else { + t.like(ibcTransferMsg, { receiver: EUD }); + } + t.is( + ibcTransferMsg.sourceChannel, + fetchedChainInfo.agoric.connections['noble-1'].transferChannel + .channelId, + 'expect routing through Noble', + ); + }, + }); + return me; +}; + +test.serial('OCW operators redeem invitations and start watching', async t => { + const { + startKit: { zoe, invitations }, + evm: { txPub }, + sync, + } = t.context; + const operators = await Promise.all( + invitations.operator.map(async opInv => { + const op = makeOracleOperator(opInv, txPub.subscriber, zoe, t); + await E(op).watch(); + return op; + }), + ); + sync.ocw.resolve(operators); +}); + +// XXX: replace test.serial() with promise synchronization? + +test.serial('C25 - LPs can deposit USDC', async t => { + const { + startKit: { zoe, instance, metricsSub }, + common: { + utils, + brands: { usdc }, + }, + sync, + } = t.context; + const usdcPurse = purseOf(usdc.issuer, utils); + // C25 - MUST support multiple liquidity providers + const lp = { + lp50: makeLP('Logan', usdcPurse(50_000_000n), zoe, instance), + lp200: makeLP('Larry', usdcPurse(200_000_000n), zoe, instance), + }; + + const { + value: { + shareWorth: { numerator: balance0 }, + }, + } = await E(metricsSub).getUpdateSince(); + + await Promise.all([ + E(lp.lp200).deposit(t, 200_000_000n), + E(lp.lp50).deposit(t, 50_000_000n), + ]); + + sync.lp.resolve(lp); + const { + value: { + shareWorth: { numerator: poolBalance }, + }, + } = await E(metricsSub).getUpdateSince(); + t.deepEqual(poolBalance, make(usdc.brand, 250_000_000n + balance0.value)); +}); + +test.serial('Contract skips advance when risks identified', async t => { + const { + common: { + commonPrivateArgs: { feeConfig }, + utils: { transmitTransferAck }, + }, + evm: { cctp, txPub }, + startKit: { metricsSub }, + bridges: { snapshot, since }, + mint, + } = t.context; + const custEmpty = makeCustomer('Skippy', cctp, txPub.publisher, feeConfig); + const bridgePos = snapshot(); + const sent = await custEmpty.sendFast(t, 1_000_000n, 'osmo123', true); + const bridgeTraffic = since(bridgePos); + await mint(sent); + custEmpty.checkSent(t, bridgeTraffic, 'forward'); + t.log('No advancement, just settlement'); + await transmitTransferAck(); // ack IBC transfer for forward +}); + +test.serial('STORY01: advancing happy path for 100 USDC', async t => { + const { + common: { + brands: { usdc }, + commonPrivateArgs: { feeConfig }, + utils: { inspectBankBridge, transmitTransferAck }, + }, + evm: { cctp, txPub }, + startKit: { metricsSub }, + bridges: { snapshot, since }, + mint, + } = t.context; + const cust1 = makeCustomer('Carl', cctp, txPub.publisher, feeConfig); + + const bridgePos = snapshot(); + const sent1 = await cust1.sendFast(t, 108_000_000n, 'osmo1234advanceHappy'); + await transmitTransferAck(); // ack IBC transfer for advance + // Nothing we can check here, unless we want to inspect calls to `trace`. + // `test/exos/advancer.test.ts` covers calls to `log: LogFn` with mocks. + // This is still helpful to call, so we can observe "Advance transfer + // fulfilled" in the test output. + + const { calculateAdvance, calculateSplit } = makeFeeTools(feeConfig); + const expectedAdvance = calculateAdvance(usdc.make(sent1.tx.amount)); + t.log('advancer sent to PoolAccount', expectedAdvance); + t.deepEqual(inspectBankBridge().at(-1), { + amount: String(expectedAdvance.value), + denom: uusdcOnAgoric, + recipient: makeTestAddress(), + type: 'VBANK_GIVE', + }); + + cust1.checkSent(t, since(bridgePos)); + + const emptyMetrics = { + encumberedBalance: usdc.makeEmpty(), + shareWorth: { + numerator: usdc.make(1n), + denominator: { value: 1n }, + }, + totalBorrows: usdc.makeEmpty(), + totalContractFees: usdc.makeEmpty(), + totalPoolFees: usdc.makeEmpty(), + totalRepays: usdc.makeEmpty(), + }; + const par250 = { + numerator: usdc.make(250_000_001n), + denominator: { value: 250_000_001n }, + }; + + t.like( + await E(metricsSub) + .getUpdateSince() + .then(r => r.value), + { + ...emptyMetrics, + encumberedBalance: expectedAdvance, + shareWorth: par250, + totalBorrows: expectedAdvance, + }, + 'metrics while advancing', + ); + + await mint(sent1); + + // C8 - "Contract MUST be able to initialize settlement process when Noble mints USDC." + // The metrics are a useful proxy, but the contract could lie. + // The real test of whether the contract turns minted funds into liquidity is + // the ability to advance the funds (in later tests). + const split = calculateSplit(usdc.make(sent1.tx.amount)); + t.like( + await E(metricsSub) + .getUpdateSince() + .then(r => r.value), + { + ...emptyMetrics, + shareWorth: { + ...par250, + numerator: add(par250.numerator, split.PoolFee), + }, + totalBorrows: { value: 105839999n }, + totalContractFees: { value: 432000n }, + totalPoolFees: { value: 1728001n }, + totalRepays: { value: 105839999n }, + }, + 'metrics after advancing', + ); +}); + +// most likely in exo unit tests +test.todo( + 'C21 - Contract MUST log / timestamp each step in the transaction flow', +); + +test.serial('STORY03: see accounting metrics', async t => { + const { + common: { + brands: { usdc }, + }, + startKit: { metricsSub }, + } = t.context; + const { value: metrics } = await E(metricsSub).getUpdateSince(); + + t.log(metrics); + t.true(matches(metrics, PoolMetricsShape)); +}); +test.todo('document metrics storage schema'); +test.todo('get metrics from vstorage'); + +test.serial('STORY05: LP collects fees on 100 USDC', async t => { + const { + sync, + common: { + brands: { usdc }, + }, + } = t.context; + + const lp = await sync.lp.promise; + const got = await E(lp.lp200).withdraw(t, 0.5); // redeem 1/2 my shares + + // C3 - Contract MUST calculate ... + // Mostly, see unit tests for calculateAdvance, calculateSplit + // TODO: add a feeTools unit test for the magic number below. + t.deepEqual(got, add(usdc.units(100), usdc.make(691_200n))); + + await E(lp.lp200).deposit(t, 100_000_000n); // put all but the fees back in +}); + +test.serial('With 250 available, 3 race to get ~100', async t => { + const { + bridges: { snapshot, since }, + evm: { cctp, txPub }, + common: { + commonPrivateArgs: { feeConfig }, + utils: { transmitTransferAck }, + }, + startKit: { metricsSub }, + mint, + } = t.context; + + const cust = { + racer1: makeCustomer('Racer1', cctp, txPub.publisher, feeConfig), + racer2: makeCustomer('Racer2', cctp, txPub.publisher, feeConfig), + racer3: makeCustomer('Racer3', cctp, txPub.publisher, feeConfig), + }; + + await cust.racer3.checkPoolAvailable(t, 125_000_000n, metricsSub); + + const bridgePos = snapshot(); + const [sent1, sent2, sent3] = await Promise.all([ + cust.racer1.sendFast(t, 110_000_000n, 'osmo1234a'), + cust.racer2.sendFast(t, 120_000_000n, 'osmo1234b'), + cust.racer3.sendFast(t, 125_000_000n, 'osmo1234c'), + ]); + cust.racer1.checkSent(t, since(bridgePos)); + cust.racer2.checkSent(t, since(bridgePos)); + // TODO/WIP: cust.racer3.checkSent(t, since(bridgePos), 'forward - LP depleted'); + await transmitTransferAck(); + await transmitTransferAck(); + await transmitTransferAck(); + await Promise.all([mint(sent1), mint(sent2), mint(sent3)]); +}); + +test.serial('STORY05(cont): LPs withdraw all liquidity', async t => { + const { + sync, + common: { + brands: { usdc }, + }, + } = t.context; + + const lp = await sync.lp.promise; + const [a, b] = await Promise.all([ + E(lp.lp200).withdraw(t, 1), + E(lp.lp50).withdraw(t, 1), + ]); + t.log({ a, b, sum: add(a, b) }); + t.truthy(a); + t.truthy(b); +}); + +test.serial('STORY09: insufficient liquidity: no FastUSDC option', async t => { + // STORY09 - As the Fast USDC end user, + // I should see the option to use Fast USDC unavailable + // on the UI (and unusable) if there are not funds in the + // MarketMaker’s account + const { + common: { + commonPrivateArgs: { feeConfig }, + }, + evm: { cctp, txPub }, + startKit: { metricsSub }, + } = t.context; + const early = makeCustomer('Unice', cctp, txPub.publisher, feeConfig); + const available = await early.checkPoolAvailable(t, 5_000_000n, metricsSub); + t.false(available); +}); + +test.serial('C20 - Contract MUST function with an empty pool', async t => { + const { + common: { + commonPrivateArgs: { feeConfig }, + utils: { transmitTransferAck }, + }, + evm: { cctp, txPub }, + startKit: { metricsSub }, + bridges: { snapshot, since }, + mint, + } = t.context; + const custEmpty = makeCustomer('Earl', cctp, txPub.publisher, feeConfig); + const bridgePos = snapshot(); + const sent = await custEmpty.sendFast(t, 150_000_000n, 'osmo123'); + const bridgeTraffic = since(bridgePos); + await mint(sent); + custEmpty.checkSent(t, bridgeTraffic, 'forward'); + t.log('No advancement, just settlement'); + await transmitTransferAck(); // ack IBC transfer for forward +}); + +// advancedEarly stuff +test.todo( + 'C12 - Contract MUST only pay back the Pool only if they started the advance before USDC is minted', +); + +test.todo('C18 - forward - MUST log and alert these incidents'); + +test.serial('Settlement for unknown transaction (operator down)', async t => { + const { + sync, + bridges: { snapshot, since }, + evm: { cctp, txPub }, + common: { + commonPrivateArgs: { feeConfig }, + utils: { transmitTransferAck }, + }, + mint, + } = t.context; + const operators = await sync.ocw.promise; + + // Simulate 2 of 3 operators being unavailable + operators[0].setActive(false); + operators[1].setActive(false); + + const opDown = makeCustomer('Otto', cctp, txPub.publisher, feeConfig); + + const bridgePos = snapshot(); + const sent = await opDown.sendFast(t, 20_000_000n, 'osmo12345'); + await mint(sent); + const bridgeTraffic = since(bridgePos); + + t.like( + bridgeTraffic.bank, + [ + { + amount: '20000000', + sender: 'faucet', + type: 'VBANK_GRAB', + }, + { + amount: '20000000', + recipient: 'agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g', + type: 'VBANK_GIVE', + }, + ], + '20 USDC arrive at the settlement account', + ); + t.deepEqual(bridgeTraffic.local, [], 'no IBC transfers'); + + await transmitTransferAck(); +}); + +test.todo( + 'fee levels MUST be visible to external parties - i.e., written to public storage', +); diff --git a/packages/fast-usdc/test/fixtures.ts b/packages/fast-usdc/test/fixtures.ts new file mode 100644 index 00000000000..8496051125d --- /dev/null +++ b/packages/fast-usdc/test/fixtures.ts @@ -0,0 +1,170 @@ +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; +import type { ChainAddress } from '@agoric/orchestration'; +import type { VTransferIBCEvent } from '@agoric/vats'; +import type { CctpTxEvidence, EvmAddress } from '../src/types.js'; + +const mockScenarios = [ + 'AGORIC_PLUS_OSMO', + 'AGORIC_PLUS_DYDX', + 'AGORIC_NO_PARAMS', + 'AGORIC_UNKNOWN_EUD', +] as const; + +type MockScenario = (typeof mockScenarios)[number]; + +export const Senders = { + default: '0xDefaultFakeEthereumAddress', +} as unknown as Record; + +export const MockCctpTxEvidences: Record< + MockScenario, + (receiverAddress?: string) => CctpTxEvidence +> = { + AGORIC_PLUS_OSMO: (receiverAddress?: string) => ({ + blockHash: + '0x90d7343e04f8160892e94f02d6a9b9f255663ed0ac34caca98544c8143fee665', + blockNumber: 21037663n, + txHash: + '0xc81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761702', + tx: { + amount: 150000000n, + forwardingAddress: 'noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelqkd', + sender: Senders.default, + }, + aux: { + forwardingChannel: 'channel-21', + recipientAddress: + receiverAddress || + encodeAddressHook(settlementAddress.value, { + EUD: 'osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }), + }, + chainId: 1, + }), + AGORIC_PLUS_DYDX: (receiverAddress?: string) => ({ + blockHash: + '0x80d7343e04f8160892e94f02d6a9b9f255663ed0ac34caca98544c8143fee699', + blockNumber: 21037669n, + txHash: + '0xd81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761799', + tx: { + amount: 300000000n, + forwardingAddress: 'noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelktz', + sender: Senders.default, + }, + aux: { + forwardingChannel: 'channel-21', + recipientAddress: + receiverAddress || + encodeAddressHook(settlementAddress.value, { + EUD: 'dydx183dejcnmkka5dzcu9xw6mywq0p2m5peks28men', + }), + }, + chainId: 1, + }), + AGORIC_NO_PARAMS: (receiverAddress?: string) => ({ + blockHash: + '0x70d7343e04f8160892e94f02d6a9b9f255663ed0ac34caca98544c8143fee699', + blockNumber: 21037669n, + txHash: + '0xa81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761799', + tx: { + amount: 200000000n, + forwardingAddress: 'noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelyyy', + sender: Senders.default, + }, + aux: { + forwardingChannel: 'channel-21', + recipientAddress: receiverAddress || settlementAddress.value, + }, + chainId: 1, + }), + AGORIC_UNKNOWN_EUD: (receiverAddress?: string) => ({ + blockHash: + '0x70d7343e04f8160892e94f02d6a9b9f255663ed0ac34caca98544c8143fee699', + blockNumber: 21037669n, + txHash: + '0xa81bc6105b60a234c7c50ac17816ebcd5561d366df8bf3be59ff387552761799', + tx: { + amount: 200000000n, + forwardingAddress: 'noble1x0ydg69dh6fqvr27xjvp6maqmrldam6yfelyyy', + sender: Senders.default, + }, + aux: { + forwardingChannel: 'channel-21', + recipientAddress: + receiverAddress || + encodeAddressHook(settlementAddress.value, { + EUD: 'random1addr', + }), + }, + chainId: 1, + }), +}; + +const nobleDefaultVTransferParams = { + // (XXX confirm) FungibleTokenPacketData is from the perspective of the counterparty + denom: 'uusdc', + sourceChannel: + fetchedChainInfo.agoric.connections['noble-1'].transferChannel + .counterPartyChannelId, + destinationChannel: + fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId, +}; + +export const MockVTransferEvents: Record< + MockScenario, + (receiverAddress?: string) => VTransferIBCEvent +> = { + AGORIC_PLUS_OSMO: (recieverAddress?: string) => + buildVTransferEvent({ + ...nobleDefaultVTransferParams, + amount: MockCctpTxEvidences.AGORIC_PLUS_OSMO().tx.amount, + sender: MockCctpTxEvidences.AGORIC_PLUS_OSMO().tx.forwardingAddress, + receiver: + recieverAddress || + MockCctpTxEvidences.AGORIC_PLUS_OSMO().aux.recipientAddress, + }), + AGORIC_PLUS_DYDX: (recieverAddress?: string) => + buildVTransferEvent({ + ...nobleDefaultVTransferParams, + amount: MockCctpTxEvidences.AGORIC_PLUS_DYDX().tx.amount, + sender: MockCctpTxEvidences.AGORIC_PLUS_DYDX().tx.forwardingAddress, + receiver: + recieverAddress || + MockCctpTxEvidences.AGORIC_PLUS_DYDX().aux.recipientAddress, + }), + AGORIC_NO_PARAMS: (recieverAddress?: string) => + buildVTransferEvent({ + ...nobleDefaultVTransferParams, + amount: MockCctpTxEvidences.AGORIC_NO_PARAMS().tx.amount, + sender: MockCctpTxEvidences.AGORIC_NO_PARAMS().tx.forwardingAddress, + receiver: + recieverAddress || + MockCctpTxEvidences.AGORIC_NO_PARAMS().aux.recipientAddress, + }), + AGORIC_UNKNOWN_EUD: (recieverAddress?: string) => + buildVTransferEvent({ + ...nobleDefaultVTransferParams, + amount: MockCctpTxEvidences.AGORIC_UNKNOWN_EUD().tx.amount, + sender: MockCctpTxEvidences.AGORIC_UNKNOWN_EUD().tx.forwardingAddress, + receiver: + recieverAddress || + MockCctpTxEvidences.AGORIC_UNKNOWN_EUD().aux.recipientAddress, + }), +}; + +export const intermediateRecipient: ChainAddress = harden({ + chainId: 'noble-1', + value: 'noble1test', + encoding: 'bech32', +}); + +export const settlementAddress: ChainAddress = harden({ + chainId: 'agoric-3', + encoding: 'bech32' as const, + // Random value, copied from tests of address hooks + value: 'agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek', +}); diff --git a/packages/fast-usdc/test/mocks.ts b/packages/fast-usdc/test/mocks.ts new file mode 100644 index 00000000000..d6196d3b7d5 --- /dev/null +++ b/packages/fast-usdc/test/mocks.ts @@ -0,0 +1,87 @@ +import type { HostInterface } from '@agoric/async-flow'; +import type { + ChainAddress, + DenomAmount, + OrchestrationAccount, +} from '@agoric/orchestration'; +import type { Zone } from '@agoric/zone'; +import type { VowTools } from '@agoric/vow'; +import { makeRatio } from '@agoric/zoe/src/contractSupport/ratio.js'; +import type { + AmountUtils, + withAmountUtils, +} from '@agoric/zoe/tools/test-utils.js'; +import type { FeeConfig, LogFn } from '../src/types.js'; + +export const prepareMockOrchAccounts = ( + zone: Zone, + { + vowTools: { makeVowKit, asVow }, + log, + usdc, + }: { + vowTools: VowTools; + log: (...args: any[]) => void; + usdc: { brand: Brand<'nat'>; issuer: Issuer<'nat'> }; + }, +) => { + // each can only be resolved/rejected once per test + const poolAccountTransferVK = makeVowKit(); + + const mockedPoolAccount = zone.exo('Mock Pool LocalOrchAccount', undefined, { + transfer(destination: ChainAddress, amount: DenomAmount) { + log('PoolAccount.transfer() called with', destination, amount); + return poolAccountTransferVK.vow; + }, + deposit(payment: Payment<'nat'>) { + log('PoolAccount.deposit() called with', payment); + // XXX consider a mock for deposit failure + return asVow(async () => usdc.issuer.getAmountOf(payment)); + }, + }); + + const poolAccount = mockedPoolAccount as unknown as HostInterface< + OrchestrationAccount<{ chainId: 'agoric' }> + >; + + const settlementCallLog = [] as any[]; + const settlementAccountMock = zone.exo('Mock Settlement Account', undefined, { + transfer(...args) { + settlementCallLog.push(harden(['transfer', ...args])); + }, + }); + const settlementAccount = settlementAccountMock as unknown as HostInterface< + OrchestrationAccount<{ chainId: 'agoric' }> + >; + return { + mockPoolAccount: { + account: poolAccount, + transferVResolver: poolAccountTransferVK.resolver, + }, + settlement: { + account: settlementAccount, + callLog: settlementCallLog, + }, + }; +}; + +export const makeTestLogger = (logger: LogFn) => { + const logs: unknown[][] = []; + const log = (...args: any[]) => { + logs.push(args); + logger(args); + }; + const inspectLogs = (index?: number) => + typeof index === 'number' ? logs[index] : logs; + return { log, inspectLogs }; +}; + +export type TestLogger = ReturnType; + +export const makeTestFeeConfig = (usdc: Omit): FeeConfig => + harden({ + flat: usdc.make(1n), + variableRate: makeRatio(2n, usdc.brand), + maxVariable: usdc.units(5), + contractRate: makeRatio(20n, usdc.brand), + }); diff --git a/packages/fast-usdc/test/pool-share-math.test.ts b/packages/fast-usdc/test/pool-share-math.test.ts new file mode 100644 index 00000000000..c0fda677346 --- /dev/null +++ b/packages/fast-usdc/test/pool-share-math.test.ts @@ -0,0 +1,526 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { testProp, fc } from '@fast-check/ava'; +import { AmountMath, makeIssuerKit } from '@agoric/ertp'; +import { + multiplyBy, + parseRatio, +} from '@agoric/zoe/src/contractSupport/ratio.js'; +import { mustMatch } from '@endo/patterns'; +import { + borrowCalc, + depositCalc, + makeParity, + repayCalc, + withdrawCalc, + withFees, +} from '../src/pool-share-math.js'; +import { makeProposalShapes } from '../src/type-guards.js'; + +const { add, make, isEmpty, makeEmpty, subtract } = AmountMath; + +const issuerKits = { + PoolShare: makeIssuerKit<'nat'>('PoolShare'), + USDC: makeIssuerKit<'nat'>('USDC'), +}; +const brands = harden({ + PoolShares: issuerKits.PoolShare.brand, + USDC: issuerKits.USDC.brand, +}); +const parity = makeParity(make(brands.USDC, 1n), brands.PoolShares); +const shapes = makeProposalShapes(brands); + +test('initial deposit to pool', t => { + const { PoolShares, USDC } = brands; + + const proposal = harden({ + give: { USDC: make(USDC, 100n) }, + want: { PoolShare: make(PoolShares, 1n) }, + }); + mustMatch(proposal, shapes.deposit); + const actual = depositCalc(parity, proposal); + t.deepEqual(actual, { + payouts: { PoolShare: make(PoolShares, 100n) }, + shareWorth: makeParity(actual.shareWorth.numerator, PoolShares), + }); +}); + +test('initial withdrawal fails', t => { + const { PoolShares, USDC } = brands; + const proposal = harden({ + give: { PoolShare: make(PoolShares, 100n) }, + want: { USDC: make(USDC, 100n) }, + }); + t.throws(() => withdrawCalc(parity, proposal), { + message: /cannot withdraw/, + }); +}); + +test('withdrawal after deposit OK', t => { + const { PoolShares, USDC } = brands; + const state0 = makeParity(make(USDC, 1n), PoolShares); + + const pDep = { give: { USDC: make(USDC, 100n) } }; + const { shareWorth: state1 } = depositCalc(state0, pDep); + + const proposal = harden({ + give: { PoolShare: make(PoolShares, 50n) }, + want: { USDC: make(USDC, 50n) }, + }); + mustMatch(proposal, shapes.withdraw); + + const actual = withdrawCalc(state1, proposal); + + t.deepEqual(actual, { + payouts: { USDC: make(USDC, 50n) }, + shareWorth: { + numerator: make(USDC, 51n), + denominator: make(PoolShares, 51n), + }, + }); +}); + +test('deposit offer underestimates value of share', t => { + const { PoolShares, USDC } = brands; + + const pDep = { give: { USDC: make(USDC, 100n) } }; + const { shareWorth: state1 } = depositCalc(parity, pDep); + const state2 = withFees(state1, make(USDC, 20n)); + + const proposal = harden({ + give: { USDC: make(USDC, 50n) }, + want: { PoolShare: make(PoolShares, 50n) }, + }); + mustMatch(proposal, shapes.deposit); + + t.throws(() => depositCalc(state2, proposal), { + message: /cannot pay out/, + }); +}); + +test('deposit offer overestimates value of share', t => { + const { PoolShares, USDC } = brands; + const state0 = makeParity(make(USDC, 1n), PoolShares); + + const proposal = harden({ + give: { USDC: make(USDC, 10n) }, + want: { PoolShare: make(PoolShares, 8n) }, + }); + mustMatch(proposal, shapes.deposit); + + const actual = depositCalc(state0, proposal); + t.deepEqual(actual, { + payouts: { PoolShare: make(PoolShares, 10n) }, + shareWorth: { + numerator: make(USDC, 11n), + denominator: make(PoolShares, 11n), + }, + }); +}); + +test('withdrawal offer underestimates value of share', t => { + const { PoolShares, USDC } = brands; + const state0 = makeParity(make(USDC, 1n), PoolShares); + + const proposal1 = harden({ give: { USDC: make(USDC, 100n) } }); + const { shareWorth: state1 } = depositCalc(state0, proposal1); + + const proposal = harden({ + give: { PoolShare: make(PoolShares, 60n) }, + want: { USDC: make(USDC, 50n) }, + }); + mustMatch(proposal, shapes.withdraw); + + const actual = withdrawCalc(state1, proposal); + + t.deepEqual(actual, { + payouts: { USDC: make(USDC, 60n) }, + shareWorth: { + numerator: make(USDC, 41n), + denominator: make(PoolShares, 41n), + }, + }); +}); + +test('withdrawal offer overestimates value of share', t => { + const { PoolShares, USDC } = brands; + const state0 = makeParity(make(USDC, 1n), PoolShares); + + const d100 = { give: { USDC: make(USDC, 100n) } }; + const { shareWorth: state1 } = depositCalc(state0, d100); + + const proposal = harden({ + give: { PoolShare: make(PoolShares, 50n) }, + want: { USDC: make(USDC, 60n) }, + }); + mustMatch(proposal, shapes.withdraw); + + t.throws(() => withdrawCalc(state1, proposal), { + message: /cannot withdraw/, + }); +}); + +const scaleAmount = (frac: number, amount: Amount<'nat'>) => { + const asRatio = parseRatio(frac, amount.brand); + return multiplyBy(amount, asRatio); +}; + +// ack: https://stackoverflow.com/a/2901298/7963 +function numberWithCommas(x) { + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); +} + +const logAmt = amt => [ + Number(amt.value), + // numberWithCommas(Number(amt.value)), + amt.brand + .toString() + .replace(/^\[object Alleged:/, '') + .replace(/ brand]$/, ''), +]; + +const arbAmountOf = brand => + fc + .record({ + brand: fc.constant(brand), + value: fc.bigInt({ min: 1n, max: 1_000n * 1_000_000n }), + }) + .map(x => harden(x)); +const arbUSDC = arbAmountOf(brands.USDC); +const arbShares = arbAmountOf(brands.PoolShares); + +const arbShareWorth = fc + .record({ numerator: arbUSDC, denominator: arbShares }) + .map(x => harden(x)); + +testProp( + 'deposit properties', + [arbShareWorth, arbUSDC], + (t, shareWorth, In) => { + const actual = depositCalc(shareWorth, { give: { USDC: In } }); + const { + payouts: { PoolShare }, + shareWorth: post, + } = actual; + const { numerator: poolAmount, denominator: sharesOutstanding } = post; + t.deepEqual(poolAmount, add(shareWorth.numerator, In)); + t.deepEqual(sharesOutstanding, add(shareWorth.denominator, PoolShare)); + }, +); + +const arbPortion = fc.double({ min: 0.0001, max: 1.0, noNaN: true }); +const arbDelta = fc.double({ min: 0.75, max: 1.0, noNaN: true }); + +testProp( + 'sequence of deposits and withdrawals', + [ + fc.array( + fc.record({ + party: fc.nat(7), + action: fc.oneof( + fc.record({ In: arbUSDC }), + fc.record({ Part: arbPortion, Slip: arbDelta }), + ), + }), + { minLength: 3 }, + ), + ], + (t, actions) => { + const { PoolShares, USDC } = brands; + const emptyShares = makeEmpty(PoolShares); + const emptyUSDC = makeEmpty(USDC); + let shareWorth = makeParity(make(USDC, 1n), PoolShares); + const myDeposits: Record> = {}; + const myShares: Record> = {}; + + for (const { party, action } of actions) { + if ('In' in action) { + const d = depositCalc(shareWorth, { give: { USDC: action.In } }); + myShares[party] = add( + myShares[party] || emptyShares, + d.payouts.PoolShare, + ); + myDeposits[party] = add(myDeposits[party] || emptyUSDC, action.In); + + const { + payouts: { PoolShare }, + shareWorth: post, + } = d; + const { numerator: poolAmount, denominator: sharesOutstanding } = post; + + t.deepEqual(poolAmount, add(shareWorth.numerator, action.In)); + t.deepEqual(sharesOutstanding, add(shareWorth.denominator, PoolShare)); + + shareWorth = post; + } else if ('Part' in action) { + if (!myShares[party]) continue; + const toGive = scaleAmount(action.Part, myShares[party]); + if (isEmpty(toGive)) continue; + const toGet = scaleAmount(action.Slip, multiplyBy(toGive, shareWorth)); + const s = withdrawCalc(shareWorth, { + give: { PoolShare: toGive }, + want: { USDC: toGet }, + }); + myShares[party] = subtract(myShares[party], toGive); + myDeposits[party] = subtract(myDeposits[party], s.payouts.USDC); + const { numerator: poolAmount, denominator: sharesOutstanding } = + s.shareWorth; + t.deepEqual(poolAmount, subtract(shareWorth.numerator, s.payouts.USDC)); + t.deepEqual( + sharesOutstanding, + subtract(shareWorth.denominator, toGive), + ); + shareWorth = s.shareWorth; + } + } + + if (Object.keys(myShares).length === 0) t.pass(); + + for (const p of Object.keys(myShares)) { + const myValue = multiplyBy(myShares[p], shareWorth); + // t.log(p, ...[myShares[p], myDeposits[p], myValue].map(logAmt).flat()); + t.deepEqual(myValue, myDeposits[p]); + } + + const allShares = Object.values(myShares).reduce( + (acc, v) => add(acc, v), + make(PoolShares, 1n), + ); + t.deepEqual(allShares, shareWorth.denominator); + + if (actions.length < 14) return; + t.log( + actions.length, + 'actions', + Object.keys(myShares).length, + 'parties:', + ...logAmt(allShares), + ); + }, +); + +const makeInitialPoolStats = () => ({ + totalBorrows: makeEmpty(brands.USDC), + totalRepays: makeEmpty(brands.USDC), + totalPoolFees: makeEmpty(brands.USDC), + totalContractFees: makeEmpty(brands.USDC), +}); + +test('basic borrow calculation', t => { + const { USDC } = brands; + const requested = make(USDC, 100n); + const poolSeatAllocation = make(USDC, 200n); + const encumberedBalance = make(USDC, 50n); + const poolStats = makeInitialPoolStats(); + + const result = borrowCalc( + requested, + poolSeatAllocation, + encumberedBalance, + poolStats, + ); + + t.deepEqual( + result.encumberedBalance, + make(USDC, 150n), + 'Outstanding lends should increase by borrowed amount', + ); + t.deepEqual( + result.poolStats.totalBorrows, + make(USDC, 100n), + 'Total borrows should increase by borrowed amount', + ); + t.deepEqual( + Object.keys(result.poolStats), + Object.keys(poolStats), + 'borrowCalc returns all poolStats fields', + ); +}); + +test('borrow fails when requested exceeds or equals pool seat allocation', t => { + const { USDC } = brands; + const requested = make(USDC, 200n); + const poolSeatAllocation = make(USDC, 100n); + const encumberedBalance = make(USDC, 0n); + const poolStats = makeInitialPoolStats(); + + t.throws( + () => + borrowCalc(requested, poolSeatAllocation, encumberedBalance, poolStats), + { + message: /Cannot borrow/, + }, + ); + t.throws( + () => borrowCalc(requested, make(USDC, 200n), encumberedBalance, poolStats), + { + message: /Cannot borrow/, + }, + 'throw when request equals pool seat allocation', + ); + t.notThrows(() => + borrowCalc(requested, make(USDC, 201n), encumberedBalance, poolStats), + ); +}); + +test('basic repay calculation', t => { + const { USDC } = brands; + const shareWorth = makeParity(make(USDC, 1n), brands.PoolShares); + const amounts = { + Principal: make(USDC, 100n), + PoolFee: make(USDC, 10n), + ContractFee: make(USDC, 5n), + }; + const encumberedBalance = make(USDC, 200n); + const poolStats = makeInitialPoolStats(); + const fromSeatAllocation = amounts; + + const result = repayCalc( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, + ); + + t.deepEqual( + result.encumberedBalance, + make(USDC, 100n), + 'Outstanding lends should decrease by principal', + ); + t.deepEqual( + result.poolStats.totalRepays, + amounts.Principal, + 'Total repays should increase by principal', + ); + t.deepEqual( + result.poolStats.totalPoolFees, + amounts.PoolFee, + 'Total pool fees should increase by pool fee', + ); + t.deepEqual( + result.poolStats.totalContractFees, + amounts.ContractFee, + 'Total contract fees should increase by contract fee', + ); + t.deepEqual( + result.poolStats.totalBorrows, + poolStats.totalBorrows, + 'Total borrows should remain unchanged', + ); + t.deepEqual( + result.shareWorth.numerator, + make(USDC, 11n), + 'Share worth numerator should increase by pool fee', + ); + t.deepEqual( + Object.keys(result.poolStats), + Object.keys(poolStats), + 'repayCalc returns all poolStats fields', + ); +}); + +test('repay fails when principal exceeds encumbered balance', t => { + const { USDC } = brands; + + const shareWorth = makeParity(make(USDC, 1n), brands.PoolShares); + const amounts = { + Principal: make(USDC, 200n), + PoolFee: make(USDC, 10n), + ContractFee: make(USDC, 5n), + }; + const encumberedBalance = make(USDC, 100n); + const poolStats = { + ...makeInitialPoolStats(), + totalBorrows: make(USDC, 100n), + }; + + const fromSeatAllocation = amounts; + + t.throws( + () => + repayCalc( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, + ), + { + message: /Cannot repay. Principal .* exceeds encumberedBalance/, + }, + ); + + t.notThrows( + () => + repayCalc(shareWorth, fromSeatAllocation, amounts, make(USDC, 200n), { + ...makeInitialPoolStats(), + totalBorrows: make(USDC, 200n), + }), + 'repay succeeds when principal equals encumbered balance', + ); +}); + +test('repay fails when seat allocation does not equal amounts', t => { + const { USDC } = brands; + + const shareWorth = makeParity(make(USDC, 1n), brands.PoolShares); + const amounts = { + Principal: make(USDC, 200n), + PoolFee: make(USDC, 10n), + ContractFee: make(USDC, 5n), + }; + const encumberedBalance = make(USDC, 100n); + const poolStats = { + ...makeInitialPoolStats(), + totalBorrows: make(USDC, 100n), + }; + + const fromSeatAllocation = { + ...amounts, + ContractFee: make(USDC, 1n), + }; + + t.throws( + () => + repayCalc( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, + ), + { + message: /Cannot repay. From seat allocation .* does not equal amounts/, + }, + ); +}); + +test('repay succeeds with no Pool or Contract Fee', t => { + const { USDC } = brands; + const encumberedBalance = make(USDC, 100n); + const shareWorth = makeParity(make(USDC, 1n), brands.PoolShares); + + const amounts = { + Principal: make(USDC, 25n), + ContractFee: make(USDC, 0n), + PoolFee: make(USDC, 0n), + }; + const poolStats = { + ...makeInitialPoolStats(), + totalBorrows: make(USDC, 100n), + }; + const fromSeatAllocation = amounts; + const actual = repayCalc( + shareWorth, + fromSeatAllocation, + amounts, + encumberedBalance, + poolStats, + ); + t.like(actual, { + shareWorth, + encumberedBalance: { + value: 75n, + }, + }); +}); diff --git a/packages/fast-usdc/test/snapshots/cli.test.ts.md b/packages/fast-usdc/test/snapshots/cli.test.ts.md deleted file mode 100644 index f99a1fe5746..00000000000 --- a/packages/fast-usdc/test/snapshots/cli.test.ts.md +++ /dev/null @@ -1,23 +0,0 @@ -# Snapshot report for `test/cli.test.ts` - -The actual snapshot is saved in `cli.test.ts.snap`. - -Generated by [AVA](https://avajs.dev). - -## CLI shows help when run without arguments - -> Snapshot 1 - - `Usage: fast-usdc [options] [command]␊ - ␊ - CLI to interact with Fast USDC liquidity pool␊ - ␊ - Options:␊ - -V, --version output the version number␊ - -h, --help display help for command␊ - ␊ - Commands:␊ - deposit Offer assets to the liquidity pool␊ - withdraw Withdraw assets from the liquidity pool␊ - help [command] display help for command␊ - ` diff --git a/packages/fast-usdc/test/snapshots/cli.test.ts.snap b/packages/fast-usdc/test/snapshots/cli.test.ts.snap deleted file mode 100644 index 7fb4649fe87..00000000000 Binary files a/packages/fast-usdc/test/snapshots/cli.test.ts.snap and /dev/null differ diff --git a/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md new file mode 100644 index 00000000000..52a2897ceb7 --- /dev/null +++ b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md @@ -0,0 +1,655 @@ +# Snapshot report for `test/fast-usdc.contract.test.ts` + +The actual snapshot is saved in `fast-usdc.contract.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## baggage + +> contract baggage after start + + { + 'Durable Publish Kit_kindHandle': 'Alleged: kind', + Recorder_kindHandle: 'Alleged: kind', + asyncFlow: { + AdminAsyncFlow_kindHandle: 'Alleged: kind', + AdminAsyncFlow_singleton: 'Alleged: AdminAsyncFlow', + Bijection_kindHandle: 'Alleged: kind', + FunctionUnwrapper_kindHandle: 'Alleged: kind', + FunctionUnwrapper_singleton: 'Alleged: FunctionUnwrapper', + LogStoreMetadata: { + generation: 0, + }, + LogStore_kindHandle: 'Alleged: kind', + StateUnwrapper_kindHandle: 'Alleged: kind', + asyncFuncEagerWakers: [ + Object @Alleged: asyncFlow flow {}, + ], + asyncFuncFailures: {}, + flowForOutcomeVow: { + 'Alleged: VowInternalsKit vowV0': 'Alleged: asyncFlow flow', + }, + unwrapMap: 'Alleged: weakMapStore', + }, + chainHub: { + ChainHub_kindHandle: 'Alleged: kind', + ChainHub_singleton: 'Alleged: ChainHub', + bech32PrefixToChainName: { + agoric: 'agoric', + noble: 'noble', + osmo: 'osmosis', + }, + brandDenom: { + 'Alleged: USDC brand': 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + }, + chainInfos: { + agoric: { + bech32Prefix: 'agoric', + chainId: 'agoric-3', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'ubld', + }, + ], + }, + noble: { + bech32Prefix: 'noble', + chainId: 'noble-1', + icqEnabled: false, + pfmEnabled: true, + }, + osmosis: { + bech32Prefix: 'osmo', + chainId: 'osmosis-1', + icqEnabled: true, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uosmo', + }, + ], + }, + }, + connectionInfos: { + 'agoric-3_cosmoshub-4': { + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-5', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_noble-1': { + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + id: 'connection-72', + state: 3, + transferChannel: { + channelId: 'channel-62', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_omniflixhub-1': { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + id: 'connection-67', + state: 3, + transferChannel: { + channelId: 'channel-58', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_osmosis-1': { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_secret-4': { + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_stride-1': { + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-59', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_umee-1': { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_osmosis-1': { + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-2', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_noble-1': { + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + id: 'connection-790', + state: 3, + transferChannel: { + channelId: 'channel-536', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_osmosis-1': { + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + id: 'connection-257', + state: 3, + transferChannel: { + channelId: 'channel-141', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_noble-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_osmosis-1': { + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-3', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_noble-1': { + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + id: 'connection-322', + state: 3, + transferChannel: { + channelId: 'channel-224', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_osmosis-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_noble-1': { + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + id: 'connection-31', + state: 3, + transferChannel: { + channelId: 'channel-30', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_osmosis-1': { + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_omniflixhub-1': { + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + id: 'connection-65', + state: 3, + transferChannel: { + channelId: 'channel-44', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_osmosis-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_secret-4': { + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + id: 'connection-33', + state: 3, + transferChannel: { + channelId: 'channel-17', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_stargaze-1': { + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_umee-1': { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + id: 'connection-74', + state: 3, + transferChannel: { + channelId: 'channel-51', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1_osmosis-1': { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_secret-4': { + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + id: 'connection-1244', + state: 3, + transferChannel: { + channelId: 'channel-88', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_stargaze-1': { + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-1223', + state: 3, + transferChannel: { + channelId: 'channel-75', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_stride-1': { + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + id: 'connection-1657', + state: 3, + transferChannel: { + channelId: 'channel-326', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_umee-1': { + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + id: 'connection-1410', + state: 3, + transferChannel: { + channelId: 'channel-184', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + }, + denom: { + 'agoric:ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9': { + baseDenom: 'uusdc', + baseName: 'noble', + brand: Object @Alleged: USDC brand {}, + chainName: 'agoric', + }, + 'noble:uusdc': { + baseDenom: 'uusdc', + baseName: 'noble', + chainName: 'noble', + }, + 'osmosis:ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4': { + baseDenom: 'uusdc', + baseName: 'noble', + chainName: 'osmosis', + }, + }, + lookupChainInfo_kindHandle: 'Alleged: kind', + lookupChainsAndConnection_kindHandle: 'Alleged: kind', + lookupConnectionInfo_kindHandle: 'Alleged: kind', + }, + contract: { + Advancer: 'Alleged: Fast USDC Advancer advancer', + 'Fast USDC Advancer_kindHandle': 'Alleged: kind', + 'Fast USDC Creator_kindHandle': 'Alleged: kind', + 'Fast USDC Creator_singleton': 'Alleged: Fast USDC Creator', + 'Fast USDC Feed_kindHandle': 'Alleged: kind', + 'Fast USDC Public_kindHandle': 'Alleged: kind', + 'Fast USDC Public_singleton': 'Alleged: Fast USDC Public', + 'Fast USDC Settler_kindHandle': 'Alleged: kind', + 'Fast USDC Status Manager_kindHandle': 'Alleged: kind', + 'Fast USDC Status Manager_singleton': 'Alleged: Fast USDC Status Manager', + 'Feed Kit': { + creator: Object @Alleged: Fast USDC Feed creator {}, + operatorPowers: Object @Alleged: Fast USDC Feed operatorPowers {}, + public: Object @Alleged: Fast USDC Feed public {}, + }, + Kinds: { + 'Transaction Feed_kindHandle': 'Alleged: kind', + }, + 'Liquidity Pool kit': { + borrower: Object @Alleged: Liquidity Pool borrower {}, + depositHandler: Object @Alleged: Liquidity Pool depositHandler {}, + external: Object @Alleged: Liquidity Pool external {}, + public: Object @Alleged: Liquidity Pool public {}, + repayer: Object @Alleged: Liquidity Pool repayer {}, + withdrawHandler: Object @Alleged: Liquidity Pool withdrawHandler {}, + }, + 'Liquidity Pool_kindHandle': 'Alleged: kind', + NobleAccount: 'Vow', + 'Operator Kit_kindHandle': 'Alleged: kind', + PendingTxs: {}, + PoolAccount: 'Vow', + SeenTxs: [], + SettleAccount: 'Vow', + StoredCompletedTxs: [], + mint: { + PoolShare: 'Alleged: zcfMint', + }, + operators: {}, + orchestration: { + makeLocalAccount: { + asyncFlow_kindHandle: 'Alleged: kind', + }, + makeNobleAccount: { + asyncFlow_kindHandle: 'Alleged: kind', + }, + }, + pending: {}, + risks: {}, + vstorage: { + 'Durable Publish Kit_kindHandle': 'Alleged: kind', + Recorder_kindHandle: 'Alleged: kind', + }, + }, + firstIncarnationKey: true, + orchestration: { + 'Cosmos Orchestration Account Holder_kindHandle': 'Alleged: kind', + 'Local Orchestration Account Kit_kindHandle': 'Alleged: kind', + LocalChainFacade_kindHandle: 'Alleged: kind', + Orchestrator_kindHandle: 'Alleged: kind', + RemoteChainFacade_kindHandle: 'Alleged: kind', + chainName: { + agoric: { + pending: false, + value: Object @Alleged: LocalChainFacade public {}, + }, + noble: { + pending: false, + value: Object @Alleged: RemoteChainFacade public {}, + }, + }, + ibcTools: { + IBCTransferSenderKit_kindHandle: 'Alleged: kind', + ibcResultWatcher_kindHandle: 'Alleged: kind', + ibcResultWatcher_singleton: 'Alleged: ibcResultWatcher', + }, + packetTools: { + PacketToolsKit_kindHandle: 'Alleged: kind', + }, + }, + vows: { + AdminRetryableFlow_kindHandle: 'Alleged: kind', + AdminRetryableFlow_singleton: 'Alleged: AdminRetryableFlow', + PromiseWatcher_kindHandle: 'Alleged: kind', + VowInternalsKit_kindHandle: 'Alleged: kind', + WatchUtils_kindHandle: 'Alleged: kind', + retryableFlowForOutcomeVow: {}, + }, + } diff --git a/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.snap b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.snap new file mode 100644 index 00000000000..2554e4fe33d Binary files /dev/null and b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.snap differ diff --git a/packages/fast-usdc/test/supports.ts b/packages/fast-usdc/test/supports.ts new file mode 100644 index 00000000000..6a4608a0cf5 --- /dev/null +++ b/packages/fast-usdc/test/supports.ts @@ -0,0 +1,284 @@ +import { makeIssuerKit } from '@agoric/ertp'; +import { VTRANSFER_IBC_EVENT } from '@agoric/internal/src/action-types.js'; +import { + defaultSerializer, + makeFakeStorageKit, +} from '@agoric/internal/src/storage-test-utils.js'; +import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; +import { + denomHash, + withChainCapabilities, + type CosmosChainInfo, + type Denom, +} from '@agoric/orchestration'; +import { registerKnownChains } from '@agoric/orchestration/src/chain-info.js'; +import { + makeChainHub, + type DenomDetail, +} 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 { setupFakeNetwork } from '@agoric/orchestration/test/network-fakes.js'; +import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js'; +import { makeTestAddress } from '@agoric/orchestration/tools/make-test-address.js'; +import { reincarnate } from '@agoric/swingset-liveslots/tools/setup-vat-data.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, type Zone } from '@agoric/zone'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { E } from '@endo/far'; +import type { ExecutionContext } from 'ava'; +import { makeTestFeeConfig } from './mocks.js'; + +export { + makeFakeLocalchainBridge, + makeFakeTransferBridge, +} from '@agoric/vats/tools/fake-bridge.js'; + +const assetOn = ( + baseDenom: Denom, + baseName: string, + chainName?: string, + infoOf?: Record, + brandKey?: string, +): [string, DenomDetail & { brandKey?: string }] => { + if (!chainName) { + return [baseDenom, { baseName, chainName: baseName, baseDenom }]; + } + if (!infoOf) throw Error(`must provide infoOf`); + const issuerInfo = infoOf[baseName]; + const holdingInfo = infoOf[chainName]; + if (!holdingInfo) throw Error(`${chainName} missing`); + if (!holdingInfo.connections) + throw Error(`connections missing for ${chainName}`); + const { channelId } = + holdingInfo.connections[issuerInfo.chainId].transferChannel; + const denom = `ibc/${denomHash({ denom: baseDenom, channelId })}`; + return [denom, { baseName, chainName, baseDenom, brandKey }]; +}; + +export const [uusdcOnAgoric, agUSDCDetail] = assetOn( + 'uusdc', + 'noble', + 'agoric', + fetchedChainInfo, + 'USDC', +); + +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 usdc = withAmountUtils(makeIssuerKit('USDC')); + const bankBridgeMessages = [] as any[]; + const { bankManager, pourPayment } = await makeFakeBankManagerKit({ + onToBridge: obj => bankBridgeMessages.push(obj), + }); + await E(bankManager).addAsset( + uusdcOnAgoric, + 'USDC', + 'USD Circle Stablecoin', + usdc.issuerKit, + ); + // These mints no longer stay in sync with bankManager. + // Use pourPayment() for IST. + const { mint: _i, ...usdcSansMint } = usdc; + // 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( + uusdcOnAgoric, + /** @type {AssetInfo} */ harden({ + brand: usdc.brand, + issuer: usdc.issuer, + issuerName: 'USDC', + denom: 'uusdc', + proposedName: 'USDC', + 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), + makeTestAddress, + ); + const localchain = prepareLocalChainTools( + rootZone.subZone('localchain'), + vowTools, + ).makeLocalChain({ + bankManager, + system: localchainBridge, + transfer: transferMiddleware, + }); + const timer = buildZoeManualTimer(t.log); + const marshaller = makeFakeBoard().getPublishingMarshaller(); + const storage = makeFakeStorageKit( + 'fun', // Fast USDC Node + ); + /** + * Read pure data (CapData that has no slots) from the storage path + * @param path + */ + storage.getDeserialized = (path: string): unknown => + storage.getValues(path).map(defaultSerializer.parse); + + 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, + ); + + const chainInfo = harden(() => { + const { agoric, osmosis, noble } = withChainCapabilities(fetchedChainInfo); + return { agoric, osmosis, noble }; + })(); + + const assetInfo: [Denom, DenomDetail & { brandKey?: string }][] = harden([ + assetOn('uusdc', 'noble'), + [uusdcOnAgoric, agUSDCDetail], + assetOn('uusdc', 'noble', 'osmosis', fetchedChainInfo), + ]); + + 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: { + usdc: usdcSansMint, + }, + mocks: { + ibcBridge, + transferBridge, + }, + commonPrivateArgs: { + agoricNames, + localchain, + orchestrationService: cosmosInterchainService, + storageNode: storage.rootNode, + poolMetricsNode: storage.rootNode.makeChildNode('poolMetrics'), + marshaller, + timerService: timer, + feeConfig: makeTestFeeConfig(usdc), + chainInfo, + assetInfo, + }, + facadeServices: { + agoricNames, + /** A chainHub for Exo tests, distinct from the one a contract makes within `withOrchestration` */ + chainHub, + localchain, + orchestrationService: cosmosInterchainService, + timerService: timer, + }, + utils: { + pourPayment, + inspectLocalBridge: () => harden([...localBridgeMessages]), + inspectDibcBridge: () => E(ibcBridge).inspectDibcBridge(), + inspectBankBridge: () => harden([...bankBridgeMessages]), + transmitTransferAck, + }, + }; +}; + +export const makeDefaultContext = (contract: Installation) => {}; + +/** + * Reincarnate without relaxDurabilityRules and provide a durable zone in the incarnation. + * @param key + */ +export const provideDurableZone = (key: string): Zone => { + const { fakeVomKit } = reincarnate({ relaxDurabilityRules: false }); + const root = fakeVomKit.cm.provideBaggage(); + const zone = makeDurableZone(root); + return zone.subZone(key); +}; diff --git a/packages/fast-usdc/test/type-guards.test.ts b/packages/fast-usdc/test/type-guards.test.ts new file mode 100644 index 00000000000..cefea175705 --- /dev/null +++ b/packages/fast-usdc/test/type-guards.test.ts @@ -0,0 +1,39 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; + +import { mustMatch } from '@endo/patterns'; +import { TxStatus, PendingTxStatus } from '../src/constants.js'; +import { CctpTxEvidenceShape, PendingTxShape } from '../src/type-guards.js'; +import type { CctpTxEvidence } from '../src/types.js'; + +import { MockCctpTxEvidences } from './fixtures.js'; + +test('CctpTxEvidenceShape', t => { + const specimen: CctpTxEvidence = harden( + MockCctpTxEvidences.AGORIC_PLUS_OSMO(), + ); + + t.notThrows(() => mustMatch(specimen, CctpTxEvidenceShape)); +}); + +test('PendingTxShape', t => { + const specimen: CctpTxEvidence & { status: TxStatus } = harden({ + ...MockCctpTxEvidences.AGORIC_PLUS_OSMO(), + status: PendingTxStatus.Observed, + }); + + t.notThrows(() => mustMatch(specimen, PendingTxShape)); + + t.notThrows(() => + mustMatch( + harden({ ...specimen, status: PendingTxStatus.Advanced }), + PendingTxShape, + ), + ); + + t.throws(() => + mustMatch( + harden({ ...specimen, status: TxStatus.Settled }), + PendingTxShape, + ), + ); +}); diff --git a/packages/fast-usdc/test/util/file.test.ts b/packages/fast-usdc/test/util/file.test.ts new file mode 100644 index 00000000000..c95f3790da0 --- /dev/null +++ b/packages/fast-usdc/test/util/file.test.ts @@ -0,0 +1,148 @@ +import test from 'ava'; +import { makeFile } from '../../src/util/file.js'; + +const makeReadMock = (content: string) => { + let filePathRead: string; + let encodingUsed: string; + const readFile = (filePath: string, encoding: string) => { + filePathRead = filePath; + encodingUsed = encoding; + return content; + }; + return { + getFilePathRead: () => filePathRead, + getEncodingUsed: () => encodingUsed, + readFile, + }; +}; + +const makeExistsMock = (exists: boolean) => { + let filePathRead: string; + const pathExists = (filePath: string) => { + filePathRead = filePath; + return exists; + }; + return { + getFilePathRead: () => filePathRead, + pathExists, + }; +}; + +const makeWriteMock = () => { + let filePathWritten: string; + let contentsWritten: string; + const writeFile = (filePath: string, contents: string) => { + filePathWritten = filePath; + contentsWritten = contents; + }; + return { + getFilePathWritten: () => filePathWritten, + getContentsWritten: () => contentsWritten, + writeFile, + }; +}; + +const makeMkdirMock = () => { + let dirPathMade: string; + const mkdir = (dirPath: string) => { + dirPathMade = dirPath; + }; + return { + getDirPathMade: () => dirPathMade, + mkdir, + }; +}; + +test('returns the path', t => { + const path = 'config/dir/.fast-usdc/config.json'; + const file = makeFile(path); + + t.is(file.path, path); +}); + +test('reads the file contents', async t => { + const path = 'config/dir/.fast-usdc/config.json'; + const content = 'foo'; + const readMock = makeReadMock(content); + // @ts-expect-error mocking readFile + const file = makeFile(path, readMock.readFile); + + const result = await file.read(); + t.is(result, content); + t.is(readMock.getEncodingUsed(), 'utf-8'); + t.is(readMock.getFilePathRead(), path); +}); + +test('can tell whether the file exists', t => { + const path = 'config/dir/.fast-usdc/config.json'; + const mock1 = makeExistsMock(false); + const mock2 = makeExistsMock(true); + const file1 = makeFile( + path, + // @ts-expect-error mocking + undefined, + undefined, + undefined, + mock1.pathExists, + ); + const file2 = makeFile( + path, + // @ts-expect-error mocking + undefined, + undefined, + undefined, + mock2.pathExists, + ); + + const res1 = file1.exists(); + const res2 = file2.exists(); + + t.is(res1, false); + t.is(mock1.getFilePathRead(), path); + t.is(res2, true); + t.is(mock2.getFilePathRead(), path); +}); + +test('writes the file if the directory exists', async t => { + const dir = 'config/dir/.fast-usdc'; + const path = `${dir}/config.json`; + const mockExists = makeExistsMock(true); + const mockWrite = makeWriteMock(); + const file = makeFile( + path, + // @ts-expect-error mocking + undefined, + mockWrite.writeFile, + undefined, + mockExists.pathExists, + ); + + await file.write('foo'); + + t.is(mockExists.getFilePathRead(), dir); + t.is(mockWrite.getContentsWritten(), 'foo'); + t.is(mockWrite.getFilePathWritten(), path); +}); + +test('creates the directory if it does not exist', async t => { + const dir = 'config/dir/.fast-usdc'; + const path = `${dir}/config.json`; + const mockExists = makeExistsMock(false); + const mockWrite = makeWriteMock(); + const mockMkdir = makeMkdirMock(); + const file = makeFile( + path, + // @ts-expect-error mocking + undefined, + mockWrite.writeFile, + mockMkdir.mkdir, + mockExists.pathExists, + ); + + await file.write('foo'); + + t.is(mockExists.getFilePathRead(), dir); + t.is(mockMkdir.getDirPathMade(), dir); + t.is(mockWrite.getContentsWritten(), 'foo'); + t.is(mockWrite.getFilePathWritten(), path); +}); diff --git a/packages/fast-usdc/test/utils/fees.test.ts b/packages/fast-usdc/test/utils/fees.test.ts new file mode 100644 index 00000000000..07004b3b125 --- /dev/null +++ b/packages/fast-usdc/test/utils/fees.test.ts @@ -0,0 +1,213 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { makeIssuerKit, AmountMath } from '@agoric/ertp'; +import { makeRatioFromAmounts } from '@agoric/zoe/src/contractSupport/ratio.js'; +import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import { q } from '@endo/errors'; +import { makeFeeTools } from '../../src/utils/fees.js'; +import type { FeeConfig } from '../../src/types.js'; +import { makeTestFeeConfig } from '../mocks.js'; +import { MockCctpTxEvidences } from '../fixtures.js'; + +const { add, isEqual } = AmountMath; + +const issuerKits = { + USDC: makeIssuerKit<'nat'>('USDC'), +}; +const { brand: usdcBrand } = issuerKits.USDC; + +const USDC = (value: bigint) => AmountMath.make(usdcBrand, value); +const USDCRatio = (numerator: bigint, denominator: bigint = 100n) => + makeRatioFromAmounts(USDC(numerator), USDC(denominator)); + +const aFeeConfig: FeeConfig = { + flat: USDC(10n), + variableRate: USDCRatio(2n), + maxVariable: USDC(100n), + contractRate: USDCRatio(20n), +}; +harden(aFeeConfig); + +type FeelToolsScenario = { + name: string; + config?: FeeConfig; + requested: Amount<'nat'>; + expected: { + totalFee: Amount<'nat'>; + advance: Amount<'nat'>; + split: { + ContractFee: Amount<'nat'>; + PoolFee: Amount<'nat'>; + }; + }; +}; + +const feeToolsScenario = test.macro({ + title: (_, { name }: FeelToolsScenario) => `fee calcs: ${name}`, + exec: ( + t, + { config = aFeeConfig, requested, expected }: FeelToolsScenario, + ) => { + const { totalFee, advance, split } = expected; + const feeTools = makeFeeTools(harden(config)); + + const debugString = `expected:\n${q(feeTools.calculateSplit(requested)).toString()}`; + t.true( + isEqual(totalFee, add(split.ContractFee, split.PoolFee)), + `sanity check: total fee equals sum of splits. ${debugString}`, + ); + t.true( + isEqual(requested, add(totalFee, advance)), + `sanity check: requested equals advance plus fee. ${debugString}`, + ); + + t.deepEqual(feeTools.calculateAdvanceFee(requested), totalFee); + t.deepEqual(feeTools.calculateAdvance(requested), advance); + t.deepEqual(feeTools.calculateSplit(requested), { + ...split, + Principal: advance, + }); + }, +}); + +test(feeToolsScenario, { + name: 'below max variable fee', + requested: USDC(1000n), + expected: { + totalFee: USDC(30n), // 10 flat + 20 variable + advance: USDC(970n), + split: { + ContractFee: USDC(6n), + PoolFee: USDC(24n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'above max variable fee', + requested: USDC(10000n), + expected: { + totalFee: USDC(110n), // 10 flat + 100 max + advance: USDC(9890n), + split: { + ContractFee: USDC(22n), + PoolFee: USDC(88n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'zero variable fee', + requested: USDC(1000n), + config: { + ...aFeeConfig, + variableRate: USDCRatio(0n), + }, + expected: { + totalFee: USDC(10n), // only flat + advance: USDC(990n), + split: { + ContractFee: USDC(2n), + PoolFee: USDC(8n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'zero flat fee', + requested: USDC(1000n), + config: { + ...aFeeConfig, + flat: USDC(0n), + }, + expected: { + totalFee: USDC(20n), // only variable + advance: USDC(980n), + split: { + ContractFee: USDC(4n), + PoolFee: USDC(16n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'zero fees (free)', + requested: USDC(100n), + config: { + ...aFeeConfig, + flat: USDC(0n), + variableRate: USDCRatio(0n), + }, + expected: { + totalFee: USDC(0n), // no fee charged + advance: USDC(100n), + split: { + ContractFee: USDC(0n), + PoolFee: USDC(0n), + }, + }, +}); + +test(feeToolsScenario, { + // TODO consider behavior where 0 or undefined means "no fee cap" + name: 'only flat is charged if `maxVariable: 0`', + requested: USDC(10000n), + config: { + ...aFeeConfig, + variableRate: USDCRatio(20n), + maxVariable: USDC(0n), + }, + expected: { + totalFee: USDC(10n), // only flat + advance: USDC(9990n), + split: { + ContractFee: USDC(2n), + PoolFee: USDC(8n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'AGORIC_PLUS_OSMO with commonPrivateArgs.feeConfig', + // 150_000_000n + requested: USDC(MockCctpTxEvidences.AGORIC_PLUS_OSMO().tx.amount), + // same as commonPrivateArgs.feeConfig from `CommonSetup` + config: makeTestFeeConfig(withAmountUtils(issuerKits.USDC)), + expected: { + totalFee: USDC(3000001n), // 1n + min(2% of 150USDC, 5USDC) + advance: USDC(146999999n), + split: { + ContractFee: USDC(600000n), // 20% of fee + PoolFee: USDC(2400001n), + }, + }, +}); + +test(feeToolsScenario, { + name: 'AGORIC_PLUS_DYDX with commonPrivateArgs.feeConfig', + // 300_000_000n + requested: USDC(MockCctpTxEvidences.AGORIC_PLUS_DYDX().tx.amount), + // same as commonPrivateArgs.feeConfig from `CommonSetup` + config: makeTestFeeConfig(withAmountUtils(issuerKits.USDC)), + expected: { + totalFee: USDC(5000001n), // 1n + min(2% of 300USDC, 5USDC) + advance: USDC(294999999n), + split: { + ContractFee: USDC(1000000n), // 20% of fee + PoolFee: USDC(4000001n), + }, + }, +}); + +test('request must exceed fees', t => { + const feeTools = makeFeeTools(aFeeConfig); + + const expectedError = { message: 'Request must exceed fees.' }; + + for (const requested of [0n, 2n, 10n].map(USDC)) { + t.throws(() => feeTools.calculateAdvanceFee(requested), expectedError); + t.throws(() => feeTools.calculateAdvance(requested), expectedError); + t.throws(() => feeTools.calculateSplit(requested), expectedError); + } + // advance can be smaller than fee + t.is(feeTools.calculateAdvanceFee(USDC(11n)).value, 10n); +}); diff --git a/packages/fast-usdc/testing/mocks.ts b/packages/fast-usdc/testing/mocks.ts new file mode 100644 index 00000000000..55b0a495ee6 --- /dev/null +++ b/packages/fast-usdc/testing/mocks.ts @@ -0,0 +1,66 @@ +export const mockOut = () => { + let logOut = ''; + let errOut = ''; + return { + log: (s: string) => (logOut += `${s}\n`), + error: (s: string) => (errOut += `${s}\n`), + getLogOut: () => logOut, + getErrOut: () => errOut, + }; +}; + +export const mockrl = (answer: string) => { + return { + question: () => Promise.resolve(answer), + close: () => {}, + }; +}; + +export const mockFile = (path: string, contents = '') => { + const read = async () => { + if (!contents) { + throw new Error(); + } + return contents; + }; + const write = async (val: string) => { + contents = val; + }; + const exists = () => !!contents; + + return { read, write, exists, path }; +}; + +export const makeVstorageMock = (records: { [key: string]: any }) => { + const queryCounts = {}; + const vstorage = { + readLatest: async (path: string) => { + queryCounts[path] = (queryCounts[path] ?? 0) + 1; + return records[path]; + }, + }; + + return { vstorage, getQueryCounts: () => queryCounts }; +}; + +export const makeFetchMock = get => { + const queryCounts = {}; + const fetch = async (path: string) => { + queryCounts[path] = (queryCounts[path] ?? 0) + 1; + return { json: async () => get(path) }; + }; + + return { fetch, getQueryCounts: () => queryCounts }; +}; + +export const makeMockSigner = () => { + let signedArgs; + const signer = { + signAndBroadcast: async (...args) => { + signedArgs = harden(args); + return { code: 0, transactionHash: 'SUCCESSHASH' }; + }, + }; + + return { getSigned: () => signedArgs, signer }; +}; diff --git a/packages/fast-usdc/tools/cli-tools.ts b/packages/fast-usdc/tools/cli-tools.ts new file mode 100644 index 00000000000..12af12653e3 --- /dev/null +++ b/packages/fast-usdc/tools/cli-tools.ts @@ -0,0 +1,9 @@ +export const flags = ( + record: Record, +): string[] => { + // @ts-expect-error undefined is filtered out + const skipUndef: [string, string][] = Object.entries(record).filter( + ([_k, v]) => v !== undefined, + ); + return skipUndef.map(([k, v]) => [`--${k}`, `${v}`]).flat(); +}; diff --git a/packages/fast-usdc/tools/mock-io.ts b/packages/fast-usdc/tools/mock-io.ts new file mode 100644 index 00000000000..0cb6ced28e6 --- /dev/null +++ b/packages/fast-usdc/tools/mock-io.ts @@ -0,0 +1,14 @@ +import type { Writable } from 'node:stream'; + +/** + * mock stdout / stderr, for example + * + * @param buf - caller-provided buffer for written data + */ +export const mockStream = (buf: string[]): T => + ({ + write: txt => { + buf.push(txt); + return true; + }, + }) as T; diff --git a/packages/fast-usdc/tsconfig.json b/packages/fast-usdc/tsconfig.json index 2bb806097ef..de2e8c94eb8 100644 --- a/packages/fast-usdc/tsconfig.json +++ b/packages/fast-usdc/tsconfig.json @@ -1,10 +1,10 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { - "strict": true, - }, + "compilerOptions": {}, "include": [ + "scripts", "src", "test", + "testing" ], } diff --git a/packages/governance/package.json b/packages/governance/package.json index a7e19089b78..8fcbef02fb7 100644 --- a/packages/governance/package.json +++ b/packages/governance/package.json @@ -13,7 +13,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -31,6 +31,7 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/internal": "^0.4.0-u18.0", "@agoric/notifier": "^0.7.0-u18.0", @@ -38,22 +39,21 @@ "@agoric/time": "^0.3.3-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8", "import-meta-resolve": "^2.2.1" }, "devDependencies": { "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/init": "^1.1.7", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "README.md", @@ -76,6 +76,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 89.35 + "atLeast": 89.49 } } diff --git a/packages/governance/src/contractGovernance/paramManager.js b/packages/governance/src/contractGovernance/paramManager.js index ccafa4fc6b7..f79d9af10cc 100644 --- a/packages/governance/src/contractGovernance/paramManager.js +++ b/packages/governance/src/contractGovernance/paramManager.js @@ -120,7 +120,6 @@ const makeParamManagerBuilder = (publisherKit, zoe) => { }); // names are keywords so they will necessarily be TitleCase - // eslint-disable-next-line no-use-before-define getters[`get${name}`] = () => getTypedParam(type, name); // CRUCIAL: here we're creating the update functions that can change the // values of the governed contract's parameters. We'll return the updateFns @@ -292,7 +291,6 @@ const makeParamManagerBuilder = (publisherKit, zoe) => { getVisibleValue, }); - // eslint-disable-next-line no-use-before-define getters[`get${name}`] = () => getTypedParam(ParamTypes.INVITATION, name); // CRUCIAL: here we're creating the update functions that can change the // values of the governed contract's parameters. We'll return updateParams diff --git a/packages/governance/src/contractHelper.js b/packages/governance/src/contractHelper.js index c3a0896ea1d..e47b0709f54 100644 --- a/packages/governance/src/contractHelper.js +++ b/packages/governance/src/contractHelper.js @@ -250,6 +250,7 @@ const facetHelpers = (zcf, paramManager) => { * @param {M} paramTypesMap * @param {ERef} [storageNode] * @param {ERef} [marshaller] + * @param {object} [overrides] */ const handleParamGovernance = ( zcf, @@ -257,6 +258,7 @@ const handleParamGovernance = ( paramTypesMap, storageNode, marshaller, + overrides, ) => { /** @type {import('@agoric/notifier').StoredPublisherKit} */ const publisherKit = makeStoredPublisherKit( @@ -269,6 +271,7 @@ const handleParamGovernance = ( zcf, { Electorate: initialPoserInvitation }, paramTypesMap, + overrides, ); return facetHelpers(zcf, paramManager); diff --git a/packages/governance/src/typeGuards.js b/packages/governance/src/typeGuards.js index 6e41726003d..acfd82f7c78 100644 --- a/packages/governance/src/typeGuards.js +++ b/packages/governance/src/typeGuards.js @@ -17,26 +17,31 @@ export const ElectionTypeShape = M.or( 'offer_filter', ); -export const ClosingRuleShape = harden({ +export const ClosingRuleShape = { timer: M.eref(TimerShape), deadline: TimestampShape, -}); +}; +harden(ClosingRuleShape); // all the strings that will be in the filter after passing -export const YesOfferFilterPositionShape = harden({ +export const YesOfferFilterPositionShape = { strings: M.arrayOf(M.string()), -}); -export const NoOfferFilterPositionShape = harden({ - dontUpdate: M.arrayOf(M.string()), -}); -export const OfferFilterPositionsShape = harden([ +}; +harden(YesOfferFilterPositionShape); + +export const NoOfferFilterPositionShape = { dontUpdate: M.arrayOf(M.string()) }; +harden(NoOfferFilterPositionShape); + +export const OfferFilterPositionsShape = [ YesOfferFilterPositionShape, NoOfferFilterPositionShape, -]); -export const OfferFilterIssueShape = harden({ - strings: M.arrayOf(M.string()), -}); -export const OfferFilterQuestionSpecShape = harden({ +]; +harden(OfferFilterPositionsShape); + +export const OfferFilterIssueShape = { strings: M.arrayOf(M.string()) }; +harden(OfferFilterIssueShape); + +export const OfferFilterQuestionSpecShape = { method: ChoiceMethodShape, issue: OfferFilterIssueShape, positions: OfferFilterPositionsShape, @@ -46,34 +51,41 @@ export const OfferFilterQuestionSpecShape = harden({ closingRule: ClosingRuleShape, quorumRule: QuorumRuleShape, tieOutcome: NoOfferFilterPositionShape, -}); -export const OfferFilterQuestionDetailsShape = harden({ +}; +harden(OfferFilterQuestionSpecShape); + +export const OfferFilterQuestionDetailsShape = { ...OfferFilterQuestionSpecShape, questionHandle: makeHandleShape('Question'), counterInstance: InstanceHandleShape, -}); +}; +harden(OfferFilterQuestionDetailsShape); // keys are parameter names, values are proposed values export const ParamChangesSpecShape = M.recordOf(M.string(), M.any()); export const YesParamChangesPositionShape = ParamChangesSpecShape; -export const NoParamChangesPositionShape = harden({ - noChange: M.arrayOf(M.string()), -}); -export const ParamChangesPositionsShape = harden([ +export const NoParamChangesPositionShape = { noChange: M.arrayOf(M.string()) }; +harden(NoParamChangesPositionShape); + +export const ParamChangesPositionsShape = [ YesParamChangesPositionShape, NoParamChangesPositionShape, -]); -export const ParamPathShape = harden({ - key: M.any(), -}); -export const ParamChangesIssueShape = harden({ +]; +harden(ParamChangesPositionsShape); + +export const ParamPathShape = { key: M.any() }; +harden(ParamPathShape); + +export const ParamChangesIssueShape = { spec: { paramPath: ParamPathShape, changes: ParamChangesSpecShape, }, contract: InstanceHandleShape, -}); -export const ParamChangesQuestionSpecShape = harden({ +}; +harden(ParamChangesIssueShape); + +export const ParamChangesQuestionSpecShape = { method: 'unranked', issue: ParamChangesIssueShape, positions: ParamChangesPositionsShape, @@ -83,27 +95,33 @@ export const ParamChangesQuestionSpecShape = harden({ closingRule: ClosingRuleShape, quorumRule: 'majority', tieOutcome: NoParamChangesPositionShape, -}); +}; +harden(ParamChangesQuestionSpecShape); -export const ParamChangesQuestionDetailsShape = harden({ +export const ParamChangesQuestionDetailsShape = { ...ParamChangesQuestionSpecShape, questionHandle: makeHandleShape('Question'), counterInstance: InstanceHandleShape, -}); +}; +harden(ParamChangesQuestionDetailsShape); -const ApiInvocationSpecShape = harden({ +const ApiInvocationSpecShape = { apiMethodName: M.string(), methodArgs: M.arrayOf(M.any()), -}); +}; +harden(ApiInvocationSpecShape); + export const YesApiInvocationPositionShape = ApiInvocationSpecShape; -export const NoApiInvocationPositionShape = harden({ - dontInvoke: M.string(), -}); -export const ApiInvocationPositionsShape = harden([ +export const NoApiInvocationPositionShape = { dontInvoke: M.string() }; +harden(NoApiInvocationPositionShape); + +export const ApiInvocationPositionsShape = [ YesApiInvocationPositionShape, NoApiInvocationPositionShape, -]); -export const ApiInvocationQuestionSpecShape = harden({ +]; +harden(ApiInvocationPositionsShape); + +export const ApiInvocationQuestionSpecShape = { method: 'unranked', issue: ApiInvocationSpecShape, positions: ApiInvocationPositionsShape, @@ -113,39 +131,53 @@ export const ApiInvocationQuestionSpecShape = harden({ closingRule: ClosingRuleShape, quorumRule: QuorumRuleShape, tieOutcome: NoApiInvocationPositionShape, -}); -export const ApiInvocationQuestionDetailsShape = harden({ +}; +harden(ApiInvocationQuestionSpecShape); + +export const ApiInvocationQuestionDetailsShape = { ...ApiInvocationQuestionSpecShape, questionHandle: makeHandleShape('Question'), counterInstance: InstanceHandleShape, -}); +}; +harden(ApiInvocationQuestionDetailsShape); -const SimpleSpecShape = harden({ - text: M.string(), -}); -export const YesSimplePositionShape = harden({ text: M.string() }); -export const NoSimplePositionShape = harden({ text: M.string() }); -export const SimplePositionsShape = harden([ +const SimpleSpecShape = { text: M.string() }; +harden(SimpleSpecShape); + +export const YesSimplePositionShape = { text: M.string() }; +harden(YesSimplePositionShape); + +export const NoSimplePositionShape = { text: M.string() }; +harden(NoSimplePositionShape); + +export const SimplePositionsShape = [ YesSimplePositionShape, NoSimplePositionShape, -]); +]; +harden(SimplePositionsShape); + export const SimpleIssueShape = SimpleSpecShape; -export const SimpleQuestionSpecShape = harden({ +harden(SimpleIssueShape); + +export const SimpleQuestionSpecShape = { method: ChoiceMethodShape, issue: SimpleIssueShape, - positions: M.arrayOf(harden({ text: M.string() })), + positions: M.arrayOf({ text: M.string() }), electionType: M.or('election', 'survey'), maxChoices: M.gte(1), maxWinners: M.gte(1), closingRule: ClosingRuleShape, quorumRule: QuorumRuleShape, tieOutcome: NoSimplePositionShape, -}); -export const SimpleQuestionDetailsShape = harden({ +}; +harden(SimpleQuestionSpecShape); + +export const SimpleQuestionDetailsShape = { ...SimpleQuestionSpecShape, questionHandle: makeHandleShape('Question'), counterInstance: InstanceHandleShape, -}); +}; +harden(SimpleQuestionDetailsShape); export const QuestionSpecShape = M.or( ApiInvocationQuestionSpecShape, @@ -199,11 +231,12 @@ export const ElectorateCreatorI = M.interface('Committee AdminFacet', { getPublicFacet: M.call().returns(ElectoratePublicShape), }); -export const QuestionStatsShape = harden({ +export const QuestionStatsShape = { spoiled: M.nat(), votes: M.nat(), results: M.arrayOf({ position: PositionShape, total: M.nat() }), -}); +}; +harden(QuestionStatsShape); export const QuestionI = M.interface('Question', { getVoteCounter: M.call().returns(InstanceHandleShape), diff --git a/packages/import-manager/package.json b/packages/import-manager/package.json index 48950e68688..300c144f3dc 100644 --- a/packages/import-manager/package.json +++ b/packages/import-manager/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint": "yarn lint:eslint", "lint-fix": "yarn lint:eslint --fix", @@ -32,7 +32,7 @@ "devDependencies": { "@agoric/swingset-vat": "^0.33.0-u18.0", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "src/", diff --git a/packages/inter-protocol/package.json b/packages/inter-protocol/package.json index c9da4fddde2..02c3e2e4c1e 100644 --- a/packages/inter-protocol/package.json +++ b/packages/inter-protocol/package.json @@ -13,7 +13,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -31,6 +31,7 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/governance": "^0.10.4-u18.0", "@agoric/internal": "^0.4.0-u18.0", @@ -40,26 +41,25 @@ "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/vats": "^0.16.0-u18.4", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/captp": "^4.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7", + "@agoric/zone": "^0.3.0-u18.0", + "@endo/captp": "^4.4.3", + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8", "jessie.js": "^0.3.4" }, "devDependencies": { "@agoric/smart-wallet": "^0.5.4-u18.4", "@agoric/swingset-liveslots": "^0.10.3-u18.0", "@agoric/swingset-vat": "^0.33.0-u18.0", - "@agoric/zone": "^0.3.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/init": "^1.1.6", - "@endo/promise-kit": "^1.1.7", + "@endo/bundle-source": "^3.5.0", + "@endo/init": "^1.1.7", + "@endo/promise-kit": "^1.1.8", "@fast-check/ava": "^1.1.5", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "deep-object-diff": "^1.1.9", "import-meta-resolve": "^2.2.1" }, @@ -82,6 +82,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 95.8 + "atLeast": 95.58 } } diff --git a/packages/inter-protocol/src/auction/auctioneer.js b/packages/inter-protocol/src/auction/auctioneer.js index 1eed4c9d48a..a09589c9a7e 100644 --- a/packages/inter-protocol/src/auction/auctioneer.js +++ b/packages/inter-protocol/src/auction/auctioneer.js @@ -6,7 +6,7 @@ import { E } from '@endo/eventual-send'; import { Far } from '@endo/marshal'; import { AmountMath, AmountShape, BrandShape } from '@agoric/ertp'; import { handleParamGovernance } from '@agoric/governance'; -import { BASIS_POINTS, makeTracer } from '@agoric/internal'; +import { makeTracer } from '@agoric/internal'; import { prepareDurablePublishKit } from '@agoric/notifier'; import { mustMatch } from '@agoric/store'; import { appendToStoredArray } from '@agoric/store/src/stores/store-utils.js'; @@ -40,6 +40,8 @@ import { AuctionState } from './util.js'; * @import {PriceAuthority, PriceDescription, PriceQuote, PriceQuoteValue, PriceQuery,} from '@agoric/zoe/tools/types.js'; */ +const BASIS_POINTS = 10_000n; + const { add, multiply } = natSafeMath; const trace = makeTracer('Auction', true); @@ -584,7 +586,6 @@ export const start = async (zcf, privateArgs, baggage) => { }, }); - // eslint-disable-next-line no-use-before-define const isActive = () => scheduler.getAuctionState() === AuctionState.ACTIVE; /** @@ -651,7 +652,6 @@ export const start = async (zcf, privateArgs, baggage) => { ); }, getSchedules() { - // eslint-disable-next-line no-use-before-define return scheduler.getSchedule(); }, getScheduleUpdates() { diff --git a/packages/inter-protocol/src/auction/scheduler.js b/packages/inter-protocol/src/auction/scheduler.js index 57ead7b8d97..68eaa038a99 100644 --- a/packages/inter-protocol/src/auction/scheduler.js +++ b/packages/inter-protocol/src/auction/scheduler.js @@ -244,7 +244,6 @@ export const makeScheduler = async ( try { setTimeMonotonically(time); auctionDriver.capturePrices(); - // eslint-disable-next-line no-use-before-define return startAuction(); } catch (e) { console.error(`⚠️ Auction threw ${e}. Caught in SchedulerWaker.`); diff --git a/packages/inter-protocol/src/proposals/econ-behaviors.js b/packages/inter-protocol/src/proposals/econ-behaviors.js index 9b58897e6c9..a90744fca9a 100644 --- a/packages/inter-protocol/src/proposals/econ-behaviors.js +++ b/packages/inter-protocol/src/proposals/econ-behaviors.js @@ -157,9 +157,10 @@ export const setupReserve = async ({ 'reserve.governor', ); - const [creatorFacet, publicFacet, instance] = await Promise.all([ + const [creatorFacet, publicFacet, adminFacet, instance] = await Promise.all([ E(g.creatorFacet).getCreatorFacet(), E(g.creatorFacet).getPublicFacet(), + E(g.creatorFacet).getAdminFacet(), E(g.publicFacet).getGovernedContract(), ]); @@ -169,7 +170,7 @@ export const setupReserve = async ({ instance, publicFacet, creatorFacet, - adminFacet: g.adminFacet, + adminFacet, governor: g.instance, governorCreatorFacet: g.creatorFacet, diff --git a/packages/inter-protocol/src/proposals/replace-fee-distributor.js b/packages/inter-protocol/src/proposals/replace-fee-distributor.js new file mode 100644 index 00000000000..8b1360c4962 --- /dev/null +++ b/packages/inter-protocol/src/proposals/replace-fee-distributor.js @@ -0,0 +1,195 @@ +import { deeplyFulfilledObject, makeTracer } from '@agoric/internal'; +import { Stable } from '@agoric/internal/src/tokens.js'; +import { makeScalarBigMapStore } from '@agoric/vat-data'; +import { getInterfaceOf, E } from '@endo/far'; + +const trace = makeTracer('ReplaceFeeDistributer', true); + +/** + * Start the reward distributor. + * + * @param {import('./econ-behaviors').EconomyBootstrapPowers} powers + * @param {{ + * options: { + * keywordShares: Record; + * collectionInterval: bigint; + * }; + * }} options + */ +export const replaceFeeDistributor = async ( + { + consume: { + chainTimerService, + bankManager, + vaultFactoryKit, + periodicFeeCollectors, + reserveKit, + zoe, + contractKits: contractKitsP, + }, + produce: { + feeDistributorKit, + periodicFeeCollectors: periodicFeeCollectorsP, + }, + instance: { + produce: { feeDistributor: feeDistributorP }, + }, + installation: { + consume: { feeDistributor }, + }, + issuer: { + consume: { [Stable.symbol]: centralIssuerP }, + }, + brand: { + consume: { [Stable.symbol]: centralBrandP }, + }, + }, + { options }, +) => { + trace('replaceFeeDistributer', options); + + const { keywordShares, collectionInterval } = options; + + const feeDistributorTerms = await deeplyFulfilledObject( + harden({ + timerService: chainTimerService, + collectionInterval, + keywordShares, + }), + ); + trace('feeDistributorTerms', feeDistributorTerms); + + const [centralIssuer, centralBrand, contractKits] = await Promise.all([ + centralIssuerP, + centralBrandP, + contractKitsP, + ]); + + const rewardDistributorDepositFacet = await E(bankManager) + .getRewardDistributorDepositFacet(Stable.denom, { + issuer: centralIssuer, + brand: centralBrand, + }) + .catch(e => { + console.error('Cannot create fee collector deposit facet', e); + return undefined; + }); + + /** + * @type {StartedInstanceKit< + * typeof import('@agoric/inter-protocol/src/feeDistributor.js').start + * >} + */ + const instanceKit = await E(zoe).startInstance( + feeDistributor, + { Fee: centralIssuer }, + feeDistributorTerms, + undefined, + 'feeDistributor', + ); + await E(instanceKit.creatorFacet).setDestinations({ + ...(rewardDistributorDepositFacet && { + RewardDistributor: E( + instanceKit.creatorFacet, + ).makeDepositFacetDestination(rewardDistributorDepositFacet), + }), + Reserve: E(instanceKit.creatorFacet).makeOfferDestination( + zoe, + 'Collateral', + E.get(reserveKit).publicFacet, + 'makeAddCollateralInvitation', + ), + }); + + trace('Clearing the old instance from bootstrap powers...'); + feeDistributorKit.reset(); + feeDistributorP.reset(); + + trace('Now introduce the new instance'); + feeDistributorKit.resolve( + harden({ ...instanceKit, label: 'feeDistributor' }), + ); + feeDistributorP.resolve(instanceKit.instance); + + const periodicCollectors = await periodicFeeCollectors; + trace( + `Stop periodicCollectors of the old instance. Number of collectors: ${periodicCollectors.getSize()}`, + ); + for await (const [key, collector] of periodicCollectors.entries()) { + trace('Getting debugName', key); + // @ts-expect-error incomplete PeriodicFeeCollector type + const debugName = await E(collector).getDebugName(); + trace(`Stopping ${debugName}...`); + await E(collector).stop(); + } + periodicFeeCollectorsP.reset(); + + trace('Old collectors cleared. Start creating and setting new ones.'); + + const collectorKit = { + vaultFactory: E.get(vaultFactoryKit).creatorFacet, + }; + const newCollectorStore = makeScalarBigMapStore('periodicCollectors', { + durable: true, + }); + await Promise.all( + Object.entries(collectorKit).map(async ([debugName, collectorFacet]) => { + const collector = E(instanceKit.creatorFacet).makeContractFeeCollector( + zoe, + collectorFacet, + ); + const periodicCollector = await E( + instanceKit.creatorFacet, + ).startPeriodicCollection(debugName, collector); + newCollectorStore.init(periodicCollectors.getSize(), periodicCollector); + }), + ); + + trace('Write newCollectorStore in periodicFeeCollectors'); + periodicFeeCollectorsP.resolve(newCollectorStore); + + trace('Write to contractKits'); + const label = getInterfaceOf(instanceKit.instance); + const kit = harden({ ...instanceKit, label }); + contractKits.init(kit.instance, kit); + + trace('Done.'); +}; +harden(replaceFeeDistributor); + +const t = 'replaceFeeDistributor'; +export const getManifestForReplaceFeeDistributor = async ( + _, + feeDistributorOptions, +) => ({ + manifest: { + [replaceFeeDistributor.name]: { + consume: { + chainTimerService: t, + bankManager: t, + vaultFactoryKit: t, + periodicFeeCollectors: t, + reserveKit: t, + zoe: t, + contractKits: t, + }, + produce: { + feeDistributorKit: t, + periodicFeeCollectors: t, + }, + instance: { + produce: { feeDistributor: t }, + }, + installation: { + consume: { feeDistributor: t }, + }, + issuer: { + consume: { [Stable.symbol]: t }, + }, + brand: { + consume: { [Stable.symbol]: t }, + }, + }, + }, + options: { ...feeDistributorOptions }, +}); diff --git a/packages/inter-protocol/src/proposals/replaceElectorate.js b/packages/inter-protocol/src/proposals/replaceElectorate.js index adde9adf747..efaa4ccd0b1 100644 --- a/packages/inter-protocol/src/proposals/replaceElectorate.js +++ b/packages/inter-protocol/src/proposals/replaceElectorate.js @@ -289,33 +289,87 @@ const startNewEconomicCommittee = async ( * Starts a new Economic Committee Charter by creating an instance with the * provided committee specifications. * - * @param {EconomyBootstrapPowers} powers - The resources and capabilities - * required to start the committee. + * @param {EconomyBootstrapPowers & + * PromiseSpaceOf<{ retiredContractInstances: MapStore }>} powers + * - The resources and capabilities required to start the committee. + * * @returns {Promise} A promise that resolves to the * charter kit result. */ const startNewEconCharter = async ({ - consume: { startUpgradable }, - produce: { econCharterKit }, + consume: { + board, + startUpgradable, + contractKits: contractKitsP, + econCharterKit: econCharterKitP, + retiredContractInstances: retiredContractInstancesP, + }, + produce: { + econCharterKit: produceEconCharterKit, + retiredContractInstances: produceRetiredInstances, + }, installation: { consume: { binaryVoteCounter: counterP, econCommitteeCharter: installP }, }, instance: { produce: { econCommitteeCharter }, + consume: { econCommitteeCharter: previousInstanceP }, }, }) => { - const [charterInstall, counterInstall] = await Promise.all([ + const [ + charterInstall, + counterInstall, + previousInstance, + contractKits, + econCharterKit, + retiredInstances, + ] = await Promise.all([ installP, counterP, + previousInstanceP, + contractKitsP, + econCharterKitP, + provideRetiredInstances(retiredContractInstancesP, produceRetiredInstances), ]); - const terms = await harden({ - binaryVoteCounterInstallation: counterInstall, - }); + + const label = 'econCommitteeCharter'; + const previousCharterKit = { ...econCharterKit, label }; + + const boardID = await E(board).getId(previousCharterKit.instance); + const identifier = `${label}-${boardID}`; + trace('Saving previous EC Charter Instance', label); + + // save the old charter instance kit so we can manage it later + if (retiredInstances.has(identifier)) { + // bootstrap tests start having already run this upgrade. Actual upgrades on + // mainNet or testnets should start with the promiseSpace post upgrade-17, + // which doesn't have this entry in the map. + trace( + '⚠️ WARNING: collision on storing Charter in retireInstances not' + + ' expected during chain upgrade. It IS normal during bootstrap tests', + ); + } else { + retiredInstances.init(identifier, previousCharterKit.instance); + } + if (contractKits.has(previousInstance)) { + // bootstrap tests start having already run this upgrade. Actual upgrades on + // mainNet or testnets should start with the promiseSpace post upgrade-17, + // which doesn't have this entry in the map. + trace( + '⚠️ WARNING: collision on storing Charter in contractKits not' + + ' expected during chain upgrade. It IS normal during bootstrap tests', + ); + } else { + contractKits.init(previousInstance, previousCharterKit); + } trace('Starting new EC Charter Instance'); + const terms = harden({ + binaryVoteCounterInstallation: counterInstall, + }); const startResult = await E(startUpgradable)({ - label: 'econCommitteeCharter', + label, installation: charterInstall, terms, }); @@ -325,8 +379,8 @@ const startNewEconCharter = async ({ econCommitteeCharter.reset(); econCommitteeCharter.resolve(E.get(startResult).instance); - econCharterKit.reset(); - econCharterKit.resolve(startResult); + produceEconCharterKit.reset(); + produceEconCharterKit.resolve(startResult); return startResult; }; @@ -515,6 +569,8 @@ export const getManifestForReplaceAllElectorates = async ( auctionUpgradeNewGovCreator: true, auctionUpgradeNewInstance: true, psmKit: true, + contractKits: true, + econCharterKit: true, governedContractKits: true, chainStorage: true, highPrioritySendersManager: true, @@ -543,7 +599,10 @@ export const getManifestForReplaceAllElectorates = async ( economicCommittee: true, econCommitteeCharter: true, }, - consume: { economicCommittee: true }, + consume: { + economicCommittee: true, + econCommitteeCharter: true, + }, }, }, }, diff --git a/packages/inter-protocol/src/proposals/upgrade-vaults.js b/packages/inter-protocol/src/proposals/upgrade-vaults.js index febaa8cfa35..b92961d871f 100644 --- a/packages/inter-protocol/src/proposals/upgrade-vaults.js +++ b/packages/inter-protocol/src/proposals/upgrade-vaults.js @@ -1,3 +1,9 @@ +/** + * @file this core-eval proposal is specific to the upgrade-18 scenario, + * handling tasks beyond generic Vault Factory null upgrade. For a reusable + * proposal, see upgrade-vaultFactory-proposal.js. + */ + import { E } from '@endo/far'; import { makeNotifierFromAsyncIterable } from '@agoric/notifier'; import { makeTracer } from '@agoric/internal/src/index.js'; diff --git a/packages/inter-protocol/src/provisionPool.js b/packages/inter-protocol/src/provisionPool.js index 7eb37c61dd1..ee002f1a011 100644 --- a/packages/inter-protocol/src/provisionPool.js +++ b/packages/inter-protocol/src/provisionPool.js @@ -12,7 +12,11 @@ import { prepareExo } from '@agoric/vat-data'; import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js'; import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; import { TopicsRecordShape } from '@agoric/zoe/src/contractSupport/topics.js'; -import { prepareProvisionPoolKit } from './provisionPoolKit.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { + prepareBridgeProvisionTool, + prepareProvisionPoolKit, +} from './provisionPoolKit.js'; /** @import {Marshal} from '@endo/marshal'; */ @@ -49,6 +53,7 @@ harden(meta); * storageNode: StorageNode; * marshaller: Marshal; * metricsOverride?: import('./provisionPoolKit.js').MetricsNotification; + * governedParamOverrides?: Record; * }} privateArgs * @param {import('@agoric/vat-data').Baggage} baggage */ @@ -70,13 +75,18 @@ export const start = async (zcf, privateArgs, baggage) => { }, privateArgs.storageNode, privateArgs.marshaller, + privateArgs.governedParamOverrides, ); - const makeProvisionPoolKit = prepareProvisionPoolKit(baggage, { + const zone = makeDurableZone(baggage); + + const makeBridgeProvisionTool = prepareBridgeProvisionTool(zone); + const makeProvisionPoolKit = prepareProvisionPoolKit(zone, { makeRecorderKit, params, poolBank, zcf, + makeBridgeProvisionTool, }); const provisionPoolKit = await provideSingleton( diff --git a/packages/inter-protocol/src/provisionPoolKit.js b/packages/inter-protocol/src/provisionPoolKit.js index 4e1c71aa704..6c3694e6097 100644 --- a/packages/inter-protocol/src/provisionPoolKit.js +++ b/packages/inter-protocol/src/provisionPoolKit.js @@ -1,7 +1,6 @@ // @ts-check import { X, q, Fail } from '@endo/errors'; import { E } from '@endo/far'; -import { Far } from '@endo/marshal'; import { AmountMath, BrandShape } from '@agoric/ertp'; import { deeplyFulfilledObject, makeTracer } from '@agoric/internal'; @@ -15,7 +14,6 @@ import { M, makeScalarBigMapStore, makeScalarBigSetStore, - prepareExoClassKit, } from '@agoric/vat-data'; import { PowerFlags } from '@agoric/vats/src/walletFlags.js'; import { @@ -37,6 +35,15 @@ const FIRST_LOWER_NEAR_KEYWORD = /^[a-z][a-zA-Z0-9_$]*$/; * @import {Bank, BankManager} from '@agoric/vats/src/vat-bank.js' */ +// XXX when inferred, error TS2742: cannot be named without a reference to '../../../node_modules/@endo/exo/src/get-interface.js'. This is likely not portable. A type annotation is necessary. +/** + * @typedef {{ + * machine: any; + * helper: any; + * public: any; + * }} ProvisionPoolKit + */ + /** * @typedef {import('@agoric/zoe/src/zoeService/utils.js').Instance< * import('@agoric/inter-protocol/src/psm/psm.js').start @@ -66,18 +73,22 @@ const FIRST_LOWER_NEAR_KEYWORD = /^[a-z][a-zA-Z0-9_$]*$/; * Given attenuated access to the funding purse, handle requests to provision * smart wallets. * - * @param {(depositBank: ERef) => Promise} sendInitialPayment - * @param {() => void} onProvisioned + * @param {import('@agoric/zone').Zone} zone */ -export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => { - /** @param {ProvisionPoolKitReferences} refs */ - const makeBridgeHandler = ({ - bankManager, - namesByAddressAdmin, - walletFactory, - }) => - Far('provisioningHandler', { - fromBridge: async obj => { +export const prepareBridgeProvisionTool = zone => + zone.exoClass( + 'smartWalletProvisioningHandler', + M.interface('ProvisionBridgeHandlerMaker', { + fromBridge: M.callWhen(M.record()).returns(), + }), + (bankManager, walletFactory, namesByAddressAdmin, forHandler) => ({ + bankManager, + walletFactory, + namesByAddressAdmin, + forHandler, + }), + { + async fromBridge(obj) { obj.type === 'PLEASE_PROVISION' || Fail`Unrecognized request ${obj.type}`; trace('PLEASE_PROVISION', obj); @@ -85,9 +96,12 @@ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => { powerFlags.includes(PowerFlags.SMART_WALLET) || Fail`missing SMART_WALLET in powerFlags`; + const { bankManager, walletFactory, namesByAddressAdmin, forHandler } = + this.state; + const bank = E(bankManager).getBankForAddress(address); // only proceed if we can provide funds - await sendInitialPayment(bank); + await forHandler.sendInitialPayment(bank); const [_, created] = await E(walletFactory).provideSmartWallet( address, @@ -95,31 +109,30 @@ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => { namesByAddressAdmin, ); if (created) { - onProvisioned(); + forHandler.onProvisioned(); } trace(created ? 'provisioned' : 're-provisioned', address); }, - }); - return makeBridgeHandler; -}; + }, + ); /** - * @param {import('@agoric/vat-data').Baggage} baggage + * @param {import('@agoric/zone').Zone} zone * @param {{ * makeRecorderKit: import('@agoric/zoe/src/contractSupport/recorder.js').MakeRecorderKit; * params: any; * poolBank: import('@endo/far').ERef; * zcf: ZCF; + * makeBridgeProvisionTool: ReturnType; * }} powers */ export const prepareProvisionPoolKit = ( - baggage, - { makeRecorderKit, params, poolBank, zcf }, + zone, + { makeRecorderKit, params, poolBank, zcf, makeBridgeProvisionTool }, ) => { const zoe = zcf.getZoeService(); - const makeProvisionPoolKitInternal = prepareExoClassKit( - baggage, + const makeProvisionPoolKitInternal = zone.exoClassKit( 'ProvisionPoolKit', { machine: M.interface('ProvisionPoolKit machine', { @@ -142,6 +155,7 @@ export const prepareProvisionPoolKit = ( ackWallet: M.call(M.string()).returns(M.boolean()), }), helper: UnguardedHelperI, + forHandler: UnguardedHelperI, public: M.interface('ProvisionPoolKit public', { getPublicTopics: M.call().returns({ metrics: PublicTopicShape }), }), @@ -208,23 +222,24 @@ export const prepareProvisionPoolKit = ( const refs = await deeplyFulfilledObject(obj); Object.assign(this.state, refs); }, + /** @returns {import('@agoric/vats').BridgeHandler} */ makeHandler() { const { bankManager, namesByAddressAdmin, walletFactory } = this.state; if (!bankManager || !namesByAddressAdmin || !walletFactory) { throw Fail`must set references before handling requests`; } - const { helper } = this.facets; - // a bit obtuse but leave for backwards compatibility with tests - const innerMaker = makeBridgeProvisionTool( - bank => helper.sendInitialPayment(bank), - () => helper.onProvisioned(), - ); - return innerMaker({ + + const { forHandler } = this.facets; + + const provisionHandler = makeBridgeProvisionTool( bankManager, - namesByAddressAdmin, walletFactory, - }); + namesByAddressAdmin, + forHandler, + ); + + return provisionHandler; }, /** * @param {Brand} brand @@ -302,37 +317,6 @@ export const prepareProvisionPoolKit = ( ); facets.helper.publishMetrics(); }, - onProvisioned() { - const { state, facets } = this; - state.walletsProvisioned += 1n; - facets.helper.publishMetrics(); - }, - /** @param {ERef} destBank */ - async sendInitialPayment(destBank) { - const { - facets: { helper }, - state: { fundPurse, poolBrand }, - } = this; - const perAccountInitialAmount = /** @type {Amount<'nat'>} */ ( - params.getPerAccountInitialAmount() - ); - const initialPmt = await E(fundPurse).withdraw( - perAccountInitialAmount, - ); - - const destPurse = E(destBank).getPurse(poolBrand); - return E(destPurse) - .deposit(initialPmt) - .then(amt => { - helper.onSendFunds(perAccountInitialAmount); - trace('provisionPool sent', amt); - }) - .catch(reason => { - console.error(X`initial deposit failed: ${q(reason)}`); - void E(fundPurse).deposit(initialPmt); - throw reason; - }); - }, /** * @param {ERef} exchangePurse * @param {ERef} brand @@ -482,6 +466,39 @@ export const prepareProvisionPoolKit = ( return rxd; }, }, + forHandler: { + onProvisioned() { + const { state, facets } = this; + state.walletsProvisioned += 1n; + facets.helper.publishMetrics(); + }, + /** @param {ERef} destBank */ + async sendInitialPayment(destBank) { + const { + facets: { helper }, + state: { fundPurse, poolBrand }, + } = this; + const perAccountInitialAmount = /** @type {Amount<'nat'>} */ ( + params.getPerAccountInitialAmount() + ); + const initialPmt = await E(fundPurse).withdraw( + perAccountInitialAmount, + ); + + const destPurse = E(destBank).getPurse(poolBrand); + return E(destPurse) + .deposit(initialPmt) + .then(amt => { + helper.onSendFunds(perAccountInitialAmount); + trace('provisionPool sent', amt); + }) + .catch(reason => { + console.error(X`initial deposit failed: ${q(reason)}`); + void E(fundPurse).deposit(initialPmt); + throw reason; + }); + }, + }, public: { getPublicTopics() { return { @@ -506,6 +523,7 @@ export const prepareProvisionPoolKit = ( * @param {object} opts * @param {Brand<'nat'>} opts.poolBrand * @param {ERef} opts.storageNode + * @returns {Promise} */ const makeProvisionPoolKit = async ({ poolBrand, storageNode }) => { const fundPurse = await E(poolBank).getPurse(poolBrand); diff --git a/packages/inter-protocol/src/psm/psm.js b/packages/inter-protocol/src/psm/psm.js index 246d138979f..4a8e2f3c4cd 100644 --- a/packages/inter-protocol/src/psm/psm.js +++ b/packages/inter-protocol/src/psm/psm.js @@ -14,7 +14,6 @@ import { import { StorageNodeShape } from '@agoric/internal'; import { M, prepareExo, provide } from '@agoric/vat-data'; import { - atomicRearrange, atomicTransfer, ceilMultiplyBy, floorDivideBy, @@ -273,8 +272,7 @@ export const start = async (zcf, privateArgs, baggage) => { const maxAnchor = floorMultiplyBy(afterFee, anchorPerMinted); AmountMath.isGTE(maxAnchor, wanted) || Fail`wanted ${wanted} is more than ${given} minus fees ${fee}`; - atomicRearrange( - zcf, + zcf.atomicRearrange( harden([ [seat, stage, { In: afterFee }, { Minted: afterFee }], [seat, feePool, { In: fee }, { Minted: fee }], @@ -305,8 +303,7 @@ export const start = async (zcf, privateArgs, baggage) => { Fail`wanted ${wanted} is more than ${given} minus fees ${fee}`; mintMinted(asStable); try { - atomicRearrange( - zcf, + zcf.atomicRearrange( harden([ [seat, anchorPool, { In: given }, { Anchor: given }], [stage, seat, { Minted: afterFee }, { Out: afterFee }], diff --git a/packages/inter-protocol/src/reserve/assetReserve.js b/packages/inter-protocol/src/reserve/assetReserve.js index 322172e0e0f..f8ed8204564 100644 --- a/packages/inter-protocol/src/reserve/assetReserve.js +++ b/packages/inter-protocol/src/reserve/assetReserve.js @@ -57,22 +57,13 @@ export const start = async (zcf, privateArgs, baggage) => { privateArgs.marshaller, ); - /** @type {() => Promise>} */ - const takeFeeMint = async () => { - if (baggage.has('feeMint')) { - return baggage.get('feeMint'); - } - - const feeMintTemp = await zcf.registerFeeMint( - 'Fee', - privateArgs.feeMintAccess, - ); - baggage.init('feeMint', feeMintTemp); - return feeMintTemp; - }; - trace('awaiting takeFeeMint'); - const feeMint = await takeFeeMint(); const storageNode = await privateArgs.storageNode; + + trace('awaiting feeMint'); + const { feeMint } = await provideAll(baggage, { + feeMint: () => zcf.registerFeeMint('Fee', privateArgs.feeMintAccess), + }); + const makeAssetReserveKit = await prepareAssetReserveKit(baggage, { feeMint, makeRecorderKit, diff --git a/packages/inter-protocol/src/reserve/params.js b/packages/inter-protocol/src/reserve/params.js index 5da75a96fdc..f7e8aa2eac5 100644 --- a/packages/inter-protocol/src/reserve/params.js +++ b/packages/inter-protocol/src/reserve/params.js @@ -2,8 +2,10 @@ import { CONTRACT_ELECTORATE, ParamTypes } from '@agoric/governance'; -const makeReserveTerms = (poserInvitationAmount, timer) => ({ - timer, +/** + * @param {InvitationAmount} poserInvitationAmount + */ +const makeReserveTerms = poserInvitationAmount => ({ governedParams: harden({ [CONTRACT_ELECTORATE]: { type: ParamTypes.INVITATION, diff --git a/packages/inter-protocol/src/vaultFactory/vaultDirector.js b/packages/inter-protocol/src/vaultFactory/vaultDirector.js index fdfa8d2f9d9..56e0706f3f1 100644 --- a/packages/inter-protocol/src/vaultFactory/vaultDirector.js +++ b/packages/inter-protocol/src/vaultFactory/vaultDirector.js @@ -325,6 +325,7 @@ const prepareVaultDirector = ( getGovernedParams: M.callWhen({ collateralBrand: BrandShape }).returns( M.record(), ), + getDirectorGovernedParams: M.call().returns(M.promise()), getInvitationAmount: M.call(M.string()).returns(AmountShape), getPublicTopics: M.call().returns(TopicsRecordShape), }), @@ -492,7 +493,7 @@ const prepareVaultDirector = ( }, /** * Note this works only for a collateral manager. For the director use, - * `getElectorateSubscription` + * `getDirectorGovernedParams` * * @param {{ collateralBrand: Brand }} selector */ @@ -500,6 +501,9 @@ const prepareVaultDirector = ( // TODO use named getters of TypedParamManager return vaultParamManagers.get(collateralBrand).getParams(); }, + getDirectorGovernedParams() { + return directorParamManager.getParams(); + }, /** @param {string} name */ getInvitationAmount(name) { return directorParamManager.getInvitationAmount(name); diff --git a/packages/inter-protocol/test/provisionPool.test.js b/packages/inter-protocol/test/provisionPool.test.js index 48ea08f7312..e591643a927 100644 --- a/packages/inter-protocol/test/provisionPool.test.js +++ b/packages/inter-protocol/test/provisionPool.test.js @@ -19,7 +19,8 @@ import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; import { makeRatio } from '@agoric/zoe/src/contractSupport/ratio.js'; import { E, Far } from '@endo/far'; import path from 'path'; -import { makeBridgeProvisionTool } from '../src/provisionPoolKit.js'; +import { makeHeapZone } from '@agoric/zone'; +import { prepareBridgeProvisionTool } from '../src/provisionPoolKit.js'; import { makeMockChainStorageRoot, setUpZoeForTest, @@ -364,15 +365,14 @@ test('makeBridgeProvisionTool handles duplicate requests', async t => { const { nameHub: namesByAddress, nameAdmin: namesByAddressAdmin } = makeNameHubKit(); const publishMetrics = () => {}; - const makeHandler = makeBridgeProvisionTool( - sendInitialPayment, - publishMetrics, - ); - const handler = makeHandler({ + const zone = makeHeapZone(); + const makeBridgeProvisionTool = prepareBridgeProvisionTool(zone); + const handler = makeBridgeProvisionTool( bankManager, - namesByAddressAdmin, walletFactory, - }); + namesByAddressAdmin, + Far('helpers', { sendInitialPayment, onProvisioned: publishMetrics }), + ); t.log('1st request to provision a SMART_WALLET for', address); await handler.fromBridge({ diff --git a/packages/inter-protocol/test/psm/setupPsm.js b/packages/inter-protocol/test/psm/setupPsm.js index f00a283c05b..895ff2679c6 100644 --- a/packages/inter-protocol/test/psm/setupPsm.js +++ b/packages/inter-protocol/test/psm/setupPsm.js @@ -100,8 +100,8 @@ export const setupPsm = async ( brand.produce.IST.resolve(istBrand); issuer.produce.IST.resolve(istIssuer); + // @ts-expect-error mock space.produce.provisionPoolStartResult.resolve({ - // @ts-expect-error mock creatorFacet: Far('dummy', { initPSM: () => { t.log('dummy provisionPool.initPSM'); diff --git a/packages/inter-protocol/test/swingsetTests/reserve/bootstrap-assetReserve-upgrade.js b/packages/inter-protocol/test/swingsetTests/reserve/bootstrap-assetReserve-upgrade.js index d6bb13d4d50..91318683cb5 100644 --- a/packages/inter-protocol/test/swingsetTests/reserve/bootstrap-assetReserve-upgrade.js +++ b/packages/inter-protocol/test/swingsetTests/reserve/bootstrap-assetReserve-upgrade.js @@ -271,6 +271,11 @@ export const buildRootObject = async () => { metricsRecord = await E(metrics).getUpdateSince(); + // verify allocations + const allocations = await E(arLimitedFacet).getAllocations(); + assert.equal(allocations.Moola.value, 100_000n); + assert.equal(allocations.Moola.brand, moola.brand); + // same as last assert.equal(metricsRecord.updateCount, 2n); diff --git a/packages/inter-protocol/test/vaultFactory/vaultFactory.test.js b/packages/inter-protocol/test/vaultFactory/vaultFactory.test.js index f285b00bd00..f7d8b8bc296 100644 --- a/packages/inter-protocol/test/vaultFactory/vaultFactory.test.js +++ b/packages/inter-protocol/test/vaultFactory/vaultFactory.test.js @@ -2049,4 +2049,39 @@ test('governance publisher', async t => { LiquidationPenalty: { type: 'ratio' }, MintFee: { type: 'ratio' }, }); + + const params = await E(vfPublic).getDirectorGovernedParams(); + t.like(params, { + ChargingPeriod: { type: 'nat', value: 2n }, + Electorate: { type: 'invitation' }, + MinInitialDebt: { type: 'amount' }, + RecordingPeriod: { type: 'nat' }, + ReferencedUI: { value: 'abracadabra' }, + ShortfallInvitation: { type: 'invitation' }, + }); +}); + +test('access to director params', async t => { + const { aeth } = t.context; + + t.context.referencedUi = 'hocus pocus'; + const services = await setupServices( + t, + [500n, 15n], + aeth.make(900n), + undefined, + undefined, + 500n, + ); + const { vfPublic } = services.vaultFactory; + + const params = await E(vfPublic).getDirectorGovernedParams(); + t.like(params, { + ChargingPeriod: { type: 'nat', value: 2n }, + Electorate: { type: 'invitation' }, + MinInitialDebt: { type: 'amount' }, + RecordingPeriod: { type: 'nat' }, + ReferencedUI: { value: 'hocus pocus' }, + ShortfallInvitation: { type: 'invitation' }, + }); }); diff --git a/packages/internal/README.md b/packages/internal/README.md index 032078bb0fd..cebfad5ae9a 100644 --- a/packages/internal/README.md +++ b/packages/internal/README.md @@ -10,11 +10,11 @@ Like all `@agoric` packages it follows Semantic Versioning. Unlike the others, i # Design -It is meant to be a home for modules that have no Agoric-specific dependencies themselves. It does depend on a these other @agoric packages but they are all destined to migrate out of the repo, +It is meant to be a home for modules that have no dependencies on other packages in this repository, except for the following packages that do not theirselves depend upon any other @agoric packages and may be destined for migration elsewhere: -- base-zone -- store -- assert +- [base-zone](../base-zone) +- [store](../store) +- [cosmic-proto](../cosmic-proto) This package may not take dependencies on any others in this repository. diff --git a/packages/internal/package.json b/packages/internal/package.json index 9a44b8ec641..8d16fa7a71c 100755 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -20,22 +20,23 @@ "lint:types": "tsc" }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/base-zone": "^0.1.1-u18.0", - "@endo/common": "^1.2.7", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", - "@endo/stream": "^1.2.7", + "@endo/common": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", + "@endo/stream": "^1.2.8", "anylogger": "^0.21.0", "jessie.js": "^0.3.4" }, "devDependencies": { - "@endo/exo": "^1.5.6", - "@endo/init": "^1.1.6", + "@agoric/cosmic-proto": "^0.5.0-u18.4", + "@endo/exo": "^1.5.7", + "@endo/init": "^1.1.7", "ava": "^5.3.0", "tsd": "^0.31.1" }, @@ -57,6 +58,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 93.42 + "atLeast": 93.06 } } diff --git a/packages/internal/src/action-types.js b/packages/internal/src/action-types.js index 30e363f5117..837059d9b52 100644 --- a/packages/internal/src/action-types.js +++ b/packages/internal/src/action-types.js @@ -1,19 +1,76 @@ // @jessie-check -export const AG_COSMOS_INIT = 'AG_COSMOS_INIT'; -export const SWING_STORE_EXPORT = 'SWING_STORE_EXPORT'; -export const BEGIN_BLOCK = 'BEGIN_BLOCK'; +/** + * Types of messages used for communication between a cosmos-sdk blockchain node + * and its paired swingset VM, especially for the ABCI lifecycle. See: + * + * - https://github.com/tendermint/tendermint/blob/v0.34.x/spec/abci/abci.md#block-execution + * - ../../../golang/cosmos/vm/action.go + * - ../../../golang/cosmos/app/app.go + * - ../../../golang/cosmos/x/swingset/abci.go + * - ../../../golang/cosmos/x/swingset/keeper/swing_store_exports_handler.go + * - ../../cosmic-swingset/src/chain-main.js + * - ../../cosmic-swingset/src/launch-chain.js + * + * @enum {(typeof SwingsetMessageType)[keyof typeof SwingsetMessageType]} + */ +export const SwingsetMessageType = /** @type {const} */ ({ + AG_COSMOS_INIT: 'AG_COSMOS_INIT', // used to synchronize at process launch + BEGIN_BLOCK: 'BEGIN_BLOCK', + END_BLOCK: 'END_BLOCK', + COMMIT_BLOCK: 'COMMIT_BLOCK', + AFTER_COMMIT_BLOCK: 'AFTER_COMMIT_BLOCK', + SWING_STORE_EXPORT: 'SWING_STORE_EXPORT', // used to synchronize data export +}); +harden(SwingsetMessageType); + +// TODO: Update all imports to use SwingsetMessageType. But until then... +export const { + AG_COSMOS_INIT, + BEGIN_BLOCK, + END_BLOCK, + COMMIT_BLOCK, + AFTER_COMMIT_BLOCK, + SWING_STORE_EXPORT, +} = SwingsetMessageType; + +/** + * Types of "action" messages consumed by the swingset VM from actionQueue or + * highPriorityQueue during END_BLOCK. See: + * + * - ../../../golang/cosmos/x/swingset/keeper/msg_server.go + * - ../../../golang/cosmos/x/swingset/keeper/proposal.go + * - ../../../golang/cosmos/x/vbank/vbank.go + * - ../../../golang/cosmos/x/vibc/handler.go + * - ../../../golang/cosmos/x/vibc/keeper/triggers.go + * - ../../../golang/cosmos/x/vibc/types/ibc_module.go + * + * @enum {(typeof QueuedActionType)[keyof typeof QueuedActionType]} + */ +export const QueuedActionType = /** @type {const} */ ({ + CORE_EVAL: 'CORE_EVAL', + DELIVER_INBOUND: 'DELIVER_INBOUND', + IBC_EVENT: 'IBC_EVENT', + INSTALL_BUNDLE: 'INSTALL_BUNDLE', + PLEASE_PROVISION: 'PLEASE_PROVISION', + VBANK_BALANCE_UPDATE: 'VBANK_BALANCE_UPDATE', + WALLET_ACTION: 'WALLET_ACTION', + WALLET_SPEND_ACTION: 'WALLET_SPEND_ACTION', +}); +harden(QueuedActionType); + +// TODO: Update all imports to use QueuedActionType. But until then... +export const { + CORE_EVAL, + DELIVER_INBOUND, + IBC_EVENT, + INSTALL_BUNDLE, + PLEASE_PROVISION, + VBANK_BALANCE_UPDATE, + WALLET_ACTION, + WALLET_SPEND_ACTION, +} = QueuedActionType; + export const CALCULATE_FEES_IN_BEANS = 'CALCULATE_FEES_IN_BEANS'; -export const CORE_EVAL = 'CORE_EVAL'; -export const DELIVER_INBOUND = 'DELIVER_INBOUND'; -export const END_BLOCK = 'END_BLOCK'; -export const COMMIT_BLOCK = 'COMMIT_BLOCK'; -export const AFTER_COMMIT_BLOCK = 'AFTER_COMMIT_BLOCK'; -export const IBC_EVENT = 'IBC_EVENT'; -export const PLEASE_PROVISION = 'PLEASE_PROVISION'; -export const VBANK_BALANCE_UPDATE = 'VBANK_BALANCE_UPDATE'; -export const WALLET_ACTION = 'WALLET_ACTION'; -export const WALLET_SPEND_ACTION = 'WALLET_SPEND_ACTION'; -export const INSTALL_BUNDLE = 'INSTALL_BUNDLE'; export const VTRANSFER_IBC_EVENT = 'VTRANSFER_IBC_EVENT'; export const KERNEL_UPGRADE_EVENTS = 'KERNEL_UPGRADE_EVENTS'; diff --git a/packages/internal/src/chain-utils.js b/packages/internal/src/chain-utils.js new file mode 100644 index 00000000000..264c3391b1d --- /dev/null +++ b/packages/internal/src/chain-utils.js @@ -0,0 +1,57 @@ +/** + * @file Types and utilities for supporting blockchain functionality without + * risking import cycles. + * + * TODO: Integrate (or integrate with) any/all of: + * + * - ./action-types.js + * - ./chain-storage-paths.js + * - ./config.js + * - ../../cosmic-proto (if comfortable co-residing with generated code) + */ + +import * as _ActionType from './action-types.js'; + +/** @typedef {`${bigint}`} NatString */ + +/** + * @typedef {object} BlockInfo + * @property {number} blockHeight + * @property {number} blockTime POSIX Seconds Since the Epoch + * @property {import('@agoric/cosmic-proto/swingset/swingset.js').ParamsSDKType} params + */ + +/** + * @typedef {BlockInfo & { + * type: typeof _ActionType.AG_COSMOS_INIT; + * chainID: string; + * isBootstrap?: boolean; + * supplyCoins: { denom: string; amount: NatString }[]; + * }} InitMsg + * cosmosInitAction fields that are subject to consensus. See cosmosInitAction + * in {@link ../../../golang/cosmos/app/app.go}. + */ + +/** + * @param {any} initAction + * @returns {InitMsg} + */ +export const makeInitMsg = initAction => { + const { + type, + blockHeight, + blockTime, + chainID, + params, + // NB: resolvedConfig is independent of consensus and MUST NOT be included + supplyCoins, + } = initAction; + return { + type, + blockHeight, + blockTime, + chainID, + params, + supplyCoins, + }; +}; diff --git a/packages/internal/src/index.js b/packages/internal/src/index.js index 457c35502e3..662e273110d 100644 --- a/packages/internal/src/index.js +++ b/packages/internal/src/index.js @@ -5,8 +5,10 @@ export * from './config.js'; export * from './debug.js'; export * from './errors.js'; -export * from './utils.js'; +export * from './js-utils.js'; +export { pureDataMarshaller } from './marshal.js'; export * from './method-tools.js'; +export * from './ses-utils.js'; export * from './typeCheck.js'; export * from './typeGuards.js'; diff --git a/packages/internal/src/js-utils.js b/packages/internal/src/js-utils.js new file mode 100644 index 00000000000..70cd6d19c4b --- /dev/null +++ b/packages/internal/src/js-utils.js @@ -0,0 +1,89 @@ +// @ts-check +// @jessie-check +/** + * @file Pure JavaScript utility functions that are compatible with but not + * dependent upon a hardened environment. + */ + +/** + * Deep-copy a value by round-tripping it through JSON (which drops + * function/symbol/undefined values and properties that are non-enumerable + * and/or symbol-keyed, and rejects bigint values). + * + * @template T + * @param {T} value + * @returns {T} + */ +export const deepCopyJsonable = value => JSON.parse(JSON.stringify(value)); + +/** + * @param {any} value + * @param {string | undefined} name + * @param {object | undefined} container + * @param {(value: any, name: string, record: object) => any} mapper + * @returns {any} + */ +const deepMapObjectInternal = (value, name, container, mapper) => { + if (container && typeof name === 'string') { + const mapped = mapper(value, name, container); + if (mapped !== value) { + return mapped; + } + } + + if (typeof value !== 'object' || !value) { + return value; + } + + let wasMapped = false; + const mappedEntries = Object.entries(value).map(([innerName, innerValue]) => { + const mappedInnerValue = deepMapObjectInternal( + innerValue, + innerName, + value, + mapper, + ); + wasMapped ||= mappedInnerValue !== innerValue; + return [innerName, mappedInnerValue]; + }); + + return wasMapped ? Object.fromEntries(mappedEntries) : value; +}; + +/** + * Recursively traverses a record object structure, calling a mapper function + * for each enumerable string-keyed property and returning a record composed of + * the results. If none of the values are changed, the original object is + * returned, maintaining its identity. + * + * When the property value is an object, it is sent to the mapper like any other + * value, and then recursively traversed unless replaced with a distinct value. + * + * @param {object} obj + * @param {(value: any, name: string, record: object) => any} mapper + * @returns {object} + */ +export const deepMapObject = (obj, mapper) => + deepMapObjectInternal(obj, undefined, undefined, mapper); + +/** + * Returns a function that uses a millisecond-based current-time capability + * (such as `performance.now`) to measure execution duration of an async + * function and report the result in seconds to match our telemetry standard. + * + * @param {() => number} currentTimeMillisec + */ +export const makeMeasureSeconds = currentTimeMillisec => { + /** + * @template T + * @param {() => Promise} fn + * @returns {Promise<{ result: T; duration: number }>} + */ + const measureSeconds = async fn => { + const t0 = currentTimeMillisec(); + const result = await fn(); + const durationMillisec = currentTimeMillisec() - t0; + return { result, duration: durationMillisec / 1000 }; + }; + return measureSeconds; +}; diff --git a/packages/internal/src/marshal.js b/packages/internal/src/marshal.js index 3750b910ad2..ebfaa33d9e6 100644 --- a/packages/internal/src/marshal.js +++ b/packages/internal/src/marshal.js @@ -135,3 +135,10 @@ export const makeHistoryReviver = (entries, slotToVal = undefined) => { return harden({ getItem, children, has }); }; + +/** @param {import('@endo/marshal').CapData} cap */ +const rejectOCap = cap => Fail`${cap} is not pure data`; +export const pureDataMarshaller = makeMarshal(rejectOCap, rejectOCap, { + serializeBodyFormat: 'smallcaps', +}); +harden(pureDataMarshaller); diff --git a/packages/internal/src/netstring.js b/packages/internal/src/netstring.js index 38d4fff30ef..fe7d5b49b42 100644 --- a/packages/internal/src/netstring.js +++ b/packages/internal/src/netstring.js @@ -89,6 +89,7 @@ export function decode(data, optMaxChunkSize) { */ // input is a byte pipe, output is a sequence of Buffers export function netstringDecoderStream(optMaxChunkSize) { + /** @type {Buffer} */ let buffered = Buffer.from(''); /** * @param {Buffer} chunk diff --git a/packages/internal/src/node/fs-stream.js b/packages/internal/src/node/fs-stream.js index 8e7ae36a48b..5d3da5edafe 100644 --- a/packages/internal/src/node/fs-stream.js +++ b/packages/internal/src/node/fs-stream.js @@ -21,13 +21,13 @@ export const fsStreamReady = stream => } const onReady = () => { - cleanup(); // eslint-disable-line no-use-before-define + cleanup(); resolve(); }; /** @param {Error} err */ const onError = err => { - cleanup(); // eslint-disable-line no-use-before-define + cleanup(); reject(err); }; diff --git a/packages/internal/src/node/shutdown.js b/packages/internal/src/node/shutdown.js index 400b66bde06..fa7b4c01699 100644 --- a/packages/internal/src/node/shutdown.js +++ b/packages/internal/src/node/shutdown.js @@ -22,7 +22,6 @@ export const makeFreshShutdown = (verbose = true) => { process.off('SIGINT', shutdown); process.off('SIGTERM', shutdown); process.off('beforeExit', shutdown); - // eslint-disable-next-line no-use-before-define process.off('uncaughtException', uncaughtShutdown); verbose && console.error(`Shutting down cleanly...`); const shutdowners = [...shutdownThunks.keys()]; diff --git a/packages/internal/src/utils.js b/packages/internal/src/ses-utils.js similarity index 81% rename from packages/internal/src/utils.js rename to packages/internal/src/ses-utils.js index bd69cdfabb9..11b11699d4b 100644 --- a/packages/internal/src/utils.js +++ b/packages/internal/src/ses-utils.js @@ -1,5 +1,9 @@ // @ts-check // @jessie-check +/** + * @file Utility functions that are dependent upon a hardened environment, + * either directly or indirectly (e.g. by @endo imports). + */ import { q, Fail, makeError, annotateError, X } from '@endo/errors'; import { deeplyFulfilled, isObject } from '@endo/marshal'; @@ -9,8 +13,6 @@ import { asyncGenerate } from 'jessie.js'; const { fromEntries, keys, values } = Object; -export const BASIS_POINTS = 10_000n; - /** @import {ERef} from '@endo/far' */ /** @@ -52,55 +54,6 @@ export const deeplyFulfilledObject = async obj => { return deeplyFulfilled(obj); }; -/** - * @param {any} value - * @param {string | undefined} name - * @param {object | undefined} container - * @param {(value: any, name: string, record: object) => any} mapper - * @returns {any} - */ -const deepMapObjectInternal = (value, name, container, mapper) => { - if (container && typeof name === 'string') { - const mapped = mapper(value, name, container); - if (mapped !== value) { - return mapped; - } - } - - if (typeof value !== 'object' || !value) { - return value; - } - - let wasMapped = false; - const mappedEntries = Object.entries(value).map(([innerName, innerValue]) => { - const mappedInnerValue = deepMapObjectInternal( - innerValue, - innerName, - value, - mapper, - ); - wasMapped ||= mappedInnerValue !== innerValue; - return [innerName, mappedInnerValue]; - }); - - return wasMapped ? Object.fromEntries(mappedEntries) : value; -}; - -/** - * Traverses a record object structure deeply, calling a replacer for each - * enumerable string property values of an object. If none of the values are - * changed, the original object is used as-is, maintaining its identity. - * - * When an object is found as a property value, the replacer is first called on - * it. If not replaced, the object is then traversed. - * - * @param {object} obj - * @param {(value: any, name: string, record: object) => any} mapper - * @returns {object} - */ -export const deepMapObject = (obj, mapper) => - deepMapObjectInternal(obj, undefined, undefined, mapper); - /** * Tolerate absence of AggregateError in e.g. xsnap. * @@ -184,27 +137,6 @@ export const withDeferredCleanup = async fn => { return aggregateTryFinally(() => fn(addCleanup), finalizer); }; -/** - * Returns a function that uses a millisecond-based time-since-epoch capability - * (such as `performance.now`) to measure execution time of an async function - * and report the result in seconds to match our telemetry standard. - * - * @param {typeof import('perf_hooks').performance.now} currentTimeMillisec - * @returns {( - * fn: () => Promise, - * ) => Promise<{ result: T; duration: number }>} - */ -export const makeMeasureSeconds = currentTimeMillisec => { - /** @param {() => any} fn */ - const measureSeconds = async fn => { - const t0 = currentTimeMillisec(); - const result = await fn(); - const durationMillisec = currentTimeMillisec() - t0; - return { result, duration: durationMillisec / 1000 }; - }; - return measureSeconds; -}; - /** * @template {Record} T * @typedef {{ [P in keyof T]: Exclude }} AllDefined diff --git a/packages/internal/src/storage-test-utils.js b/packages/internal/src/storage-test-utils.js index f224c47ad93..15774a7ec01 100644 --- a/packages/internal/src/storage-test-utils.js +++ b/packages/internal/src/storage-test-utils.js @@ -2,9 +2,10 @@ import { Fail } from '@endo/errors'; import { Far } from '@endo/far'; import { makeMarshal, Remotable } from '@endo/marshal'; -import { unmarshalFromVstorage } from './marshal.js'; import { makeTracer } from './debug.js'; +import { NonNullish } from './errors.js'; import { isStreamCell, makeChainStorageRoot } from './lib-chainStorage.js'; +import { unmarshalFromVstorage } from './marshal.js'; import { bindAllMethods } from './method-tools.js'; import { eventLoopIteration } from './testing-utils.js'; @@ -33,6 +34,16 @@ export const defaultMarshaller = makeMarshal(undefined, slotToRemotable, { serializeBodyFormat: 'smallcaps', }); +/** + * Serialize/deserialize functions using {@link defaultMarshaller} + */ +export const defaultSerializer = { + /** @type {(text: string) => unknown} */ + parse: txt => defaultMarshaller.fromCapData(JSON.parse(txt)), + /** @type {(obj: any) => string} */ + stringify: obj => JSON.stringify(defaultMarshaller.toCapData(obj)), +}; + /** * A deserializer which produces slot strings instead of Remotables, so if `a = * Far('iface')`, and serializing `{ a }` into `capData` assigned it slot @@ -189,10 +200,26 @@ export const makeFakeStorageKit = (rootPath, rootOptions) => { }, ); const rootNode = makeChainStorageRoot(toStorage, rootPath, resolvedOptions); + + /** + * Get the values at a sequence node + * + * @param {string} path + * @returns {string[]} + */ + const getValues = path => { + assert(resolvedOptions.sequence); + const nodeData = data.get(path); + assert(nodeData, `no data at path ${path}`); + const wrapper = JSON.parse(nodeData); + return wrapper.values; + }; + return { rootNode, // eslint-disable-next-line object-shorthand data: /** @type {Map} */ (data), + getValues, messages, toStorage, }; @@ -250,30 +277,48 @@ export const makeMockChainStorageRoot = () => { * @param {import('ava').ExecutionContext} t * @param {MockChainStorageRoot | FakeStorageKit} storage * @param {({ note: string } | { node: string; owner: string }) & - * ({ pattern: string; replacement: string } | {})} opts + * ({ pattern: string; replacement: string } | {}) & { + * showValue?: (v: string) => unknown; + * }} opts */ export const documentStorageSchema = async (t, storage, opts) => { // chainStorage publication is unsynchronized await eventLoopIteration(); + const getLast = (/** @type {string} */ cell) => + JSON.parse(cell).values.at(-1) || assert.fail(); + const { showValue = s => s } = opts; + /** @type {(d: Map, k: string) => unknown} */ + const getBodyDefault = (d, k) => showValue(getLast(NonNullish(d.get(k)))); + const [keys, getBody] = 'keys' in storage ? [storage.keys(), (/** @type {string} */ k) => storage.getBody(k)] - : [storage.data.keys(), (/** @type {string} */ k) => storage.data.get(k)]; + : [ + storage.data.keys(), + (/** @type {string} */ k) => getBodyDefault(storage.data, k), + ]; const { pattern, replacement } = 'pattern' in opts ? opts : { pattern: 'mockChainStorageRoot.', replacement: 'published.' }; - const illustration = [...keys].sort().map( + + const pruned = [...keys] + .sort() + .filter( + 'node' in opts + ? key => + key + .replace(pattern, replacement) + .startsWith(`published.${opts.node}`) + : _entry => true, + ); + + const illustration = pruned.map( /** @type {(k: string) => [string, unknown]} */ key => [key.replace(pattern, replacement), getBody(key)], ); - const pruned = illustration.filter( - 'node' in opts - ? ([key, _]) => key.startsWith(`published.${opts.node}`) - : _entry => true, - ); const note = 'note' in opts @@ -283,5 +328,5 @@ export const documentStorageSchema = async (t, storage, opts) => { The example below illustrates the schema of the data published there. See also board marshalling conventions (_to appear_).`; - t.snapshot(pruned, note + boilerplate); + t.snapshot(illustration, note + boilerplate); }; diff --git a/packages/internal/src/types.ts b/packages/internal/src/types.ts index 54d13d2d509..9d5420ff3df 100644 --- a/packages/internal/src/types.ts +++ b/packages/internal/src/types.ts @@ -2,7 +2,7 @@ import type { ERef, RemotableBrand } from '@endo/eventual-send'; import type { Primitive } from '@endo/pass-style'; import type { Pattern } from '@endo/patterns'; -import type { Callable } from './utils.js'; +import type { Callable } from './ses-utils.js'; /** * A map corresponding with a total function such that `get(key)` is assumed to diff --git a/packages/internal/test/snapshots/exports.test.js.md b/packages/internal/test/snapshots/exports.test.js.md index 683deeab0dc..de3a330db68 100644 --- a/packages/internal/test/snapshots/exports.test.js.md +++ b/packages/internal/test/snapshots/exports.test.js.md @@ -9,7 +9,6 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - 'BASIS_POINTS', 'BridgeId', 'CosmosInitKeyToBridgeId', 'NonNullish', @@ -23,6 +22,7 @@ Generated by [AVA](https://avajs.dev). 'assertAllDefined', 'bindAllMethods', 'cast', + 'deepCopyJsonable', 'deepMapObject', 'deeplyFulfilledObject', 'forever', @@ -34,6 +34,7 @@ Generated by [AVA](https://avajs.dev). 'mustMatch', 'objectMap', 'objectMetaMap', + 'pureDataMarshaller', 'synchronizedTee', 'untilTrue', 'whileTrue', diff --git a/packages/internal/test/snapshots/exports.test.js.snap b/packages/internal/test/snapshots/exports.test.js.snap index a4732587e9f..8f11be2dad6 100644 Binary files a/packages/internal/test/snapshots/exports.test.js.snap and b/packages/internal/test/snapshots/exports.test.js.snap differ diff --git a/packages/internal/test/utils.test.js b/packages/internal/test/utils.test.js index 7d1b9ba5092..60d50fb34fc 100644 --- a/packages/internal/test/utils.test.js +++ b/packages/internal/test/utils.test.js @@ -2,16 +2,15 @@ import test from 'ava'; import { Far } from '@endo/far'; +import { deepMapObject, makeMeasureSeconds } from '../src/js-utils.js'; import { - makeMeasureSeconds, assertAllDefined, whileTrue, untilTrue, forever, deeplyFulfilledObject, - deepMapObject, synchronizedTee, -} from '../src/utils.js'; +} from '../src/ses-utils.js'; test('deeplyFulfilledObject', async t => { const someFar = Far('somefar', { getAsync: () => Promise.resolve('async') }); diff --git a/packages/internal/tsconfig.json b/packages/internal/tsconfig.json index f4bccfe777f..8baa1d41626 100644 --- a/packages/internal/tsconfig.json +++ b/packages/internal/tsconfig.json @@ -7,11 +7,8 @@ "noImplicitAny": true, }, "include": [ - "*.js", - "*.ts", - "src/**/*.js", - "src/**/*.ts", - "test/**/*.js", - "test/**/*.ts" + "src", + "test", + "tools" ] } diff --git a/packages/kmarshal/package.json b/packages/kmarshal/package.json index c1320118b1c..1ed87557dd9 100644 --- a/packages/kmarshal/package.json +++ b/packages/kmarshal/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -21,9 +21,9 @@ "lint:eslint": "eslint ." }, "dependencies": { - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1" + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/errors": "^1.2.8" }, "devDependencies": { "ava": "^5.3.0" diff --git a/packages/network/package.json b/packages/network/package.json index b468512a78c..4af89780881 100644 --- a/packages/network/package.json +++ b/packages/network/package.json @@ -10,7 +10,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -21,24 +21,24 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", - "@endo/base64": "^1.0.8", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/base64": "^1.0.9", + "@endo/far": "^1.1.9", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { "@agoric/swingset-liveslots": "^0.10.3-u18.0", "@agoric/swingset-vat": "^0.33.0-u18.0", "@agoric/vow": "^0.2.0-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/bundle-source": "^3.4.2", + "@endo/bundle-source": "^3.5.0", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "exports": { ".": "./src/index.js" @@ -66,6 +66,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 91.15 + "atLeast": 91.16 } } diff --git a/packages/network/test/fakes.js b/packages/network/test/fakes.js index 9ad80dca982..566c605ce05 100644 --- a/packages/network/test/fakes.js +++ b/packages/network/test/fakes.js @@ -13,7 +13,6 @@ import { * @import {ListenHandler, MakeEchoConnectionKit} from '../src/index.js'; */ -// eslint-disable-next-line no-constant-condition const log = false ? console.log : () => {}; /** diff --git a/packages/notifier/README.md b/packages/notifier/README.md index e5b8352bb59..074fe8bbb7c 100644 --- a/packages/notifier/README.md +++ b/packages/notifier/README.md @@ -182,7 +182,7 @@ time of calling `fork()`. Carol's code is like Bob's except lower level, using the ForkableAsyncIterable interface directly. ```js -import { makePromiseKit } from '@agoric/promiseKit'; +import { makePromiseKit } from '@endo/promise-kit'; const subscriptionIterator = subscription[Symbol.asyncIterator](); const { promise: afterA, resolve: afterAResolve } = makePromiseKit(); diff --git a/packages/notifier/package.json b/packages/notifier/package.json index 6bfeaba909c..cf4ef74bb75 100644 --- a/packages/notifier/package.json +++ b/packages/notifier/package.json @@ -12,7 +12,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -33,23 +33,23 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { "@agoric/kmarshal": "^0.1.1-u18.0", - "@agoric/swing-store": "^0.10.0-u18.0", "@agoric/swingset-liveslots": "^0.10.3-u18.0", + "@agoric/swing-store": "^0.10.0-u18.0", "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/init": "^1.1.6", - "@endo/ses-ava": "^1.2.7", + "@endo/init": "^1.1.7", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "exports": { ".": "./src/index.js", @@ -76,6 +76,6 @@ "timeout": "2m" }, "typeCoverage": { - "atLeast": 90.71 + "atLeast": 90.77 } } diff --git a/packages/notifier/src/types.ts b/packages/notifier/src/types.ts index 972ce7cf0c0..30d1281ea9d 100644 --- a/packages/notifier/src/types.ts +++ b/packages/notifier/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { StoredFacet, Unserializer, diff --git a/packages/notifier/test/makeNotifierFromSubscriber.test.js b/packages/notifier/test/makeNotifierFromSubscriber.test.js index 1193296736f..8ba52d65aeb 100644 --- a/packages/notifier/test/makeNotifierFromSubscriber.test.js +++ b/packages/notifier/test/makeNotifierFromSubscriber.test.js @@ -75,7 +75,6 @@ test('makeNotifierFromSubscriber(finishes) - getUpdateSince', async t => { const results = []; let updateCount; - // eslint-disable-next-line no-constant-condition while (true) { const result = await notifier.getUpdateSince(updateCount); ({ updateCount } = result); @@ -137,7 +136,6 @@ test('makeNotifierFromSubscriber(fails) - getUpdateSince', async t => { const results = []; let updateCount; try { - // eslint-disable-next-line no-constant-condition while (true) { const result = await notifier.getUpdateSince(updateCount); ({ updateCount } = result); diff --git a/packages/notifier/test/map-unum.js b/packages/notifier/test/map-unum.js index a0da12b78c8..46039f29a7e 100644 --- a/packages/notifier/test/map-unum.js +++ b/packages/notifier/test/map-unum.js @@ -23,7 +23,6 @@ export const makeMapLeader = initialEntries => { const change = delta => { if (deltaCount >= m.size) { - // eslint-disable-next-line no-use-before-define snapshot(); } else { deltaPublication.updateState(delta); diff --git a/packages/notifier/tsconfig.json b/packages/notifier/tsconfig.json index 6affe6ed970..2d0d78172fa 100644 --- a/packages/notifier/tsconfig.json +++ b/packages/notifier/tsconfig.json @@ -4,6 +4,7 @@ "compilerOptions": {}, "include": [ "src/**/*.js", + "subscribe.*", // exclude exported.js so that stub doesn't overwrite exportd.d.ts "test/**/*.js", "tools/**/*.js", diff --git a/packages/orchestration/index.js b/packages/orchestration/index.js index e124fcacb12..d218e68c57a 100644 --- a/packages/orchestration/index.js +++ b/packages/orchestration/index.js @@ -7,5 +7,8 @@ export * from './src/types-index.js'; // no named exports export * from './src/exos/cosmos-interchain-service.js'; export * from './src/exos/chain-hub-admin.js'; export * from './src/typeGuards.js'; +export * from './src/utils/denomHash.js'; export { withOrchestration } from './src/utils/start-helper.js'; +export { withChainCapabilities } from './src/chain-capabilities.js'; +export { registerChainsAndAssets } from './src/utils/chain-hub-helper.js'; diff --git a/packages/orchestration/package.json b/packages/orchestration/package.json index 992227f79a3..bc7f1054b0b 100644 --- a/packages/orchestration/package.json +++ b/packages/orchestration/package.json @@ -14,7 +14,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint": "run-s --continue-on-error lint:*", "lint:types": "tsc", @@ -46,11 +46,11 @@ "@agoric/vow": "^0.2.0-u18.0", "@agoric/zoe": "^0.26.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/base64": "^1.0.8", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/patterns": "^1.4.6", + "@endo/base64": "^1.0.9", + "@endo/errors": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/patterns": "^1.4.7", "@noble/hashes": "^1.5.0" }, "devDependencies": { @@ -58,13 +58,14 @@ "@chain-registry/client": "^1.47.4", "@cosmjs/amino": "^0.32.3", "@cosmjs/proto-signing": "^0.32.3", - "@endo/bundle-source": "^3.4.2", - "@endo/import-bundle": "^1.3.1", - "@endo/ses-ava": "^1.2.7", + "@endo/bundle-source": "^3.5.0", + "@endo/import-bundle": "^1.3.2", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.1", - "c8": "^9.1.0", - "prettier": "^3.3.2", - "ts-blank-space": "^0.4.1" + "bech32": "^2.0.0", + "c8": "^10.1.2", + "prettier": "^3.4.2", + "ts-blank-space": "^0.4.4" }, "ava": { "extensions": { @@ -93,6 +94,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 97.3 + "atLeast": 97.29 } } diff --git a/packages/orchestration/scripts/fetch-chain-info.ts b/packages/orchestration/scripts/fetch-chain-info.ts index 9634dfc884e..75ee144555e 100755 --- a/packages/orchestration/scripts/fetch-chain-info.ts +++ b/packages/orchestration/scripts/fetch-chain-info.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env -S node --import ts-blank-space/register /** @file Fetch canonical chain info to generate the minimum needed for agoricNames */ import { ChainRegistryClient } from '@chain-registry/client'; import fsp from 'node:fs/promises'; diff --git a/packages/orchestration/src/chain-capabilities.js b/packages/orchestration/src/chain-capabilities.js new file mode 100644 index 00000000000..20dfbdc4e07 --- /dev/null +++ b/packages/orchestration/src/chain-capabilities.js @@ -0,0 +1,60 @@ +/** + * @file Contains ChainInfo that not available from a well-known chain registry. + */ + +import { objectMap } from '@endo/patterns'; + +/** @import {CosmosChainInfo, KnownChains} from '@agoric/orchestration'; */ + +/** + * Chains with the async-icq (icq-1) module available. + * + * @satisfies {Partial>} + */ +const IcqEnabled = /** @type {const} */ ({ + omniflixhub: true, + osmosis: true, +}); +harden(IcqEnabled); + +/** + * Chains with the packet-forward-middleware module available. + * + * @satisfies {Partial>} + */ +const PfmEnabled = /** @type {const} */ ({ + agoric: true, + celestia: true, + cosmoshub: true, + juno: true, + neutron: true, + noble: true, + omniflixhub: true, + osmosis: true, + secretnetwork: true, + stargaze: true, + stride: true, + umee: true, +}); +harden(PfmEnabled); + +/** + * @param {Record} chainInfo + * @param {{ + * PfmEnabled: Record; + * IcqEnabled: Record; + * }} [opts] + */ +export const withChainCapabilities = ( + chainInfo, + opts = { + PfmEnabled, + IcqEnabled, + }, +) => { + return objectMap(chainInfo, (info, name) => ({ + ...info, + pfmEnabled: !!opts.PfmEnabled[name], + icqEnabled: !!opts.IcqEnabled[name], + })); +}; diff --git a/packages/orchestration/src/cosmos-api.ts b/packages/orchestration/src/cosmos-api.ts index 40f3e255281..a4934c2006c 100644 --- a/packages/orchestration/src/cosmos-api.ts +++ b/packages/orchestration/src/cosmos-api.ts @@ -8,6 +8,7 @@ import type { } 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, @@ -19,7 +20,12 @@ import type { } 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 } from '@agoric/vats'; +import type { + IBCChannelID, + IBCConnectionID, + IBCPortID, + VTransferIBCEvent, +} from '@agoric/vats'; import type { TargetApp, TargetRegistration, @@ -29,7 +35,9 @@ import type { RemoteIbcAddress, } from '@agoric/vats/tools/ibc-utils.js'; import type { QueryDelegationTotalRewardsResponse } from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import type { Coin } from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; import type { AmountArg, ChainAddress, Denom, DenomAmount } from './types.js'; +import { PFM_RECEIVER } from './exos/chain-hub.js'; /** An address for a validator on some blockchain, e.g., cosmos, eth, etc. */ export type CosmosValidatorAddress = ChainAddress & { @@ -85,12 +93,18 @@ export interface CosmosAssetInfo extends Record { * 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; - + /** + * Note: developers must provide this value themselves for `.transfer` to work + * as expected. Please see examples for details. + */ + pfmEnabled?: boolean; /** * cf https://github.com/cosmos/chain-registry/blob/master/chain.schema.json#L117 */ @@ -224,20 +238,10 @@ export interface StakingAccountActions { } /** - * Low level object that supports queries and operations for an account on a remote chain. + * Low level methods from IcaAccount that we pass through to CosmosOrchestrationAccount */ -export interface IcaAccount { - /** - * @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; +export interface IcaAccountMethods { /** * Submit a transaction on behalf of the remote account for execution on the remote chain. * @param msgs - records for the transaction @@ -265,6 +269,23 @@ export interface IcaAccount { * @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 */ @@ -278,16 +299,22 @@ export interface LiquidStakingMethods { liquidStake: (amount: AmountArg) => Promise; } +// TODO support StakingAccountQueries /** Methods supported only on Agoric chain accounts */ -export interface LocalAccountMethods { +export interface LocalAccountMethods extends StakingAccountActions { /** deposit payment (from zoe, for example) to the account */ - deposit: (payment: Payment<'nat'>) => Promise; + 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. Each account may be associated - * with at most one handler at a given time. + * 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. @@ -306,6 +333,12 @@ export interface IBCMsgTransferOptions { timeoutHeight?: MsgTransfer['timeoutHeight']; timeoutTimestamp?: MsgTransfer['timeoutTimestamp']; memo?: string; + forwardOpts?: { + /** The recipient address for the intermediate transfer. Defaults to 'pfm' unless specified */ + intermediateRecipient?: ChainAddress; + timeout?: ForwardInfo['forward']['timeout']; + retries?: ForwardInfo['forward']['retries']; + }; } /** @@ -318,17 +351,71 @@ export interface IBCMsgTransferOptions { * @see {OrchestrationAccountI} */ export type CosmosChainAccountMethods = - (CCI extends { - icaEnabled: true; - } - ? IcaAccount - : {}) & - CCI extends { - stakingTokens: {}; - } - ? StakingAccountActions & StakingAccountQueries - : {}; + IcaAccountMethods & + (CCI extends { + stakingTokens: {}; + } + ? StakingAccountActions & StakingAccountQueries + : {}); export type ICQQueryFunction = ( msgs: JsonSafe[], ) => Promise[]>; + +/** + * Message structure for PFM memo + * + * @see {@link https://github.com/cosmos/chain-registry/blob/58b603bbe01f70e911e3ad2bdb6b90c4ca665735/_memo_keys/ICS20_memo_keys.json#L38-L60} + */ +export interface ForwardInfo { + forward: { + receiver: ChainAddress['value']; + port: IBCPortID; + channel: IBCChannelID; + /** e.g. '10m' */ + timeout: GoDuration; + /** default is 3? */ + retries: number; + next?: { + forward: ForwardInfo; + }; + }; +} + +/** + * Object used to help build MsgTransfer parameters for IBC transfers. + * + * If `forwardInfo` is present: + * - it must be stringified and provided as the `memo` field value for + * use with `MsgTransfer`. + * - `receiver` will be set to `"pfm"` - purposely invalid bech32. see {@link https://github.com/cosmos/ibc-apps/blob/26f3ad8f58e4ffc7769c6766cb42b954181dc100/middleware/packet-forward-middleware/README.md#minimal-example---chain-forward-a-b-c} + */ +export type TransferRoute = { + /** typically, `transfer` */ + sourcePort: string; + sourceChannel: IBCChannelID; + token: Coin; +} & ( + | { + receiver: typeof PFM_RECEIVER | ChainAddress['value']; + /** contains PFM forwarding info */ + forwardInfo: ForwardInfo; + } + | { + receiver: string; + forwardInfo?: never; + } +); + +/** Single units allowed in Go time duration strings */ +type GoDurationUnit = 'h' | 'm' | 's' | 'ms' | 'us' | 'ns'; + +/** + * Type for a time duration string in Go (cosmos-sdk). For example, "1h", "3m". + * + * Note: this does not support composite values like "1h30m", "1m30s", + * which are allowed in Go. + * + * @see https://pkg.go.dev/time#ParseDuration + */ +export type GoDuration = `${number}${GoDurationUnit}`; diff --git a/packages/orchestration/src/examples/auto-stake-it.contract.js b/packages/orchestration/src/examples/auto-stake-it.contract.js index d08781e47ff..4db3c55adcb 100644 --- a/packages/orchestration/src/examples/auto-stake-it.contract.js +++ b/packages/orchestration/src/examples/auto-stake-it.contract.js @@ -8,10 +8,12 @@ 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 { registerChainsAndAssets } from '../utils/chain-hub-helper.js'; /** * @import {Zone} from '@agoric/zone'; * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '../types.js'; */ /** @@ -23,13 +25,15 @@ import * as flows from './auto-stake-it.flows.js'; * @param {ZCF} zcf * @param {OrchestrationPowers & { * marshaller: Marshaller; - * }} _privateArgs + * chainInfo?: Record; + * assetInfo?: [Denom, DenomDetail & { brandKey?: string }][]; + * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools */ const contract = async ( zcf, - _privateArgs, + privateArgs, zone, { chainHub, orchestrateAll, vowTools }, ) => { @@ -67,6 +71,13 @@ const contract = async ( const creatorFacet = prepareChainHubAdmin(zone, chainHub); + registerChainsAndAssets( + chainHub, + zcf.getTerms().brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + return { publicFacet, creatorFacet }; }; diff --git a/packages/orchestration/src/examples/basic-flows.contract.js b/packages/orchestration/src/examples/basic-flows.contract.js index 60f58cadd1f..ab8387d2ec8 100644 --- a/packages/orchestration/src/examples/basic-flows.contract.js +++ b/packages/orchestration/src/examples/basic-flows.contract.js @@ -6,10 +6,12 @@ import { InvitationShape } from '@agoric/zoe/src/typeGuards.js'; import { M } from '@endo/patterns'; import { preparePortfolioHolder } from '../exos/portfolio-holder-kit.js'; import { withOrchestration } from '../utils/start-helper.js'; +import { registerChainsAndAssets } from '../utils/chain-hub-helper.js'; import * as flows from './basic-flows.flows.js'; /** * @import {Zone} from '@agoric/zone'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; */ @@ -17,15 +19,17 @@ import * as flows from './basic-flows.flows.js'; * @param {ZCF} zcf * @param {OrchestrationPowers & { * marshaller: Marshaller; - * }} _privateArgs + * chainInfo?: Record; + * assetInfo?: [Denom, DenomDetail & { brandKey?: string }][]; + * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools */ const contract = async ( zcf, - _privateArgs, + privateArgs, zone, - { orchestrateAll, vowTools }, + { chainHub, orchestrateAll, vowTools }, ) => { const makePortfolioHolder = preparePortfolioHolder( zone.subZone('portfolio'), @@ -56,6 +60,13 @@ const contract = async ( }, ); + registerChainsAndAssets( + chainHub, + zcf.getTerms().brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + return { publicFacet }; }; diff --git a/packages/orchestration/src/examples/send-anywhere.contract.js b/packages/orchestration/src/examples/send-anywhere.contract.js index 3cfab6ec922..b277d5733ad 100644 --- a/packages/orchestration/src/examples/send-anywhere.contract.js +++ b/packages/orchestration/src/examples/send-anywhere.contract.js @@ -4,6 +4,7 @@ import { M } from '@endo/patterns'; import { prepareChainHubAdmin } from '../exos/chain-hub-admin.js'; import { AnyNatAmountShape } from '../typeGuards.js'; import { withOrchestration } from '../utils/start-helper.js'; +import { registerChainsAndAssets } from '../utils/chain-hub-helper.js'; import * as flows from './send-anywhere.flows.js'; import * as sharedFlows from './shared.flows.js'; @@ -11,6 +12,7 @@ import * as sharedFlows from './shared.flows.js'; * @import {Vow} from '@agoric/vow'; * @import {Zone} from '@agoric/zone'; * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; */ export const SingleNatAmountRecord = M.and( @@ -27,6 +29,8 @@ harden(SingleNatAmountRecord); * @param {ZCF} zcf * @param {OrchestrationPowers & { * marshaller: Marshaller; + * chainInfo?: Record; + * assetInfo?: [Denom, DenomDetail & { brandKey?: string }][]; * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools @@ -82,6 +86,13 @@ export const contract = async ( }, ); + registerChainsAndAssets( + chainHub, + zcf.getTerms().brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + return { publicFacet, creatorFacet }; }; harden(contract); diff --git a/packages/orchestration/src/examples/staking-combinations.contract.js b/packages/orchestration/src/examples/staking-combinations.contract.js index 0f233c85fdf..209fe7dc787 100644 --- a/packages/orchestration/src/examples/staking-combinations.contract.js +++ b/packages/orchestration/src/examples/staking-combinations.contract.js @@ -75,7 +75,6 @@ const contract = async ( * @param {{ validator: CosmosValidatorAddress }} offerArgs */ (seat, { validator }) => - // eslint-disable-next-line no-use-before-define -- defined by orchestrateAll, necessarily after this orchFns.depositAndDelegate(account, seat, validator), 'Deposit and delegate', undefined, @@ -98,7 +97,6 @@ const contract = async ( return zcf.makeInvitation( () => - // eslint-disable-next-line no-use-before-define -- defined by orchestrateAll, necessarily after this orchFns.undelegateAndTransfer(account, { delegations, destination, @@ -133,6 +131,7 @@ const contract = async ( ); const orchFns = orchestrateAll(flows, { + chainHub, sharedLocalAccountP, makeCombineInvitationMakers, makeExtraInvitationMaker, diff --git a/packages/orchestration/src/examples/staking-combinations.flows.js b/packages/orchestration/src/examples/staking-combinations.flows.js index 23b1583ce58..2df03f35102 100644 --- a/packages/orchestration/src/examples/staking-combinations.flows.js +++ b/packages/orchestration/src/examples/staking-combinations.flows.js @@ -1,6 +1,6 @@ /** * @import {GuestInterface} from '@agoric/async-flow'; - * @import {Orchestrator, OrchestrationFlow, AmountArg, CosmosValidatorAddress, ChainAddress, LocalAccountMethods, OrchestrationAccountI} from '../types.js' + * @import {Orchestrator, OrchestrationFlow, AmountArg, CosmosValidatorAddress, ChainAddress, LocalAccountMethods, OrchestrationAccountCommon, ChainHub} from '../types.js' * @import {ContinuingOfferResult, InvitationMakers} from '@agoric/smart-wallet/src/types.js'; * @import {LocalOrchestrationAccountKit} from '../exos/local-orchestration-account.js'; * @import {MakeCombineInvitationMakers} from '../exos/combine-invitation-makers.js'; @@ -9,7 +9,7 @@ */ import { mustMatch } from '@endo/patterns'; -import { makeError, q } from '@endo/errors'; +import { Fail, makeError, q } from '@endo/errors'; import { makeTracer } from '@agoric/internal'; import { ChainAddressShape } from '../typeGuards.js'; @@ -48,6 +48,7 @@ harden(makeAccount); * @satisfies {OrchestrationFlow} * @param {Orchestrator} orch * @param {object} ctx + * @param {GuestInterface} ctx.chainHub * @param {Promise>} ctx.sharedLocalAccountP * @param {GuestInterface} ctx.zoeTools * @param {GuestInterface} account @@ -57,7 +58,7 @@ harden(makeAccount); */ export const depositAndDelegate = async ( orch, - { sharedLocalAccountP, zoeTools }, + { chainHub, sharedLocalAccountP, zoeTools }, account, seat, validator, @@ -84,7 +85,11 @@ export const depositAndDelegate = async ( throw errMsg; } seat.exit(); - await account.delegate(validator, give.Stake); + const denom = chainHub.getDenom(give.Stake.brand); + if (!denom) throw Fail`unknown brand ${q(give.Stake.brand)}`; + // TODO #10449 amountToCoin accepts brands + const denomAmount = harden({ denom, value: give.Stake.value }); + await account.delegate(validator, denomAmount); }; harden(depositAndDelegate); diff --git a/packages/orchestration/src/examples/swap.contract.js b/packages/orchestration/src/examples/swap.contract.js index e726d371cf1..400eae50b92 100644 --- a/packages/orchestration/src/examples/swap.contract.js +++ b/packages/orchestration/src/examples/swap.contract.js @@ -3,6 +3,7 @@ import { TimerServiceShape } from '@agoric/time'; import { M } from '@endo/patterns'; import { withOrchestration } from '../utils/start-helper.js'; import * as flows from './swap.flows.js'; +import { CosmosChainInfoShape, DenomDetailShape } from '../typeGuards.js'; /** * @import {TimerService} from '@agoric/time'; @@ -12,6 +13,7 @@ import * as flows from './swap.flows.js'; * @import {NameHub} from '@agoric/vats'; * @import {Zone} from '@agoric/zone'; * @import {OrchestrationTools} from '../utils/start-helper.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; */ /** @type {ContractMeta} */ @@ -23,6 +25,8 @@ export const meta = { storageNode: StorageNodeShape, marshaller: M.remotable('marshaller'), timerService: M.or(TimerServiceShape, null), + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), + assetInfo: M.arrayOf([M.string(), DenomDetailShape]), }, upgradability: 'canUpgrade', }; @@ -49,6 +53,8 @@ harden(makeNatAmountShape); * storageNode: Remote; * timerService: Remote; * marshaller: Marshaller; + * chainInfo: Record; + * assetInfo: [Denom, DenomDetail & { brandKey?: string }][]; * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools diff --git a/packages/orchestration/src/exos/README.md b/packages/orchestration/src/exos/README.md index f147c1bf071..0599cbbbf1a 100644 --- a/packages/orchestration/src/exos/README.md +++ b/packages/orchestration/src/exos/README.md @@ -1,6 +1,6 @@ # Exo structure -Last verified 2024-09-06 +Last verified 2024-10-30 ```mermaid classDiagram @@ -52,9 +52,9 @@ classDiagram %% In other vats class Port { - getLocalAddress() addListener() connect() + getLocalAddress() removeListener() revoke() } @@ -76,9 +76,8 @@ classDiagram deposit() executeTx() getBalance() - withdraw() - executeTx() monitorTransfers() + withdraw() } %% In api consumer vats @@ -113,12 +112,14 @@ classDiagram timer: Timer topicKit: RecorderKit asContinuingOffer() + deactivate() delegate() executeEncodedTx() getAddress() getBalance() getBalances() getPublicTopics() + reactivate() redelegate() send() sendAll() diff --git a/packages/orchestration/src/exos/chain-hub-admin.js b/packages/orchestration/src/exos/chain-hub-admin.js index e790257b3b4..2a365508ebe 100644 --- a/packages/orchestration/src/exos/chain-hub-admin.js +++ b/packages/orchestration/src/exos/chain-hub-admin.js @@ -2,8 +2,7 @@ /* 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 { CosmosChainInfoShape, DenomDetailShape } from '../typeGuards.js'; /** * @import {Zone} from '@agoric/zone'; diff --git a/packages/orchestration/src/exos/chain-hub.js b/packages/orchestration/src/exos/chain-hub.js index 120d51fae9a..557d25e0585 100644 --- a/packages/orchestration/src/exos/chain-hub.js +++ b/packages/orchestration/src/exos/chain-hub.js @@ -4,19 +4,32 @@ import { M } from '@endo/patterns'; import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; import { VowShape } from '@agoric/vow'; -import { CosmosChainInfoShape, IBCConnectionInfoShape } from '../typeGuards.js'; +import { + ChainAddressShape, + CoinShape, + CosmosChainInfoShape, + DenomAmountShape, + DenomDetailShape, + ForwardInfoShape, + ForwardOptsShape, + IBCChannelIDShape, + 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 {CosmosAssetInfo, CosmosChainInfo, ForwardInfo, IBCConnectionInfo, IBCMsgTransferOptions, TransferRoute, GoDuration} from '../cosmos-api.js'; * @import {ChainInfo, KnownChains} from '../chain-info.js'; - * @import {Denom} from '../orchestration-api.js'; - * @import {Remote} from '@agoric/internal'; - * @import {TypedPattern} from '@agoric/internal'; + * @import {ChainAddress, Denom, DenomAmount} from '../orchestration-api.js'; + * @import {Remote, TypedPattern} from '@agoric/internal'; */ +/** receiver address value for ibc transfers that involve PFM */ +export const PFM_RECEIVER = /** @type {const} */ ('pfm'); + /** * If K matches a known chain, narrow the type from generic ChainInfo * @@ -35,11 +48,6 @@ import { CosmosChainInfoShape, IBCConnectionInfoShape } from '../typeGuards.js'; * @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]} @@ -98,7 +106,7 @@ export const connectionKey = (chainId1, chainId2) => { */ const reverseConnInfo = connInfo => { const { transferChannel } = connInfo; - return { + return harden({ id: connInfo.counterparty.connection_id, client_id: connInfo.counterparty.client_id, counterparty: { @@ -113,7 +121,7 @@ const reverseConnInfo = connInfo => { portId: transferChannel.counterPartyPortId, counterPartyPortId: transferChannel.portId, }, - }; + }); }; /** @@ -167,6 +175,26 @@ const ChainIdArgShape = M.or( ), ); +// TODO #9324 determine timeout defaults +const DefaultPfmTimeoutOpts = harden( + /** @type {const} */ ({ + retries: 3, + timeout: /** @type {const} */ ('10m'), + }), +); + +/** @type {TypedPattern} */ +export const TransferRouteShape = M.splitRecord( + { + sourcePort: M.string(), + sourceChannel: IBCChannelIDShape, + token: CoinShape, + receiver: M.string(), + }, + { forwardInfo: ForwardInfoShape }, + {}, +); + const ChainHubI = M.interface('ChainHub', { registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), getChainInfo: M.call(M.string()).returns(VowShape), @@ -178,8 +206,14 @@ const ChainHubI = M.interface('ChainHub', { 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())), + getAsset: M.call(M.string(), 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), + makeTransferRoute: M.call(ChainAddressShape, DenomAmountShape, M.string()) + .optional(ForwardOptsShape) + .returns(M.or(M.undefined(), TransferRouteShape)), }); /** @@ -216,6 +250,17 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { keyShape: BrandShape, valueShape: M.string(), }); + /** @type {MapStore} */ + const bech32PrefixToChainName = zone.mapStore('bech32PrefixToChainName', { + keyShape: M.string(), + valueShape: M.string(), + }); + + /** + * @param {Denom} denom - from perspective of the src/holding chain + * @param {DenomDetail['chainName']} srcChainName + */ + const makeDenomKey = (denom, srcChainName) => `${srcChainName}:${denom}`; const lookupChainInfo = vowTools.retryable( zone, @@ -230,6 +275,9 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { // 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) { @@ -269,7 +317,6 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { }, ); - /* eslint-disable no-use-before-define -- chainHub defined below */ const lookupChainsAndConnection = vowTools.retryable( zone, 'lookupChainsAndConnection', @@ -316,6 +363,9 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { */ registerChain(name, chainInfo) { chainInfos.init(name, chainInfo); + if (chainInfo.bech32Prefix) { + bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); + } }, /** * @template {string} K @@ -396,8 +446,14 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { Fail`must register chain ${q(chainName)} first`; chainInfos.has(baseName) || Fail`must register chain ${q(baseName)} first`; - denomDetails.init(denom, detail); + + const denomKey = makeDenomKey(denom, detail.chainName); + denomDetails.has(denomKey) && + Fail`already registered ${q(denom)} on ${q(chainName)}`; + denomDetails.init(denomKey, detail); if (detail.brand) { + chainName === 'agoric' || + Fail`brands only registerable for agoric-held assets`; brandDenoms.init(detail.brand, denom); } }, @@ -405,11 +461,13 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { * Retrieve holding, issuing chain names etc. for a denom. * * @param {Denom} denom + * @param {string} srcChainName - the chainName the denom is held on * @returns {DenomDetail | undefined} */ - getAsset(denom) { - if (denomDetails.has(denom)) { - return denomDetails.get(denom); + getAsset(denom, srcChainName) { + const denomKey = makeDenomKey(denom, srcChainName); + if (denomDetails.has(denomKey)) { + return denomDetails.get(denomKey); } return undefined; }, @@ -425,6 +483,133 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { } return undefined; }, + /** + * @param {string} address bech32 address + * @returns {ChainAddress} + * @throws {Error} if chain info not found for bech32Prefix + */ + 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'), + }); + }, + /** + * Determine the transfer route for a destination and amount given the + * current holding chain. + * + * Does not account for routes with more than 1 intermediary hop - that is, + * it can't unwrap denoms that were incorrectly routed. + * + * XXX consider accepting AmountArg #10449 + * + * @param {ChainAddress} destination + * @param {DenomAmount} denomAmount + * @param {string} srcChainName + * @param {IBCMsgTransferOptions['forwardOpts']} [forwardOpts] + * @returns {TransferRoute} single hop, multi hop + * @throws {Error} if unable to determine route + */ + makeTransferRoute(destination, denomAmount, srcChainName, forwardOpts) { + chainInfos.has(srcChainName) || + Fail`chain info not found for holding chain: ${q(srcChainName)}`; + + const denomDetail = chainHub.getAsset(denomAmount.denom, srcChainName); + denomDetail || + Fail`no denom detail for: ${q(denomAmount.denom)} on ${q(srcChainName)}. ensure it is registered in chainHub.`; + + const { baseName, chainName } = /** @type {DenomDetail} */ (denomDetail); + + // currently unreachable since assets are registered with holdingChainName + chainName === srcChainName || + Fail`cannot transfer asset ${q(denomAmount.denom)}. held on ${q(chainName)} not ${q(srcChainName)}.`; + + // currently unreachable since we can't register an asset before a chain + chainInfos.has(baseName) || + Fail`chain info not found for issuing chain: ${q(baseName)}`; + + const { chainId: baseChainId, pfmEnabled } = chainInfos.get(baseName); + + const holdingChainId = chainInfos.get(srcChainName).chainId; + + // asset is transferring to or from the issuing chain, return direct route + if (baseChainId === destination.chainId || baseName === srcChainName) { + // TODO use getConnectionInfo once its sync + const connKey = connectionKey(holdingChainId, destination.chainId); + connectionInfos.has(connKey) || + Fail`no connection info found for ${holdingChainId}<->${destination.chainId}`; + + const { transferChannel } = denormalizeConnectionInfo( + holdingChainId, // from chain (primary) + destination.chainId, // to chain (counterparty) + connectionInfos.get(connKey), + ); + return harden({ + sourcePort: transferChannel.portId, + sourceChannel: transferChannel.channelId, + token: { + amount: String(denomAmount.value), + denom: denomAmount.denom, + }, + receiver: destination.value, + }); + } + + // asset is issued on a 3rd chain, attempt pfm route + pfmEnabled || Fail`pfm not enabled on issuing chain: ${q(baseName)}`; + + // TODO use getConnectionInfo once its sync + const currToIssuerKey = connectionKey(holdingChainId, baseChainId); + connectionInfos.has(currToIssuerKey) || + Fail`no connection info found for ${holdingChainId}<->${baseChainId}`; + + const issuerToDestKey = connectionKey(baseChainId, destination.chainId); + connectionInfos.has(issuerToDestKey) || + Fail`no connection info found for ${baseChainId}<->${destination.chainId}`; + + const currToIssuer = denormalizeConnectionInfo( + holdingChainId, + baseChainId, + connectionInfos.get(currToIssuerKey), + ); + const issuerToDest = denormalizeConnectionInfo( + baseChainId, + destination.chainId, + connectionInfos.get(issuerToDestKey), + ); + + /** @type {ForwardInfo} */ + const forwardInfo = harden({ + forward: { + receiver: destination.value, + port: issuerToDest.transferChannel.portId, + channel: issuerToDest.transferChannel.channelId, + ...DefaultPfmTimeoutOpts, + ...forwardOpts, + }, + }); + return harden({ + sourcePort: currToIssuer.transferChannel.portId, + sourceChannel: currToIssuer.transferChannel.channelId, + token: { + amount: String(denomAmount.value), + denom: denomAmount.denom, + }, + /** + * purposely using invalid bech32 + * {@link https://github.com/cosmos/ibc-apps/blob/26f3ad8f58e4ffc7769c6766cb42b954181dc100/middleware/packet-forward-middleware/README.md#minimal-example---chain-forward-a-b-c} + */ + receiver: forwardOpts?.intermediateRecipient?.value || PFM_RECEIVER, + forwardInfo, + }); + }, }); return chainHub; diff --git a/packages/orchestration/src/exos/cosmos-interchain-service.js b/packages/orchestration/src/exos/cosmos-interchain-service.js index 5724cc9490a..16c182d5d3a 100644 --- a/packages/orchestration/src/exos/cosmos-interchain-service.js +++ b/packages/orchestration/src/exos/cosmos-interchain-service.js @@ -25,7 +25,7 @@ import { prepareICQConnectionKit } from './icq-connection-kit.js'; const { Vow$ } = NetworkShape; // TODO #9611 /** - * @typedef {object} OrchestrationPowers + * @typedef {object} CosmosOrchestrationPowers * @property {Remote} portAllocator * @property {undefined} reserved reserve a state key for future use. can hold * an additional power or a record of powers @@ -39,7 +39,7 @@ const { Vow$ } = NetworkShape; // TODO #9611 * @typedef {{ * icqConnections: ICQConnectionStore; * sharedICQPort: Remote | undefined; - * } & OrchestrationPowers} OrchestrationState + * } & CosmosOrchestrationPowers} OrchestrationState */ /** @@ -101,7 +101,7 @@ const prepareCosmosOrchestrationServiceKit = ( .returns(Vow$(M.remotable('ICQConnection'))), }), }, - /** @param {Partial} powers */ + /** @param {Partial} powers */ powers => { mustMatch(powers?.portAllocator, M.remotable('PortAllocator')); const icqConnections = zone.detached().mapStore('ICQConnections'); diff --git a/packages/orchestration/src/exos/cosmos-orchestration-account.js b/packages/orchestration/src/exos/cosmos-orchestration-account.js index cf80a6c42f5..1e1ae810283 100644 --- a/packages/orchestration/src/exos/cosmos-orchestration-account.js +++ b/packages/orchestration/src/exos/cosmos-orchestration-account.js @@ -50,6 +50,8 @@ import { DelegationShape, DenomAmountShape, IBCTransferOptionsShape, + Proto3Shape, + TxBodyOptsShape, } from '../typeGuards.js'; import { coerceCoin, coerceDenom } from '../utils/amounts.js'; import { @@ -65,7 +67,7 @@ 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 {AmountArg, IcaAccount, ChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountCommon, 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'; @@ -80,7 +82,7 @@ import { makeTimestampHelper } from '../utils/time.js'; * @import {LocalIbcAddress, RemoteIbcAddress} from '@agoric/vats/tools/ibc-utils.js'; */ -const trace = makeTracer('ComosOrchestrationAccountHolder'); +const trace = makeTracer('CosmosOrchAccount'); const { Vow$ } = NetworkShape; // TODO #9611 @@ -136,13 +138,16 @@ const stakingAccountQueriesMethods = { getRewards: M.call().returns(VowShape), }; -/** @see {OrchestrationAccountI} */ +/** @see {OrchestrationAccountCommon} */ 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] }} */ @@ -335,6 +340,8 @@ export const prepareCosmosOrchestrationAccountKit = ( * @returns {Coin} */ amountToCoin(amount) { + !('brand' in amount) || + Fail`'amountToCoin' not working for ${q(amount.brand)} until #10449; use 'DenomAmount' for now`; return coerceCoin(chainHub, amount); }, }, @@ -695,7 +702,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }, }, holder: { - /** @type {HostOf} */ + /** @type {HostOf} */ asContinuingOffer() { // @ts-expect-error XXX invitationMakers // getPublicTopics resolves promptly (same run), so we don't need a watcher @@ -717,7 +724,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ getPublicTopics() { // getStoragePath resolves promptly (same run), so we don't need a watcher // eslint-disable-next-line no-restricted-syntax @@ -734,7 +741,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ getAddress() { return this.state.chainAddress; }, @@ -801,7 +808,7 @@ export const prepareCosmosOrchestrationAccountKit = ( return watch(results, this.facets.withdrawRewardWatcher); }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ getBalance(denom) { return asVow(() => { const { chainAddress, icqConnection } = this.state; @@ -820,7 +827,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ getBalances() { return asVow(() => { const { chainAddress, icqConnection } = this.state; @@ -838,7 +845,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ send(toAccount, amount) { return asVow(() => { trace('send', toAccount, amount); @@ -859,7 +866,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ sendAll(toAccount, amounts) { return asVow(() => { trace('sendAll', toAccount, amounts); @@ -880,7 +887,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ transfer(destination, amount, opts) { trace('transfer', destination, amount, opts); return asVow(() => { @@ -914,7 +921,7 @@ export const prepareCosmosOrchestrationAccountKit = ( }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ transferSteps(amount, msg) { console.log('transferSteps got', amount, msg); return asVow(() => Fail`not yet implemented`); @@ -955,11 +962,11 @@ export const prepareCosmosOrchestrationAccountKit = ( }, /** @type {HostOf} */ deactivate() { - return watch(E(this.facets.helper.owned()).deactivate()); + return asVow(() => watch(E(this.facets.helper.owned()).deactivate())); }, /** @type {HostOf} */ reactivate() { - return watch(E(this.facets.helper.owned()).reactivate()); + return asVow(() => watch(E(this.facets.helper.owned()).reactivate())); }, /** @type {HostOf} */ getDelegation(validator) { @@ -1093,6 +1100,12 @@ export const prepareCosmosOrchestrationAccountKit = ( return watch(results, this.facets.rewardsQueryWatcher); }); }, + /** @type {HostOf} */ + executeEncodedTx(msgs, opts) { + return asVow(() => + watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), + ); + }, }, }, ); diff --git a/packages/orchestration/src/exos/local-orchestration-account.js b/packages/orchestration/src/exos/local-orchestration-account.js index bc5e1f2a48a..8b5a04d9a4e 100644 --- a/packages/orchestration/src/exos/local-orchestration-account.js +++ b/packages/orchestration/src/exos/local-orchestration-account.js @@ -11,7 +11,6 @@ import { Fail, q } from '@endo/errors'; import { AmountArgShape, AnyNatAmountsRecord, - ChainAddressShape, DenomAmountShape, DenomShape, IBCTransferOptionsShape, @@ -24,11 +23,12 @@ 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 { TransferRouteShape } from './chain-hub.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 {AmountArg, ChainAddress, DenomAmount, IBCMsgTransferOptions, IBCConnectionInfo, OrchestrationAccountCommon, LocalAccountMethods, TransferRoute} from '@agoric/orchestration'; * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'. * @import {Zone} from '@agoric/zone'; * @import {Remote} from '@agoric/internal'; @@ -43,7 +43,7 @@ import { coerceCoin, coerceDenomAmount } from '../utils/amounts.js'; * @import {ZoeTools} from '../utils/zoe-tools.js'; */ -const trace = makeTracer('LOA'); +const trace = makeTracer('LocalOrchAccount'); const { Vow$ } = NetworkShape; // TODO #9611 @@ -107,7 +107,7 @@ export const prepareLocalOrchestrationAccountKit = ( zoeTools, }, ) => { - const { watch, allVows, asVow, when } = vowTools; + const { watch, asVow, when } = vowTools; const { makeIBCTransferSender } = prepareIBCTools( zone.subZone('ibcTools'), vowTools, @@ -134,11 +134,10 @@ export const prepareLocalOrchestrationAccountKit = ( .returns(VowShape), }), transferWatcher: M.interface('transferWatcher', { - onFulfilled: M.call([M.record(), M.nat()]) + onFulfilled: M.call(M.nat()) .optional({ - destination: ChainAddressShape, opts: M.or(M.undefined(), IBCTransferOptionsShape), - amount: DenomAmountShape, + route: TransferRouteShape, }) .returns(Vow$(M.record())), }), @@ -345,37 +344,34 @@ export const prepareLocalOrchestrationAccountKit = ( }, transferWatcher: { /** - * @param {[ - * { transferChannel: IBCConnectionInfo['transferChannel'] }, - * bigint, - * ]} results + * @param {bigint} timeoutTimestamp * @param {{ - * destination: ChainAddress; - * opts?: IBCMsgTransferOptions; - * amount: DenomAmount; + * opts?: Omit; + * route: TransferRoute; * }} ctx */ - onFulfilled( - [{ transferChannel }, timeoutTimestamp], - { opts, amount, destination }, - ) { + onFulfilled(timeoutTimestamp, { opts, route }) { + const { forwardInfo, ...transferDetails } = route; + /** @type {string | undefined} */ + let memo; + if (opts && 'memo' in opts) { + memo = opts.memo; + } + if (forwardInfo) { + // forward memo takes precedence + memo = JSON.stringify(forwardInfo); + } const transferMsg = typedJson( '/ibc.applications.transfer.v1.MsgTransfer', { - sourcePort: transferChannel.portId, - sourceChannel: transferChannel.channelId, - token: { - amount: String(amount.value), - denom: amount.denom, - }, + ...transferDetails, sender: this.state.address.value, - receiver: destination.value, timeoutHeight: opts?.timeoutHeight ?? { revisionHeight: 0n, revisionNumber: 0n, }, timeoutTimestamp, - memo: opts?.memo ?? '', + memo: memo ?? '', }, ); @@ -395,9 +391,7 @@ export const prepareLocalOrchestrationAccountKit = ( * first result */ extractFirstResultWatcher: { - /** - * @param {Record[]} results - */ + /** @param {Record[]} results */ onFulfilled(results) { results.length === 1 || Fail`expected exactly one result; got ${results}`; @@ -482,7 +476,7 @@ export const prepareLocalOrchestrationAccountKit = ( }, }, holder: { - /** @type {HostOf} */ + /** @type {HostOf} */ asContinuingOffer() { // @ts-expect-error XXX invitationMakers // getPublicTopics resolves promptly (same run), so we don't need a watcher @@ -504,14 +498,12 @@ export const prepareLocalOrchestrationAccountKit = ( }); }); }, - /** - * @type {HostOf} - */ + /** @type {HostOf} */ getBalance(denomArg) { return asVow(() => { const [brand, denom] = typeof denomArg === 'string' - ? [chainHub.getAsset(denomArg)?.brand, denomArg] + ? [chainHub.getAsset(denomArg, 'agoric')?.brand, denomArg] : [denomArg, chainHub.getDenom(denomArg)]; if (!denom) { @@ -537,7 +529,7 @@ export const prepareLocalOrchestrationAccountKit = ( ); }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ getBalances() { return watch( E(localchain).query( @@ -549,9 +541,7 @@ export const prepareLocalOrchestrationAccountKit = ( ); }, - /** - * @type {HostOf} - */ + /** @type {HostOf} */ getPublicTopics() { // getStoragePath resolves promptly (same run), so we don't need a watcher // eslint-disable-next-line no-restricted-syntax @@ -628,14 +618,14 @@ export const prepareLocalOrchestrationAccountKit = ( executeTx(messages) { return watch(E(this.state.account).executeTx(messages)); }, - /** @type {OrchestrationAccountI['getAddress']} */ + /** @type {OrchestrationAccountCommon['getAddress']} */ getAddress() { return this.state.address; }, /** * XXX consider using ERTP to send if it's vbank asset * - * @type {HostOf} + * @type {HostOf} */ send(toAccount, amount) { return asVow(() => { @@ -656,7 +646,7 @@ export const prepareLocalOrchestrationAccountKit = ( /** * XXX consider using ERTP to send if it's vbank asset * - * @type {HostOf} + * @type {HostOf} */ sendAll(toAccount, amounts) { return asVow(() => { @@ -682,17 +672,25 @@ export const prepareLocalOrchestrationAccountKit = ( * timeoutTimestamp are not supplied, a default timeoutTimestamp will * be set for 5 minutes in the future * @returns {Vow} + * @throws {Error} if route is not determinable, asset is not + * recognized, or the transfer is rejected (insufficient funds, + * timeout) */ transfer(destination, amount, opts) { return asVow(() => { - trace('Transferring funds from LCA over IBC'); + trace('Transferring funds over IBC'); + const denomAmount = coerceDenomAmount(chainHub, amount); - const connectionInfoV = watch( - chainHub.getConnectionInfo( - this.state.address.chainId, - destination.chainId, - ), + const { forwardOpts, ...rest } = opts ?? {}; + + // throws if route is not determinable + const route = chainHub.makeTransferRoute( + destination, + denomAmount, + 'agoric', + forwardOpts, ); + trace('got transfer route', route); // set a `timeoutTimestamp` if caller does not supply either `timeoutHeight` or `timeoutTimestamp` // TODO #9324 what's a reasonable default? currently 5 minutes @@ -700,23 +698,22 @@ export const prepareLocalOrchestrationAccountKit = ( opts?.timeoutTimestamp ?? (opts?.timeoutHeight ? 0n - : E(timestampHelper).getTimeoutTimestampNS()); + : asVow(() => 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]), + timeoutTimestampVowOrValue, this.facets.transferWatcher, { - opts, - amount: coerceDenomAmount(chainHub, amount), - destination, + opts: rest, + route, }, ); return resultV; }); }, - /** @type {HostOf} */ + /** @type {HostOf} */ transferSteps(amount, msg) { return asVow(() => { console.log('transferSteps got', amount, msg); diff --git a/packages/orchestration/src/exos/orchestrator.js b/packages/orchestration/src/exos/orchestrator.js index 97e383dcf12..0d5dae350b8 100644 --- a/packages/orchestration/src/exos/orchestrator.js +++ b/packages/orchestration/src/exos/orchestrator.js @@ -25,7 +25,7 @@ import { * @import {CosmosInterchainService} from './exo-interfaces.js'; * @import {MakeLocalChainFacade} from './local-chain-facade.js'; * @import {MakeRemoteChainFacade} from './remote-chain-facade.js'; - * @import {Chain, ChainInfo, IBCConnectionInfo, Orchestrator} from '../types.js'; + * @import {Chain, ChainInfo, IBCConnectionInfo, KnownChains, Orchestrator} from '../types.js'; */ const { Vow$ } = NetworkShape; // TODO #9611 @@ -34,7 +34,7 @@ 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), + getDenomInfo: M.call(DenomShape, M.string()).returns(DenomInfoShape), asAmount: M.call(DenomAmountShape).returns(AmountShape), }); @@ -138,8 +138,8 @@ const prepareOrchestratorKit = ( }); }, /** @type {HostOf} */ - getDenomInfo(denom) { - const denomDetail = chainHub.getAsset(denom); + getDenomInfo(denom, holdingChainName) { + const denomDetail = chainHub.getAsset(denom, holdingChainName); if (!denomDetail) throw Fail`No denom detail for ${q(denom)}`; const { chainName, baseName, baseDenom, brand } = denomDetail; chainByName.has(chainName) || @@ -148,14 +148,20 @@ const prepareOrchestratorKit = ( if (maybeChain.pending) { throw Fail`wait until getChain(${q(chainName)}) completes before getDenomInfo(${q(denom)})`; } - const chain = maybeChain.value; + 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 = maybeBase.value; + const base = + /** @type {HostInterface>} */ ( + maybeBase.value + ); return harden({ chain, base, brand, baseDenom }); }, /** @type {HostOf} */ diff --git a/packages/orchestration/src/exos/packet-tools.js b/packages/orchestration/src/exos/packet-tools.js index a4ba79c2455..2b873ebc2eb 100644 --- a/packages/orchestration/src/exos/packet-tools.js +++ b/packages/orchestration/src/exos/packet-tools.js @@ -126,7 +126,7 @@ export const preparePacketTools = (zone, vowTools) => { const resolverToPattern = zone.detached().mapStore('resolverToPattern'); return { lca, - reg: /** @type {Remote | null} */ (null), + reg: /** @type {Vow | null} */ (null), resolverToPattern, upcallQueue: /** @type {any[] | null} */ (null), pending: 0, @@ -327,23 +327,19 @@ export const preparePacketTools = (zone, vowTools) => { } 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 { lca, reg: cachedReg } = this.state; + if (cachedReg) { + return when(cachedReg); } + // Atomically update the registration. 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; - }); + const reg = watch(E(lca).monitorTransfers(tap)); + this.state.reg = reg; + return when(reg); }, unsubscribeFromTransfers() { const { reg, monitor } = this.state; diff --git a/packages/orchestration/src/exos/portfolio-holder-kit.js b/packages/orchestration/src/exos/portfolio-holder-kit.js index a5c03eceacd..0b8f213796d 100644 --- a/packages/orchestration/src/exos/portfolio-holder-kit.js +++ b/packages/orchestration/src/exos/portfolio-holder-kit.js @@ -13,7 +13,7 @@ const { fromEntries } = Object; * @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'; + * @import {OrchestrationAccount, OrchestrationAccountCommon, MakeCombineInvitationMakers} from '@agoric/orchestration'; */ /** diff --git a/packages/orchestration/src/exos/remote-chain-facade.js b/packages/orchestration/src/exos/remote-chain-facade.js index 3efebfff11d..3349eb39c5d 100644 --- a/packages/orchestration/src/exos/remote-chain-facade.js +++ b/packages/orchestration/src/exos/remote-chain-facade.js @@ -125,8 +125,6 @@ const prepareRemoteChainFacadeKit = ( 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 diff --git a/packages/orchestration/src/facade.js b/packages/orchestration/src/facade.js index d2fe5b595d8..65de08c9e78 100644 --- a/packages/orchestration/src/facade.js +++ b/packages/orchestration/src/facade.js @@ -119,7 +119,6 @@ export const makeOrchestrationFacade = ({ const mappedFlows = new Map( Object.entries(guestFns).map(([name, guestFn]) => [ guestFn, - // eslint-disable-next-line no-use-before-define (...args) => orcFns[name](...args), ]), ); diff --git a/packages/orchestration/src/fetched-chain-info.js b/packages/orchestration/src/fetched-chain-info.js index 0d83cbedeb8..651633fd1ad 100644 --- a/packages/orchestration/src/fetched-chain-info.js +++ b/packages/orchestration/src/fetched-chain-info.js @@ -1,6 +1,7 @@ /** @file Generated by fetch-chain-info.ts */ export default /** @type {const} } */ ({ agoric: { + bech32Prefix: 'agoric', chainId: 'agoric-3', stakingTokens: [ { @@ -138,6 +139,7 @@ export default /** @type {const} } */ ({ }, }, celestia: { + bech32Prefix: 'celestia', chainId: 'celestia', stakingTokens: [ { @@ -239,6 +241,7 @@ export default /** @type {const} } */ ({ }, }, cosmoshub: { + bech32Prefix: 'cosmos', chainId: 'cosmoshub-4', stakingTokens: [ { @@ -247,24 +250,6 @@ export default /** @type {const} } */ ({ ], icqEnabled: false, connections: { - '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', - }, - }, 'agoric-3': { id: 'connection-649', client_id: '07-tendermint-927', @@ -391,6 +376,24 @@ export default /** @type {const} } */ ({ 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', @@ -412,6 +415,7 @@ export default /** @type {const} } */ ({ }, }, dydx: { + bech32Prefix: 'dydx', chainId: 'dydx-mainnet-1', stakingTokens: [ { @@ -513,6 +517,7 @@ export default /** @type {const} } */ ({ }, }, juno: { + bech32Prefix: 'juno', chainId: 'juno-1', stakingTokens: [ { @@ -650,6 +655,7 @@ export default /** @type {const} } */ ({ }, }, neutron: { + bech32Prefix: 'neutron', chainId: 'neutron-1', stakingTokens: [ { @@ -823,6 +829,7 @@ export default /** @type {const} } */ ({ }, }, noble: { + bech32Prefix: 'noble', chainId: 'noble-1', icqEnabled: false, connections: { @@ -1009,6 +1016,7 @@ export default /** @type {const} } */ ({ }, }, omniflixhub: { + bech32Prefix: 'omniflix', chainId: 'omniflixhub-1', stakingTokens: [ { @@ -1092,6 +1100,7 @@ export default /** @type {const} } */ ({ }, }, osmosis: { + bech32Prefix: 'osmo', chainId: 'osmosis-1', stakingTokens: [ { @@ -1319,6 +1328,7 @@ export default /** @type {const} } */ ({ }, }, secretnetwork: { + bech32Prefix: 'secret', chainId: 'secret-4', stakingTokens: [ { @@ -1510,6 +1520,7 @@ export default /** @type {const} } */ ({ }, }, stargaze: { + bech32Prefix: 'stars', chainId: 'stargaze-1', stakingTokens: [ { @@ -1665,6 +1676,7 @@ export default /** @type {const} } */ ({ }, }, stride: { + bech32Prefix: 'stride', chainId: 'stride-1', stakingTokens: [ { @@ -1856,6 +1868,7 @@ export default /** @type {const} } */ ({ }, }, umee: { + bech32Prefix: 'umee', chainId: 'umee-1', stakingTokens: [ { diff --git a/packages/orchestration/src/orchestration-api.ts b/packages/orchestration/src/orchestration-api.ts index cf8f84d9c07..4bd51994d26 100644 --- a/packages/orchestration/src/orchestration-api.ts +++ b/packages/orchestration/src/orchestration-api.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ /** * @file General API of orchestration * - must not have chain-specific types without runtime narrowing by chain id @@ -7,10 +6,7 @@ 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 { - LocalChainAccount, - QueryManyFn, -} from '@agoric/vats/src/localchain.js'; +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 { @@ -73,12 +69,13 @@ export type ChainAddress = { * * The methods available depend on the chain and its capabilities. */ -export type OrchestrationAccount = OrchestrationAccountI & - (CI extends CosmosChainInfo - ? CI['chainId'] extends `agoric${string}` - ? CosmosChainAccountMethods & LocalAccountMethods - : CosmosChainAccountMethods - : {}); +export type OrchestrationAccount = + OrchestrationAccountCommon & + (CI extends CosmosChainInfo + ? CI['chainId'] extends `agoric${string}` + ? LocalAccountMethods + : CosmosChainAccountMethods + : {}); /** * An object for access the core functions of a remote chain. @@ -106,6 +103,9 @@ export interface Chain { // TODO provide a way to get the local denom/brand/whatever for this chain } +/** + * Used with `orch.getDenomInfo('ibc/1234')`. See {@link Orchestrator.getDenomInfo} + */ export interface DenomInfo< HoldingChain extends keyof KnownChains, IssuingChain extends keyof KnownChains, @@ -147,6 +147,7 @@ export interface Orchestrator { IssuingChain extends keyof KnownChains, >( denom: Denom, + srcChainName: HoldingChain, ) => DenomInfo; /** @@ -160,7 +161,7 @@ export interface Orchestrator { /** * An object that supports high-level operations for an account on a remote chain. */ -export interface OrchestrationAccountI { +export interface OrchestrationAccountCommon { /** * @returns the address of the account on the remote chain */ @@ -195,8 +196,8 @@ export interface OrchestrationAccountI { * @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. + * @throws {Error} if route is not determinable, asset is not recognized, or + * the transfer is rejected (insufficient funds, timeout) */ transfer: ( destination: ChainAddress, diff --git a/packages/builders/scripts/testing/start-auto-stake-it.js b/packages/orchestration/src/proposals/start-auto-stake-it.js similarity index 55% rename from packages/builders/scripts/testing/start-auto-stake-it.js rename to packages/orchestration/src/proposals/start-auto-stake-it.js index 8a02140c012..69cfc7721e5 100644 --- a/packages/builders/scripts/testing/start-auto-stake-it.js +++ b/packages/orchestration/src/proposals/start-auto-stake-it.js @@ -11,6 +11,7 @@ import { deeplyFulfilled } from '@endo/marshal'; /** * @import {AutoStakeItSF} from '@agoric/orchestration/src/examples/auto-stake-it.contract.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; */ const contractName = 'autoAutoStakeIt'; @@ -18,26 +19,35 @@ const trace = makeTracer(contractName, true); /** * @param {BootstrapPowers} powers + * @param {{ + * options: { + * chainInfo: Record; + * assetInfo: [Denom, DenomDetail & { brandKey?: string }][]; + * }; + * }} config */ -export const startAutoStakeIt = async ({ - consume: { - agoricNames, - board, - chainStorage, - chainTimerService, - cosmosInterchainService, - localchain, - startUpgradable, - }, - installation: { - // @ts-expect-error not a WellKnownName - consume: { [contractName]: installation }, - }, - instance: { - // @ts-expect-error not a WellKnownName - produce: { [contractName]: produceInstance }, +export const startAutoStakeIt = async ( + { + consume: { + agoricNames, + board, + chainStorage, + chainTimerService, + cosmosInterchainService, + localchain, + startUpgradable, + }, + installation: { + // @ts-expect-error not a WellKnownName + consume: { [contractName]: installation }, + }, + instance: { + // @ts-expect-error not a WellKnownName + produce: { [contractName]: produceInstance }, + }, }, -}) => { + { options: { chainInfo, assetInfo } }, +) => { trace(`start ${contractName}`); await null; @@ -58,6 +68,8 @@ export const startAutoStakeIt = async ({ storageNode, marshaller, timerService: chainTimerService, + chainInfo, + assetInfo, }), ), }; @@ -67,10 +79,7 @@ export const startAutoStakeIt = async ({ }; harden(startAutoStakeIt); -export const getManifestForContract = ( - { restoreRef }, - { installKeys, ...options }, -) => { +export const getManifest = ({ restoreRef }, { installKeys, options }) => { return { manifest: { [startAutoStakeIt.name]: { @@ -97,32 +106,3 @@ export const getManifestForContract = ( options, }; }; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ -export const defaultProposalBuilder = async ({ publishRef, install }) => { - return harden({ - // Somewhat unorthodox, source the exports from this builder module - sourceSpec: '@agoric/builders/scripts/testing/start-auto-stake-it.js', - getManifestCall: [ - 'getManifestForContract', - { - installKeys: { - autoAutoStakeIt: publishRef( - install( - '@agoric/orchestration/src/examples/auto-stake-it.contract.js', - ), - ), - }, - }, - ], - }); -}; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ -export default async (homeP, endowments) => { - // import dynamically so the module can work in CoreEval environment - const dspModule = await import('@agoric/deploy-script-support'); - const { makeHelpers } = dspModule; - const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(startAutoStakeIt.name, defaultProposalBuilder); -}; diff --git a/packages/orchestration/src/proposals/start-basic-flows.js b/packages/orchestration/src/proposals/start-basic-flows.js index e19b242ff90..59682e21e10 100644 --- a/packages/orchestration/src/proposals/start-basic-flows.js +++ b/packages/orchestration/src/proposals/start-basic-flows.js @@ -6,6 +6,7 @@ import { makeStorageNodeChild } from '@agoric/internal/src/lib-chainStorage.js'; import { E } from '@endo/far'; /** + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; * @import {BasicFlowsSF} from '../examples/basic-flows.contract.js'; */ @@ -15,30 +16,59 @@ const contractName = 'basicFlows'; /** * See `@agoric/builders/builders/scripts/orchestration/init-basic-flows.js` for * the accompanying proposal builder. Run `agoric run - * packages/builders/scripts/orchestration/init-basic-flows.js` to build the + * packages/builders/scripts/orchestration/init-basic-flows.js --chainInfo + * 'chainName:CosmosChainInfo' --assetInfo 'denom:DenomDetail'` to build the * contract and proposal files. * - * @param {BootstrapPowers} powers + * @param {BootstrapPowers & { + * installation: { + * consume: { + * basicFlows: Installation; + * }; + * }; + * instance: { + * produce: { + * basicFlows: Producer; + * }; + * }; + * issuer: { + * consume: { + * BLD: Issuer<'nat'>; + * IST: Issuer<'nat'>; + * USDC: Issuer<'nat'>; + * }; + * }; + * }} powers + * @param {{ + * options: { + * chainInfo: Record; + * assetInfo: [Denom, DenomDetail & { brandKey?: string }][]; + * }; + * }} config */ -export const startBasicFlows = async ({ - consume: { - agoricNames, - board, - chainStorage, - chainTimerService, - cosmosInterchainService, - localchain, - startUpgradable, - }, - installation: { - // @ts-expect-error not a WellKnownName - consume: { [contractName]: installation }, - }, - instance: { - // @ts-expect-error not a WellKnownName - produce: { [contractName]: produceInstance }, +export const startBasicFlows = async ( + { + consume: { + agoricNames, + board, + chainStorage, + chainTimerService, + cosmosInterchainService, + localchain, + startUpgradable, + }, + installation: { + consume: { [contractName]: installation }, + }, + instance: { + produce: { [contractName]: produceInstance }, + }, + issuer: { + consume: { BLD, IST }, + }, }, -}) => { + { options: { chainInfo, assetInfo } }, +) => { trace(`start ${contractName}`); await null; @@ -49,6 +79,10 @@ export const startBasicFlows = async ({ const startOpts = { label: 'basicFlows', installation, + issuerKeywordRecord: { + BLD: await BLD, + IST: await IST, + }, terms: undefined, privateArgs: { agoricNames: await agoricNames, @@ -57,6 +91,8 @@ export const startBasicFlows = async ({ storageNode, marshaller, timerService: await chainTimerService, + chainInfo, + assetInfo, }, }; @@ -67,7 +103,7 @@ harden(startBasicFlows); export const getManifestForContract = ( { restoreRef }, - { installKeys, ...options }, + { installKeys, options }, ) => { return { manifest: { @@ -87,6 +123,9 @@ export const getManifestForContract = ( instance: { produce: { [contractName]: true }, }, + issuer: { + consume: { BLD: true, IST: true }, + }, }, }, installations: { diff --git a/packages/builders/scripts/testing/start-send-anywhere.js b/packages/orchestration/src/proposals/start-send-anywhere.js similarity index 51% rename from packages/builders/scripts/testing/start-send-anywhere.js rename to packages/orchestration/src/proposals/start-send-anywhere.js index e29d043ccb8..0599f077dd9 100644 --- a/packages/builders/scripts/testing/start-send-anywhere.js +++ b/packages/orchestration/src/proposals/start-send-anywhere.js @@ -1,7 +1,3 @@ -/** - * @file This is for use in tests in a3p-integration - * Unlike most builder scripts, this one includes the proposal exports as well. - */ import { deeplyFulfilledObject, makeTracer, @@ -10,16 +6,15 @@ import { import { E } from '@endo/far'; /// + /** * @import {Installation} from '@agoric/zoe/src/zoeService/utils.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; + * @import {start as StartFn} from '@agoric/orchestration/src/examples/send-anywhere.contract.js'; */ const trace = makeTracer('StartSA', true); -/** - * @import {start as StartFn} from '@agoric/orchestration/src/examples/send-anywhere.contract.js'; - */ - /** * @param {BootstrapPowers & { * installation: { @@ -27,29 +22,48 @@ const trace = makeTracer('StartSA', true); * sendAnywhere: Installation; * }; * }; + * instance: { + * produce: { + * sendAnywhere: Producer; + * }; + * }; + * issuer: { + * consume: { + * BLD: Issuer<'nat'>; + * IST: Issuer<'nat'>; + * }; + * }; * }} powers + * @param {{ + * options: { + * chainInfo: Record; + * assetInfo: [Denom, DenomDetail & { brandKey?: string }][]; + * }; + * }} config */ -export const startSendAnywhere = async ({ - consume: { - agoricNames, - board, - chainStorage, - chainTimerService, - cosmosInterchainService, - localchain, - startUpgradable, - }, - installation: { - consume: { sendAnywhere }, - }, - instance: { - // @ts-expect-error unknown instance - produce: { sendAnywhere: produceInstance }, - }, - issuer: { - consume: { IST }, +export const startSendAnywhere = async ( + { + consume: { + agoricNames, + board, + chainStorage, + chainTimerService, + cosmosInterchainService, + localchain, + startUpgradable, + }, + installation: { + consume: { sendAnywhere }, + }, + instance: { + produce: { sendAnywhere: produceInstance }, + }, + issuer: { + consume: { BLD, IST }, + }, }, -}) => { + { options: { chainInfo, assetInfo } }, +) => { trace(startSendAnywhere.name); const marshaller = await E(board).getReadonlyMarshaller(); @@ -64,13 +78,38 @@ export const startSendAnywhere = async ({ 'send-anywhere', ), timerService: chainTimerService, + chainInfo, + assetInfo, }), ); + /** @param {() => Promise} p */ + const safeFulfill = async p => + E.when( + p(), + i => i, + () => undefined, + ); + + const atomIssuer = await safeFulfill(() => + E(agoricNames).lookup('issuer', 'ATOM'), + ); + const osmoIssuer = await safeFulfill(() => + E(agoricNames).lookup('issuer', 'OSMO'), + ); + + const issuerKeywordRecord = harden({ + BLD: await BLD, + IST: await IST, + ...(atomIssuer && { ATOM: atomIssuer }), + ...(osmoIssuer && { OSMO: osmoIssuer }), + }); + trace('issuerKeywordRecord', issuerKeywordRecord); + const { instance } = await E(startUpgradable)({ label: 'send-anywhere', installation: sendAnywhere, - issuerKeywordRecord: { Stable: await IST }, + issuerKeywordRecord, privateArgs, }); produceInstance.resolve(instance); @@ -78,7 +117,7 @@ export const startSendAnywhere = async ({ }; harden(startSendAnywhere); -export const getManifest = ({ restoreRef }, { installationRef }) => { +export const getManifest = ({ restoreRef }, { installationRef, options }) => { return { manifest: { [startSendAnywhere.name]: { @@ -99,38 +138,13 @@ export const getManifest = ({ restoreRef }, { installationRef }) => { produce: { sendAnywhere: true }, }, issuer: { - consume: { IST: true }, + consume: { BLD: true, IST: true }, }, }, }, installations: { sendAnywhere: restoreRef(installationRef), }, + options, }; }; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ -export const defaultProposalBuilder = async ({ publishRef, install }) => - harden({ - // Somewhat unorthodox, source the exports from this builder module - sourceSpec: '@agoric/builders/scripts/testing/start-send-anywhere.js', - getManifestCall: [ - getManifest.name, - { - installationRef: publishRef( - install( - '@agoric/orchestration/src/examples/send-anywhere.contract.js', - ), - ), - }, - ], - }); - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ -export default async (homeP, endowments) => { - // import dynamically so the module can work in CoreEval environment - const dspModule = await import('@agoric/deploy-script-support'); - const { makeHelpers } = dspModule; - const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(startSendAnywhere.name, defaultProposalBuilder); -}; diff --git a/packages/orchestration/src/typeGuards.js b/packages/orchestration/src/typeGuards.js index 2e08fb747f9..3f83257ab32 100644 --- a/packages/orchestration/src/typeGuards.js +++ b/packages/orchestration/src/typeGuards.js @@ -1,13 +1,15 @@ +import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; import { VowShape } from '@agoric/vow'; import { M } from '@endo/patterns'; /** * @import {TypedPattern} from '@agoric/internal'; - * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomDetail, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js'; + * @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress, OrchestrationPowers, ForwardInfo, IBCMsgTransferOptions} from './types.js'; * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; - * @import {Delegation} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js'; * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; + * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; * @import {TypedJson} from '@agoric/cosmic-proto'; + * @import {DenomDetail} from './exos/chain-hub.js'; */ /** @@ -31,28 +33,15 @@ export const ChainAddressShape = { encoding: M.string(), value: M.string(), }; +harden(ChainAddressShape); /** @type {TypedPattern} */ -export const Proto3Shape = { - typeUrl: M.string(), - value: M.string(), -}; - -/** @internal */ -export const IBCTransferOptionsShape = M.splitRecord( - {}, - { - timeoutTimestamp: M.bigint(), - timeoutHeight: { - revisionHeight: M.bigint(), - revisionNumber: M.bigint(), - }, - memo: M.string(), - }, -); +export const Proto3Shape = { typeUrl: M.string(), value: M.string() }; +harden(ChainAddressShape); /** @internal */ export const IBCChannelIDShape = M.string(); + /** @internal */ export const IBCChannelInfoShape = M.splitRecord({ portId: M.string(), @@ -63,8 +52,10 @@ export const IBCChannelInfoShape = M.splitRecord({ state: M.scalar(), // XXX version: M.string(), }); + /** @internal */ export const IBCConnectionIDShape = M.string(); + /** @internal */ export const IBCConnectionInfoShape = M.splitRecord({ id: IBCConnectionIDShape, @@ -94,10 +85,12 @@ 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(), + pfmEnabled: M.boolean(), }, ); @@ -107,6 +100,14 @@ export const ChainInfoShape = M.splitRecord({ }); export const DenomShape = M.string(); +/** @type {TypedPattern} */ +export const CoinShape = { + /** json-safe stringified bigint */ + amount: M.string(), + denom: DenomShape, +}; +harden(CoinShape); + /** @type {TypedPattern>} */ export const DenomInfoShape = { chain: M.remotable('Chain'), @@ -114,15 +115,25 @@ export const DenomInfoShape = { brand: M.or(M.remotable('Brand'), M.undefined()), baseDenom: M.string(), }; +harden(DenomInfoShape); + +/** @type {TypedPattern} */ +export const DenomDetailShape = M.splitRecord( + { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, + { brand: BrandShape }, +); +harden(DenomDetailShape); /** @type {TypedPattern} */ -export const DenomAmountShape = { denom: DenomShape, value: M.bigint() }; +export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; +harden(DenomAmountShape); /** @type {TypedPattern>} */ -export const AnyNatAmountShape = harden({ +export const AnyNatAmountShape = { brand: M.remotable('Brand'), value: M.nat(), -}); +}; +harden(AnyNatAmountShape); /** @type {TypedPattern} */ export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape); @@ -151,10 +162,11 @@ export const ICQMsgShape = M.splitRecord( export const TypedJsonShape = M.splitRecord({ '@type': M.string() }); /** @see {Chain} */ -export const chainFacadeMethods = harden({ +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 @@ -164,6 +176,7 @@ export const chainFacadeMethods = harden({ * string */ export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() }; +harden(TimestampProtoShape); /** * see {@link TxBody} for more details @@ -186,6 +199,70 @@ export const TxBodyOptsShape = M.splitRecord( */ export const AnyNatAmountsRecord = M.and( M.recordOf(M.string(), AnyNatAmountShape), - M.not(harden({})), + M.not({}), +); + +/** @type {TypedPattern} */ +export const OrchestrationPowersShape = { + agoricNames: M.remotable(), + localchain: M.remotable(), + orchestrationService: M.remotable(), + storageNode: M.remotable(), + timerService: M.remotable(), +}; +harden(OrchestrationPowersShape); + +const ForwardArgsShape = { + receiver: M.string(), + port: 'transfer', + channel: M.string(), + timeout: M.string(), + retries: M.number(), +}; +harden(ForwardArgsShape); + +/** @type {TypedPattern} */ +export const ForwardInfoShape = { + forward: M.splitRecord(ForwardArgsShape, { + /** + * Protocol allows us to recursively include `next` keys, but this only + * supports one. In practice, this is all we currently need. + */ + next: { + forward: ForwardArgsShape, + }, + }), +}; +harden(ForwardInfoShape); + +/** + * Caller configurable values of {@link ForwardInfo} + * + * @type {TypedPattern} + */ +export const ForwardOptsShape = M.splitRecord( + {}, + { + timeout: M.string(), + retries: M.number(), + intermediateRecipient: ChainAddressShape, + }, + {}, +); + +/** + * @type {TypedPattern} + * @internal + */ +export const IBCTransferOptionsShape = M.splitRecord( + {}, + { + timeoutTimestamp: M.bigint(), + timeoutHeight: { + revisionHeight: M.bigint(), + revisionNumber: M.bigint(), + }, + memo: M.string(), + forwardOpts: ForwardOptsShape, + }, ); -harden(AnyNatAmountsRecord); diff --git a/packages/orchestration/src/types.ts b/packages/orchestration/src/types.ts index 905892a2236..7a0b23566e4 100644 --- a/packages/orchestration/src/types.ts +++ b/packages/orchestration/src/types.ts @@ -13,6 +13,7 @@ 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'; +export type * from './utils/start-helper.js'; /** * ({@link ZCF})-like tools for use in {@link OrchestrationFlow}s. diff --git a/packages/orchestration/src/utils/address.js b/packages/orchestration/src/utils/address.js index 1735040c401..8d39ed5afa6 100644 --- a/packages/orchestration/src/utils/address.js +++ b/packages/orchestration/src/utils/address.js @@ -1,4 +1,4 @@ -import { Fail } from '@endo/errors'; +import { Fail, q } from '@endo/errors'; /** * @import {IBCConnectionID} from '@agoric/vats'; @@ -84,3 +84,20 @@ export const findAddressField = remoteAddressString => { } }; 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/packages/orchestration/src/utils/asset.js b/packages/orchestration/src/utils/asset.js new file mode 100644 index 00000000000..2f4efccd998 --- /dev/null +++ b/packages/orchestration/src/utils/asset.js @@ -0,0 +1,33 @@ +import { denomHash } from './denomHash.js'; + +/** + * @import {ChainHub, CosmosChainInfo, Denom, DenomDetail} from '../types.js'; + */ + +/** + * Helper function for creating {@link DenomDetail} data for {@link ChainHub} + * asset registration. + * + * @param {Denom} baseDenom + * @param {string} baseName + * @param {Brand<'nat'>} [brand] + * @param {string} [chainName] + * @param {Record} [infoOf] + * @returns {[string, DenomDetail]} + */ +export const assetOn = (baseDenom, baseName, brand, chainName, infoOf) => { + const baseDetail = { baseName, chainName: chainName || baseName, baseDenom }; + const detail = brand ? { ...baseDetail, brand } : baseDetail; + if (!chainName) return harden([baseDenom, detail]); + + if (!infoOf) throw Error(`must provide infoOf`); + const issuerInfo = infoOf[baseName]; + const holdingInfo = infoOf[chainName]; + if (!holdingInfo) throw Error(`${chainName} missing`); + if (!holdingInfo.connections) + throw Error(`connections missing for ${chainName}`); + const { channelId } = + holdingInfo.connections[issuerInfo.chainId].transferChannel; + const denom = `ibc/${denomHash({ denom: baseDenom, channelId })}`; + return harden([denom, detail]); +}; diff --git a/packages/orchestration/src/utils/chain-hub-helper.js b/packages/orchestration/src/utils/chain-hub-helper.js new file mode 100644 index 00000000000..829d0b58a7e --- /dev/null +++ b/packages/orchestration/src/utils/chain-hub-helper.js @@ -0,0 +1,60 @@ +/** + * @import {ChainHub, CosmosChainInfo, Denom, DenomDetail} from '../types.js'; + */ + +/** + * Registers chains, connections, assets in the provided chainHub. + * + * If either is not provided, registration will be skipped. + * + * TODO #10580 remove 'brandKey' in favor of `LegibleCapData` + * + * @param {ChainHub} chainHub + * @param {Record>} brands + * @param {Record | undefined} chainInfo + * @param {[Denom, DenomDetail & { brandKey?: string }][] | undefined} assetInfo + */ +export const registerChainsAndAssets = ( + chainHub, + brands, + chainInfo, + assetInfo, +) => { + console.log('chainHub: registering chains', Object.keys(chainInfo || {})); + if (!chainInfo) { + return; + } + + const conns = {}; + for (const [chainName, allInfo] of Object.entries(chainInfo)) { + const { connections, ...info } = allInfo; + chainHub.registerChain(chainName, info); + if (connections) conns[info.chainId] = connections; + } + const registeredPairs = new Set(); + for (const [pChainId, connInfos] of Object.entries(conns)) { + for (const [cChainId, connInfo] of Object.entries(connInfos)) { + const pair = [pChainId, cChainId].sort().join('<->'); + if (!registeredPairs.has(pair)) { + chainHub.registerConnection(pChainId, cChainId, connInfo); + registeredPairs.add(pair); + } + } + } + console.log('chainHub: registered connections', [...registeredPairs].sort()); + + console.log( + 'chainHub: registering assets', + assetInfo?.map(([denom, { chainName }]) => `${chainName}: ${denom}`), + ); + if (!assetInfo) { + return; + } + for (const [denom, info] of assetInfo) { + const { brandKey, ...rest } = info; + const infoWithBrand = brandKey + ? { ...rest, brand: brands[brandKey] } + : rest; + chainHub.registerAsset(denom, infoWithBrand); + } +}; diff --git a/packages/orchestration/src/utils/orchestrationAccount.js b/packages/orchestration/src/utils/orchestrationAccount.js index 23f5337d3dc..992510d23f1 100644 --- a/packages/orchestration/src/utils/orchestrationAccount.js +++ b/packages/orchestration/src/utils/orchestrationAccount.js @@ -10,11 +10,11 @@ import { IBCTransferOptionsShape, } from '../typeGuards.js'; -/** @import {OrchestrationAccountI} from '../orchestration-api.js'; */ +/** @import {OrchestrationAccountCommon} from '../orchestration-api.js'; */ const { Vow$ } = NetworkShape; // TODO #9611 -/** @see {OrchestrationAccountI} */ +/** @see {OrchestrationAccountCommon} */ export const orchestrationAccountMethods = { getAddress: M.call().returns(ChainAddressShape), getBalance: M.call(M.or(BrandShape, M.string())).returns( diff --git a/packages/orchestration/src/utils/registry.js b/packages/orchestration/src/utils/registry.js index 9156937910c..25789864729 100644 --- a/packages/orchestration/src/utils/registry.js +++ b/packages/orchestration/src/utils/registry.js @@ -90,6 +90,7 @@ export const convertChainInfo = async registry => { 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 @@ -117,8 +118,9 @@ export const convertChainInfo = async registry => { const connections = Object.fromEntries( ibcData .map(datum => toConnectionEntry(datum, name, chainInfo)) + .filter(entry => entry.length > 0) // sort alphabetically for consistency - .sort(([a], [b]) => (a && b ? a.localeCompare(b) : 0)), + .sort(([a], [b]) => a.localeCompare(b)), ); chainInfo[name] = { ...chainInfo[name], connections }; } diff --git a/packages/orchestration/src/utils/start-helper.js b/packages/orchestration/src/utils/start-helper.js index 366542e0e02..e6c36bd523c 100644 --- a/packages/orchestration/src/utils/start-helper.js +++ b/packages/orchestration/src/utils/start-helper.js @@ -50,10 +50,6 @@ export const provideOrchestration = ( remotePowers, marshaller, ) => { - zcf.setTestJig(() => ({ - baggage, - })); - // separate zones const zones = (() => { const zone = makeDurableZone(baggage); @@ -160,9 +156,15 @@ export const provideOrchestration = ( zones.contract.subZone('orchestration'), ); + zcf.setTestJig(() => ({ + baggage, + chainHub, + })); + return { ...defaultOrchestrateKit, makeOrchestrateKit, + baggage, chainHub, vowTools, asyncFlowTools, diff --git a/packages/orchestration/src/vat-orchestration.js b/packages/orchestration/src/vat-orchestration.js index 016ccfac7b7..25622d7fbbc 100644 --- a/packages/orchestration/src/vat-orchestration.js +++ b/packages/orchestration/src/vat-orchestration.js @@ -5,7 +5,7 @@ import { prepareCosmosInterchainService } from './exos/cosmos-interchain-service /** * @import {Baggage} from '@agoric/vat-data'; - * @import {OrchestrationPowers} from './exos/cosmos-interchain-service.js'; + * @import {CosmosOrchestrationPowers} from './exos/cosmos-interchain-service.js'; */ /** @@ -26,7 +26,7 @@ export const buildRootObject = (vatPowers, vatParameters, baggage) => { ); return Far('OrchestrationVat', { - /** @param {Partial} [initialPowers] */ + /** @param {Partial} [initialPowers] */ makeCosmosInterchainService(initialPowers = {}) { return makeCosmosInterchainService(initialPowers); }, diff --git a/packages/orchestration/test/durability.ts b/packages/orchestration/test/durability.ts new file mode 100644 index 00000000000..454637e2520 --- /dev/null +++ b/packages/orchestration/test/durability.ts @@ -0,0 +1,25 @@ +/** + * Importing this module reincarnates the "vat" (global env) to have strict durability rules. + */ +import { reincarnate } from '@agoric/swingset-liveslots/tools/setup-vat-data.js'; +import type { Zone } from '@agoric/zone'; +import { makeDurableZone } from '@agoric/zone/durable.js'; + +// all orchestration tests have strict durability rules +const { fakeVomKit } = reincarnate({ relaxDurabilityRules: false }); + +/** + * Reincarnate without relaxDurabilityRules and provide a durable zone in the incarnation. + * @param key + */ +export const provideDurableZone = (key: string): Zone => { + const root = fakeVomKit.cm.provideBaggage(); + const zone = makeDurableZone(root); + return zone.subZone(key); +}; + +let zoneCounter = 0; +export const provideFreshRootZone = (): Zone => { + zoneCounter += 1; + return provideDurableZone(`root${zoneCounter}`); +}; diff --git a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md index 65648310c19..df818b1eba8 100644 --- a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md +++ b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md @@ -34,20 +34,1119 @@ Generated by [AVA](https://avajs.dev). chainHub: { ChainHub_kindHandle: 'Alleged: kind', ChainHub_singleton: 'Alleged: ChainHub', - brandDenom: {}, + bech32PrefixToChainName: { + agoric: 'agoric', + celestia: 'celestia', + cosmos: 'cosmoshub', + dydx: 'dydx', + juno: 'juno', + neutron: 'neutron', + noble: 'noble', + omniflix: 'omniflixhub', + osmo: 'osmosis', + secret: 'secretnetwork', + stars: 'stargaze', + stride: 'stride', + umee: 'umee', + }, + brandDenom: { + 'Alleged: BLD brand': 'ubld', + 'Alleged: IST brand': 'uist', + }, chainInfos: { agoric: { + bech32Prefix: 'agoric', chainId: 'agoric-3', icqEnabled: false, + pfmEnabled: true, stakingTokens: [ { denom: 'ubld', }, ], }, + celestia: { + bech32Prefix: 'celestia', + chainId: 'celestia', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'utia', + }, + ], + }, + cosmoshub: { + bech32Prefix: 'cosmos', + chainId: 'cosmoshub-4', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uatom', + }, + ], + }, + dydx: { + bech32Prefix: 'dydx', + chainId: 'dydx-mainnet-1', + icqEnabled: false, + pfmEnabled: false, + stakingTokens: [ + { + denom: 'adydx', + }, + ], + }, + juno: { + bech32Prefix: 'juno', + chainId: 'juno-1', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'ujuno', + }, + ], + }, + neutron: { + bech32Prefix: 'neutron', + chainId: 'neutron-1', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'untrn', + }, + ], + }, + noble: { + bech32Prefix: 'noble', + chainId: 'noble-1', + icqEnabled: false, + pfmEnabled: true, + }, + omniflixhub: { + bech32Prefix: 'omniflix', + chainId: 'omniflixhub-1', + icqEnabled: true, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uflix', + }, + ], + }, + osmosis: { + bech32Prefix: 'osmo', + chainId: 'osmosis-1', + icqEnabled: true, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uosmo', + }, + ], + }, + secretnetwork: { + bech32Prefix: 'secret', + chainId: 'secret-4', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uscrt', + }, + ], + }, + stargaze: { + bech32Prefix: 'stars', + chainId: 'stargaze-1', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'ustars', + }, + ], + }, + stride: { + bech32Prefix: 'stride', + chainId: 'stride-1', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'ustrd', + }, + ], + }, + umee: { + bech32Prefix: 'umee', + chainId: 'umee-1', + icqEnabled: false, + pfmEnabled: true, + stakingTokens: [ + { + denom: 'uumee', + }, + ], + }, + }, + connectionInfos: { + 'agoric-3_cosmoshub-4': { + client_id: '07-tendermint-6', + counterparty: { + client_id: '07-tendermint-927', + connection_id: 'connection-649', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-5', + counterPartyChannelId: 'channel-405', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_noble-1': { + client_id: '07-tendermint-77', + counterparty: { + client_id: '07-tendermint-32', + connection_id: 'connection-40', + }, + id: 'connection-72', + state: 3, + transferChannel: { + channelId: 'channel-62', + counterPartyChannelId: 'channel-21', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_omniflixhub-1': { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-47', + connection_id: 'connection-40', + }, + id: 'connection-67', + state: 3, + transferChannel: { + channelId: 'channel-58', + counterPartyChannelId: 'channel-30', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_osmosis-1': { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-2109', + connection_id: 'connection-1649', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-320', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_secret-4': { + client_id: '07-tendermint-17', + counterparty: { + client_id: '07-tendermint-111', + connection_id: 'connection-80', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-51', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_stride-1': { + client_id: '07-tendermint-74', + counterparty: { + client_id: '07-tendermint-129', + connection_id: 'connection-118', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-59', + counterPartyChannelId: 'channel-148', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'agoric-3_umee-1': { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-152', + connection_id: 'connection-101', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_neutron-1': { + client_id: '07-tendermint-29', + counterparty: { + client_id: '07-tendermint-48', + connection_id: 'connection-36', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-35', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_osmosis-1': { + client_id: '07-tendermint-10', + counterparty: { + client_id: '07-tendermint-3012', + connection_id: 'connection-2503', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-2', + counterPartyChannelId: 'channel-6994', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_secret-4': { + client_id: '07-tendermint-52', + counterparty: { + client_id: '07-tendermint-174', + connection_id: 'connection-131', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-14', + counterPartyChannelId: 'channel-91', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_stargaze-1': { + client_id: '07-tendermint-86', + counterparty: { + client_id: '07-tendermint-359', + connection_id: 'connection-296', + }, + id: 'connection-56', + state: 3, + transferChannel: { + channelId: 'channel-33', + counterPartyChannelId: 'channel-291', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'celestia_stride-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-137', + connection_id: 'connection-125', + }, + id: 'connection-4', + state: 3, + transferChannel: { + channelId: 'channel-4', + counterPartyChannelId: 'channel-162', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_juno-1': { + client_id: '07-tendermint-439', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-2', + }, + id: 'connection-372', + state: 3, + transferChannel: { + channelId: 'channel-207', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_neutron-1': { + client_id: '07-tendermint-1119', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-809', + state: 3, + transferChannel: { + channelId: 'channel-569', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_noble-1': { + client_id: '07-tendermint-1116', + counterparty: { + client_id: '07-tendermint-4', + connection_id: 'connection-12', + }, + id: 'connection-790', + state: 3, + transferChannel: { + channelId: 'channel-536', + counterPartyChannelId: 'channel-4', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_omniflixhub-1': { + client_id: '07-tendermint-656', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-19', + }, + id: 'connection-501', + state: 3, + transferChannel: { + channelId: 'channel-306', + counterPartyChannelId: 'channel-12', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_osmosis-1': { + client_id: '07-tendermint-259', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-1', + }, + id: 'connection-257', + state: 3, + transferChannel: { + channelId: 'channel-141', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_secret-4': { + client_id: '07-tendermint-492', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-0', + }, + id: 'connection-401', + state: 3, + transferChannel: { + channelId: 'channel-235', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_stargaze-1': { + client_id: '07-tendermint-1188', + counterparty: { + client_id: '07-tendermint-320', + connection_id: 'connection-256', + }, + id: 'connection-918', + state: 3, + transferChannel: { + channelId: 'channel-730', + counterPartyChannelId: 'channel-239', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'cosmoshub-4_stride-1': { + client_id: '07-tendermint-913', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-635', + state: 3, + transferChannel: { + channelId: 'channel-391', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_neutron-1': { + client_id: '07-tendermint-11', + counterparty: { + client_id: '07-tendermint-72', + connection_id: 'connection-51', + }, + id: 'connection-17', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_noble-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-59', + connection_id: 'connection-57', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-33', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_osmosis-1': { + client_id: '07-tendermint-3', + counterparty: { + client_id: '07-tendermint-3009', + connection_id: 'connection-2500', + }, + id: 'connection-7', + state: 3, + transferChannel: { + channelId: 'channel-3', + counterPartyChannelId: 'channel-6787', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_stride-1': { + client_id: '07-tendermint-1', + counterparty: { + client_id: '07-tendermint-133', + connection_id: 'connection-123', + }, + id: 'connection-1', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-160', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'dydx-mainnet-1_umee-1': { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-244', + connection_id: 'connection-208', + }, + id: 'connection-13', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-118', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_neutron-1': { + client_id: '07-tendermint-557', + counterparty: { + client_id: '07-tendermint-97', + connection_id: 'connection-71', + }, + id: 'connection-524', + state: 3, + transferChannel: { + channelId: 'channel-548', + counterPartyChannelId: 'channel-4328', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_noble-1': { + client_id: '07-tendermint-334', + counterparty: { + client_id: '07-tendermint-3', + connection_id: 'connection-8', + }, + id: 'connection-322', + state: 3, + transferChannel: { + channelId: 'channel-224', + counterPartyChannelId: 'channel-3', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_osmosis-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-1457', + connection_id: 'connection-1142', + }, + id: 'connection-0', + state: 3, + transferChannel: { + channelId: 'channel-0', + counterPartyChannelId: 'channel-42', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_secret-4': { + client_id: '07-tendermint-108', + counterparty: { + client_id: '07-tendermint-23', + connection_id: 'connection-9', + }, + id: 'connection-68', + state: 3, + transferChannel: { + channelId: 'channel-48', + counterPartyChannelId: 'channel-8', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_stargaze-1': { + client_id: '07-tendermint-44', + counterparty: { + client_id: '07-tendermint-13', + connection_id: 'connection-11', + }, + id: 'connection-30', + state: 3, + transferChannel: { + channelId: 'channel-20', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'juno-1_stride-1': { + client_id: '07-tendermint-263', + counterparty: { + client_id: '07-tendermint-31', + connection_id: 'connection-19', + }, + id: 'connection-205', + state: 3, + transferChannel: { + channelId: 'channel-139', + counterPartyChannelId: 'channel-24', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_noble-1': { + client_id: '07-tendermint-40', + counterparty: { + client_id: '07-tendermint-25', + connection_id: 'connection-34', + }, + id: 'connection-31', + state: 3, + transferChannel: { + channelId: 'channel-30', + counterPartyChannelId: 'channel-18', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_osmosis-1': { + client_id: '07-tendermint-19', + counterparty: { + client_id: '07-tendermint-2823', + connection_id: 'connection-2338', + }, + id: 'connection-18', + state: 3, + transferChannel: { + channelId: 'channel-10', + counterPartyChannelId: 'channel-874', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_secret-4': { + client_id: '07-tendermint-85', + counterparty: { + client_id: '07-tendermint-199', + connection_id: 'connection-192', + }, + id: 'connection-63', + state: 3, + transferChannel: { + channelId: 'channel-1551', + counterPartyChannelId: 'channel-144', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_stargaze-1': { + client_id: '07-tendermint-31', + counterparty: { + client_id: '07-tendermint-283', + connection_id: 'connection-211', + }, + id: 'connection-23', + state: 3, + transferChannel: { + channelId: 'channel-18', + counterPartyChannelId: 'channel-191', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'neutron-1_stride-1': { + client_id: '07-tendermint-18', + counterparty: { + client_id: '07-tendermint-125', + connection_id: 'connection-113', + }, + id: 'connection-15', + state: 3, + transferChannel: { + channelId: 'channel-8', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_omniflixhub-1': { + client_id: '07-tendermint-68', + counterparty: { + client_id: '07-tendermint-51', + connection_id: 'connection-49', + }, + id: 'connection-65', + state: 3, + transferChannel: { + channelId: 'channel-44', + counterPartyChannelId: 'channel-38', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_osmosis-1': { + client_id: '07-tendermint-0', + counterparty: { + client_id: '07-tendermint-2704', + connection_id: 'connection-2241', + }, + id: 'connection-2', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-750', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_secret-4': { + client_id: '07-tendermint-24', + counterparty: { + client_id: '07-tendermint-170', + connection_id: 'connection-127', + }, + id: 'connection-33', + state: 3, + transferChannel: { + channelId: 'channel-17', + counterPartyChannelId: 'channel-88', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_stargaze-1': { + client_id: '07-tendermint-16', + counterparty: { + client_id: '07-tendermint-287', + connection_id: 'connection-214', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-11', + counterPartyChannelId: 'channel-204', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'noble-1_umee-1': { + client_id: '07-tendermint-73', + counterparty: { + client_id: '07-tendermint-248', + connection_id: 'connection-210', + }, + id: 'connection-74', + state: 3, + transferChannel: { + channelId: 'channel-51', + counterPartyChannelId: 'channel-120', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'omniflixhub-1_osmosis-1': { + client_id: '07-tendermint-8', + counterparty: { + client_id: '07-tendermint-1829', + connection_id: 'connection-1431', + }, + id: 'connection-8', + state: 3, + transferChannel: { + channelId: 'channel-1', + counterPartyChannelId: 'channel-199', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_secret-4': { + client_id: '07-tendermint-1588', + counterparty: { + client_id: '07-tendermint-2', + connection_id: 'connection-1', + }, + id: 'connection-1244', + state: 3, + transferChannel: { + channelId: 'channel-88', + counterPartyChannelId: 'channel-1', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_stargaze-1': { + client_id: '07-tendermint-1562', + counterparty: { + client_id: '07-tendermint-0', + connection_id: 'connection-0', + }, + id: 'connection-1223', + state: 3, + transferChannel: { + channelId: 'channel-75', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_stride-1': { + client_id: '07-tendermint-2119', + counterparty: { + client_id: '07-tendermint-1', + connection_id: 'connection-2', + }, + id: 'connection-1657', + state: 3, + transferChannel: { + channelId: 'channel-326', + counterPartyChannelId: 'channel-5', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'osmosis-1_umee-1': { + client_id: '07-tendermint-1805', + counterparty: { + client_id: '07-tendermint-6', + connection_id: 'connection-0', + }, + id: 'connection-1410', + state: 3, + transferChannel: { + channelId: 'channel-184', + counterPartyChannelId: 'channel-0', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4_stargaze-1': { + client_id: '07-tendermint-43', + counterparty: { + client_id: '07-tendermint-177', + connection_id: 'connection-110', + }, + id: 'connection-25', + state: 3, + transferChannel: { + channelId: 'channel-19', + counterPartyChannelId: 'channel-48', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4_stride-1': { + client_id: '07-tendermint-75', + counterparty: { + client_id: '07-tendermint-37', + connection_id: 'connection-25', + }, + id: 'connection-40', + state: 3, + transferChannel: { + channelId: 'channel-37', + counterPartyChannelId: 'channel-40', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'secret-4_umee-1': { + client_id: '07-tendermint-193', + counterparty: { + client_id: '07-tendermint-249', + connection_id: 'connection-213', + }, + id: 'connection-188', + state: 3, + transferChannel: { + channelId: 'channel-126', + counterPartyChannelId: 'channel-123', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'stargaze-1_stride-1': { + client_id: '07-tendermint-195', + counterparty: { + client_id: '07-tendermint-30', + connection_id: 'connection-18', + }, + id: 'connection-128', + state: 3, + transferChannel: { + channelId: 'channel-106', + counterPartyChannelId: 'channel-19', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + 'stride-1_umee-1': { + client_id: '07-tendermint-32', + counterparty: { + client_id: '07-tendermint-64', + connection_id: 'connection-45', + }, + id: 'connection-20', + state: 3, + transferChannel: { + channelId: 'channel-29', + counterPartyChannelId: 'channel-34', + counterPartyPortId: 'transfer', + ordering: 0, + portId: 'transfer', + state: 3, + version: 'ics20-1', + }, + }, + }, + denom: { + 'agoric:ibc/BA313C4A19DFBF943586C0387E6B11286F9E416B4DD27574E6909CABE0E342FA': { + baseDenom: 'uatom', + baseName: 'cosmoshub', + chainName: 'agoric', + }, + 'agoric:ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9': { + baseDenom: 'uusdc', + baseName: 'noble', + chainName: 'agoric', + }, + 'agoric:ubld': { + baseDenom: 'ubld', + baseName: 'agoric', + brand: Object @Alleged: BLD brand {}, + chainName: 'agoric', + }, + 'agoric:uist': { + baseDenom: 'uist', + baseName: 'agoric', + brand: Object @Alleged: IST brand {}, + chainName: 'agoric', + }, + 'cosmoshub:ibc/9EA9BCC30570DC3198317BB6B5561AB41DDC17AFC342087022C128C57EFE19BA': { + baseDenom: 'uist', + baseName: 'agoric', + chainName: 'cosmoshub', + }, + 'dydx:ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5': { + baseDenom: 'uusdc', + baseName: 'noble', + chainName: 'dydx', + }, }, - connectionInfos: {}, - denom: {}, lookupChainInfo_kindHandle: 'Alleged: kind', lookupChainsAndConnection_kindHandle: 'Alleged: kind', lookupConnectionInfo_kindHandle: 'Alleged: kind', diff --git a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap index 8f699611dac..3cf1a7c6eca 100644 Binary files a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap and b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap differ diff --git a/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.md b/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.md index c6d98bfbc95..378cdaddaf7 100644 --- a/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.md +++ b/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.md @@ -30,11 +30,16 @@ Generated by [AVA](https://avajs.dev). chainHub: { ChainHub_kindHandle: 'Alleged: kind', ChainHub_singleton: 'Alleged: ChainHub', + bech32PrefixToChainName: { + agoric: 'agoric', + cosmos: 'cosmoshub', + }, brandDenom: { 'Alleged: BLD brand': 'ubld', }, chainInfos: { agoric: { + bech32Prefix: 'agoric', chainId: 'agoric-3', icqEnabled: false, stakingTokens: [ @@ -44,6 +49,7 @@ Generated by [AVA](https://avajs.dev). ], }, cosmoshub: { + bech32Prefix: 'cosmos', chainId: 'cosmoshub-4', icqEnabled: false, stakingTokens: [ @@ -92,7 +98,7 @@ Generated by [AVA](https://avajs.dev). }, }, denom: { - ubld: { + 'agoric:ubld': { baseDenom: 'ubld', baseName: 'agoric', brand: Object @Alleged: BLD brand {}, diff --git a/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.snap b/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.snap index ef607a9874e..89494e9934d 100644 Binary files a/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.snap and b/packages/orchestration/test/examples/snapshots/staking-combinations.test.ts.snap differ diff --git a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md index 9ff9a074a00..fb15c9d00d8 100644 --- a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md +++ b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md @@ -30,9 +30,15 @@ Generated by [AVA](https://avajs.dev). chainHub: { ChainHub_kindHandle: 'Alleged: kind', ChainHub_singleton: 'Alleged: ChainHub', + bech32PrefixToChainName: { + agoric: 'agoric', + osmo: 'osmosis', + stride: 'stride', + }, brandDenom: {}, chainInfos: { agoric: { + bech32Prefix: 'agoric', chainId: 'agoric-3', icqEnabled: false, stakingTokens: [ @@ -42,6 +48,7 @@ Generated by [AVA](https://avajs.dev). ], }, osmosis: { + bech32Prefix: 'osmo', chainId: 'osmosis-1', icqEnabled: true, stakingTokens: [ @@ -51,6 +58,7 @@ Generated by [AVA](https://avajs.dev). ], }, stride: { + bech32Prefix: 'stride', chainId: 'stride-1', icqEnabled: false, stakingTokens: [ diff --git a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap index d0c60a3f1ea..34fcdb2beca 100644 Binary files a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap and b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap differ diff --git a/packages/orchestration/test/exos/chain-hub.test.ts b/packages/orchestration/test/exos/chain-hub.test.ts index fed1602a9ab..1505c6e0321 100644 --- a/packages/orchestration/test/exos/chain-hub.test.ts +++ b/packages/orchestration/test/exos/chain-hub.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @jessie.js/safe-await-separator -- XXX irrelevant for tests */ import '@agoric/swingset-liveslots/tools/prepare-test-env.js'; import test from '@endo/ses-ava/prepare-endo.js'; @@ -7,8 +6,10 @@ import { prepareSwingsetVowTools } from '@agoric/vow/vat.js'; import { E } from '@endo/far'; import { makeIssuerKit } from '@agoric/ertp'; import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import { typedJson } from '@agoric/cosmic-proto'; +import { objectMap } from '@endo/patterns'; import { makeChainHub, registerAssets } from '../../src/exos/chain-hub.js'; -import { provideDurableZone } from '../supports.js'; +import { provideFreshRootZone } from '../durability.js'; import { registerChainAssets, registerKnownChains, @@ -19,29 +20,14 @@ import type { IBCConnectionInfo, } from '../../src/cosmos-api.js'; import { assets as assetFixture } from '../assets.fixture.js'; - -const connection = { - id: 'connection-1', - client_id: '07-tendermint-3', - counterparty: { - client_id: '07-tendermint-2', - connection_id: 'connection-1', - }, - state: 3 /* IBCConnectionState.STATE_OPEN */, - transferChannel: { - portId: 'transfer', - channelId: 'channel-1', - counterPartyChannelId: 'channel-1', - counterPartyPortId: 'transfer', - ordering: 1 /* Order.ORDER_UNORDERED */, - state: 3 /* IBCConnectionState.STATE_OPEN */, - version: 'ics20-1', - }, -} as const; +import { registerChainsAndAssets } from '../../src/utils/chain-hub-helper.js'; +import { assetOn } from '../../src/utils/asset.js'; +import { withChainCapabilities } from '../../src/chain-capabilities.js'; +import type { ChainAddress, DenomAmount } from '../../src/orchestration-api.js'; // fresh state for each test const setup = () => { - const zone = provideDurableZone('root'); + const zone = provideFreshRootZone(); const vt = prepareSwingsetVowTools(zone.subZone('vows')); const { nameHub, nameAdmin } = makeNameHubKit(); const chainHub = makeChainHub(zone.subZone('chainHub'), nameHub, vt); @@ -49,7 +35,7 @@ const setup = () => { return { chainHub, nameAdmin, vt }; }; -test.serial('getChainInfo', async t => { +test('getChainInfo', async t => { const { chainHub, nameAdmin, vt } = setup(); // use fetched chain info await registerKnownChains(nameAdmin); @@ -58,7 +44,7 @@ test.serial('getChainInfo', async t => { t.like(await vt.asPromise(vow), { chainId: 'celestia' }); }); -test.serial('concurrency', async t => { +test('concurrency', async t => { const { chainHub, nameAdmin, vt } = setup(); // use fetched chain info await registerKnownChains(nameAdmin); @@ -71,7 +57,7 @@ test.serial('concurrency', async t => { ]); }); -test.serial('getConnectionInfo', async t => { +test('getConnectionInfo', async t => { const { chainHub, vt } = setup(); // https://mapofzones.com/zones/celestia/peers @@ -99,28 +85,29 @@ test('denom info support via getAsset and getDenom', async t => { const denom = 'utok1'; const info1: CosmosChainInfo = { - chainId: 'chain1', + bech32Prefix: 'chain', + chainId: 'agoric', stakingTokens: [{ denom }], }; const tok1 = withAmountUtils(makeIssuerKit('Tok1')); - chainHub.registerChain('chain1', info1); + chainHub.registerChain('agoric', info1); const info = { - chainName: 'chain1', - baseName: 'chain1', + chainName: 'agoric', + baseName: 'agoric', baseDenom: denom, brand: tok1.brand, }; chainHub.registerAsset('utok1', info); t.deepEqual( - chainHub.getAsset('utok1'), + chainHub.getAsset('utok1', 'agoric'), info, 'getAsset(denom) returns denom info', ); t.is( - chainHub.getAsset('utok404'), + chainHub.getAsset('utok404', 'agoric'), undefined, 'getAsset returns undefined when denom not registered', ); @@ -147,7 +134,7 @@ test('toward asset info in agoricNames (#9572)', async t => { await vt.when(chainHub.getChainInfo('cosmoshub')); for (const name of ['kava', 'fxcore']) { - chainHub.registerChain(name, { chainId: name }); + chainHub.registerChain(name, { chainId: name, bech32Prefix: name }); } await registerChainAssets(nameAdmin, 'cosmoshub', assetFixture.cosmoshub); @@ -158,7 +145,7 @@ test('toward asset info in agoricNames (#9572)', async t => { registerAssets(chainHub, 'cosmoshub', details); { - const actual = chainHub.getAsset('uatom'); + const actual = chainHub.getAsset('uatom', 'cosmoshub'); t.deepEqual(actual, { chainName: 'cosmoshub', baseName: 'cosmoshub', @@ -169,6 +156,7 @@ test('toward asset info in agoricNames (#9572)', async t => { { const actual = chainHub.getAsset( 'ibc/F04D72CF9B5D9C849BB278B691CDFA2241813327430EC9CDC83F8F4CA4CDC2B0', + 'cosmoshub', ); t.deepEqual(actual, { chainName: 'cosmoshub', @@ -177,3 +165,429 @@ test('toward asset info in agoricNames (#9572)', async t => { }); } }); + +test('makeChainAddress', async t => { + const { chainHub, nameAdmin, vt } = setup(); + // use fetched chain info + await registerKnownChains(nameAdmin); + + // call getChainInfo so ChainHub performs agoricNames lookup that populates its local cache + await vt.asPromise(chainHub.getChainInfo('osmosis')); + + const MOCK_ICA_ADDRESS = + 'osmo1ht7u569vpuryp6utadsydcne9ckeh2v8dkd38v5hptjl3u2ewppqc6kzgd'; + t.deepEqual(chainHub.makeChainAddress(MOCK_ICA_ADDRESS), { + chainId: 'osmosis-1', + value: MOCK_ICA_ADDRESS, + encoding: 'bech32', + }); + + t.throws( + () => chainHub.makeChainAddress(MOCK_ICA_ADDRESS.replace('osmo1', 'foo1')), + { + message: 'Chain info not found for bech32Prefix "foo"', + }, + ); + + t.throws(() => chainHub.makeChainAddress('notbech32'), { + message: 'No separator character for "notbech32"', + }); + + t.throws(() => chainHub.makeChainAddress('1notbech32'), { + message: 'Missing prefix for "1notbech32"', + }); +}); + +const [uusdcOnAgoric, agDetail] = assetOn( + 'uusdc', + 'noble', + undefined, + 'agoric', + knownChains, +); +const [uusdcOnOsmosis, osDetail] = assetOn( + 'uusdc', + 'noble', + undefined, + 'osmosis', + knownChains, +); + +test('makeTransferRoute - to issuing chain', async t => { + const { chainHub } = setup(); + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), // adds pfmEnabled + harden([ + [uusdcOnAgoric, agDetail], + [uusdcOnOsmosis, osDetail], + ]), + ); + + const dest: ChainAddress = chainHub.makeChainAddress('noble1234'); + { + // 100 USDC on agoric -> noble + const amt: DenomAmount = harden({ denom: uusdcOnAgoric, value: 100n }); + t.deepEqual(chainHub.makeTransferRoute(dest, amt, 'agoric'), { + receiver: 'noble1234', + sourceChannel: 'channel-62', + sourcePort: 'transfer', + token: { + amount: '100', + denom: + 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + }, + }); + } + { + // 100 USDC on osmosis -> noble + const amt: DenomAmount = harden({ denom: uusdcOnOsmosis, value: 100n }); + t.deepEqual(chainHub.makeTransferRoute(dest, amt, 'osmosis'), { + receiver: 'noble1234', + sourceChannel: 'channel-750', + sourcePort: 'transfer', + token: { + amount: '100', + denom: + 'ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4', + }, + }); + } +}); + +test('makeTransferRoute - from issuing chain', async t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), // adds pfmEnabled + harden([assetOn('uist', 'agoric'), assetOn('uosmo', 'osmosis')]), + ); + + const dest: ChainAddress = chainHub.makeChainAddress('noble1234'); + { + // IST on agoric -> noble + const amt: DenomAmount = harden({ denom: 'uist', value: 100n }); + t.deepEqual(chainHub.makeTransferRoute(dest, amt, 'agoric'), { + receiver: 'noble1234', + sourceChannel: 'channel-62', + sourcePort: 'transfer', + token: { + amount: '100', + denom: 'uist', + }, + }); + } + { + // OSMO on osmosis -> noble + const amt: DenomAmount = harden({ denom: 'uosmo', value: 100n }); + t.deepEqual(chainHub.makeTransferRoute(dest, amt, 'osmosis'), { + receiver: 'noble1234', + sourceChannel: 'channel-750', + sourcePort: 'transfer', + token: { + amount: '100', + denom: 'uosmo', + }, + }); + } +}); + +test('makeTransferRoute - through issuing chain', async t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), // adds pfmEnabled + harden([[uusdcOnAgoric, agDetail]]), + ); + + const dest: ChainAddress = chainHub.makeChainAddress('osmo1234'); + const amt: DenomAmount = harden({ denom: uusdcOnAgoric, value: 100n }); + + // 100 USDC on agoric -> osmosis + const route = chainHub.makeTransferRoute(dest, amt, 'agoric'); + t.deepEqual(route, { + sourcePort: 'transfer', + sourceChannel: 'channel-62', + token: { + amount: '100', + denom: + 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + }, + receiver: 'pfm', + forwardInfo: { + forward: { + receiver: 'osmo1234', + port: 'transfer', + channel: 'channel-1', + retries: 3, + timeout: '10m', + }, + }, + }); + + // use TransferRoute to build a MsgTransfer + if (!('forwardInfo' in route)) { + throw new Error('forwardInfo not returned'); // appease tsc... + } + + const { forwardInfo, ...rest } = route; + const transferMsg = typedJson('/ibc.applications.transfer.v1.MsgTransfer', { + ...rest, + memo: JSON.stringify(forwardInfo), + // callers of `.makeTransferRoute` will provide these fields themselves: + sender: 'agoric123', + timeoutHeight: { + revisionHeight: 0n, + revisionNumber: 0n, + }, + timeoutTimestamp: 0n, + }); + t.like(transferMsg, { + memo: '{"forward":{"receiver":"osmo1234","port":"transfer","channel":"channel-1","retries":3,"timeout":"10m"}}', + receiver: 'pfm', + }); +}); + +test('makeTransferRoute - takes forwardOpts', t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), // adds pfmEnabled + harden([[uusdcOnOsmosis, osDetail]]), + ); + + const dest: ChainAddress = chainHub.makeChainAddress('agoric1234'); + const amt: DenomAmount = harden({ denom: uusdcOnOsmosis, value: 100n }); + const forwardOpts = harden({ + retries: 1, + timeout: '3m' as const, + }); + + // 100 USDC on osmosis -> agoric + const route = chainHub.makeTransferRoute(dest, amt, 'osmosis', forwardOpts); + t.like(route, { + sourceChannel: 'channel-750', + token: { + denom: uusdcOnOsmosis, + }, + receiver: 'pfm', + forwardInfo: { + forward: { + channel: 'channel-21', + ...forwardOpts, + }, + }, + }); + + const nobleAddr = harden({ + value: 'noble1234', + encoding: 'bech32' as const, + chainId: 'noble-1', + }); + + t.like( + chainHub.makeTransferRoute(dest, amt, 'osmosis', { + timeout: '99m', + intermediateRecipient: nobleAddr, + }), + { + receiver: nobleAddr.value, + forwardInfo: { + forward: { + timeout: '99m' as const, + }, + }, + }, + 'each field is optional', + ); + + // test that typeGuard works + t.throws( + () => + chainHub.makeTransferRoute( + dest, + amt, + 'osmosis', + harden({ + ...forwardOpts, + forward: JSON.stringify('stringified nested forward data'), + }), + ), + { message: /In "makeTransferRoute" method of/ }, + ); +}); + +const nobleDest: ChainAddress = harden({ + value: 'noble1234', + chainId: 'noble-1', + encoding: 'bech32', +}); + +test('makeTransferRoute - no chain info', t => { + const { chainHub } = setup(); + + const amt: DenomAmount = harden({ denom: 'uist', value: 100n }); + t.throws(() => chainHub.makeTransferRoute(nobleDest, amt, 'agoric'), { + message: 'chain info not found for holding chain: "agoric"', + }); +}); + +test('makeTransferRoute - no asset info', t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), // adds pfmEnabled + undefined, // do not supply asset info + ); + + t.throws( + () => + chainHub.makeTransferRoute( + nobleDest, + harden({ denom: 'uist', value: 100n }), + 'agoric', + ), + { + message: + 'no denom detail for: "uist" on "agoric". ensure it is registered in chainHub.', + }, + ); + + t.throws( + () => + chainHub.makeTransferRoute( + nobleDest, + harden({ denom: uusdcOnAgoric, value: 100n }), + 'agoric', + ), + { + message: + 'no denom detail for: "ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9" on "agoric". ensure it is registered in chainHub.', + }, + ); +}); + +const knownChainsSansConns = objectMap( + withChainCapabilities(knownChains), + ({ connections, ...rest }) => rest, +); + +test('makeTransferRoute - no connection info single hop', t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + knownChainsSansConns, // omit connections + harden([ + [uusdcOnAgoric, agDetail], + [uusdcOnOsmosis, osDetail], + ]), + ); + + t.throws( + () => + chainHub.makeTransferRoute( + nobleDest, + harden({ denom: uusdcOnAgoric, value: 100n }), + 'agoric', + ), + { message: 'no connection info found for "agoric-3"<->"noble-1"' }, + ); +}); + +test('makeTransferRoute - no connection info multi hop', t => { + const { chainHub } = setup(); + + // only agoric has connection info; osmosis<>noble will be missing + const chainInfo = { ...knownChainsSansConns, agoric: knownChains.agoric }; + registerChainsAndAssets( + chainHub, + {}, + harden(chainInfo), + harden([ + [uusdcOnAgoric, agDetail], + [uusdcOnOsmosis, osDetail], + ]), + ); + + const osmoDest = chainHub.makeChainAddress('osmo1234'); + const agoricDest = chainHub.makeChainAddress('agoric1234'); + + t.throws( + () => + chainHub.makeTransferRoute( + osmoDest, + harden({ denom: uusdcOnAgoric, value: 100n }), + 'agoric', + ), + { message: 'no connection info found for "noble-1"<->"osmosis-1"' }, + ); + + // transfer USDC on osmosis to agoric + t.throws( + () => + chainHub.makeTransferRoute( + agoricDest, + harden({ denom: uusdcOnOsmosis, value: 100n }), + 'osmosis', + ), + { message: 'no connection info found for "osmosis-1"<->"noble-1"' }, + ); +}); + +test('makeTransferRoute - asset not on holding chain', t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + withChainCapabilities(knownChains), + harden([[uusdcOnAgoric, agDetail]]), + ); + + // transfer USDC on agoric from osmosis to noble (impossible) + t.throws( + () => + chainHub.makeTransferRoute( + nobleDest, + harden({ denom: uusdcOnAgoric, value: 100n }), + 'osmosis', + ), + { + message: + 'no denom detail for: "ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9" on "osmosis". ensure it is registered in chainHub.', + }, + ); +}); + +test('makeTransferRoute - no PFM path', t => { + const { chainHub } = setup(); + + registerChainsAndAssets( + chainHub, + {}, + knownChains, // intentionally omit pfmEnabled + harden([[uusdcOnAgoric, agDetail]]), + ); + + // transfer USDC on agoric to osmosis + t.throws( + () => + chainHub.makeTransferRoute( + chainHub.makeChainAddress('osmo1234'), + harden({ denom: uusdcOnAgoric, value: 100n }), + 'agoric', + ), + { message: 'pfm not enabled on issuing chain: "noble"' }, + ); +}); diff --git a/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts b/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts index e0f1f4d12af..1cfb26d7a2f 100644 --- a/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts +++ b/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts @@ -14,6 +14,10 @@ import { QueryBalanceRequest, QueryBalanceResponse, } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/query.js'; +import { + MsgSend, + MsgSendResponse, +} from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; import { Coin } from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; import { QueryDelegationRequest, @@ -33,6 +37,14 @@ import { QueryDelegationRewardsResponse, QueryDelegationTotalRewardsResponse, } from '@agoric/cosmic-proto/cosmos/distribution/v1beta1/query.js'; +import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js'; +import { + MsgDelegate, + MsgDelegateResponse, +} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/tx.js'; +import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import { makeIssuerKit } from '@agoric/ertp'; +import { decodeBase64 } from '@endo/base64'; import { commonSetup } from '../supports.js'; import type { AmountArg, @@ -48,6 +60,9 @@ import { parseOutgoingTxPacket, } from '../../tools/ibc-mocks.js'; import type { CosmosValidatorAddress } from '../../src/cosmos-api.js'; +import { protoMsgMocks } from '../ibc-mocks.js'; +import fetchedChainInfo from '../../src/fetched-chain-info.js'; +import { assetOn } from '../../src/utils/asset.js'; type TestContext = Awaited>; @@ -57,11 +72,21 @@ test.beforeEach(async t => { t.context = await commonSetup(t); }); +const [uistOnCosmos] = assetOn( + 'uist', + 'agoric', + undefined, + 'cosmoshub', + fetchedChainInfo, +); + test('send (to addr on same chain)', async t => { const { brands: { ist }, - utils: { inspectDibcBridge }, + mocks: { ibcBridge }, + utils: { inspectDibcBridge, populateChainHub }, } = t.context; + populateChainHub(); const makeTestCOAKit = prepareMakeTestCOAKit(t, t.context); const account = await makeTestCOAKit(); t.assert(account, 'account is returned'); @@ -81,6 +106,42 @@ test('send (to addr on same chain)', async t => { undefined, ); + // register handler for ist bank send + ibcBridge.addMockAck( + buildTxPacketString([ + MsgSend.toProtoMsg({ + fromAddress: 'cosmos1test', + toAddress: 'cosmos99test', + amount: [ + { + denom: uistOnCosmos, + // denom: 'ibc/uisthash', + amount: '10', + }, + ], + }), + ]), + buildMsgResponseString(MsgSendResponse, {}), + ); + + t.is( + await E(account).send(toAddress, { + denom: uistOnCosmos, + value: 10n, + } as AmountArg), + undefined, + 'send accepts Amount', + ); + + await t.throwsAsync( + () => E(account).send(toAddress, ist.make(10n) as AmountArg), + { + message: + "'amountToCoin' not working for \"[Alleged: IST brand]\" until #10449; use 'DenomAmount' for now", + }, + 'TODO #10449 amountToCoin for CosmosOrchestrationAccount', + ); + // simulate timeout error await t.throwsAsync( E(account).send(toAddress, { value: 504n, denom: 'uatom' } as AmountArg), @@ -88,10 +149,17 @@ test('send (to addr on same chain)', async t => { { message: 'ABCI code: 5: error handling packet: see events for details' }, ); - // IST not registered - await t.throwsAsync(E(account).send(toAddress, ist.make(10n) as AmountArg), { - message: 'No denom for brand [object Alleged: IST brand]', - }); + // MOO brand not registered + const moolah = withAmountUtils(makeIssuerKit('MOO')); + await t.throwsAsync( + E(account).send(toAddress, moolah.make(10n) as AmountArg), + { + // TODO #10449 + // message: 'No denom for brand [object Alleged: MOO brand]', + message: + "'amountToCoin' not working for \"[Alleged: MOO brand]\" until #10449; use 'DenomAmount' for now", + }, + ); // multi-send (sendAll) t.is( @@ -103,11 +171,10 @@ test('send (to addr on same chain)', async t => { ); const { bridgeDowncalls } = await inspectDibcBridge(); - t.is( bridgeDowncalls.filter(d => d.method === 'sendPacket').length, - 3, - 'sent 2 successful txs and 1 failed. 1 rejected before sending', + 4, + 'sent 3 successful txs and 1 failed. 1 rejected before sending', ); }); @@ -115,9 +182,10 @@ test('transfer', async t => { const { brands: { ist }, facadeServices: { chainHub }, - utils: { inspectDibcBridge }, + utils: { inspectDibcBridge, populateChainHub }, mocks: { ibcBridge }, } = t.context; + populateChainHub(); const mockIbcTransfer = { sourcePort: 'transfer', @@ -177,6 +245,14 @@ test('transfer', async t => { }, }); + const umooTransfer = toTransferTxPacket({ + ...mockIbcTransfer, + token: { + denom: 'umoo', + amount: '10', + }, + }); + return { [defaultTransfer]: transferResp, [customTimeoutHeight]: transferResp, @@ -184,6 +260,7 @@ test('transfer', async t => { [customTimeout]: transferResp, [customMemo]: transferResp, [uistTransfer]: transferResp, + [umooTransfer]: transferResp, }; }; ibcBridge.setMockAck(buildMocks()); @@ -300,18 +377,26 @@ test('transfer', async t => { }, ); + const moolah = withAmountUtils(makeIssuerKit('MOO')); t.log('transfer throws if asset is not in its chainHub'); - await t.throwsAsync(E(account).transfer(mockDestination, ist.make(10n)), { - message: 'No denom for brand [object Alleged: IST brand]', + await t.throwsAsync(E(account).transfer(mockDestination, moolah.make(10n)), { + // TODO #10449 + // message: 'No denom for brand [object Alleged: MOO brand]', + message: + "'amountToCoin' not working for \"[Alleged: MOO brand]\" until #10449; use 'DenomAmount' for now", }); - chainHub.registerAsset('uist', { - baseDenom: 'uist', + chainHub.registerAsset('umoo', { + baseDenom: 'umoo', baseName: 'agoric', - brand: ist.brand, + brand: moolah.brand, chainName: 'agoric', }); - // uses uistTransfer mock above - await E(account).transfer(mockDestination, ist.make(10n)); + // uses umooTransfer mock above + await E(account).transfer( + mockDestination, + // moolah.make(10n), // TODO #10449 restore + { denom: 'umoo', value: 10n }, + ); t.log('transfer timeout error recieved and handled from the bridge'); await t.throwsAsync( @@ -816,3 +901,38 @@ test('not yet implemented', async t => { message: 'Not Implemented. Try using withdrawReward.', }); }); + +test('executeEncodedTx', async t => { + const makeTestCOAKit = prepareMakeTestCOAKit(t, t.context); + const account = await makeTestCOAKit(); + + const delegateMsgSuccess = Any.toJSON( + MsgDelegate.toProtoMsg({ + delegatorAddress: 'cosmos1test', + validatorAddress: 'cosmosvaloper1test', + amount: { denom: 'uatom', amount: '10' }, + }), + ); + + const res = await E(account).executeEncodedTx([delegateMsgSuccess]); + t.is( + res, + 'Ei0KKy9jb3Ntb3Muc3Rha2luZy52MWJldGExLk1zZ0RlbGVnYXRlUmVzcG9uc2U=', // cosmos.staking.v1beta1.MsgDelegateResponse + 'delegateMsgSuccess', + ); + const decodedRes = MsgDelegateResponse.decode(decodeBase64(res)); + t.deepEqual(decodedRes, {}, 'MsgDelegate returns MsgDelegateResponse'); + + t.context.mocks.ibcBridge.addMockAck( + // Delegate 100 ubld from cosmos1test to cosmosvaloper1test observed in console, timeoutHeight: 6n + 'eyJ0eXBlIjoxLCJkYXRhIjoiQ2xVS0l5OWpiM050YjNNdWMzUmhhMmx1Wnk1Mk1XSmxkR0V4TGsxelowUmxiR1ZuWVhSbEVpNEtDMk52YzIxdmN6RjBaWE4wRWhKamIzTnRiM04yWVd4dmNHVnlNWFJsYzNRYUN3b0ZkV0YwYjIwU0FqRXdHQVk9IiwibWVtbyI6IiJ9', + protoMsgMocks.delegate.ack, + ); + t.is( + await E(account).executeEncodedTx([delegateMsgSuccess], { + timeoutHeight: 6n, + }), + 'Ei0KKy9jb3Ntb3Muc3Rha2luZy52MWJldGExLk1zZ0RlbGVnYXRlUmVzcG9uc2U=', // cosmos.staking.v1beta1.MsgDelegateResponse + 'delegateMsgSuccess', + ); +}); diff --git a/packages/orchestration/test/exos/local-orchestration-account-kit.test.ts b/packages/orchestration/test/exos/local-orchestration-account-kit.test.ts index c1eed2f6730..ed618734166 100644 --- a/packages/orchestration/test/exos/local-orchestration-account-kit.test.ts +++ b/packages/orchestration/test/exos/local-orchestration-account-kit.test.ts @@ -9,16 +9,26 @@ import { } from '@agoric/vats/tools/fake-bridge.js'; import { heapVowE as VE } from '@agoric/vow/vat.js'; import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; -import type { ChainAddress, AmountArg } from '../../src/orchestration-api.js'; +import type { IBCChannelID } from '@agoric/vats'; +import type { + ChainAddress, + AmountArg, + DenomAmount, +} from '../../src/orchestration-api.js'; import { maxClockSkew } from '../../src/utils/cosmos.js'; import { NANOSECONDS_PER_SECOND } from '../../src/utils/time.js'; import { buildVTransferEvent } from '../../tools/ibc-mocks.js'; import { UNBOND_PERIOD_SECONDS } from '../ibc-mocks.js'; import { commonSetup } from '../supports.js'; import { prepareMakeTestLOAKit } from './make-test-loa-kit.js'; +import fetchedChainInfo from '../../src/fetched-chain-info.js'; +import type { IBCMsgTransferOptions } from '../../src/cosmos-api.js'; +import { PFM_RECEIVER } from '../../src/exos/chain-hub.js'; +import { assetOn } from '../../src/utils/asset.js'; test('deposit, withdraw', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); @@ -64,6 +74,7 @@ test('deposit, withdraw', async t => { test('delegate, undelegate', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); @@ -100,6 +111,7 @@ test('delegate, undelegate', async t => { test('transfer', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); @@ -108,12 +120,12 @@ test('transfer', async t => { const { brands: { bld: stake }, mocks: { transferBridge }, - utils, + utils: { inspectLocalBridge, pourPayment }, } = common; t.truthy(account, 'account is returned'); - const oneHundredStakePmt = await utils.pourPayment(stake.units(100)); + const oneHundredStakePmt = await pourPayment(stake.units(100)); t.log('deposit 100 bld to account'); await VE(account).deposit(oneHundredStakePmt); @@ -127,7 +139,6 @@ test('transfer', async t => { value: 'cosmos1pleab', encoding: 'bech32', }; - const sourceChannel = 'channel-5'; // observed in toBridge VLOCALCHAIN_EXECUTE_TX sourceChannel, confirmed via fetched-chain-info.js /** The running tally of transfer messages that were sent over the bridge */ let lastSequence = 0n; @@ -142,7 +153,7 @@ test('transfer', async t => { const startTransfer = async ( amount: AmountArg, dest: ChainAddress, - opts = {}, + opts: IBCMsgTransferOptions = {}, ) => { const transferP = VE(account).transfer(dest, amount, opts); lastSequence += 1n; @@ -163,16 +174,15 @@ test('transfer', async t => { buildVTransferEvent({ receiver: destination.value, sender, - sourceChannel, + sourceChannel: + fetchedChainInfo.agoric.connections[destination.chainId].transferChannel + .channelId, sequence: lastSequence, }), ); const transferRes = await transferP; - t.true( - transferRes === undefined, - 'Successful transfer returns Promise.', - ); + t.true(transferRes === undefined, 'Successful transfer returns Vow.'); await t.throwsAsync( ( @@ -194,7 +204,7 @@ test('transfer', async t => { // XXX dev has to know not to startTransfer here await t.throwsAsync( VE(account).transfer(unknownDestination, { denom: 'ubld', value: 1n }), - { message: /connection not found: agoric-3<->fakenet/ }, + { message: 'no connection info found for "agoric-3"<->"fakenet"' }, 'cannot create transfer msg with unknown chainId', ); @@ -203,11 +213,13 @@ test('transfer', async t => { * @param amount * @param dest * @param opts + * @param sourceChannel */ const doTransfer = async ( amount: AmountArg, dest: ChainAddress, - opts = {}, + opts: IBCMsgTransferOptions = {}, + sourceChannel?: IBCChannelID, ) => { const { transferP: promise } = await startTransfer(amount, dest, opts); // simulate incoming message so that promise resolves @@ -215,20 +227,33 @@ test('transfer', async t => { buildVTransferEvent({ receiver: dest.value, sender, - sourceChannel, + sourceChannel: + sourceChannel || + fetchedChainInfo.agoric.connections[dest.chainId].transferChannel + .channelId, sequence: lastSequence, }), ); return promise; }; + const lastestTxMsg = () => { + const tx = inspectLocalBridge().at(-1); + if (tx.type !== 'VLOCALCHAIN_EXECUTE_TX') { + throw new Error('last message was not VLOCALCHAIN_EXECUTE_TX'); + } + return tx.messages[0]; + }; + await t.notThrowsAsync( doTransfer({ denom: 'ubld', value: 10n }, destination, { memo: 'hello', }), 'can create transfer msg with memo', ); - // TODO, intercept/spy the bridge message to see that it has a memo + t.like(lastestTxMsg(), { + memo: 'hello', + }); await t.notThrowsAsync( doTransfer({ denom: 'ubld', value: 10n }, destination, { @@ -244,10 +269,63 @@ test('transfer', async t => { }), 'accepts custom timeoutHeight', ); + + const [uusdcOnAgoric] = assetOn( + 'uusdc', + 'noble', + undefined, + 'agoric', + fetchedChainInfo, + ); + const dydxDest: ChainAddress = { + chainId: 'dydx-mainnet-1', + encoding: 'bech32', + value: 'dydx1test', + }; + const aDenomAmount: DenomAmount = { + denom: uusdcOnAgoric, + value: 100n, + }; + + t.log('Transfer handles multi-hop transfers'); + await t.notThrowsAsync( + doTransfer( + aDenomAmount, + dydxDest, + {}, + fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId, + ), + ); + + t.like(lastestTxMsg(), { + receiver: PFM_RECEIVER, + memo: '{"forward":{"receiver":"dydx1test","port":"transfer","channel":"channel-33","retries":3,"timeout":"10m"}}', + }); + + t.log('accepts pfm `forwardOpts`'); + await t.notThrowsAsync( + doTransfer( + aDenomAmount, + dydxDest, + { + forwardOpts: { + timeout: '999m', + }, + }, + fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId, + ), + ); + + t.like(JSON.parse(lastestTxMsg().memo), { + forward: { + timeout: '999m', + }, + }); }); test('monitor transfers', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); const { @@ -292,6 +370,7 @@ test('monitor transfers', async t => { test('send', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); t.truthy(account, 'account is returned'); @@ -352,6 +431,7 @@ test('send', async t => { test('getBalance', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); t.truthy(account, 'account is returned'); @@ -406,6 +486,7 @@ test('getBalance', async t => { test('getBalances', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const makeTestLOAKit = prepareMakeTestLOAKit(t, common); const account = await makeTestLOAKit(); t.truthy(account, 'account is returned'); diff --git a/packages/orchestration/test/exos/make-test-coa-kit.ts b/packages/orchestration/test/exos/make-test-coa-kit.ts index 6042091b31a..f1b63c50550 100644 --- a/packages/orchestration/test/exos/make-test-coa-kit.ts +++ b/packages/orchestration/test/exos/make-test-coa-kit.ts @@ -83,10 +83,6 @@ export const prepareMakeTestCOAKit = ( timer, }, ); - - t.log('register Agoric chain and BLD in ChainHub'); - utils.registerAgoricBld(); - return holder; }; }; diff --git a/packages/orchestration/test/exos/make-test-loa-kit.ts b/packages/orchestration/test/exos/make-test-loa-kit.ts index ee718c5a997..8bb57055d0b 100644 --- a/packages/orchestration/test/exos/make-test-loa-kit.ts +++ b/packages/orchestration/test/exos/make-test-loa-kit.ts @@ -63,9 +63,6 @@ export const prepareMakeTestLOAKit = ( }), storageNode: storageNode.makeChildNode(address), }); - - t.log('register Agoric chain and BLD in ChainHub'); - utils.registerAgoricBld(); return account; }; }; diff --git a/packages/orchestration/test/exos/portfolio-holder-kit.test.ts b/packages/orchestration/test/exos/portfolio-holder-kit.test.ts index a498b9b0c2c..b456399b57c 100644 --- a/packages/orchestration/test/exos/portfolio-holder-kit.test.ts +++ b/packages/orchestration/test/exos/portfolio-holder-kit.test.ts @@ -8,6 +8,7 @@ import { prepareMakeTestCOAKit } from './make-test-coa-kit.js'; test('portfolio holder kit behaviors', async t => { const common = await commonSetup(t); + common.utils.populateChainHub(); const { rootZone, storage, vowTools } = common.bootstrap; const storageNode = storage.rootNode.makeChildNode('accounts'); diff --git a/packages/orchestration/test/facade-durability.test.ts b/packages/orchestration/test/facade-durability.test.ts index a5caec6e904..011ccc98276 100644 --- a/packages/orchestration/test/facade-durability.test.ts +++ b/packages/orchestration/test/facade-durability.test.ts @@ -1,15 +1,14 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import { makeIssuerKit } from '@agoric/ertp'; -import { reincarnate } from '@agoric/swingset-liveslots/tools/setup-vat-data.js'; import { prepareSwingsetVowTools } from '@agoric/vow/vat.js'; -import { setupZCFTest } from '@agoric/zoe/test/unitTests/zcf/setupZcfTest.js'; import type { CosmosChainInfo, IBCConnectionInfo } from '../src/cosmos-api.js'; import fetchedChainInfo from '../src/fetched-chain-info.js'; // Refresh with scripts/refresh-chain-info.ts import type { Chain } from '../src/orchestration-api.js'; import { denomHash } from '../src/utils/denomHash.js'; import { provideOrchestration } from '../src/utils/start-helper.js'; -import { commonSetup, provideDurableZone } from './supports.js'; +import { commonSetup } from './supports.js'; +import { provideDurableZone, provideFreshRootZone } from './durability.js'; const test = anyTest; @@ -40,18 +39,19 @@ const mockChainConnection: IBCConnectionInfo = { }, }; -test.serial('chain info', async t => { - const { bootstrap, facadeServices, commonPrivateArgs } = await commonSetup(t); +// @ts-expect-error mock +const mockZcf: ZCF = { + setTestJig: () => {}, +}; - const { zcf } = await setupZCFTest(); +test('chain info', async t => { + const { facadeServices, commonPrivateArgs } = await commonSetup(t); - // After setupZCFTest because this disables relaxDurabilityRules - // which breaks Zoe test setup's fakeVatAdmin - const zone = provideDurableZone('test'); + const zone = provideFreshRootZone(); const vt = prepareSwingsetVowTools(zone); const orchKit = provideOrchestration( - zcf, + mockZcf, zone.mapStore('test'), { agoricNames: facadeServices.agoricNames, @@ -80,20 +80,14 @@ test.serial('chain info', async t => { t.deepEqual(await vt.when(result.getChainInfo()), mockChainInfo); }); -test.serial('faulty chain info', async t => { +test('missing chain info', async t => { const { facadeServices, commonPrivateArgs } = await commonSetup(t); - // XXX relax again so setupZCFTest can run. This is also why the tests are serial. - reincarnate({ relaxDurabilityRules: true }); - const { zcf } = await setupZCFTest(); - - // After setupZCFTest because this disables relaxDurabilityRules - // which breaks Zoe test setup's fakeVatAdmin - const zone = provideDurableZone('test'); + const zone = provideFreshRootZone(); const vt = prepareSwingsetVowTools(zone); const orchKit = provideOrchestration( - zcf, + mockZcf, zone.mapStore('test'), { agoricNames: facadeServices.agoricNames, @@ -105,16 +99,7 @@ test.serial('faulty chain info', async t => { commonPrivateArgs.marshaller, ); - const { chainHub, orchestrate } = orchKit; - - const { stakingTokens, ...sansStakingTokens } = mockChainInfo; - - chainHub.registerChain('mock', sansStakingTokens); - chainHub.registerConnection( - 'agoric-3', - mockChainInfo.chainId, - mockChainConnection, - ); + const { orchestrate } = orchKit; const handle = orchestrate('mock', {}, async orc => { const chain = await orc.getChain('mock'); @@ -123,24 +108,18 @@ test.serial('faulty chain info', async t => { }); await t.throwsAsync(vt.when(handle()), { - message: 'chain info lacks staking denom', + message: 'chain not found:mock', }); }); -test.serial('racy chain info', async t => { +test('racy chain info', async t => { const { facadeServices, commonPrivateArgs } = await commonSetup(t); - // XXX relax again - reincarnate({ relaxDurabilityRules: true }); - const { zcf } = await setupZCFTest(); - - // After setupZCFTest because this disables relaxDurabilityRules - // which breaks Zoe test setup's fakeVatAdmin - const zone = provideDurableZone('test'); + const zone = provideFreshRootZone(); const vt = prepareSwingsetVowTools(zone); const orchKit = provideOrchestration( - zcf, + mockZcf, zone.mapStore('test'), { agoricNames: facadeServices.agoricNames, @@ -176,16 +155,13 @@ test.serial('racy chain info', async t => { t.deepEqual(await chainInfos[1], mockChainInfo); }); -test.serial('asset / denom info', async t => { +test('asset / denom info', async t => { const { facadeServices, commonPrivateArgs } = await commonSetup(t); - // XXX relax again - reincarnate({ relaxDurabilityRules: true }); - const { zcf } = await setupZCFTest(); - const zone = provideDurableZone('test'); + const zone = provideFreshRootZone(); const vt = prepareSwingsetVowTools(zone); const orchKit = provideOrchestration( - zcf, + mockZcf, zone.mapStore('test'), { agoricNames: facadeServices.agoricNames, @@ -199,7 +175,7 @@ test.serial('asset / denom info', async t => { const { chainHub, orchestrate } = orchKit; chainHub.registerChain('agoric', fetchedChainInfo.agoric); - chainHub.registerChain(mockChainInfo.chainId, mockChainInfo); + chainHub.registerChain('mock', mockChainInfo); chainHub.registerConnection( 'agoric-3', mockChainInfo.chainId, @@ -207,8 +183,8 @@ test.serial('asset / denom info', async t => { ); chainHub.registerAsset('utoken1', { - chainName: mockChainInfo.chainId, - baseName: mockChainInfo.chainId, + chainName: 'mock', + baseName: 'mock', baseDenom: 'utoken1', }); @@ -218,7 +194,7 @@ test.serial('asset / denom info', async t => { t.log(`utoken1 over ${channelId}: ${agDenom}`); chainHub.registerAsset(agDenom, { chainName: 'agoric', - baseName: mockChainInfo.chainId, + baseName: 'mock', baseDenom: 'utoken1', brand, }); @@ -228,10 +204,14 @@ test.serial('asset / denom info', async t => { { brand }, // eslint-disable-next-line no-shadow async (orc, { brand }) => { - const c1 = await orc.getChain(mockChainInfo.chainId); + const c1 = await orc.getChain('mock'); { - const actual = orc.getDenomInfo('utoken1'); + const actual = orc.getDenomInfo( + 'utoken1', + // @ts-expect-error 'mock' not a KnownChain + 'mock', + ); console.log('actual', actual); const info = await actual.chain.getChainInfo(); t.deepEqual(info, mockChainInfo); @@ -245,12 +225,12 @@ test.serial('asset / denom info', async t => { } const agP = orc.getChain('agoric'); - t.throws(() => orc.getDenomInfo(agDenom), { + t.throws(() => orc.getDenomInfo(agDenom, 'agoric'), { message: /^wait until getChain\("agoric"\) completes/, }); const ag = await agP; { - const actual = orc.getDenomInfo(agDenom); + const actual = orc.getDenomInfo(agDenom, 'agoric'); t.deepEqual(actual, { chain: ag, @@ -273,7 +253,11 @@ test.serial('asset / denom info', async t => { }); const missingGetChain = orchestrate('missing getChain', {}, async orc => { - const actual = orc.getDenomInfo('utoken2'); + const actual = orc.getDenomInfo( + 'utoken2', + // @ts-expect-error 'mock' not a KnownChain + 'anotherChain', + ); }); await t.throwsAsync(vt.when(missingGetChain()), { diff --git a/packages/orchestration/test/fixtures/zoe-tools.flows.js b/packages/orchestration/test/fixtures/zoe-tools.flows.js index 4994984bafc..c8e7d829105 100644 --- a/packages/orchestration/test/fixtures/zoe-tools.flows.js +++ b/packages/orchestration/test/fixtures/zoe-tools.flows.js @@ -13,7 +13,7 @@ const { values } = Object; * @import {GuestInterface} from '@agoric/async-flow'; * @import {AtomicProvider} from '@agoric/store/src/stores/store-utils.js'; * @import {LocalOrchestrationAccountKit} from '../../src/exos/local-orchestration-account.js'; - * @import {Orchestrator, LocalAccountMethods, OrchestrationAccountI, OrchestrationFlow, ChainAddress} from '@agoric/orchestration'; + * @import {Orchestrator, LocalAccountMethods, OrchestrationAccountCommon, OrchestrationFlow, ChainAddress} from '@agoric/orchestration'; * @import {ZoeTools} from '../../src/utils/zoe-tools.js'; */ diff --git a/packages/orchestration/test/snapshots/chain-info.test.js.md b/packages/orchestration/test/snapshots/chain-info.test.js.md index 9a7bab61b77..10da37384c0 100644 --- a/packages/orchestration/test/snapshots/chain-info.test.js.md +++ b/packages/orchestration/test/snapshots/chain-info.test.js.md @@ -12,6 +12,7 @@ Generated by [AVA](https://avajs.dev). [ 'agoric', { + bech32Prefix: 'agoric', chainId: 'agoric-3', icqEnabled: false, stakingTokens: [ @@ -24,6 +25,7 @@ Generated by [AVA](https://avajs.dev). [ 'celestia', { + bech32Prefix: 'celestia', chainId: 'celestia', icqEnabled: false, stakingTokens: [ @@ -36,6 +38,7 @@ Generated by [AVA](https://avajs.dev). [ 'cosmoshub', { + bech32Prefix: 'cosmos', chainId: 'cosmoshub-4', icqEnabled: false, stakingTokens: [ @@ -48,6 +51,7 @@ Generated by [AVA](https://avajs.dev). [ 'dydx', { + bech32Prefix: 'dydx', chainId: 'dydx-mainnet-1', icqEnabled: false, stakingTokens: [ @@ -60,6 +64,7 @@ Generated by [AVA](https://avajs.dev). [ 'juno', { + bech32Prefix: 'juno', chainId: 'juno-1', icqEnabled: false, stakingTokens: [ @@ -72,6 +77,7 @@ Generated by [AVA](https://avajs.dev). [ 'neutron', { + bech32Prefix: 'neutron', chainId: 'neutron-1', icqEnabled: false, stakingTokens: [ @@ -84,6 +90,7 @@ Generated by [AVA](https://avajs.dev). [ 'noble', { + bech32Prefix: 'noble', chainId: 'noble-1', icqEnabled: false, }, @@ -91,6 +98,7 @@ Generated by [AVA](https://avajs.dev). [ 'omniflixhub', { + bech32Prefix: 'omniflix', chainId: 'omniflixhub-1', icqEnabled: false, stakingTokens: [ @@ -103,6 +111,7 @@ Generated by [AVA](https://avajs.dev). [ 'osmosis', { + bech32Prefix: 'osmo', chainId: 'osmosis-1', icqEnabled: true, stakingTokens: [ @@ -115,6 +124,7 @@ Generated by [AVA](https://avajs.dev). [ 'secretnetwork', { + bech32Prefix: 'secret', chainId: 'secret-4', icqEnabled: false, stakingTokens: [ @@ -127,6 +137,7 @@ Generated by [AVA](https://avajs.dev). [ 'stargaze', { + bech32Prefix: 'stars', chainId: 'stargaze-1', icqEnabled: false, stakingTokens: [ @@ -139,6 +150,7 @@ Generated by [AVA](https://avajs.dev). [ 'stride', { + bech32Prefix: 'stride', chainId: 'stride-1', icqEnabled: false, stakingTokens: [ @@ -151,6 +163,7 @@ Generated by [AVA](https://avajs.dev). [ 'umee', { + bech32Prefix: 'umee', chainId: 'umee-1', icqEnabled: false, stakingTokens: [ diff --git a/packages/orchestration/test/snapshots/chain-info.test.js.snap b/packages/orchestration/test/snapshots/chain-info.test.js.snap index f75f04ba200..4b0e2bddb25 100644 Binary files a/packages/orchestration/test/snapshots/chain-info.test.js.snap and b/packages/orchestration/test/snapshots/chain-info.test.js.snap differ diff --git a/packages/orchestration/test/snapshots/exports.test.ts.md b/packages/orchestration/test/snapshots/exports.test.ts.md index 2b058658b22..22bf7e69d2d 100644 --- a/packages/orchestration/test/snapshots/exports.test.ts.md +++ b/packages/orchestration/test/snapshots/exports.test.ts.md @@ -14,25 +14,33 @@ Generated by [AVA](https://avajs.dev). 'AnyNatAmountsRecord', 'ChainAddressShape', 'ChainInfoShape', + 'CoinShape', 'CosmosAssetInfoShape', 'CosmosChainInfoShape', 'DelegationShape', 'DenomAmountShape', + 'DenomDetailShape', 'DenomInfoShape', 'DenomShape', + 'ForwardInfoShape', + 'ForwardOptsShape', 'IBCChannelIDShape', 'IBCChannelInfoShape', 'IBCConnectionIDShape', 'IBCConnectionInfoShape', 'IBCTransferOptionsShape', 'ICQMsgShape', + 'OrchestrationPowersShape', 'OutboundConnectionHandlerI', 'Proto3Shape', 'TimestampProtoShape', 'TxBodyOptsShape', 'TypedJsonShape', 'chainFacadeMethods', + 'denomHash', 'prepareChainHubAdmin', 'prepareCosmosInterchainService', + 'registerChainsAndAssets', + 'withChainCapabilities', 'withOrchestration', ] diff --git a/packages/orchestration/test/snapshots/exports.test.ts.snap b/packages/orchestration/test/snapshots/exports.test.ts.snap index fab9e78c6b8..613327cd832 100644 Binary files a/packages/orchestration/test/snapshots/exports.test.ts.snap and b/packages/orchestration/test/snapshots/exports.test.ts.snap differ diff --git a/packages/orchestration/test/supports.ts b/packages/orchestration/test/supports.ts index 974456dd2d4..2d8a85cb056 100644 --- a/packages/orchestration/test/supports.ts +++ b/packages/orchestration/test/supports.ts @@ -1,7 +1,7 @@ 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 { reincarnate } from '@agoric/swingset-liveslots/tools/setup-vat-data.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'; @@ -17,17 +17,18 @@ 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, type Zone } from '@agoric/zone'; -import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeHeapZone } from '@agoric/zone'; import { E } from '@endo/far'; import type { ExecutionContext } from 'ava'; -import { eventLoopIteration } from '@agoric/internal/src/testing-utils.js'; import { registerKnownChains } from '../src/chain-info.js'; -import { prepareCosmosInterchainService } from '../src/exos/cosmos-interchain-service.js'; -import { setupFakeNetwork } from './network-fakes.js'; -import { buildVTransferEvent } from '../tools/ibc-mocks.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'; +import { withChainCapabilities } from '../src/chain-capabilities.js'; +import { registerChainsAndAssets } from '../src/utils/chain-hub-helper.js'; +import { assetOn } from '../src/utils/asset.js'; export { makeFakeLocalchainBridge, @@ -170,22 +171,33 @@ export const commonSetup = async (t: ExecutionContext) => { vowTools, ); + /** add `pfmEnabled` to chainInfo */ + const chainInfoWithCaps = withChainCapabilities(fetchedChainInfo); + + /** for registration with `ChainHub` */ + const commonAssetInfo = harden([ + assetOn('ubld', 'agoric', bldSansMint.brand), + assetOn('uist', 'agoric', istSansMint.brand), + assetOn('uist', 'agoric', undefined, 'cosmoshub', chainInfoWithCaps), + assetOn('uusdc', 'noble', undefined, 'agoric', chainInfoWithCaps), + assetOn('uatom', 'cosmoshub', undefined, 'agoric', chainInfoWithCaps), + assetOn('uusdc', 'noble', undefined, 'dydx', chainInfoWithCaps), + ]); + /** - * Register BLD if it's not already registered. - * Does not work with `withOrchestration` contracts, as these have their own - * ChainHub. Use `ChainHubAdmin` instead. + * Register known chains an assets into the test context's `ChainHub`. + * + * For contract tests with contracts that use `withOrchestration`, access + * `chainInfo` and `assetInfo` from `commonPrivateArgs` and register in the + * contract's ChainHub with `registerChainsAndAssets`. */ - const registerAgoricBld = () => { - if (!chainHub.getAsset('ubld')) { - chainHub.registerChain('agoric', fetchedChainInfo.agoric); - chainHub.registerAsset('ubld', { - chainName: 'agoric', - baseName: 'agoric', - baseDenom: 'ubld', - brand: bld.brand, - }); - } - }; + const populateChainHub = () => + registerChainsAndAssets( + chainHub, + harden({ BLD: bldSansMint.brand, IST: istSansMint.brand }), + chainInfoWithCaps, + commonAssetInfo, + ); return { bootstrap: { @@ -216,6 +228,8 @@ export const commonSetup = async (t: ExecutionContext) => { storageNode: storage.rootNode, marshaller, timerService: timer, + chainInfo: withChainCapabilities(fetchedChainInfo), + assetInfo: harden(commonAssetInfo), }, facadeServices: { agoricNames, @@ -229,21 +243,10 @@ export const commonSetup = async (t: ExecutionContext) => { inspectLocalBridge: () => harden([...localBridgeMessages]), inspectDibcBridge: () => E(ibcBridge).inspectDibcBridge(), inspectBankBridge: () => harden([...bankBridgeMessages]), - registerAgoricBld, + populateChainHub, transmitTransferAck, }, }; }; export const makeDefaultContext = (contract: Installation) => {}; - -/** - * Reincarnate without relaxDurabilityRules and provide a durable zone in the incarnation. - * @param key - */ -export const provideDurableZone = (key: string): Zone => { - const { fakeVomKit } = reincarnate({ relaxDurabilityRules: false }); - const root = fakeVomKit.cm.provideBaggage(); - const zone = makeDurableZone(root); - return zone.subZone(key); -}; diff --git a/packages/orchestration/test/tools/make-test-address.test.ts b/packages/orchestration/test/tools/make-test-address.test.ts new file mode 100644 index 00000000000..54b859ad736 --- /dev/null +++ b/packages/orchestration/test/tools/make-test-address.test.ts @@ -0,0 +1,22 @@ +import test from '@endo/ses-ava/prepare-endo.js'; +import { encodeAddressHook } from '@agoric/cosmic-proto/address-hooks.js'; +import { makeTestAddress } from '../../tools/make-test-address.js'; + +test('makeTestAddress returns valid bech32', t => { + t.is(makeTestAddress(), 'agoric1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqp7zqht'); + t.is(makeTestAddress(1), 'agoric1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc09z0g'); + t.is( + makeTestAddress(0, 'agoric', 32), + 'agoric1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkppep3', + ); + t.is( + makeTestAddress(0, 'cosmos'), + 'cosmos1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnrql8a', + ); +}); + +test('makeTestAddress creates address accepted by encodeAddressHook', t => { + const params = { EUD: makeTestAddress(0, 'osmosis') }; + t.throws(() => encodeAddressHook('agoric1FakeLCAAddress', params)); + t.notThrows(() => encodeAddressHook(makeTestAddress(), params)); +}); diff --git a/packages/orchestration/test/types.test-d.ts b/packages/orchestration/test/types.test-d.ts index ba9c3287753..0b13a42fc19 100644 --- a/packages/orchestration/test/types.test-d.ts +++ b/packages/orchestration/test/types.test-d.ts @@ -3,7 +3,7 @@ */ import type { HostInterface, HostOf } from '@agoric/async-flow'; -import { type JsonSafe, typedJson } from '@agoric/cosmic-proto'; +import { type AnyJson, type JsonSafe, typedJson } from '@agoric/cosmic-proto'; import type { QueryAllBalancesResponse, QueryBalanceResponse, @@ -14,10 +14,16 @@ import type { Vow, VowTools } from '@agoric/vow'; import type { ResolvedPublicTopic } from '@agoric/zoe/src/contractSupport/topics.js'; import type { Passable } from '@endo/marshal'; import { expectAssignable, expectNotType, expectType } from 'tsd'; +import type { TxBody } from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; +import type { + TargetApp, + TargetRegistration, +} from '@agoric/vats/src/bridge-target.js'; import { prepareCosmosOrchestrationAccount } from '../src/exos/cosmos-orchestration-account.js'; import type { LocalOrchestrationAccountKit } from '../src/exos/local-orchestration-account.js'; import type { OrchestrationFacade } from '../src/facade.js'; import type { + AmountArg, Chain, ChainAddress, ChainInfo, @@ -104,7 +110,7 @@ expectNotType(chainAddr); expectNotType<() => Promise>(vowFn); const getDenomInfo: HostOf = null as any; - const chainHostOf = getDenomInfo('uatom').chain; + const chainHostOf = getDenomInfo('uatom', 'cosmoshub').chain; expectType>(chainHostOf.getChainInfo()); } @@ -267,3 +273,50 @@ expectNotType(chainAddr); expectAssignable(addr as CosmosValidatorAddress); expectAssignable(denomAmount as DenomAmount); } + +// Test LocalAccountMethods +{ + type ChainFacade = Chain; + const remoteChain: ChainFacade = null as any; + + const account = await remoteChain.makeAccount(); + + // Verify monitorTransfers is available + expectType<(tap: TargetApp) => Promise>( + account.monitorTransfers, + ); + + // Verify StakingAccountActions are available (StakingAccountQueries not yet supported) + expectType< + (validator: CosmosValidatorAddress, amount: AmountArg) => Promise + >(account.delegate); + + // @ts-expect-error executeEncodedTx not available on localAccount + expectType<() => Promise>(account.executeEncodedTx); +} + +// Test CosmosChainAccountMethods +{ + type ChainFacade = Chain< + CosmosChainInfo & { + chainId: 'cosmoshub-4'; + stakingTokens: [{ denom: 'uatom' }]; + } + >; + const remoteChain: ChainFacade = null as any; + + const account = await remoteChain.makeAccount(); + + // Verify executeEncodedTx is available + expectType< + ( + msgs: AnyJson[], + opts?: Partial>, + ) => Promise + >(account.executeEncodedTx); + + // Verify delegate is available via stakingTokens parameter + expectType< + (validator: CosmosValidatorAddress, amount: AmountArg) => Promise + >(account.delegate); +} diff --git a/packages/orchestration/test/utils/address.test.ts b/packages/orchestration/test/utils/address.test.ts index 9012edc9da3..ecdf12b688b 100644 --- a/packages/orchestration/test/utils/address.test.ts +++ b/packages/orchestration/test/utils/address.test.ts @@ -4,6 +4,7 @@ import { makeICAChannelAddress, makeICQChannelAddress, findAddressField, + getBech32Prefix, } from '../../src/utils/address.js'; test('makeICAChannelAddress', t => { @@ -107,3 +108,33 @@ test('makeICQChannelAddress', t => { 'makeICQChannelAddress not hardened against malformed version. use `validateRemoteIbcAddress` to detect this, or expect IBC ProtocolImpl to throw', ); }); + +const bech32 = test.macro({ + title: (_, input: string, expected: string | null) => + expected !== null + ? `can extract ${expected} prefix from ${input}` + : `throws error for invalid address ${input}`, + exec: (t, input: string, expected: string | null, error?: string) => { + if (expected !== null) { + t.is(getBech32Prefix(input), expected); + } else { + t.throws(() => getBech32Prefix(input), { message: error }); + } + }, +}); + +test(bech32, 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', 'bc'); +test(bech32, 'cosmos1n4f2eqt2gm5mh6gevf8aw2wrf75q25yru09yvn', 'cosmos'); +test(bech32, '111qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', '11'); +test( + bech32, + 'qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', + null, + 'No separator character for "qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"', +); +test( + bech32, + '1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', + null, + 'Missing prefix for "1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"', +); diff --git a/packages/orchestration/test/utils/zcf-tools.test.ts b/packages/orchestration/test/utils/zcf-tools.test.ts index 510921a9497..ffdfc7f9091 100644 --- a/packages/orchestration/test/utils/zcf-tools.test.ts +++ b/packages/orchestration/test/utils/zcf-tools.test.ts @@ -1,15 +1,15 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; -import { AmountMath, makeIssuerKit } from '@agoric/ertp'; +import { makeIssuerKit } from '@agoric/ertp'; import { prepareSwingsetVowTools } from '@agoric/vow'; import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { makeHeapZone } from '@agoric/zone'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { E, Far } from '@endo/far'; import type { TestFn } from 'ava'; import { createRequire } from 'node:module'; import { makeZcfTools } from '../../src/utils/zcf-tools.js'; -import { provideDurableZone } from '../supports.js'; const nodeRequire = createRequire(import.meta.url); const contractEntry = nodeRequire.resolve('../fixtures/zcfTester.contract.js'); @@ -34,10 +34,10 @@ const makeTestContext = async () => { const zcf: ZCF = testJig.zcf; - const zone = provideDurableZone('root'); + const zone = makeHeapZone(); const vt = prepareSwingsetVowTools(zone); const zcfTools = makeZcfTools(zcf, vt); - return { zoe, zcf, stuff, feeMintAccess, zcfTools, vt }; + return { zoe, zcf, zcfTools, vt }; }; type TestContext = Awaited>; @@ -47,7 +47,7 @@ const test = anyTest as TestFn; test.before('set up context', async t => (t.context = await makeTestContext())); test('unchanged: atomicRearrange(), assertUniqueKeyword()', async t => { - const { zcf, zcfTools } = t.context; + const { zcfTools } = t.context; t.notThrows(() => zcfTools.atomicRearrange([])); @@ -56,7 +56,7 @@ test('unchanged: atomicRearrange(), assertUniqueKeyword()', async t => { }); test('changed: makeInvitation: watch promise', async t => { - const { zoe, zcf, zcfTools, vt } = t.context; + const { zoe, zcfTools, vt } = t.context; const handler = Far('Trade', { handle: seat => {} }); const toTradeVow = zcfTools.makeInvitation(handler, 'trade'); diff --git a/packages/orchestration/tools/ibc-mocks.ts b/packages/orchestration/tools/ibc-mocks.ts index 96995b9e60c..4482edf93c0 100644 --- a/packages/orchestration/tools/ibc-mocks.ts +++ b/packages/orchestration/tools/ibc-mocks.ts @@ -24,7 +24,7 @@ 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 { +interface EncoderCommon { encode: (message: T) => { finish: () => Uint8Array; }; @@ -45,7 +45,7 @@ const toPacket = (obj: Record): string => * @param message */ export function buildMsgResponseString( - Encoder: EncoderI, + Encoder: EncoderCommon, message: Partial, ): string { const encodedMsg = Encoder.encode(Encoder.fromPartial(message)).finish(); @@ -90,7 +90,7 @@ export function buildMsgErrorString( * @param opts */ export function buildQueryResponseString( - Encoder: EncoderI, + Encoder: EncoderCommon, query: Partial, opts: Omit = { value: new Uint8Array(), diff --git a/packages/orchestration/tools/make-test-address.js b/packages/orchestration/tools/make-test-address.js new file mode 100644 index 00000000000..0a80a82562d --- /dev/null +++ b/packages/orchestration/tools/make-test-address.js @@ -0,0 +1,21 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { bech32 } from 'bech32'; + +/** + * @param {number} index + * @param {string} prefix + * @param {number} byteLength + * @returns {string} a mock bech32 address for tests + */ +export const makeTestAddress = ( + index = 0, + prefix = 'agoric', + byteLength = 20, +) => { + // create a simple 20-byte array (common address length) + const bytes = new Uint8Array(byteLength).fill(0); + // if index provided, put it in the first byte + if (index !== 0) bytes[0] = Number(index); + const words = bech32.toWords(bytes); + return bech32.encode(prefix, words); +}; diff --git a/packages/orchestration/tsconfig.json b/packages/orchestration/tsconfig.json index ade1cfe3d88..27d898bef01 100644 --- a/packages/orchestration/tsconfig.json +++ b/packages/orchestration/tsconfig.json @@ -3,6 +3,7 @@ "include": [ "build", "index.js", + "scripts", "src", "test", "tools" diff --git a/packages/pegasus/package.json b/packages/pegasus/package.json index 5506d1972e8..a7321751cd3 100644 --- a/packages/pegasus/package.json +++ b/packages/pegasus/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -28,6 +28,7 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/internal": "^0.4.0-u18.0", "@agoric/network": "^0.2.0-u18.0", @@ -37,20 +38,19 @@ "@agoric/vats": "^0.16.0-u18.4", "@agoric/vow": "^0.2.0-u18.0", "@agoric/zoe": "^0.26.3-u18.0", + "@endo/bundle-source": "^3.5.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7" + "@endo/captp": "^4.4.3", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { - "@agoric/vat-data": "^0.5.3-u18.0", "ava": "^5.3.0", - "c8": "^9.1.0", - "import-meta-resolve": "^2.2.1" + "c8": "^10.1.2", + "import-meta-resolve": "^2.2.1", + "@agoric/vat-data": "^0.5.3-u18.0" }, "files": [ "scripts/", diff --git a/packages/pegasus/src/pegasus.js b/packages/pegasus/src/pegasus.js index d96a2b1dd1b..cf2af1a545f 100644 --- a/packages/pegasus/src/pegasus.js +++ b/packages/pegasus/src/pegasus.js @@ -361,7 +361,6 @@ export const makePegasus = ({ zcf, board, namesByAddress, when }) => { receiveDenomPublication, remoteDenomSubscription, abort: reason => { - // eslint-disable-next-line no-use-before-define actions.abort(reason); }, }; diff --git a/packages/smart-wallet/package.json b/packages/smart-wallet/package.json index 1caab7bef8e..9d36da6ef84 100644 --- a/packages/smart-wallet/package.json +++ b/packages/smart-wallet/package.json @@ -17,16 +17,17 @@ "lint:eslint": "eslint ." }, "devDependencies": { + "@agoric/casting": "^0.4.3-u18.4", "@agoric/cosmic-proto": "^0.5.0-u18.4", "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/captp": "^4.4.3", + "@endo/init": "^1.1.7", "ava": "^5.3.0", "import-meta-resolve": "^2.2.1" }, "dependencies": { - "@agoric/casting": "^0.4.3-u18.4", + "@endo/errors": "^1.2.8", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/internal": "^0.4.0-u18.0", "@agoric/notifier": "^0.7.0-u18.0", @@ -36,12 +37,11 @@ "@agoric/vow": "^0.2.0-u18.0", "@agoric/zoe": "^0.26.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7" + "@endo/eventual-send": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8" }, "files": [ "src/" @@ -70,6 +70,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 94.51 + "atLeast": 94.58 } } diff --git a/packages/smart-wallet/src/offerWatcher.js b/packages/smart-wallet/src/offerWatcher.js index 4aace001224..38da65c2d77 100644 --- a/packages/smart-wallet/src/offerWatcher.js +++ b/packages/smart-wallet/src/offerWatcher.js @@ -72,13 +72,18 @@ const watchForPayout = ({ paymentWatcher }, seat) => { /** @param {VowTools} vowTools */ export const makeWatchOfferOutcomes = vowTools => { const watchForOfferResult = makeWatchForOfferResult(vowTools); - const { asPromise, allVows } = vowTools; + const { when, allVows } = vowTools; /** * @param {OutcomeWatchers} watchers * @param {UserSeat} seat */ const watchOfferOutcomes = (watchers, seat) => { - return asPromise( + // Use `when` to get a promise from the vow. + // Unlike `asPromise` this doesn't warn in case of disconnections, which is + // fine since we actually handle the outcome durably through the watchers. + // Only the `executeOffer` caller relies on the settlement of this promise, + // and only in tests. + return when( allVows([ watchForOfferResult(watchers, seat), watchForNumWants(watchers, seat), diff --git a/packages/smart-wallet/src/types.ts b/packages/smart-wallet/src/types.ts index 94350d9ef53..6100d4b96e8 100644 --- a/packages/smart-wallet/src/types.ts +++ b/packages/smart-wallet/src/types.ts @@ -8,10 +8,15 @@ import type { agoric } from '@agoric/cosmic-proto/agoric/bundle.js'; import type { AgoricNamesRemotes } from '@agoric/vats/tools/board-utils.js'; import type { PublicTopic } from '@agoric/zoe/src/contractSupport/topics.js'; +import type { Payment } from '@agoric/ertp'; import type { OfferSpec } from './offers.js'; declare const CapDataShape: unique symbol; +// Match the type in Zoe, which can't be imported because it's ambient. +// This omits the parameters that aren't used in this module. +type Invitation = Payment<'set'>; + /** * A petname can either be a plain string or a path for which the first element * is a petname for the origin, and the rest of the elements are a snapshot of diff --git a/packages/solo/package.json b/packages/solo/package.json index 77072b9934f..c0af91379f9 100644 --- a/packages/solo/package.json +++ b/packages/solo/package.json @@ -11,7 +11,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -35,13 +35,13 @@ "@agoric/time": "^0.3.3-u18.0", "@agoric/vats": "^0.16.0-u18.4", "@agoric/wallet": "^0.19.0-u18.0", - "@endo/captp": "^4.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/import-bundle": "^1.3.1", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/promise-kit": "^1.1.7", + "@endo/captp": "^4.4.3", + "@endo/errors": "^1.2.8", + "@endo/eventual-send": "^1.2.8", + "@endo/import-bundle": "^1.3.2", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/promise-kit": "^1.1.8", "anylogger": "^0.21.0", "deterministic-json": "^1.0.5", "esm": "agoric-labs/esm#Agoric-built", @@ -56,9 +56,9 @@ }, "devDependencies": { "@agoric/ertp": "^0.16.3-u18.0", - "@endo/bundle-source": "^3.4.2", + "@endo/bundle-source": "^3.5.0", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "publishConfig": { "access": "public" @@ -77,6 +77,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 73.54 + "atLeast": 74.02 } } diff --git a/packages/solo/src/chain-cosmos-sdk.js b/packages/solo/src/chain-cosmos-sdk.js index f97e9692f02..9bad3f0a1e2 100644 --- a/packages/solo/src/chain-cosmos-sdk.js +++ b/packages/solo/src/chain-cosmos-sdk.js @@ -696,14 +696,12 @@ ${chainID} chain does not yet know of address ${clientAddr}${adviseEgress( .then(txResult => { // The result had an error code (not 0 or undefined for success). if (txResult.code) { - // eslint-disable-next-line no-use-before-define failedSend( makeError(`Error in tx processing: ${txResult.log}`), ); } }) .catch(err => - // eslint-disable-next-line no-use-before-define failedSend(makeError(`Error in tx processing: ${err}`)), ); diff --git a/packages/solo/src/start.js b/packages/solo/src/start.js index b5e0d7181e4..4df27db7c8d 100644 --- a/packages/solo/src/start.js +++ b/packages/solo/src/start.js @@ -120,7 +120,6 @@ const buildSwingset = async ( const withInputQueue = makeWithQueue(); const queueThunkForKernel = withInputQueue(async thunk => { thunk(); - // eslint-disable-next-line no-use-before-define await processKernel(); }); diff --git a/packages/solo/src/vat-http.js b/packages/solo/src/vat-http.js index 6f6b2b93653..6b9c221a5d9 100644 --- a/packages/solo/src/vat-http.js +++ b/packages/solo/src/vat-http.js @@ -3,6 +3,7 @@ import { E } from '@endo/eventual-send'; import { makePromiseKit } from '@endo/promise-kit'; import { Far } from '@endo/marshal'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; import { makeNotifierKit } from '@agoric/notifier'; import { makeCache } from '@agoric/cache'; import { getReplHandler } from '@agoric/vats/src/repl.js'; @@ -27,7 +28,6 @@ export function buildRootObject(vatPowers) { const lookup = async (...path) => { // Take a snapshot of the current home. - // eslint-disable-next-line no-use-before-define const root = replObjects.home; if (path.length === 1 && Array.isArray(path[0])) { @@ -82,7 +82,7 @@ export function buildRootObject(vatPowers) { D(commandDevice).sendResponse( count, isException, - obj || JSON.parse(JSON.stringify(obj)), + obj || deepCopyJsonable(obj), ); // Map an URL only to its latest handler. @@ -186,7 +186,7 @@ export function buildRootObject(vatPowers) { // Launder the data, since the command device tends to pass device nodes // when there are empty objects, which screw things up for us. // Analysis is in https://github.com/Agoric/agoric-sdk/pull/1956 - const obj = JSON.parse(JSON.stringify(rawObj)); + const obj = deepCopyJsonable(rawObj); console.debug( `vat-http.inbound (from browser) ${count}`, JSON.stringify(obj, undefined, 2), diff --git a/packages/solo/src/web.js b/packages/solo/src/web.js index 93e70d4d212..04caf2c39f4 100644 --- a/packages/solo/src/web.js +++ b/packages/solo/src/web.js @@ -370,7 +370,6 @@ export async function makeHTTPListener( return; } - // eslint-disable-next-line no-use-before-define sendJSON({ ...res, meta }); } catch (error) { inboundCommand( diff --git a/packages/spawner/package.json b/packages/spawner/package.json index 0a1215256ac..3c5c32cd25b 100644 --- a/packages/spawner/package.json +++ b/packages/spawner/package.json @@ -11,7 +11,7 @@ "build": "yarn build:bundles", "build:bundles": "node scripts/build-bundles.js", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint": "run-s --continue-on-error lint:*", "lint-fix": "yarn lint:eslint --fix", @@ -31,18 +31,18 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/import-bundle": "^1.3.1", - "@endo/marshal": "^1.6.1" + "@endo/errors": "^1.2.8", + "@endo/eventual-send": "^1.2.8", + "@endo/import-bundle": "^1.3.2", + "@endo/marshal": "^1.6.2" }, "devDependencies": { "@agoric/internal": "^0.4.0-u18.0", "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/init": "^1.1.7", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "src/", diff --git a/packages/stat-logger/package.json b/packages/stat-logger/package.json index f3728ff10bb..2ba7344f3b2 100644 --- a/packages/stat-logger/package.json +++ b/packages/stat-logger/package.json @@ -16,7 +16,7 @@ "lint:eslint": "eslint ." }, "dependencies": { - "@endo/errors": "^1.2.7" + "@endo/errors": "^1.2.8" }, "peerDependencies": { "canvas": "^2.6.1", diff --git a/packages/store/package.json b/packages/store/package.json index 47cc7ccad5e..be71293cd8e 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -30,15 +30,15 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { - "@endo/errors": "^1.2.7", - "@endo/exo": "^1.5.6", - "@endo/marshal": "^1.6.1", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6" + "@endo/errors": "^1.2.8", + "@endo/exo": "^1.5.7", + "@endo/marshal": "^1.6.2", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7" }, "devDependencies": { - "@endo/init": "^1.1.6", - "@endo/ses-ava": "^1.2.7", + "@endo/init": "^1.1.7", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0" }, "files": [ diff --git a/packages/swing-store/package.json b/packages/swing-store/package.json index 545214e51b0..2724dd6ee66 100644 --- a/packages/swing-store/package.json +++ b/packages/swing-store/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -21,19 +21,19 @@ "lint:eslint": "eslint ." }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", - "@endo/base64": "^1.0.8", - "@endo/bundle-source": "^3.4.2", - "@endo/check-bundle": "^1.0.11", - "@endo/errors": "^1.2.7", - "@endo/nat": "^5.0.12", + "@endo/base64": "^1.0.9", + "@endo/bundle-source": "^3.5.0", + "@endo/check-bundle": "^1.0.12", + "@endo/nat": "^5.0.13", "better-sqlite3": "^9.1.1" }, "devDependencies": { - "@endo/init": "^1.1.6", + "@endo/init": "^1.1.7", "@types/better-sqlite3": "^7.6.9", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "tmp": "^0.2.1" }, "publishConfig": { @@ -49,6 +49,6 @@ "timeout": "2m" }, "typeCoverage": { - "atLeast": 79.08 + "atLeast": 79.04 } } diff --git a/packages/swing-store/src/exporter.js b/packages/swing-store/src/exporter.js index 0e355c50b9b..e8a6cc9fb62 100644 --- a/packages/swing-store/src/exporter.js +++ b/packages/swing-store/src/exporter.js @@ -133,7 +133,6 @@ export function makeSwingStoreExporter(dirPath, options = {}) { * section */ function getHostKV(key) { - typeof key === 'string' || Fail`key must be a string`; getKeyType(key) === 'host' || Fail`getHostKV requires host keys`; // @ts-expect-error unknown return sqlKVGet.get(key); @@ -176,7 +175,7 @@ export function makeSwingStoreExporter(dirPath, options = {}) { function getArtifactNames() { if (artifactMode !== 'debug') { // synchronously throw if this DB will not be able to yield all the desired artifacts - const internal = { snapStore, bundleStore, transcriptStore }; + const internal = { dirPath, snapStore, bundleStore, transcriptStore }; assertComplete(internal, artifactMode); } return generateArtifactNames(); diff --git a/packages/swing-store/src/hasher.js b/packages/swing-store/src/hasher.js index 384425517e5..c287cc7d3a2 100644 --- a/packages/swing-store/src/hasher.js +++ b/packages/swing-store/src/hasher.js @@ -16,7 +16,6 @@ import { createHash } from 'crypto'; function createSHA256(initial = undefined) { const hash = createHash('sha256'); let done = false; - // eslint-disable-next-line no-use-before-define const self = harden({ add, finish, sample }); function add(more) { !done || Fail`hash already finished`; diff --git a/packages/swing-store/src/internal.js b/packages/swing-store/src/internal.js index 6abc2485e6d..6b3ff234ce1 100644 --- a/packages/swing-store/src/internal.js +++ b/packages/swing-store/src/internal.js @@ -6,6 +6,7 @@ import { Fail, q } from '@endo/errors'; * @typedef { import('./bundleStore.js').BundleStoreInternal } BundleStoreInternal * * @typedef {{ + * dirPath: string | null, * transcriptStore: TranscriptStoreInternal, * snapStore: SnapStoreInternal, * bundleStore: BundleStoreInternal, diff --git a/packages/swing-store/src/kvStore.js b/packages/swing-store/src/kvStore.js index 646aaf3ae1c..4f8b58b5825 100644 --- a/packages/swing-store/src/kvStore.js +++ b/packages/swing-store/src/kvStore.js @@ -15,6 +15,7 @@ import { Fail } from '@endo/errors'; * @param {string} key */ export function getKeyType(key) { + typeof key === 'string' || Fail`key must be a string`; if (key.startsWith('local.')) { return 'local'; } else if (key.startsWith('host.')) { diff --git a/packages/swing-store/src/swingStore.js b/packages/swing-store/src/swingStore.js index 64d2d01de67..314a3eb73ab 100644 --- a/packages/swing-store/src/swingStore.js +++ b/packages/swing-store/src/swingStore.js @@ -337,7 +337,6 @@ export function makeSwingStore(dirPath, forceReset, options = {}) { const kernelKVStore = { ...kvStore, set(key, value) { - typeof key === 'string' || Fail`key must be a string`; const keyType = getKeyType(key); keyType !== 'host' || Fail`kernelKVStore refuses host keys`; kvStore.set(key, value); @@ -352,7 +351,6 @@ export function makeSwingStore(dirPath, forceReset, options = {}) { } }, delete(key) { - typeof key === 'string' || Fail`key must be a string`; const keyType = getKeyType(key); keyType !== 'host' || Fail`kernelKVStore refuses host keys`; kvStore.delete(key); @@ -505,6 +503,7 @@ export function makeSwingStore(dirPath, forceReset, options = {}) { /** @type {import('./internal.js').SwingStoreInternal} */ const internal = harden({ + dirPath, snapStore, transcriptStore, bundleStore, diff --git a/packages/swingset-liveslots/package.json b/packages/swingset-liveslots/package.json index 65b1a1f89a4..ebdc9c1d0e3 100644 --- a/packages/swingset-liveslots/package.json +++ b/packages/swingset-liveslots/package.json @@ -17,23 +17,23 @@ "lint:eslint": "eslint ." }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/store": "^0.9.3-u18.0", - "@endo/env-options": "^1.1.7", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/exo": "^1.5.6", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/env-options": "^1.1.8", + "@endo/eventual-send": "^1.2.8", + "@endo/exo": "^1.5.7", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { - "@agoric/kmarshal": "^0.1.1-u18.0", - "ava": "^5.3.0" + "ava": "^5.3.0", + "@agoric/kmarshal": "^0.1.1-u18.0" }, "files": [ "src/**/*.js", diff --git a/packages/swingset-liveslots/src/collectionManager.js b/packages/swingset-liveslots/src/collectionManager.js index 9b8b6d4ff2e..69dfc18531d 100644 --- a/packages/swingset-liveslots/src/collectionManager.js +++ b/packages/swingset-liveslots/src/collectionManager.js @@ -146,56 +146,48 @@ export function makeCollectionManager( scalarMapStore: { hasWeakKeys: false, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateMapStore, durable: false, }, scalarWeakMapStore: { hasWeakKeys: true, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateWeakMapStore, durable: false, }, scalarSetStore: { hasWeakKeys: false, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateSetStore, durable: false, }, scalarWeakSetStore: { hasWeakKeys: true, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateWeakSetStore, durable: false, }, scalarDurableMapStore: { hasWeakKeys: false, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateMapStore, durable: true, }, scalarDurableWeakMapStore: { hasWeakKeys: true, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateWeakMapStore, durable: true, }, scalarDurableSetStore: { hasWeakKeys: false, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateSetStore, durable: true, }, scalarDurableWeakSetStore: { hasWeakKeys: true, kindID: 0, - // eslint-disable-next-line no-use-before-define reanimator: reanimateWeakSetStore, durable: true, }, @@ -218,7 +210,6 @@ export function makeCollectionManager( vrm.registerKind( kindID, storeKindInfo[kind].reanimator, - // eslint-disable-next-line no-use-before-define deleteCollection, storeKindInfo[kind].durable, ); @@ -313,7 +304,6 @@ export function makeCollectionManager( // * vref(o-4) -> "vc.5.r0000000001:o-4" const encodeRemotable = remotable => { - // eslint-disable-next-line no-use-before-define const ordinal = getOrdinal(remotable); ordinal !== undefined || Fail`no ordinal for ${remotable}`; const ordinalTag = zeroPad(ordinal, BIGINT_TAG_LEN); diff --git a/packages/swingset-liveslots/src/liveslots.js b/packages/swingset-liveslots/src/liveslots.js index 9363b15e027..b0d82478a8f 100644 --- a/packages/swingset-liveslots/src/liveslots.js +++ b/packages/swingset-liveslots/src/liveslots.js @@ -155,10 +155,8 @@ function build( const { type, allocatedByVat, virtual, durable } = parseVatSlot(vref); if (type === 'object' && allocatedByVat) { if (virtual || durable) { - // eslint-disable-next-line no-use-before-define vrm.setExportStatus(vref, 'reachable'); } else { - // eslint-disable-next-line no-use-before-define const remotable = requiredValForSlot(vref); exportedRemotables.add(remotable); kernelRecognizableRemotables.add(vref); @@ -183,7 +181,6 @@ function build( if (wr && !wr.deref()) { // we're in the COLLECTED state, or FINALIZED after a re-introduction - // eslint-disable-next-line no-use-before-define addToPossiblyDeadSet(baseRef); slotToVal.delete(baseRef); } @@ -209,11 +206,9 @@ function build( // Support: o~.[prop](...args) remote method invocation lsdebug(`makeImportedPresence handler.applyMethod (${slot})`); if (disavowedPresences.has(o)) { - // eslint-disable-next-line no-use-before-define exitVatWithFailure(disavowalError); throw disavowalError; } - // eslint-disable-next-line no-use-before-define return queueMessage(slot, prop, args, returnedP); }, applyFunction(o, args, returnedP) { @@ -222,7 +217,6 @@ function build( get(o, prop) { lsdebug(`makeImportedPresence handler.get (${slot})`); if (disavowedPresences.has(o)) { - // eslint-disable-next-line no-use-before-define exitVatWithFailure(disavowalError); throw disavowalError; } @@ -294,7 +288,6 @@ function build( console.error(`mIPromise handler called after resolution`); Fail`mIPromise handler called after resolution`; } - // eslint-disable-next-line no-use-before-define return queueMessage(vpid, prop, args, returnedP); }, get(p, prop) { @@ -347,17 +340,14 @@ function build( // use a slot from the corresponding allocateX function allocateExportID() { - // eslint-disable-next-line no-use-before-define return vrm.allocateNextID('exportID'); } function allocateCollectionID() { - // eslint-disable-next-line no-use-before-define return vrm.allocateNextID('collectionID'); } function allocatePromiseID() { - // eslint-disable-next-line no-use-before-define const promiseID = vrm.allocateNextID('promiseID'); return makeVatSlot('promise', true, promiseID); } @@ -385,10 +375,8 @@ function build( // do a syscall.resolve when it fires. The caller must finish // doing their syscall before this turn finishes, to ensure the // kernel isn't surprised by a spurious resolution. - // eslint-disable-next-line no-use-before-define const p = requiredValForSlot(vpid); // if (!knownResolutions.has(p)) { // TODO really? - // eslint-disable-next-line no-use-before-define followForKernel(vpid, p); return true; } @@ -400,7 +388,6 @@ function build( return makeVatSlot('object', true, exportID); } - // eslint-disable-next-line no-use-before-define const m = makeMarshal(convertValToSlot, convertSlotToVal, { marshalName: `liveSlots:${forVatID}`, serializeBodyFormat: 'smallcaps', @@ -413,7 +400,6 @@ function build( console.warn('Logging sent error stack', err), }); const unmeteredUnserialize = meterControl.unmetered(m.unserialize); - // eslint-disable-next-line no-use-before-define const unmeteredConvertSlotToVal = meterControl.unmetered(convertSlotToVal); function getSlotForVal(val) { @@ -458,7 +444,6 @@ function build( allocateExportID, getSlotForVal, requiredValForSlot, - // eslint-disable-next-line no-use-before-define registerValue, m.serialize, unmeteredUnserialize, @@ -471,10 +456,8 @@ function build( vrm, allocateExportID, allocateCollectionID, - // eslint-disable-next-line no-use-before-define convertValToSlot, unmeteredConvertSlotToVal, - // eslint-disable-next-line no-use-before-define registerValue, m.serialize, unmeteredUnserialize, @@ -486,7 +469,6 @@ function build( vrm, vom, collectionManager, - // eslint-disable-next-line no-use-before-define convertValToSlot, convertSlotToVal: unmeteredConvertSlotToVal, maybeExportPromise, @@ -516,7 +498,6 @@ function build( slot = allocatePromiseID(); } else { if (disavowedPresences.has(val)) { - // eslint-disable-next-line no-use-before-define exitVatWithFailure(disavowalError); throw disavowalError; // cannot reference a disavowed object } @@ -686,7 +667,6 @@ function build( const priorResolution = knownResolutions.get(p); if (priorResolution && !doneResolutions.has(slot)) { const [priorRejected, priorRes] = priorResolution; - // eslint-disable-next-line no-use-before-define collect(slot, priorRejected, priorRes); } } @@ -972,7 +952,6 @@ function build( } // in both cases, we are now the decider, so treat it like an // exported promise - // eslint-disable-next-line no-use-before-define followForKernel(resultVPID, p); } } @@ -1249,7 +1228,6 @@ function build( possiblyRetiredSet, slotToVal, valToSlot, - // eslint-disable-next-line no-use-before-define afterDispatchActions, }); @@ -1341,7 +1319,7 @@ function build( /** * @param {import('./types.js').VatDeliveryObject} delivery - * @returns {void | Promise} + * @returns {undefined | ReturnType} */ function dispatchToUserspace(delivery) { let result; diff --git a/packages/swingset-liveslots/src/virtualObjectManager.js b/packages/swingset-liveslots/src/virtualObjectManager.js index e58430f6c4c..e88d038b1ef 100644 --- a/packages/swingset-liveslots/src/virtualObjectManager.js +++ b/packages/swingset-liveslots/src/virtualObjectManager.js @@ -1,5 +1,5 @@ /* global globalThis */ -/* eslint-disable no-use-before-define, jsdoc/require-returns-type */ +/* eslint-disable jsdoc/require-returns-type */ import { environmentOptionsListHas } from '@endo/env-options'; import { assert, Fail, q, b } from '@endo/errors'; diff --git a/packages/swingset-liveslots/src/virtualReferences.js b/packages/swingset-liveslots/src/virtualReferences.js index ffe0daca3bb..896c47431b9 100644 --- a/packages/swingset-liveslots/src/virtualReferences.js +++ b/packages/swingset-liveslots/src/virtualReferences.js @@ -1,4 +1,4 @@ -/* eslint-disable no-use-before-define, jsdoc/require-returns-type */ +/* eslint-disable jsdoc/require-returns-type */ import { assert, Fail } from '@endo/errors'; import { Nat } from '@endo/nat'; diff --git a/packages/swingset-liveslots/src/watchedPromises.js b/packages/swingset-liveslots/src/watchedPromises.js index 799171f5d99..30771fc0686 100644 --- a/packages/swingset-liveslots/src/watchedPromises.js +++ b/packages/swingset-liveslots/src/watchedPromises.js @@ -235,13 +235,23 @@ export function makeWatchedPromiseManager({ } else { watchedPromiseTable.init(vpid, harden([[watcher, ...args]])); + promiseRegistrations.init(vpid, p); + + // pseudoThen registers a settlement callback that will remove + // this promise from promiseRegistrations and + // watchedPromiseTable. To avoid triggering + // https://github.com/Agoric/agoric-sdk/issues/10757 and + // preventing slotToVal cleanup, the `pseudoThen()` should + // precede `maybeExportPromise()`. This isn't foolproof, but + // does mitigate in advance of a proper fix. See #10756 for + // details of this particular mitigation, and #10757 for the + // deeper bug. + pseudoThen(p, vpid); + // Ensure that this vat's promises are rejected at termination. if (maybeExportPromise(vpid)) { syscall.subscribe(vpid); } - - promiseRegistrations.init(vpid, p); - pseudoThen(p, vpid); } }); } diff --git a/packages/swingset-liveslots/test/watch-promise.test.js b/packages/swingset-liveslots/test/watch-promise.test.js new file mode 100644 index 00000000000..6ceecbf48f5 --- /dev/null +++ b/packages/swingset-liveslots/test/watch-promise.test.js @@ -0,0 +1,42 @@ +import test from 'ava'; + +import { Far } from '@endo/marshal'; +import { makePromiseKit } from '@endo/promise-kit'; +import { setupTestLiveslots } from './liveslots-helpers.js'; + +const build = vatPowers => { + const { VatData } = vatPowers; + const { makeKindHandle, defineDurableKind, watchPromise } = VatData; + + const kh = makeKindHandle('handler'); + const init = () => ({}); + const behavior = { + onFulfilled: _value => 0, + onRejected: _reason => 0, + }; + const makeHandler = defineDurableKind(kh, init, behavior); + + return Far('root', { + async run() { + const pr = makePromiseKit(); + const handler = makeHandler(); + watchPromise(pr.promise, handler); + pr.resolve('ignored'); + }, + }); +}; + +test('watched local promises should not leak slotToVal entries', async t => { + const { dispatchMessage, testHooks } = await setupTestLiveslots( + t, + build, + 'vatA', + ); + const { slotToVal } = testHooks; + const initial = slotToVal.size; + + await dispatchMessage('run'); + t.is(slotToVal.size, initial); + await dispatchMessage('run'); + t.is(slotToVal.size, initial); +}); diff --git a/packages/swingset-liveslots/tools/fakeVirtualSupport.js b/packages/swingset-liveslots/tools/fakeVirtualSupport.js index a8e745810ce..d05939e851e 100644 --- a/packages/swingset-liveslots/tools/fakeVirtualSupport.js +++ b/packages/swingset-liveslots/tools/fakeVirtualSupport.js @@ -234,7 +234,6 @@ export function makeFakeLiveSlotsStuff(options = {}) { assert.fail('fake liveSlots stuff configured without vrm'); } } - // eslint-disable-next-line no-use-before-define registerEntry(baseRef, val, facet !== undefined); if (!result) { result = val; diff --git a/packages/swingset-runner/package.json b/packages/swingset-runner/package.json index 3e5388fcc87..ba8f7b181ba 100644 --- a/packages/swingset-runner/package.json +++ b/packages/swingset-runner/package.json @@ -11,7 +11,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -19,10 +19,11 @@ "ci:autobench": "./autobench.js" }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/deploy-script-support": "^0.10.4-u18.4", "@agoric/ertp": "^0.16.3-u18.0", - "@agoric/inter-protocol": "^0.17.0-u18.5", "@agoric/internal": "^0.4.0-u18.0", + "@agoric/inter-protocol": "^0.17.0-u18.5", "@agoric/kmarshal": "^0.1.1-u18.0", "@agoric/stat-logger": "^0.4.29-u18.0", "@agoric/store": "^0.9.3-u18.0", @@ -31,19 +32,18 @@ "@agoric/telemetry": "^0.6.3-u18.3", "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/zoe": "^0.26.3-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", + "@endo/bundle-source": "^3.5.0", + "@endo/eventual-send": "^1.2.8", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", "expose-gc": "^1.0.0", "n-readlines": "^1.0.1", "yargs": "^16.1.0" }, "devDependencies": { "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "import-meta-resolve": "^2.2.1" }, "publishConfig": { diff --git a/packages/swingset-runner/src/auditstore.js b/packages/swingset-runner/src/auditstore.js index 568196df3a1..0c20b2fcc2a 100644 --- a/packages/swingset-runner/src/auditstore.js +++ b/packages/swingset-runner/src/auditstore.js @@ -2,7 +2,6 @@ import { Fail } from '@endo/errors'; import { parseReachableAndVatSlot } from '@agoric/swingset-vat/src/kernel/state/reachable.js'; import { parseVatSlot } from '@agoric/swingset-vat/src/lib/parseVatSlots.js'; -/* eslint-disable no-use-before-define */ export function auditRefCounts(store, doDump, printPrefix) { const refCounts = new Map(); const refSites = new Map(); diff --git a/packages/swingset-runner/src/dumpstore.js b/packages/swingset-runner/src/dumpstore.js index 74833e48ad7..de70784e199 100644 --- a/packages/swingset-runner/src/dumpstore.js +++ b/packages/swingset-runner/src/dumpstore.js @@ -1,7 +1,6 @@ import fs from 'fs'; import process from 'process'; -/* eslint-disable no-use-before-define */ export function dumpStore(kernelStorage, outfile, rawMode, truncate = true) { const transcriptStore = kernelStorage.transcriptStore; let out; diff --git a/packages/swingset-runner/src/main.js b/packages/swingset-runner/src/main.js index 6003a30227d..4da28ae2681 100644 --- a/packages/swingset-runner/src/main.js +++ b/packages/swingset-runner/src/main.js @@ -220,8 +220,6 @@ function generateIndirectConfig(baseConfig) { return config; } -/* eslint-disable no-use-before-define */ - /** * Command line utility to run a swingset for development and testing purposes. */ diff --git a/packages/swingset-runner/src/slogulator.js b/packages/swingset-runner/src/slogulator.js index 9d8bb9c504a..86cae98534c 100644 --- a/packages/swingset-runner/src/slogulator.js +++ b/packages/swingset-runner/src/slogulator.js @@ -5,8 +5,6 @@ import yargs from 'yargs'; import { Fail } from '@endo/errors'; -/* eslint-disable no-use-before-define */ - function usage() { console.error('usage message goes here'); } diff --git a/packages/swingset-xsnap-supervisor/lib/supervisor-subprocess-xsnap.js b/packages/swingset-xsnap-supervisor/lib/supervisor-subprocess-xsnap.js index d7eb1325744..d150d8da078 100644 --- a/packages/swingset-xsnap-supervisor/lib/supervisor-subprocess-xsnap.js +++ b/packages/swingset-xsnap-supervisor/lib/supervisor-subprocess-xsnap.js @@ -100,11 +100,11 @@ const meterControl = makeMeterControl(); /** * Wrap byte-level protocols with tagged array codec. * - * @param {(cmd: ArrayBuffer) => ArrayBuffer} issueCommand as from xsnap + * @param {(cmd: ArrayBufferLike) => ArrayBuffer} issueCommand as from xsnap * @typedef { [unknown, ...unknown[]] } Tagged tagged array */ function managerPort(issueCommand) { - /** @type { (item: Tagged) => ArrayBuffer } */ + /** @type { (item: Tagged) => ArrayBufferLike } */ const encode = item => { let txt; try { diff --git a/packages/swingset-xsnap-supervisor/package.json b/packages/swingset-xsnap-supervisor/package.json index 721f83687ad..b700d631c5d 100644 --- a/packages/swingset-xsnap-supervisor/package.json +++ b/packages/swingset-xsnap-supervisor/package.json @@ -19,18 +19,18 @@ "lint:types": "tsc", "lint-fix": "eslint --fix 'lib/**/*.js' 'src/**/*.js' 'scripts/**/*.js' 'test/**/*.js'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0" }, "devDependencies": { + "@endo/errors": "^1.2.8", "@agoric/swingset-liveslots": "^0.10.3-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/errors": "^1.2.7", - "@endo/import-bundle": "^1.3.1", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", + "@endo/bundle-source": "^3.5.0", + "@endo/import-bundle": "^1.3.2", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "LICENSE*", diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 9f6043d6fbd..834b9cfb25c 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -22,16 +22,16 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/store": "^0.9.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/init": "^1.1.6", - "@endo/marshal": "^1.6.1", - "@endo/stream": "^1.2.7", + "@endo/init": "^1.1.7", + "@endo/marshal": "^1.6.2", + "@endo/stream": "^1.2.8", "@opentelemetry/api": "~1.3.0", "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/exporter-logs-otlp-http": "0.53.0", "@opentelemetry/exporter-prometheus": "~0.35.0", + "@opentelemetry/exporter-logs-otlp-http": "0.53.0", "@opentelemetry/exporter-trace-otlp-http": "~0.35.0", "@opentelemetry/resources": "~1.9.0", "@opentelemetry/sdk-logs": "0.53.0", @@ -43,10 +43,10 @@ "tmp": "^0.2.1" }, "devDependencies": { - "@endo/lockdown": "^1.0.12", - "@endo/ses-ava": "^1.2.7", + "@endo/lockdown": "^1.0.13", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "tmp": "^0.2.1" }, "publishConfig": { @@ -66,6 +66,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 87.03 + "atLeast": 88.88 } } diff --git a/packages/time/package.json b/packages/time/package.json index d9dcd338167..966146403ad 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -32,13 +32,13 @@ "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { "@agoric/store": "^0.9.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/nat": "^5.0.12", - "@endo/patterns": "^1.4.6" + "@endo/errors": "^1.2.8", + "@endo/nat": "^5.0.13", + "@endo/patterns": "^1.4.7" }, "devDependencies": { - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", "ava": "^5.3.0" }, "ava": { @@ -58,6 +58,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 88.72 + "atLeast": 88.75 } } diff --git a/packages/time/src/typeGuards.js b/packages/time/src/typeGuards.js index 65a4f5d800c..9498f162568 100644 --- a/packages/time/src/typeGuards.js +++ b/packages/time/src/typeGuards.js @@ -6,25 +6,30 @@ import { M } from '@endo/patterns'; */ export const TimerBrandShape = M.remotable('TimerBrand'); + /** @type {TypedPattern} */ export const TimestampValueShape = M.nat(); + /** @type {TypedPattern} */ export const RelativeTimeValueShape = M.nat(); // Should we allow negatives? /** @type {TypedPattern} */ -export const TimestampRecordShape = harden({ +export const TimestampRecordShape = { timerBrand: TimerBrandShape, absValue: TimestampValueShape, -}); +}; +harden(TimestampRecordShape); /** @type {TypedPattern} */ -export const RelativeTimeRecordShape = harden({ +export const RelativeTimeRecordShape = { timerBrand: TimerBrandShape, relValue: RelativeTimeValueShape, -}); +}; +harden(RelativeTimeRecordShape); /** @type {TypedPattern} */ export const TimestampShape = M.or(TimestampRecordShape, TimestampValueShape); + /** @type {TypedPattern} */ export const RelativeTimeShape = M.or( RelativeTimeRecordShape, diff --git a/packages/time/src/types.ts b/packages/time/src/types.ts index dd3ca10ae68..06eaf1c3dca 100644 --- a/packages/time/src/types.ts +++ b/packages/time/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { ERef, RemotableBrand } from '@endo/eventual-send'; import type { RankComparison, RemotableObject } from '@endo/marshal'; @@ -106,7 +105,7 @@ export type CancelToken = object; * schedule a single wake() call, create a repeater that will allow scheduling * of events at regular intervals, or remove scheduled calls. */ -export interface TimerServiceI { +export interface TimerServiceCommon { /** * Retrieve the latest timestamp */ @@ -181,9 +180,9 @@ export interface TimerServiceI { getTimerBrand: () => TimerBrand; } // XXX copied from Remotable helper return type -export type TimerService = TimerServiceI & +export type TimerService = TimerServiceCommon & RemotableObject<'TimerService'> & - RemotableBrand<{}, TimerServiceI>; + RemotableBrand<{}, TimerServiceCommon>; /** * Read-only access to a TimeService's current time. This allows reading the diff --git a/packages/vat-data/package.json b/packages/vat-data/package.json index 98a1cdc4314..3ef74c4b6b3 100644 --- a/packages/vat-data/package.json +++ b/packages/vat-data/package.json @@ -18,17 +18,17 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/base-zone": "^0.1.1-u18.0", "@agoric/store": "^0.9.3-u18.0", "@agoric/swingset-liveslots": "^0.10.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/exo": "^1.5.6", - "@endo/patterns": "^1.4.6" + "@endo/exo": "^1.5.7", + "@endo/patterns": "^1.4.7" }, "devDependencies": { - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", - "@endo/ses-ava": "^1.2.7", + "@endo/init": "^1.1.7", + "@endo/far": "^1.1.9", + "@endo/ses-ava": "^1.2.8", "ava": "^5.3.0", "tsd": "^0.31.1" }, diff --git a/packages/vat-data/src/exo-utils.js b/packages/vat-data/src/exo-utils.js index c898bae3cce..867a63196e8 100644 --- a/packages/vat-data/src/exo-utils.js +++ b/packages/vat-data/src/exo-utils.js @@ -289,7 +289,10 @@ export const makeExoUtils = VatData => { * @param {Baggage} baggage * @param {string} kindName * @param {InterfaceGuard | undefined} interfaceGuard - * @param {M} methods + * @param {M & + * ThisType<{ + * self: RemotableObject & M; + * }>} methods * @param {DefineKindOptions<{ self: M }>} [options] * @returns {import('@endo/exo').Guarded} */ diff --git a/packages/vat-data/src/index.test-d.ts b/packages/vat-data/src/index.test-d.ts index 8300a1b5c50..9aff6547b06 100644 --- a/packages/vat-data/src/index.test-d.ts +++ b/packages/vat-data/src/index.test-d.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import { expectType } from 'tsd'; import type { KindFacets, diff --git a/packages/vats/package.json b/packages/vats/package.json index 3a5b52ff648..72755e3c53f 100644 --- a/packages/vats/package.json +++ b/packages/vats/package.json @@ -11,7 +11,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -22,6 +22,7 @@ "author": "Agoric", "license": "Apache-2.0", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/cosmic-proto": "^0.5.0-u18.4", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/governance": "^0.10.4-u18.0", @@ -35,23 +36,22 @@ "@agoric/vow": "^0.2.0-u18.0", "@agoric/zoe": "^0.26.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/import-bundle": "^1.3.1", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", + "@endo/far": "^1.1.9", + "@endo/import-bundle": "^1.3.2", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", "import-meta-resolve": "^2.2.1", "jessie.js": "^0.3.4" }, "devDependencies": { "@agoric/swingset-liveslots": "^0.10.3-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/init": "^1.1.7", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "CHANGELOG.md", @@ -77,6 +77,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 91.5 + "atLeast": 91.21 } } diff --git a/packages/vats/src/core/basic-behaviors.js b/packages/vats/src/core/basic-behaviors.js index 4bbbdf69ad9..5783e87d0fc 100644 --- a/packages/vats/src/core/basic-behaviors.js +++ b/packages/vats/src/core/basic-behaviors.js @@ -21,29 +21,6 @@ import { makeScopedBridge } from '../bridge.js'; /** @import {GovernableStartFn, GovernanceFacetKit} from '@agoric/governance/src/types.js'; */ -/** - * In golang/cosmos/app/app.go, we define cosmosInitAction with type - * AG_COSMOS_INIT, with the following shape. - * - * The uist supplyCoins value is taken from genesis, thereby authorizing the - * minting an initial supply of RUN. - */ -// eslint-disable-next-line no-unused-vars -const bootMsgEx = { - type: 'AG_COSMOS_INIT', - chainID: 'agoric', - storagePort: 1, - supplyCoins: [ - { denom: 'provisionpass', amount: '100' }, - { denom: 'sendpacketpass', amount: '100' }, - { denom: 'ubld', amount: '1000000000000000' }, - { denom: 'uist', amount: '50000000000' }, - ], - swingsetPort: 4, - vbankPort: 3, - vibcPort: 2, -}; - /** * TODO: review behaviors carefully for powers that go out of scope, since we * may want/need them later. @@ -560,7 +537,11 @@ export const installBootContracts = async ({ * Mint IST genesis supply. * * @param {BootstrapPowers & { - * vatParameters: { argv: { bootMsg?: typeof bootMsgEx } }; + * vatParameters: { + * argv: { + * bootMsg?: import('@agoric/internal/src/chain-utils.js').InitMsg; + * }; + * }; * }} powers */ export const mintInitialSupply = async ({ diff --git a/packages/vats/src/core/lib-boot.js b/packages/vats/src/core/lib-boot.js index 486a7f12603..beeb09dc833 100644 --- a/packages/vats/src/core/lib-boot.js +++ b/packages/vats/src/core/lib-boot.js @@ -47,7 +47,7 @@ const setDiff = (a, b) => a.filter(x => !b.includes(x)); /** * @param {import('@agoric/swingset-vat').VatPowers & { * D: DProxy; - * logger: (msg) => void; + * logger?: typeof console.log; * }} vatPowers * @param {Record} vatParameters * @param {BootstrapManifest} bootManifest @@ -106,7 +106,6 @@ export const makeBootstrap = ( const runBehaviors = manifest => { return runModuleBehaviors({ - // eslint-disable-next-line no-use-before-define allPowers, behaviors, manifest, diff --git a/packages/vats/src/proposals/testUpgradedBoard.js b/packages/vats/src/proposals/testUpgradedBoard.js new file mode 100644 index 00000000000..78b21079d0a --- /dev/null +++ b/packages/vats/src/proposals/testUpgradedBoard.js @@ -0,0 +1,35 @@ +import { E, Far } from '@endo/far'; +import { Stable } from '@agoric/internal/src/tokens.js'; + +export const testUpgradedBoard = async ({ + consume: { board }, + brand: { + consume: { [Stable.symbol]: stableBrandP }, + }, +}) => { + // /////// can we store something and get it back? //////// + const thing1 = Far('thing1', {}); + const thing1Id = await E(board).getId(thing1); + assert(thing1Id.match(/^board0[0-9]+$/)); + + const marshaller = await E(board).getReadonlyMarshaller(); + assert(marshaller, 'expected a marshaller'); + + const stableBrand = await stableBrandP; + // /////// can we retrieve a well-known object via its ID? //////// + const stableID = await E(board).getId(stableBrand); + // /////// can we retrieve something stored long ago? //////// + const stableBrandRetrieved = await E(board).getValue(stableID); + assert(stableBrandRetrieved === stableBrand, 'retrieved matching brand'); +}; + +export const getManifestForTestUpgradedBoard = () => ({ + manifest: { + [testUpgradedBoard.name]: { + consume: { board: true }, + brand: { + consume: { [Stable.symbol]: true }, + }, + }, + }, +}); diff --git a/packages/vats/src/proposals/upgrade-agoricNames-proposal.js b/packages/vats/src/proposals/upgrade-agoricNames-proposal.js new file mode 100644 index 00000000000..98497af8cf7 --- /dev/null +++ b/packages/vats/src/proposals/upgrade-agoricNames-proposal.js @@ -0,0 +1,47 @@ +import { E } from '@endo/far'; + +/** + * @param {BootstrapPowers & { + * consume: { + * vatAdminSvc: VatAdminSvc; + * vatStore: MapStore< + * string, + * import('@agoric/swingset-vat').CreateVatResults + * >; + * }; + * }} powers + * @param {object} options + * @param {{ agoricNamesRef: VatSourceRef }} options.options + */ +export const upgradeAgoricNames = async ( + { consume: { vatAdminSvc, vatStore } }, + options, +) => { + const { agoricNamesRef } = options.options; + + assert(agoricNamesRef.bundleID); + const agoricNamesBundleCap = await E(vatAdminSvc).getBundleCap( + agoricNamesRef.bundleID, + ); + console.log(`BANK BUNDLE ID: `, agoricNamesRef.bundleID); + + const { adminNode } = await E(vatStore).get('agoricNames'); + + await E(adminNode).upgrade(agoricNamesBundleCap, {}); +}; + +export const getManifestForUpgradingAgoricNames = ( + _powers, + { agoricNamesRef }, +) => ({ + manifest: { + [upgradeAgoricNames.name]: { + consume: { + vatAdminSvc: 'vatAdminSvc', + vatStore: 'vatStore', + }, + produce: {}, + }, + }, + options: { agoricNamesRef }, +}); diff --git a/packages/vats/src/proposals/upgrade-asset-reserve-proposal.js b/packages/vats/src/proposals/upgrade-asset-reserve-proposal.js new file mode 100644 index 00000000000..89fbf0042c3 --- /dev/null +++ b/packages/vats/src/proposals/upgrade-asset-reserve-proposal.js @@ -0,0 +1,93 @@ +import { E } from '@endo/far'; +import { deeplyFulfilled } from '@endo/marshal'; +import { makeTracer } from '@agoric/internal'; + +const tracer = makeTracer('UpgradeAssetReserve'); + +/** + * @param {BootstrapPowers & { + * consume: { + * economicCommitteeCreatorFacet: any; + * reserveKit: any; + * }; + * produce: { + * reserveKit: any; + * }; + * }} powers + * @param {object} options + * @param {{ assetReserveRef: VatSourceRef }} options.options + */ +export const upgradeAssetReserve = async ( + { + consume: { + economicCommitteeCreatorFacet: electorateCreatorFacet, + reserveKit: reserveKitP, + instancePrivateArgs: instancePrivateArgsP, + }, + produce: { reserveKit: reserveKitWriter }, + }, + options, +) => { + const { assetReserveRef } = options.options; + + assert(assetReserveRef.bundleID); + tracer(`ASSET RESERVE BUNDLE ID: `, assetReserveRef); + + const [reserveKit, instancePrivateArgs] = await Promise.all([ + reserveKitP, + instancePrivateArgsP, + ]); + const { governorCreatorFacet, instance } = reserveKit; + + const [originalPrivateArgs, poserInvitation] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore Local tsc sees this as an error but typedoc does not + deeplyFulfilled(instancePrivateArgs.get(instance)), + E(electorateCreatorFacet).getPoserInvitation(), + ]); + + const newPrivateArgs = harden({ + ...originalPrivateArgs, + initialPoserInvitation: poserInvitation, + }); + + const adminFacet = await E(governorCreatorFacet).getAdminFacet(); + + // We need to reset the kit and produce a new adminFacet because the + // original contract is producing an admin facet that is for the + // governor, not the reserve. + reserveKitWriter.reset(); + reserveKitWriter.resolve( + harden({ + ...reserveKit, + adminFacet, + }), + ); + + const upgradeResult = await E(adminFacet).upgradeContract( + assetReserveRef.bundleID, + newPrivateArgs, + ); + + tracer('AssetReserve upgraded: ', upgradeResult); + tracer('Done.'); +}; + +export const getManifestForUpgradingAssetReserve = ( + _powers, + { assetReserveRef }, +) => ({ + manifest: { + [upgradeAssetReserve.name]: { + consume: { + economicCommitteeCreatorFacet: true, + instancePrivateArgs: true, + reserveKit: true, + }, + produce: { + reserveKit: true, + }, + }, + }, + options: { assetReserveRef }, +}); diff --git a/packages/vats/src/proposals/upgrade-board-proposal.js b/packages/vats/src/proposals/upgrade-board-proposal.js new file mode 100644 index 00000000000..e98398fb9b3 --- /dev/null +++ b/packages/vats/src/proposals/upgrade-board-proposal.js @@ -0,0 +1,50 @@ +import { E } from '@endo/far'; + +/** + * @param {BootstrapPowers & { + * consume: { + * vatAdminSvc: VatAdminSvc; + * vatStore: MapStore< + * string, + * import('@agoric/swingset-vat').CreateVatResults + * >; + * }; + * }} powers + * @param {object} options + * @param {{ boardRef: VatSourceRef }} options.options + */ +export const upgradeBoard = async ( + { consume: { board, vatAdminSvc, vatStore } }, + options, +) => { + const { boardRef } = options.options; + + assert(boardRef.bundleID); + const boardBundleCap = await E(vatAdminSvc).getBundleCap(boardRef.bundleID); + console.log(`Board BUNDLE ID: `, boardRef.bundleID); + const idsBefore = await E(board).ids(); + + const { adminNode } = await E(vatStore).get('board'); + await E(adminNode).upgrade(boardBundleCap, {}); + + const idsAfter = await E(board).ids(); + const same = + idsBefore.length === idsAfter.length && + idsBefore.every((element, index) => element === idsAfter[index]); + assert(same, 'keys must stay the same'); + + console.log('Board upgrade complete'); +}; + +export const getManifestForUpgradingBoard = (_powers, { boardRef }) => ({ + manifest: { + [upgradeBoard.name]: { + consume: { + board: 'board', + vatAdminSvc: 'vatAdminSvc', + vatStore: 'vatStore', + }, + }, + }, + options: { boardRef }, +}); diff --git a/packages/vats/src/proposals/upgrade-mintHolder-proposal.js b/packages/vats/src/proposals/upgrade-mintHolder-proposal.js new file mode 100644 index 00000000000..4b231abdc16 --- /dev/null +++ b/packages/vats/src/proposals/upgrade-mintHolder-proposal.js @@ -0,0 +1,74 @@ +import { makeTracer } from '@agoric/internal'; +import { E } from '@endo/far'; + +const trace = makeTracer('upgrade mintHolder', true); + +export const upgradeMintHolder = async ( + { + consume: { + contractKits: contractKitsP, + instancePrivateArgs: instancePrivateArgsP, + }, + }, + options, +) => { + const { contractRef, labelList } = options.options; + assert(contractRef.bundleID, 'mintHolder bundleID not found'); + assert(labelList, 'mintHolder bank asset label list not found'); + + trace(`Start mintHolder contract upgrade`); + trace(`Assets: `, labelList); + + const [contractKits, instancePrivateArgs] = await Promise.all([ + contractKitsP, + instancePrivateArgsP, + ]); + + for (const assetLabel of labelList) { + const mintHolderKit = Array.from(contractKits.values()).find( + kit => kit.label && kit.label === assetLabel, + ); + if (!mintHolderKit) { + console.error( + `ERROR: failed to upgrade ${assetLabel} mintHolder, contractKit not found`, + ); + continue; + } + + trace(`${assetLabel} mintHolderKit: `, mintHolderKit); + + const { publicFacet, adminFacet, instance } = mintHolderKit; + + /* + * Ensure that publicFacet holds an issuer by verifying that has + * the makeEmptyPurse method. + */ + await E(publicFacet).makeEmptyPurse(); + + const privateArgs = instancePrivateArgs.get(instance); + + const upgradeResult = await E(adminFacet).upgradeContract( + contractRef.bundleID, + privateArgs, + ); + + trace(`${assetLabel} upgrade result: `, upgradeResult); + } + + trace(`Finished mintHolder contract upgrade`); +}; + +export const getManifestForUpgradingMintHolder = ( + _powers, + { contractRef, labelList }, +) => ({ + manifest: { + [upgradeMintHolder.name]: { + consume: { + contractKits: true, + instancePrivateArgs: true, + }, + }, + }, + options: { contractRef, labelList }, +}); diff --git a/packages/vats/src/proposals/upgrade-paRegistry-proposal.js b/packages/vats/src/proposals/upgrade-paRegistry-proposal.js new file mode 100644 index 00000000000..81387d7193b --- /dev/null +++ b/packages/vats/src/proposals/upgrade-paRegistry-proposal.js @@ -0,0 +1,57 @@ +// @ts-check +import { E } from '@endo/far'; +import { AmountMath } from '@agoric/ertp'; +import { Stable } from '@agoric/internal/src/tokens.js'; + +/** + * @param {BootstrapPowers} powers + * @param {object} options + * @param {{ registryRef: VatSourceRef }} options.options + */ +export const upgradePriceAuthorityRegistry = async ( + { + consume: { vatAdminSvc, vatStore, priceAuthority, agoricNames }, + brand: { + consume: { [Stable.symbol]: stableBrandP }, + }, + }, + options, +) => { + const { registryRef } = options.options; + + assert(registryRef.bundleID); + console.log(`PriceAuthorityRegistry BUNDLE ID: `, registryRef.bundleID); + + const [{ adminNode }, stableBrand, atomBrand, bundleCap] = await Promise.all([ + E(vatStore).get('priceAuthority'), + stableBrandP, + E(agoricNames).lookup('brand', 'ATOM'), + E(vatAdminSvc).getBundleCap(registryRef.bundleID), + ]); + + await E(adminNode).upgrade(bundleCap, {}); + + const oneATOM = AmountMath.make(atomBrand, 1_000_000n); + const quoteAtom = await E(priceAuthority).quoteGiven(oneATOM, stableBrand); + console.log('paRegistry quote', quoteAtom); + + assert(quoteAtom.quoteAmount.value, 'insist on getting a quote'); +}; + +const par = 'paRegistry'; +export const getManifestForUpgradingRegistry = (_powers, { registryRef }) => ({ + manifest: { + [upgradePriceAuthorityRegistry.name]: { + consume: { + agoricNames: par, + vatAdminSvc: par, + vatStore: par, + priceAuthority: par, + }, + brand: { consume: { [Stable.symbol]: par } }, + }, + }, + options: { + registryRef, + }, +}); diff --git a/packages/vats/src/proposals/upgrade-provisionPool-proposal.js b/packages/vats/src/proposals/upgrade-provisionPool-proposal.js index 9d31c752607..c2d8e7c02b9 100644 --- a/packages/vats/src/proposals/upgrade-provisionPool-proposal.js +++ b/packages/vats/src/proposals/upgrade-provisionPool-proposal.js @@ -1,5 +1,8 @@ import { E } from '@endo/far'; import { deeplyFulfilled } from '@endo/marshal'; +import { makeTracer } from '@agoric/internal'; + +const trace = makeTracer('UpgradeProvisionPool'); /** * @param {BootstrapPowers & { @@ -16,6 +19,10 @@ export const upgradeProvisionPool = async ( economicCommitteeCreatorFacet: electorateCreatorFacet, instancePrivateArgs: instancePrivateArgsP, provisionPoolStartResult: provisionPoolStartResultP, + bankManager, + namesByAddressAdmin: namesByAddressAdminP, + walletFactoryStartResult: walletFactoryStartResultP, + provisionWalletBridgeManager: provisionWalletBridgeManagerP, }, }, options, @@ -23,13 +30,28 @@ export const upgradeProvisionPool = async ( const { provisionPoolRef } = options.options; assert(provisionPoolRef.bundleID); - console.log(`PROVISION POOL BUNDLE ID: `, provisionPoolRef.bundleID); + trace(`PROVISION POOL BUNDLE ID: `, provisionPoolRef); - const [provisionPoolStartResult, instancePrivateArgs] = await Promise.all([ + const [ + provisionPoolStartResult, + instancePrivateArgs, + namesByAddressAdmin, + walletFactoryStartResult, + provisionWalletBridgeManager, + ] = await Promise.all([ provisionPoolStartResultP, instancePrivateArgsP, + namesByAddressAdminP, + walletFactoryStartResultP, + provisionWalletBridgeManagerP, ]); - const { adminFacet, instance } = provisionPoolStartResult; + const { + adminFacet, + instance, + creatorFacet: ppCreatorFacet, + publicFacet: ppPublicFacet, + } = provisionPoolStartResult; + const { creatorFacet: wfCreatorFacet } = walletFactoryStartResult; const [originalPrivateArgs, poserInvitation] = await Promise.all([ // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -38,9 +60,16 @@ export const upgradeProvisionPool = async ( E(electorateCreatorFacet).getPoserInvitation(), ]); + const params = await E(ppPublicFacet).getGovernedParams(); + const governedParamOverrides = harden({ + PerAccountInitialAmount: params.PerAccountInitialAmount.value, + }); + trace('governedParamOverrides: ', { governedParamOverrides }); + const newPrivateArgs = harden({ ...originalPrivateArgs, initialPoserInvitation: poserInvitation, + governedParamOverrides, }); const upgradeResult = await E(adminFacet).upgradeContract( @@ -48,7 +77,25 @@ export const upgradeProvisionPool = async ( newPrivateArgs, ); - console.log('ProvisionPool upgraded: ', upgradeResult); + trace('ProvisionPool upgraded: ', upgradeResult); + + const references = { + bankManager, + namesByAddressAdmin, + walletFactory: wfCreatorFacet, + }; + + trace('Calling setReferences with: ', references); + await E(ppCreatorFacet).setReferences(references); + + trace('Creating bridgeHandler...'); + const bridgeHandler = await E(ppCreatorFacet).makeHandler(); + + trace('Setting new bridgeHandler...'); + // @ts-expect-error casting + await E(provisionWalletBridgeManager).setHandler(bridgeHandler); + + trace('Done.'); }; export const getManifestForUpgradingProvisionPool = ( @@ -61,6 +108,10 @@ export const getManifestForUpgradingProvisionPool = ( economicCommitteeCreatorFacet: true, instancePrivateArgs: true, provisionPoolStartResult: true, + bankManager: true, + namesByAddressAdmin: true, + walletFactoryStartResult: true, + provisionWalletBridgeManager: true, }, produce: {}, }, diff --git a/packages/vats/src/proposals/upgrade-orch-core-proposal.js b/packages/vats/src/proposals/upgrade-vats-generic-proposal.js similarity index 59% rename from packages/vats/src/proposals/upgrade-orch-core-proposal.js rename to packages/vats/src/proposals/upgrade-vats-generic-proposal.js index 3d57869e9bd..b2023758e29 100644 --- a/packages/vats/src/proposals/upgrade-orch-core-proposal.js +++ b/packages/vats/src/proposals/upgrade-vats-generic-proposal.js @@ -11,13 +11,18 @@ import { E } from '@endo/far'; * }; * }} powers * @param {object} options - * @param {{ bundleRefs: { [vatName: string]: VatSourceRef } }} options.options + * @param {{ + * bundleRefs: { [vatName: string]: VatSourceRef }; + * vatOptions?: { + * [vatName: string]: import('@agoric/swingset-vat').VatUpgradeOptions; + * }; + * }} options.options */ -export const upgradeOrchCore = async ( +export const upgradeVatsGeneric = async ( { consume: { vatAdminSvc, vatStore } }, options, ) => { - const { bundleRefs } = options.options; + const { bundleRefs, vatOptions = {} } = options.options; for await (const [name, ref] of Object.entries(bundleRefs)) { assert(ref.bundleID, `bundleID missing for ${name}`); @@ -25,13 +30,16 @@ export const upgradeOrchCore = async ( const bundleCap = await E(vatAdminSvc).getBundleCap(ref.bundleID); const { adminNode } = await E(vatStore).get(name); - await E(adminNode).upgrade(bundleCap, {}); + await E(adminNode).upgrade(bundleCap, vatOptions[name] || {}); } }; -export const getManifestForUpgradingOrchCore = (_powers, { bundleRefs }) => ({ +export const getManifestForUpgradingVats = ( + _powers, + { bundleRefs, vatOptions }, +) => ({ manifest: { - [upgradeOrchCore.name]: { + [upgradeVatsGeneric.name]: { consume: { vatAdminSvc: 'vatAdminSvc', vatStore: 'vatStore', @@ -39,5 +47,5 @@ export const getManifestForUpgradingOrchCore = (_powers, { bundleRefs }) => ({ produce: {}, }, }, - options: { bundleRefs }, + options: { bundleRefs, vatOptions }, }); diff --git a/packages/vats/src/proposals/upgrade-vaultFactory-proposal.js b/packages/vats/src/proposals/upgrade-vaultFactory-proposal.js new file mode 100644 index 00000000000..242bdd6ae93 --- /dev/null +++ b/packages/vats/src/proposals/upgrade-vaultFactory-proposal.js @@ -0,0 +1,124 @@ +/** + * @file this core-eval proposal is a generic and reusable script for executing + * a Vault Factory upgrade. In contrast, upgrade-vaults.js is a specific + * implementation tailored to the upgrade-18. + */ + +import { E } from '@endo/far'; +import { makeTracer } from '@agoric/internal/src/index.js'; +import { makeNotifierFromAsyncIterable } from '@agoric/notifier'; + +const trace = makeTracer('upgrade Vaults proposal'); + +export const upgradeVaultFactory = async (powers, options) => { + trace('Initiate VaultFactory contract upgrade'); + + const { + consume: { + zoe, + vaultFactoryKit, + reserveKit, + auctioneerKit, + economicCommitteeCreatorFacet, + }, + } = powers; + + const { + options: { contractRef }, + } = options; + + const { adminFacet, privateArgs, publicFacet, instance } = + await vaultFactoryKit; + + const allBrands = await E(zoe).getBrands(instance); + const { Minted: _istBrand, ...vaultBrands } = allBrands; + + const initialPoserInvitation = await E( + economicCommitteeCreatorFacet, + ).getPoserInvitation(); + + const initialShortfallInvitation = await E( + E.get(reserveKit).creatorFacet, + ).makeShortfallReportingInvitation(); + + const auctioneerInstance = await E.get(auctioneerKit).instance; + + const readCurrentDirectorParams = async () => { + await null; + + const subscription = E(publicFacet).getElectorateSubscription(); + const notifier = makeNotifierFromAsyncIterable(subscription); + const { updateCount } = await notifier.getUpdateSince(); + + // subscribeAfter() retrieves the latest value. + const after = await E(subscription).subscribeAfter(updateCount); + const { current } = after.head.value; + return harden({ + MinInitialDebt: current.MinInitialDebt.value, + ReferencedUI: current.ReferencedUI.value, + RecordingPeriod: current.RecordingPeriod.value, + ChargingPeriod: current.ChargingPeriod.value, + }); + }; + + const directorParamOverrides = await readCurrentDirectorParams(); + trace({ directorParamOverrides }); + + const readManagerParams = async () => { + await null; + + const params = {}; + for (const kwd of Object.keys(vaultBrands)) { + const collateralBrand = vaultBrands[kwd]; + + /** @type {any} */ + const governedParams = await E(publicFacet).getGovernedParams({ + collateralBrand, + }); + params[kwd] = harden({ + brand: collateralBrand, + debtLimit: governedParams.DebtLimit.value, + interestRate: governedParams.InterestRate.value, + liquidationMargin: governedParams.LiquidationMargin.value, + liquidationPadding: governedParams.LiquidationPadding.value, + liquidationPenalty: governedParams.LiquidationPenalty.value, + mintFee: governedParams.MintFee.value, + }); + trace(kwd, params[kwd]); + } + return params; + }; + const managerParams = await readManagerParams(); + + const newPrivateArgs = harden({ + ...privateArgs, + auctioneerInstance, + initialPoserInvitation, + initialShortfallInvitation, + managerParams, + directorParamOverrides, + }); + + await E(adminFacet).upgradeContract(contractRef.bundleID, newPrivateArgs); + + trace('VaultFactory contract upgraded!'); +}; + +export const getManifestForVaultFactoryUpgrade = ( + { restoreRef }, + { contractRef }, +) => ({ + manifest: { + [upgradeVaultFactory.name]: { + consume: { + zoe: true, + vaultFactoryKit: true, + reserveKit: true, + auctioneerKit: true, + economicCommitteeCreatorFacet: true, + }, + }, + }, + installations: { vaultFactory: restoreRef(contractRef) }, + options: { contractRef }, +}); diff --git a/packages/vats/src/repl.js b/packages/vats/src/repl.js index fb8736482ef..28f7be203bc 100644 --- a/packages/vats/src/repl.js +++ b/packages/vats/src/repl.js @@ -18,7 +18,6 @@ const UNJSONABLES = new Map([ // A REPL-specific data dump-to-string. This specifically is *not* JSON, but its // output is unambiguous (even though it cannot be round-tripped). export const dump = (value, spaces = 0) => - // eslint-disable-next-line no-use-before-define dump0(value, spaces, new WeakSet(), 0); function dump0(value, spaces, inProgress, depth) { diff --git a/packages/vats/src/types.ts b/packages/vats/src/types.ts index c6001f8f041..34a25fcf68f 100644 --- a/packages/vats/src/types.ts +++ b/packages/vats/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { FungibleTokenPacketData } from '@agoric/cosmic-proto/ibc/applications/transfer/v2/packet.js'; import type { BridgeId, Remote } from '@agoric/internal'; import type { Bytes } from '@agoric/network'; diff --git a/packages/vats/src/virtual-purse.js b/packages/vats/src/virtual-purse.js index 155f29e31a9..8b8ac1ff915 100644 --- a/packages/vats/src/virtual-purse.js +++ b/packages/vats/src/virtual-purse.js @@ -1,7 +1,7 @@ import { Fail } from '@endo/errors'; import { E } from '@endo/far'; import { isPromise } from '@endo/promise-kit'; -import { getInterfaceGuardPayload, matches } from '@endo/patterns'; +import { getInterfaceGuardPayload } from '@endo/patterns'; import { M } from '@agoric/store'; import { @@ -105,22 +105,6 @@ export const makeVirtualPurseKitIKit = ( * current balance iterable for a given brand. */ -/** - * Until https://github.com/Agoric/agoric-sdk/issues/9407 is fixed, this - * function restricts the `optAmountShape`, if provided, to be a concrete - * `Amount` rather than a `Pattern` as it is supposed to be. - * - * TODO: Once https://github.com/Agoric/agoric-sdk/issues/9407 is fixed, remove - * this function and all calls to it. - * - * @param {Pattern} [optAmountShape] - */ -const legacyRestrictAmountShapeArg = optAmountShape => { - if (optAmountShape && !matches(optAmountShape, AmountShape)) { - throw Fail`optAmountShape if provided, must still be a concrete Amount due to https://github.com/Agoric/agoric-sdk/issues/9407`; - } -}; - /** @param {import('@agoric/zone').Zone} zone */ const prepareVirtualPurseKit = zone => zone.exoClassKit( @@ -158,7 +142,6 @@ const prepareVirtualPurseKit = zone => * @returns {Promise>} */ async recoverableClaim(payment, optAmountShape) { - legacyRestrictAmountShapeArg(optAmountShape); const { state: { recoveryPurse }, } = this; @@ -186,7 +169,6 @@ const prepareVirtualPurseKit = zone => minter: { /** @type {Retain} */ async retain(payment, optAmountShape) { - legacyRestrictAmountShapeArg(optAmountShape); !!this.state.mint || Fail`minter cannot retain without a mint.`; return E(this.state.issuer).burn(payment, optAmountShape); }, diff --git a/packages/vats/test/vat-bank-integration.test.js b/packages/vats/test/vat-bank-integration.test.js index 33cfe964744..e06fb358a21 100644 --- a/packages/vats/test/vat-bank-integration.test.js +++ b/packages/vats/test/vat-bank-integration.test.js @@ -3,6 +3,7 @@ import { test } from '@agoric/swingset-vat/tools/prepare-test-env-ava.js'; import { makeScalarMapStore } from '@agoric/vat-data'; import { E } from '@endo/far'; +import { AG_COSMOS_INIT } from '@agoric/internal/src/action-types.js'; import { makePromiseKit } from '@endo/promise-kit'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; import { observeIteration } from '@agoric/notifier'; @@ -45,14 +46,12 @@ test('mintInitialSupply, addBankAssets bootstrap actions', async t => { }); // Genesis RUN supply: 50 + /** @type {import('@agoric/internal/src/chain-utils.js').InitMsg} */ + // @ts-expect-error missing properties const bootMsg = { - type: 'INIT@@', + type: AG_COSMOS_INIT, chainID: 'ag', - storagePort: 1, supplyCoins: [{ amount: '50000000', denom: 'uist' }], - swingsetPort: 4, - vbankPort: 2, - vibcPort: 3, }; // Now run the function under test. diff --git a/packages/vats/test/vpurse.test.js b/packages/vats/test/vpurse.test.js index ca0da5744ea..4e7572660d8 100644 --- a/packages/vats/test/vpurse.test.js +++ b/packages/vats/test/vpurse.test.js @@ -169,86 +169,6 @@ test('makeVirtualPurse', async t => { ); }; - expected.pushAmount(fungible837); - await E(vpurse) - .deposit(payment, fungible837) - .then(checkDeposit) - .then(performWithdrawal) - .then(checkWithdrawal); -}); - -// TODO Once https://github.com/Agoric/agoric-sdk/issues/9407 is fixed, -// This test should replace the similar one above. -test.failing('makeVirtualPurse with optAmountShape pattern', async t => { - t.plan(22); - const { baggage } = t.context; - const zone = makeDurableZone(baggage).subZone('makeVirtualPurse'); - - const { expected, balanceUpdater, issuer, mint, brand, vpurse } = setup( - t, - zone, - ); - - const payment = mint.mintPayment(AmountMath.make(brand, 837n)); - - const notifier = E(vpurse).getCurrentAmountNotifier(); - let nextUpdateP = E(notifier).getUpdateSince(); - - const checkNotifier = async () => { - const { value: balance, updateCount } = await nextUpdateP; - t.assert( - AmountMath.isEqual(await E(vpurse).getCurrentAmount(), balance), - `the notifier balance is the same as the purse`, - ); - nextUpdateP = E(notifier).getUpdateSince(updateCount); - }; - - balanceUpdater.updateState(AmountMath.makeEmpty(brand)); - await checkNotifier(); - t.assert( - AmountMath.isEqual( - await E(vpurse).getCurrentAmount(), - AmountMath.makeEmpty(brand), - ), - `empty purse is empty`, - ); - t.is(await E(vpurse).getAllegedBrand(), brand, `purse's brand is correct`); - const fungible837 = AmountMath.make(brand, 837n); - - const checkDeposit = async newPurseBalance => { - t.assert( - AmountMath.isEqual(newPurseBalance, fungible837), - `the amount returned is the payment amount`, - ); - await checkNotifier(); - t.assert( - AmountMath.isEqual(await E(vpurse).getCurrentAmount(), fungible837), - `the new purse balance is the payment's old balance`, - ); - }; - - const performWithdrawal = () => { - expected.pullAmount(fungible837); - return E(vpurse).withdraw(fungible837); - }; - - const checkWithdrawal = async newPayment => { - await issuer.getAmountOf(newPayment).then(amount => { - t.assert( - AmountMath.isEqual(amount, fungible837), - `the withdrawn payment has the right balance`, - ); - }); - await checkNotifier(); - t.assert( - AmountMath.isEqual( - await E(vpurse).getCurrentAmount(), - AmountMath.makeEmpty(brand), - ), - `the purse is empty again`, - ); - }; - expected.pushAmount(fungible837); await E(vpurse) .deposit(payment, M.and(fungible837)) diff --git a/packages/vats/tools/bootstrap-chain-reflective.js b/packages/vats/tools/bootstrap-chain-reflective.js new file mode 100644 index 00000000000..74bdc8259b0 --- /dev/null +++ b/packages/vats/tools/bootstrap-chain-reflective.js @@ -0,0 +1,194 @@ +/** + * @file Source code for a bootstrap vat that runs blockchain behaviors (such as + * bridge vat integration) and exposes reflective methods for use in testing. + * + * TODO: Share code with packages/SwingSet/tools/bootstrap-relay.js + */ + +import { Fail, q } from '@endo/errors'; +import { Far, E } from '@endo/far'; +import { makePromiseKit } from '@endo/promise-kit'; +import { buildManualTimer } from '@agoric/swingset-vat/tools/manual-timer.js'; +import { makeReflectionMethods } from '@agoric/swingset-vat/tools/vat-puppet.js'; +import { makeDurableZone } from '@agoric/zone/durable.js'; +import { makeBootstrap } from '../src/core/lib-boot.js'; +import * as basicBehaviorsNamespace from '../src/core/basic-behaviors.js'; +import * as chainBehaviorsNamespace from '../src/core/chain-behaviors.js'; +import * as utils from '../src/core/utils.js'; + +// Gather up all defined bootstrap behaviors. +const { BASIC_BOOTSTRAP_PERMITS: BASIC_BOOTSTRAP, ...basicBehaviors } = + basicBehaviorsNamespace; +const { + CHAIN_BOOTSTRAP_MANIFEST: CHAIN_BOOTSTRAP, + SHARED_CHAIN_BOOTSTRAP_MANIFEST: SHARED_CHAIN_BOOTSTRAP, + ...chainBehaviors +} = chainBehaviorsNamespace; +const manifests = { BASIC_BOOTSTRAP, CHAIN_BOOTSTRAP, SHARED_CHAIN_BOOTSTRAP }; +const allBehaviors = { ...basicBehaviors, ...chainBehaviors }; +export const modules = { + behaviors: { ...allBehaviors }, + utils: { ...utils }, +}; + +// Support constructing a new manifest as a subset from the union of all +// standard manifests. +const allPermits = Object.fromEntries( + Object.values(manifests) + .map(manifest => Object.entries(manifest)) + .flat(), +); +const makeManifestForBehaviors = behaviors => { + const manifest = {}; + for (const behavior of behaviors) { + const { name } = behavior; + Object.hasOwn(allPermits, name) || Fail`missing permit for ${name}`; + manifest[name] = allPermits[name]; + } + return manifest; +}; + +// Define a minimal manifest of entries plucked from the above union. +manifests.MINIMAL = makeManifestForBehaviors([ + allBehaviors.bridgeCoreEval, + allBehaviors.makeBridgeManager, + allBehaviors.makeVatsFromBundles, + allBehaviors.startTimerService, + allBehaviors.setupClientManager, +]); + +/** + * @param {VatPowers & { D: DProxy; testLog: typeof console.log }} vatPowers + * @param {{ + * baseManifest?: string; + * addBehaviors?: string[]; + * coreProposalCodeSteps?: string[]; + * }} bootstrapParameters + * @param {import('@agoric/vat-data').Baggage} baggage + */ +export const buildRootObject = (vatPowers, bootstrapParameters, baggage) => { + const manualTimer = buildManualTimer(); + let vatAdmin; + const { promise: vatAdminP, resolve: captureVatAdmin } = makePromiseKit(); + void vatAdminP.then(value => (vatAdmin = value)); // for better debugging + /** @typedef {{ root: object; incarnationNumber?: number }} VatRecord */ + /** + * @typedef {VatRecord & + * import('@agoric/swingset-vat').CreateVatResults & { + * bundleCap: unknown; + * }} DynamicVatRecord + */ + /** @type {Map} */ + const vatRecords = new Map(); + const devicesByName = new Map(); + + const { baseManifest: manifestName = 'MINIMAL', addBehaviors = [] } = + bootstrapParameters; + Object.hasOwn(manifests, manifestName) || + Fail`missing manifest ${manifestName}`; + const manifest = { + ...manifests[manifestName], + ...makeManifestForBehaviors(addBehaviors), + }; + + /** + * bootstrapBase provides CORE_EVAL support, and also exposes: + * + * - promise-space functions consumeItem(name), produceItem(name, resolution), + * resetItem(name) + * - awaitVatObject(presence: object, path?: PropertyKey[]) + * - snapshotStore(store: { entries: () => Iterable<[K, V]> }): Array<[K, + * V]> + */ + const bootstrapBase = makeBootstrap( + { ...vatPowers, logger: vatPowers.testLog }, + bootstrapParameters, + manifest, + allBehaviors, + modules, + makeDurableZone(baggage), + ); + + const reflectionMethods = makeReflectionMethods(vatPowers, baggage); + + return Far('root', { + ...reflectionMethods, + + ...bootstrapBase, + bootstrap: async (vats, devices) => { + await bootstrapBase.bootstrap(vats, devices); + + // createVatAdminService is idempotent (despite the name). + captureVatAdmin(E(vats.vatAdmin).createVatAdminService(devices.vatAdmin)); + + // Capture references to static vats and devices. + for (const [name, root] of Object.entries(vats)) { + if (name !== 'vatAdmin') { + vatRecords.set(name, { root }); + } + } + for (const [name, device] of Object.entries(devices)) { + devicesByName.set(name, device); + } + }, + + getDevice: deviceName => devicesByName.get(deviceName), + + getManualTimer: () => manualTimer, + + getVatAdmin: () => vatAdmin || vatAdminP, + + getVatAdminNode: vatName => { + const vat = + vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}`; + const { adminNode } = /** @type {DynamicVatRecord} */ (vat); + return adminNode; + }, + + getVatRoot: vatName => { + const vat = + vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}`; + const { root } = vat; + return root; + }, + + /** + * @param {string} vatName + * @param {string} [bundleCapName] + * @param {{ vatParameters?: object } & Record} [vatOptions] + * @returns {Promise} root object of the new vat + */ + createVat: async (vatName, bundleCapName = vatName, vatOptions = {}) => { + const bundleCap = await E(vatAdminP).getNamedBundleCap(bundleCapName); + const { root, adminNode } = await E(vatAdminP).createVat(bundleCap, { + vatParameters: {}, + ...vatOptions, + }); + vatRecords.set(vatName, { root, adminNode, bundleCap }); + return root; + }, + + /** + * @param {string} vatName + * @param {string} [bundleCapName] + * @param {{ vatParameters?: object } & Record} [vatOptions] + * @returns {Promise} the resulting incarnation number + */ + upgradeVat: async (vatName, bundleCapName, vatOptions = {}) => { + const vatRecord = /** @type {DynamicVatRecord} */ ( + vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}` + ); + const bundleCap = await (bundleCapName + ? E(vatAdminP).getNamedBundleCap(bundleCapName) + : vatRecord.bundleCap); + const upgradeOptions = { vatParameters: {}, ...vatOptions }; + const { incarnationNumber } = await E(vatRecord.adminNode).upgrade( + bundleCap, + upgradeOptions, + ); + vatRecord.incarnationNumber = incarnationNumber; + return incarnationNumber; + }, + }); +}; +harden(buildRootObject); diff --git a/packages/vats/tools/fake-bridge.js b/packages/vats/tools/fake-bridge.js index d8e1585d6a7..067d5dc724f 100644 --- a/packages/vats/tools/fake-bridge.js +++ b/packages/vats/tools/fake-bridge.js @@ -291,9 +291,14 @@ export const fakeLocalChainBridgeQueryHandler = message => { /** * @param {import('@agoric/zone').Zone} zone * @param {(obj) => void} [onToBridge] + * @param {(number) => string} makeAddressFn * @returns {ScopedBridgeManager<'vlocalchain'>} */ -export const makeFakeLocalchainBridge = (zone, onToBridge = () => {}) => { +export const makeFakeLocalchainBridge = ( + zone, + onToBridge = () => {}, + makeAddressFn = index => `${LOCALCHAIN_DEFAULT_ADDRESS}${index || ''}`, +) => { /** @type {Remote} */ let hndlr; let lcaExecuteTxSequence = 0; @@ -306,7 +311,7 @@ export const makeFakeLocalchainBridge = (zone, onToBridge = () => {}) => { trace('toBridge', type, method, params); switch (type) { case 'VLOCALCHAIN_ALLOCATE_ADDRESS': { - const address = `${LOCALCHAIN_DEFAULT_ADDRESS}${accountsCreated || ''}`; + const address = makeAddressFn(accountsCreated); accountsCreated += 1; return address; } diff --git a/packages/vats/tsconfig.build.json b/packages/vats/tsconfig.build.json index fe5ea57d603..1487c804a7b 100644 --- a/packages/vats/tsconfig.build.json +++ b/packages/vats/tsconfig.build.json @@ -2,5 +2,7 @@ "extends": [ "./tsconfig.json", "../../tsconfig-build-options.json" - ] + ], + // FIXME: https://github.com/Agoric/agoric-sdk/issues/10351 + "exclude": ["tools/bootstrap-chain-reflective.js"] } diff --git a/packages/vm-config/decentral-itest-orchestration-config.json b/packages/vm-config/decentral-itest-orchestration-config.json index ff410f43245..30df4738ed9 100644 --- a/packages/vm-config/decentral-itest-orchestration-config.json +++ b/packages/vm-config/decentral-itest-orchestration-config.json @@ -53,6 +53,20 @@ } ] }, + { + "module": "@agoric/builders/scripts/inter-protocol/add-collateral-core.js", + "entrypoint": "psmProposalBuilder", + "args": [ + { + "anchorOptions": { + "denom": "ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9", + "decimalPlaces": 6, + "keyword": "USDC", + "proposedName": "USDC" + } + } + ] + }, { "$comment": "XXX orchesration works without oracles but some test setup dependency fails to resolve without this", "module": "@agoric/builders/scripts/inter-protocol/price-feed-core.js", diff --git a/packages/vm-config/package.json b/packages/vm-config/package.json index 2c81d96282e..47197bd054e 100644 --- a/packages/vm-config/package.json +++ b/packages/vm-config/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "exit 0", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -18,9 +18,10 @@ "keywords": [], "author": "Agoric", "license": "Apache-2.0", + "dependencies": {}, "devDependencies": { "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "CHANGELOG.md", diff --git a/packages/vow/package.json b/packages/vow/package.json index 2f02d247fc3..bf7202807e9 100755 --- a/packages/vow/package.json +++ b/packages/vow/package.json @@ -21,19 +21,19 @@ "dependencies": { "@agoric/base-zone": "^0.1.1-u18.0", "@agoric/internal": "^0.4.0-u18.0", - "@endo/env-options": "^1.1.7", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7" + "@endo/env-options": "^1.1.8", + "@endo/errors": "^1.2.8", + "@endo/eventual-send": "^1.2.8", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8" }, "devDependencies": { - "@agoric/internal": "^0.3.2", + "@agoric/internal": "^0.4.0-u18.0", "@agoric/swingset-vat": "^0.33.0-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", "ava": "^5.3.0", "tsd": "^0.31.1" }, @@ -55,6 +55,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 91.85 + "atLeast": 91.62 } } diff --git a/packages/vow/src/types.ts b/packages/vow/src/types.ts index 7c7e8418b20..83a07eb07b8 100644 --- a/packages/vow/src/types.ts +++ b/packages/vow/src/types.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-use-before-define */ import type { Remote } from '@agoric/internal'; import type { Zone } from '@agoric/zone'; import type { CopyTagged, RemotableObject } from '@endo/pass-style'; diff --git a/packages/vow/test/retryable.test.js b/packages/vow/test/retryable.test.js index 5c9e98089b2..3db86d0e526 100644 --- a/packages/vow/test/retryable.test.js +++ b/packages/vow/test/retryable.test.js @@ -174,7 +174,6 @@ test('restart', async t => { await eventLoopIteration(); if (currentRun < 3) { // Trigger our own invocation restart - // eslint-disable-next-line no-use-before-define flow.restart(); } if (currentRun === 2) { diff --git a/packages/vow/tsconfig.json b/packages/vow/tsconfig.json index ce21a7790cc..2aee5b3dc0c 100644 --- a/packages/vow/tsconfig.json +++ b/packages/vow/tsconfig.json @@ -7,9 +7,7 @@ "include": [ "*.js", "*.ts", - "src/**/*.js", - "src/**/*.ts", - "test/**/*.js", - "test/**/*.ts" + "src", + "test" ] } diff --git a/packages/wallet/api/package.json b/packages/wallet/api/package.json index be66286f14c..2a65bf11a83 100644 --- a/packages/wallet/api/package.json +++ b/packages/wallet/api/package.json @@ -15,12 +15,13 @@ }, "devDependencies": { "@agoric/vats": "^0.16.0-u18.4", - "@endo/bundle-source": "^3.4.2", - "@endo/far": "^1.1.8", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/far": "^1.1.9", + "@endo/init": "^1.1.7", "ava": "^5.3.0" }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/cache": "^0.3.3-u18.0", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/internal": "^0.4.0-u18.0", @@ -31,11 +32,10 @@ "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/zoe": "^0.26.3-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/promise-kit": "^1.1.7", + "@endo/eventual-send": "^1.2.8", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/promise-kit": "^1.1.8", "import-meta-resolve": "^2.2.1" }, "keywords": [], diff --git a/packages/wallet/api/src/lib-dehydrate.js b/packages/wallet/api/src/lib-dehydrate.js index 5f96148f1a2..44524d85b98 100644 --- a/packages/wallet/api/src/lib-dehydrate.js +++ b/packages/wallet/api/src/lib-dehydrate.js @@ -54,7 +54,6 @@ export const makeDehydrator = (initialUnnamedCount = 0) => { if (!isPath(strongname)) { return strongname; } - // eslint-disable-next-line no-use-before-define const { valToPetname: rootToPetname } = edgeMapping; const petname = rootToPetname.get(strongname[0]); assert(!isPath(petname)); @@ -73,7 +72,6 @@ export const makeDehydrator = (initialUnnamedCount = 0) => { // A strong path must have a root name we have mapped. const path = [...strongname]; - // eslint-disable-next-line no-use-before-define const { petnameToVal: petnameToRoot } = edgeMapping; if (!petnameToRoot.has(path[0])) { // Avoid asserting, which fills up the logs. @@ -163,11 +161,7 @@ export const makeDehydrator = (initialUnnamedCount = 0) => { const addPath = (path, val) => { isPath(path) || Fail`path ${q(path)} must be an array of strings`; - if ( - !valToPetname.has(val) && - // eslint-disable-next-line no-use-before-define - edgeMapping.valToPetname.has(path[0]) - ) { + if (!valToPetname.has(val) && edgeMapping.valToPetname.has(path[0])) { // We have a petname for the root of the path, so use it as our // strongname. valToPetname.init(val, path); diff --git a/packages/wallet/api/src/lib-wallet.js b/packages/wallet/api/src/lib-wallet.js index 721ebb256ae..5ca726cfd89 100644 --- a/packages/wallet/api/src/lib-wallet.js +++ b/packages/wallet/api/src/lib-wallet.js @@ -409,7 +409,6 @@ export function makeWalletRoot({ Object.entries(pursePetnameValueKeywordRecord).map( ([keyword, { pursePetname, value, amount, purse }]) => { if (!amount) { - // eslint-disable-next-line no-use-before-define purse = getPurse(pursePetname); amount = { value }; } else { @@ -642,7 +641,6 @@ export function makeWalletRoot({ // Now send it back to the purse. try { - // eslint-disable-next-line no-use-before-define return addPayment(payment, purse); } finally { // Once we've called addPayment, mark this one as done. @@ -688,7 +686,6 @@ export function makeWalletRoot({ // we still make it a normal incoming payment. const purseOrUndefined = purseKeywordRecord[keyword]; - // eslint-disable-next-line no-use-before-define return addPayment(payoutP, purseOrUndefined); }), ); @@ -718,7 +715,6 @@ export function makeWalletRoot({ const already = brandMapping.valToPetname.has(brand); petnameForBrand = brandMapping.suggestPetname(petnameForBrand, brand); if (!already && makePurse) { - // eslint-disable-next-line no-use-before-define p = makeEmptyPurse(petnameForBrand, petnameForBrand, true); } else { p = Promise.resolve(undefined); @@ -821,7 +817,6 @@ export function makeWalletRoot({ if (defaultAutoDeposit && !brandToAutoDepositPurse.has(brand)) { // Try to initialize the autodeposit purse for this brand. // Don't do state updates, since we'll do that next. - // eslint-disable-next-line no-use-before-define await doEnableAutoDeposit(petnameForPurse, false); } @@ -943,7 +938,6 @@ export function makeWalletRoot({ arguments: args, } = compileProposal(offer.proposalTemplate); - // eslint-disable-next-line no-use-before-define const zoeIssuer = issuerManager.get(ZOE_INVITE_BRAND_PETNAME); const { brand: invitationBrand } = brandTable.getByIssuer(zoeIssuer); const invitationP = findOrMakeInvitation( @@ -1158,7 +1152,6 @@ export function makeWalletRoot({ return; } - // eslint-disable-next-line no-use-before-define await addPayment(E.get(compiledOfferP).inviteP).catch(console.error); } @@ -1481,7 +1474,6 @@ export function makeWalletRoot({ // suggestion can be rejected and the suggested petname can be // changed return acceptPetname( - // eslint-disable-next-line no-use-before-define installationManager.add, suggestedPetname, installationHandleBoardId, diff --git a/packages/wallet/api/src/wallet.js b/packages/wallet/api/src/wallet.js index b00a28a9245..7efc95ede75 100644 --- a/packages/wallet/api/src/wallet.js +++ b/packages/wallet/api/src/wallet.js @@ -9,8 +9,9 @@ * types.js file. */ import { E } from '@endo/eventual-send'; -import { makeNotifierKit, observeIteration } from '@agoric/notifier'; import { Far } from '@endo/marshal'; +import { deepCopyJsonable } from '@agoric/internal/src/js-utils.js'; +import { makeNotifierKit, observeIteration } from '@agoric/notifier'; import { makeWalletRoot } from './lib-wallet.js'; import pubsub from './pubsub.js'; @@ -54,7 +55,7 @@ export function buildRootObject(vatPowers) { const offerSubscriptions = new Map(); const httpSend = (obj, channelHandles) => - E(http).send(JSON.parse(JSON.stringify(obj)), channelHandles); + E(http).send(deepCopyJsonable(obj), channelHandles); const pushOfferSubscriptions = (channelHandle, offers) => { const subs = offerSubscriptions.get(channelHandle); diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 3ec79e4c046..fdfcdd7882f 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -19,6 +19,7 @@ "build": "exit 0" }, "dependencies": { + "@agoric/internal": "^0.4.0-u18.0", "@agoric/wallet-ui": "0.1.3-solo.0", "babel-eslint": "^10.0.3", "eslint-plugin-eslint-comments": "^3.1.2", diff --git a/packages/xsnap-lockdown/lib/object-inspect.js b/packages/xsnap-lockdown/lib/object-inspect.js index 4f17c8f987e..19acc2da50d 100644 --- a/packages/xsnap-lockdown/lib/object-inspect.js +++ b/packages/xsnap-lockdown/lib/object-inspect.js @@ -1,5 +1,5 @@ // @ts-nocheck -/* eslint-disable no-nested-ternary,no-use-before-define */ +/* eslint-disable no-nested-ternary */ /* global globalThis */ // Adapted from object-inspect@1.12.0 https://github.com/inspect-js/object-inspect diff --git a/packages/xsnap-lockdown/package.json b/packages/xsnap-lockdown/package.json index 49c53ecd3fb..ecb8e403ab1 100644 --- a/packages/xsnap-lockdown/package.json +++ b/packages/xsnap-lockdown/package.json @@ -16,14 +16,14 @@ "lint:types": "tsc", "lint-fix": "eslint --fix 'src/**/*.js' 'lib/**/*.js' 'scripts/**/*.js' 'test/**/*.js'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0" }, "devDependencies": { - "@endo/bundle-source": "^3.4.2", - "@endo/init": "^1.1.6", + "@endo/bundle-source": "^3.5.0", + "@endo/init": "^1.1.7", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "rollup": "^4.24.0", "rollup-plugin-string": "^3.0.0", "source-map": "^0.7.4" diff --git a/packages/xsnap/api.js b/packages/xsnap/api.js index 3591857e9fa..cb3612f1425 100644 --- a/packages/xsnap/api.js +++ b/packages/xsnap/api.js @@ -7,7 +7,7 @@ * Also, update golden master test/xs-perf.test.js to reflect new meter * version. */ -export const METER_TYPE = 'xs-meter-32'; +export const METER_TYPE = 'xs-meter-33'; export const ExitCode = { E_UNKNOWN_ERROR: -1, diff --git a/packages/xsnap/package.json b/packages/xsnap/package.json index d7cca0c7849..7dd2da1f9d2 100644 --- a/packages/xsnap/package.json +++ b/packages/xsnap/package.json @@ -24,29 +24,29 @@ "lint:types": "tsc", "lint-fix": "eslint --fix 'src/**/*.js' 'test/**/*.js' api.js", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0" }, "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/internal": "^0.4.0-u18.0", "@agoric/xsnap-lockdown": "^0.14.1-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/init": "^1.1.6", - "@endo/netstring": "^1.0.12", - "@endo/promise-kit": "^1.1.7", - "@endo/stream": "^1.2.7", - "@endo/stream-node": "^1.1.7", + "@endo/bundle-source": "^3.5.0", + "@endo/eventual-send": "^1.2.8", + "@endo/init": "^1.1.7", + "@endo/netstring": "^1.0.13", + "@endo/promise-kit": "^1.1.8", + "@endo/stream": "^1.2.8", + "@endo/stream-node": "^1.1.8", "glob": "^7.1.6", "tmp": "^0.2.1" }, "devDependencies": { - "@endo/base64": "^1.0.8", - "@endo/nat": "^5.0.12", + "@endo/base64": "^1.0.9", + "@endo/nat": "^5.0.13", "@types/glob": "^8.1.0", "ava": "^5.3.0", - "c8": "^9.1.0" + "c8": "^10.1.2" }, "files": [ "LICENSE*", diff --git a/packages/xsnap/src/avaXS.js b/packages/xsnap/src/avaXS.js index 28bb74df5b7..1025c9a9411 100644 --- a/packages/xsnap/src/avaXS.js +++ b/packages/xsnap/src/avaXS.js @@ -112,7 +112,7 @@ async function runTestScript( /** * Handle callback "command" from xsnap subprocess. * - * @type { (msg: ArrayBuffer) => Promise } + * @type { (msg: ArrayBuffer) => Promise> } */ async function handleCommand(message) { /** diff --git a/packages/xsnap/src/globals.d.ts b/packages/xsnap/src/globals.d.ts index 695d772ae08..ec7f661073f 100644 --- a/packages/xsnap/src/globals.d.ts +++ b/packages/xsnap/src/globals.d.ts @@ -1,5 +1,5 @@ -declare var issueCommand: (msg: ArrayBuffer) => ArrayBuffer; +declare var issueCommand: (msg: ArrayBufferLike) => ArrayBuffer; namespace global { - declare var issueCommand: (msg: ArrayBuffer) => ArrayBuffer; + declare var issueCommand: (msg: ArrayBufferLike) => ArrayBuffer; } diff --git a/packages/xsnap/src/xsnap.js b/packages/xsnap/src/xsnap.js index ab4ce46dfed..5306281a095 100644 --- a/packages/xsnap/src/xsnap.js +++ b/packages/xsnap/src/xsnap.js @@ -501,7 +501,6 @@ export async function xsnap(options) { if (cleaned) return; cleaned = true; sourceStream.unpipe(output); - // eslint-disable-next-line no-use-before-define output.off('data', onData); output.end(); }; diff --git a/packages/xsnap/test/xsnap-eof.test.js b/packages/xsnap/test/xsnap-eof.test.js index e51407391ce..c5dcb7d8cea 100644 --- a/packages/xsnap/test/xsnap-eof.test.js +++ b/packages/xsnap/test/xsnap-eof.test.js @@ -198,7 +198,6 @@ const testInterruption = test.macro( */ async (t, beforeWait, onRequest, afterWait, verifyResults) => { const handleCommand = message => { - // eslint-disable-next-line no-use-before-define return onRequest(worker, message); }; const worker = await spawnReflectiveWorker(handleCommand); diff --git a/packages/zoe/package.json b/packages/zoe/package.json index 3175fabd2f1..126db3af047 100644 --- a/packages/zoe/package.json +++ b/packages/zoe/package.json @@ -13,7 +13,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava --verbose", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:unit": "ava 'test/unitTests' -T 1m --verbose", "test:swingset": "ava 'test/swingsetTests' -T 10m --verbose", "test:xs": "yarn test:xs-worker", @@ -43,6 +43,7 @@ }, "homepage": "https://github.com/Agoric/agoric-sdk#readme", "dependencies": { + "@endo/errors": "^1.2.8", "@agoric/base-zone": "^0.1.1-u18.0", "@agoric/ertp": "^0.16.3-u18.0", "@agoric/internal": "^0.4.0-u18.0", @@ -54,26 +55,25 @@ "@agoric/vat-data": "^0.5.3-u18.0", "@agoric/vow": "^0.2.0-u18.0", "@agoric/zone": "^0.3.0-u18.0", - "@endo/bundle-source": "^3.4.2", - "@endo/captp": "^4.4.2", - "@endo/common": "^1.2.7", - "@endo/errors": "^1.2.7", - "@endo/eventual-send": "^1.2.7", - "@endo/exo": "^1.5.6", - "@endo/far": "^1.1.8", - "@endo/import-bundle": "^1.3.1", - "@endo/marshal": "^1.6.1", - "@endo/nat": "^5.0.12", - "@endo/pass-style": "^1.4.6", - "@endo/patterns": "^1.4.6", - "@endo/promise-kit": "^1.1.7", + "@endo/bundle-source": "^3.5.0", + "@endo/common": "^1.2.8", + "@endo/captp": "^4.4.3", + "@endo/eventual-send": "^1.2.8", + "@endo/exo": "^1.5.7", + "@endo/far": "^1.1.9", + "@endo/import-bundle": "^1.3.2", + "@endo/marshal": "^1.6.2", + "@endo/nat": "^5.0.13", + "@endo/pass-style": "^1.4.7", + "@endo/patterns": "^1.4.7", + "@endo/promise-kit": "^1.1.8", "yargs-parser": "^21.1.1" }, "devDependencies": { + "@endo/init": "^1.1.7", "@agoric/kmarshal": "^0.1.1-u18.0", - "@endo/init": "^1.1.6", "ava": "^5.3.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "import-meta-resolve": "^2.2.1", "tsd": "^0.31.1" }, @@ -98,6 +98,6 @@ "access": "public" }, "typeCoverage": { - "atLeast": 85.01 + "atLeast": 85.06 } } diff --git a/packages/zoe/src/contractSupport/prepare-ownable.js b/packages/zoe/src/contractSupport/prepare-ownable.js index 0f563056eb3..2c750c3c37b 100644 --- a/packages/zoe/src/contractSupport/prepare-ownable.js +++ b/packages/zoe/src/contractSupport/prepare-ownable.js @@ -62,7 +62,6 @@ export const prepareOwnable = ( const { underlying } = this.state; const { revocable } = this.facets; const customDetails = underlying.getInvitationCustomDetails(); - // eslint-disable-next-line no-use-before-define const transferHandler = makeTransferHandler(underlying); const invitation = makeInvitation( diff --git a/packages/zoe/src/contracts/priceAggregator.js b/packages/zoe/src/contracts/priceAggregator.js index 0a50a514c82..f3ee1c4de1d 100644 --- a/packages/zoe/src/contracts/priceAggregator.js +++ b/packages/zoe/src/contracts/priceAggregator.js @@ -152,7 +152,6 @@ const start = async (zcf, privateArgs) => { } if (!querierPs.length) { // Only have push results, so publish them. - // eslint-disable-next-line no-use-before-define querierPs.push(updateQuote(timestamp)); } await Promise.all(querierPs).catch(console.error); diff --git a/packages/zoe/src/contracts/simpleExchange.js b/packages/zoe/src/contracts/simpleExchange.js index 46915503549..79e910dab20 100644 --- a/packages/zoe/src/contracts/simpleExchange.js +++ b/packages/zoe/src/contracts/simpleExchange.js @@ -32,7 +32,6 @@ import { const start = zcf => { let sellSeats = []; let buySeats = []; - // eslint-disable-next-line no-use-before-define const { notifier, updater } = makeNotifierKit(getBookOrders()); assertIssuerKeywords(zcf, harden(['Asset', 'Price'])); diff --git a/packages/zoe/src/typeGuards.js b/packages/zoe/src/typeGuards.js index 53afe809d9d..0c1d7a02ddb 100644 --- a/packages/zoe/src/typeGuards.js +++ b/packages/zoe/src/typeGuards.js @@ -54,16 +54,18 @@ export const IssuerRecordShape = M.splitRecord( { displayInfo: DisplayInfoShape }, ); -export const TermsShape = harden({ +export const TermsShape = { issuers: IssuerKeywordRecordShape, brands: BrandKeywordRecordShape, -}); +}; +harden(TermsShape); -export const InstanceRecordShape = harden({ +export const InstanceRecordShape = { installation: InstallationShape, instance: InstanceHandleShape, terms: M.splitRecord(TermsShape), -}); +}; +harden(InstanceRecordShape); export const HandleI = M.interface('Handle', {}); @@ -75,7 +77,7 @@ export const TimerShape = makeHandleShape('timer'); * * @see {ProposalRecord} type */ -export const FullProposalShape = harden({ +export const FullProposalShape = { want: AmountPatternKeywordRecordShape, give: AmountKeywordRecordShape, // To accept only one, we could use M.or rather than M.splitRecord, @@ -93,7 +95,9 @@ export const FullProposalShape = harden({ }, {}, ), -}); +}; +harden(FullProposalShape); + /** @see {Proposal} type */ export const ProposalShape = M.splitRecord({}, FullProposalShape, {}); @@ -107,6 +111,7 @@ export const isOnDemandExitRule = exit => { const [exitKey] = Object.keys(exit); return exitKey === 'onDemand'; }; +harden(isOnDemandExitRule); /** * @param {ExitRule} exit @@ -116,6 +121,7 @@ export const isWaivedExitRule = exit => { const [exitKey] = Object.keys(exit); return exitKey === 'waived'; }; +harden(isWaivedExitRule); /** * @param {ExitRule} exit @@ -125,6 +131,7 @@ export const isAfterDeadlineExitRule = exit => { const [exitKey] = Object.keys(exit); return exitKey === 'afterDeadline'; }; +harden(isAfterDeadlineExitRule); export const InvitationElementShape = M.splitRecord({ description: M.string(), @@ -137,12 +144,10 @@ export const OfferHandlerI = M.interface('OfferHandler', { handle: M.call(SeatShape).optional(M.any()).returns(M.any()), }); -export const SeatHandleAllocationsShape = M.arrayOf( - harden({ - seatHandle: SeatShape, - allocation: AmountKeywordRecordShape, - }), -); +export const SeatHandleAllocationsShape = M.arrayOf({ + seatHandle: SeatShape, + allocation: AmountKeywordRecordShape, +}); export const ZoeMintShape = M.remotable('ZoeMint'); export const ZoeMintI = M.interface('ZoeMint', { @@ -180,7 +185,7 @@ export const InstanceAdminI = M.interface('InstanceAdmin', { .optional( AssetKindShape, DisplayInfoShape, - M.splitRecord(harden({}), harden({ elementShape: M.pattern() })), + M.splitRecord({}, { elementShape: M.pattern() }), ) .returns(M.remotable('zoeMint')), registerFeeMint: M.call(KeywordShape, FeeMintAccessShape).returns( @@ -195,7 +200,7 @@ export const InstanceAdminI = M.interface('InstanceAdmin', { repairContractCompletionWatcher: M.call().returns(), }); -export const InstanceStorageManagerIKit = harden({ +export const InstanceStorageManagerIKit = { instanceStorageManager: M.interface('InstanceStorageManager', { getTerms: M.call().returns(M.splitRecord(TermsShape)), getIssuers: M.call().returns(IssuerKeywordRecordShape), @@ -208,7 +213,7 @@ export const InstanceStorageManagerIKit = harden({ .optional( AssetKindShape, DisplayInfoShape, - M.splitRecord(harden({}), harden({ elementShape: M.pattern() })), + M.splitRecord({}, { elementShape: M.pattern() }), ) .returns(M.eref(ZoeMintShape)), registerFeeMint: M.call(KeywordShape, FeeMintAccessShape).returns( @@ -240,7 +245,8 @@ export const InstanceStorageManagerIKit = harden({ M.remotable('adminNode'), ).returns(ZoeMintShape), }), -}); +}; +harden(InstanceStorageManagerIKit); export const BundleCapShape = M.remotable('bundleCap'); export const BundleShape = M.and( @@ -249,18 +255,16 @@ export const BundleShape = M.and( ); export const UnwrappedInstallationShape = M.splitRecord( - harden({ - installation: InstallationShape, - }), - harden({ + { installation: InstallationShape }, + { bundle: M.recordOf(M.string(), M.string({ stringLengthLimit: Infinity })), bundleCap: BundleCapShape, bundleID: M.string(), - }), - harden({}), + }, + {}, ); -export const ZoeStorageManagerIKit = harden({ +export const ZoeStorageManagerIKit = { zoeServiceDataAccess: M.interface('ZoeService dataAccess', { getTerms: M.call(InstanceHandleShape).returns(M.splitRecord(TermsShape)), getIssuers: M.call(InstanceHandleShape).returns(IssuerKeywordRecordShape), @@ -317,7 +321,8 @@ export const ZoeStorageManagerIKit = harden({ invitationIssuerAccess: M.interface('ZoeStorage invitationIssuer', { getInvitationIssuer: M.call().returns(IssuerShape), }), -}); +}; +harden(ZoeStorageManagerIKit); export const ZoeServiceI = M.interface('ZoeService', { install: M.call(M.any()).optional(M.string()).returns(M.promise()), @@ -391,7 +396,8 @@ export const HandleOfferI = M.interface('HandleOffer', { }), }); -export const PriceQuoteShape = harden({ +export const PriceQuoteShape = { quoteAmount: AmountShape, quotePayment: M.eref(PaymentShape), -}); +}; +harden(PriceQuoteShape); diff --git a/packages/zoe/src/zoeService/installationStorage.js b/packages/zoe/src/zoeService/installationStorage.js index f931c68838a..da6c53e6555 100644 --- a/packages/zoe/src/zoeService/installationStorage.js +++ b/packages/zoe/src/zoeService/installationStorage.js @@ -101,7 +101,6 @@ export const makeInstallationStorage = (getBundleCapForID, zoeBaggage) => { InstallationStorageI, { async installBundle(allegedBundle, bundleLabel) { - // @ts-expect-error TS doesn't understand context const { self } = this; // Bundle is a very open-ended type and we must decide here whether to // treat it as either a HashBundle or SourceBundle. So we have to @@ -149,7 +148,6 @@ export const makeInstallationStorage = (getBundleCapForID, zoeBaggage) => { } }, async getBundleIDFromInstallation(allegedInstallation) { - // @ts-expect-error TS doesn't understand context const { self } = this; const { bundleID } = await self.unwrapInstallation(allegedInstallation); // AWAIT diff --git a/packages/zoe/src/zoeService/startInstance.js b/packages/zoe/src/zoeService/startInstance.js index a0a1515f2a5..35bd0a718ce 100644 --- a/packages/zoe/src/zoeService/startInstance.js +++ b/packages/zoe/src/zoeService/startInstance.js @@ -85,7 +85,6 @@ export const makeStartInstance = ( onRejected: (/** @type {Error} */ reason, instanceAdmin, adminNode) => { if (isUpgradeDisconnection(reason)) { console.log(`resetting promise watcher after upgrade`, reason); - // eslint-disable-next-line no-use-before-define watchForAdminNodeDone(adminNode, instanceAdmin); } else { instanceAdmin.failAllSeats(reason); diff --git a/packages/zoe/src/zoeService/zoe.js b/packages/zoe/src/zoeService/zoe.js index 44990d6e4c1..e8983bdfb57 100644 --- a/packages/zoe/src/zoeService/zoe.js +++ b/packages/zoe/src/zoeService/zoe.js @@ -125,9 +125,7 @@ const makeDurableZoeKit = ({ name, vatParameters: { contractBundleCap, - // eslint-disable-next-line no-use-before-define zoeService, - // eslint-disable-next-line no-use-before-define invitationIssuer: invitationIssuerAccess.getInvitationIssuer(), }, }), diff --git a/packages/zoe/test/unitTests/zcf/zcf.test.js b/packages/zoe/test/unitTests/zcf/zcf.test.js index 828d3757325..216d3eded6b 100644 --- a/packages/zoe/test/unitTests/zcf/zcf.test.js +++ b/packages/zoe/test/unitTests/zcf/zcf.test.js @@ -200,7 +200,6 @@ test(`zcf.saveIssuer - bad issuer`, async t => { test(`zcf.saveIssuer - bad issuer, makeEmptyPurse throws`, async t => { const { zcf } = await setupZCFTest(); const brand = Far('brand', { - // eslint-disable-next-line no-use-before-define isMyIssuer: i => i === badIssuer, getDisplayInfo: () => ({ decimalPlaces: 6, assetKind: AssetKind.NAT }), }); diff --git a/packages/zoe/test/unitTests/zoe-startInstance.test.js b/packages/zoe/test/unitTests/zoe-startInstance.test.js index 552b0cdf41f..61e6f0a4794 100644 --- a/packages/zoe/test/unitTests/zoe-startInstance.test.js +++ b/packages/zoe/test/unitTests/zoe-startInstance.test.js @@ -115,7 +115,6 @@ test('bad issuer, makeEmptyPurse throws', async t => { const { zoe } = setup(); const installation = await E(zoe).installBundleID('b1-contract'); const brand = Far('brand', { - // eslint-disable-next-line no-use-before-define isMyIssuer: i => i === badIssuer, getDisplayInfo: () => ({ decimalPlaces: 6, assetKind: AssetKind.NAT }), }); diff --git a/packages/zoe/tools/manualTimer.js b/packages/zoe/tools/manualTimer.js index f833e2e2e83..cf05c45b07a 100644 --- a/packages/zoe/tools/manualTimer.js +++ b/packages/zoe/tools/manualTimer.js @@ -5,7 +5,7 @@ import { buildManualTimer } from '@agoric/swingset-vat/tools/manual-timer.js'; import { TimeMath } from '@agoric/time'; /** - * @import {TimerServiceI} from '@agoric/time'; + * @import {TimerServiceCommon} from '@agoric/time'; * @import {RemotableObject} from '@endo/pass-style'; * @import {RemotableBrand} from '@endo/eventual-send'; */ @@ -31,7 +31,7 @@ const nolog = (..._args) => {}; * @property {(nTimes: number, msg?: string) => Promise} tickN */ -/** @typedef {ReturnType & RemotableBrand & ManualTimerAdmin} ZoeManualTimer */ +/** @typedef {ReturnType & RemotableBrand & ManualTimerAdmin} ZoeManualTimer */ /** * A fake TimerService, for unit tests that do not use a real diff --git a/packages/zoe/tools/setup-zoe.js b/packages/zoe/tools/setup-zoe.js index 03dc1de104e..5914ce20c04 100644 --- a/packages/zoe/tools/setup-zoe.js +++ b/packages/zoe/tools/setup-zoe.js @@ -25,7 +25,7 @@ export const makeZoeForTest = vatAdminSvc => * Returns promises for `zoe` and the `feeMintAccess`. * Provide testing versions of capabilities for Zoe contracts. * - * @template {object} [T=unknown] + * @template {object} [T=any] * @param {object} options * @param {(jig: T) => void} [options.setJig] * @param {FeeIssuerConfig} [options.feeIssuerConfig] diff --git a/packages/zone/package.json b/packages/zone/package.json index 4e65471a51e..ec80665c28e 100644 --- a/packages/zone/package.json +++ b/packages/zone/package.json @@ -10,7 +10,7 @@ "prepack": "tsc --build tsconfig.build.json", "postpack": "git clean -f '*.d.ts*' '*.tsbuildinfo'", "test": "ava", - "test:c8": "c8 $C8_OPTIONS ava --config=ava-nesm.config.js", + "test:c8": "c8 --all $C8_OPTIONS ava", "test:xs": "exit 0", "lint-fix": "yarn lint:eslint --fix", "lint": "run-s --continue-on-error lint:*", @@ -29,13 +29,13 @@ "dependencies": { "@agoric/base-zone": "^0.1.1-u18.0", "@agoric/vat-data": "^0.5.3-u18.0", - "@endo/errors": "^1.2.7", - "@endo/far": "^1.1.8", - "@endo/pass-style": "^1.4.6" + "@endo/errors": "^1.2.8", + "@endo/far": "^1.1.9", + "@endo/pass-style": "^1.4.7" }, "devDependencies": { "@agoric/swingset-vat": "^0.33.0-u18.0", - "@endo/patterns": "^1.4.6", + "@endo/patterns": "^1.4.7", "ava": "^5.3.0" }, "publishConfig": { @@ -55,6 +55,6 @@ "workerThreads": false }, "typeCoverage": { - "atLeast": 96.58 + "atLeast": 98.56 } } diff --git a/packages/zone/src/durable.js b/packages/zone/src/durable.js index 8f9461e489b..b0feedd98dc 100644 --- a/packages/zone/src/durable.js +++ b/packages/zone/src/durable.js @@ -50,7 +50,6 @@ const attachDurableStores = getBaggage => { /** @type {import('.').Stores} */ return Far('durableStores', { - // eslint-disable-next-line no-use-before-define detached: () => detachedDurableStores, isStorable, mapStore, diff --git a/patches/acorn+8.10.0.patch b/patches/acorn+8.10.0.patch deleted file mode 100644 index 1ec930760a0..00000000000 --- a/patches/acorn+8.10.0.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/acorn/dist/acorn.js b/node_modules/acorn/dist/acorn.js -index 62e1aa6..2a9e592 100644 ---- a/node_modules/acorn/dist/acorn.js -+++ b/node_modules/acorn/dist/acorn.js -@@ -2191,7 +2191,7 @@ - if (checkClashes) { - if (hasOwn(checkClashes, expr.name)) - { this.raiseRecoverable(expr.start, "Argument name clash"); } -- checkClashes[expr.name] = true; -+ Object.defineProperty(checkClashes, expr.name, { configurable: true, enumerable: true, value: true }); - } - if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } - } diff --git a/scripts/ava-nesm.cjs b/scripts/ava-nesm.cjs deleted file mode 100755 index 8b922b98ffc..00000000000 --- a/scripts/ava-nesm.cjs +++ /dev/null @@ -1,16 +0,0 @@ -#! /usr/bin/env node -const fs = require('fs'); -const packageJson = fs.readFileSync('package.json', 'utf-8'); -const package = JSON.parse(packageJson); -const { ava: avaConfig } = package; -if (avaConfig.require) { - const newRequire = avaConfig.require.filter(m => m !== 'esm'); - if (newRequire.length) { - avaConfig.require = newRequire; - } else { - delete avaConfig.require; - } -} -process.stdout.write(`\ -export default ${JSON.stringify(avaConfig, undefined, 2)}; -`); diff --git a/scripts/ci-collect-testruns.sh b/scripts/ci/collect-testruns.sh similarity index 100% rename from scripts/ci-collect-testruns.sh rename to scripts/ci/collect-testruns.sh diff --git a/scripts/ci/export-a3p.sh b/scripts/ci/export-a3p.sh new file mode 100755 index 00000000000..b8369dcad84 --- /dev/null +++ b/scripts/ci/export-a3p.sh @@ -0,0 +1,50 @@ +#! /usr/bin/env bash +set -ueo pipefail + +# Usage: export-a3p.sh +# Copy an agoric-3-proposals directory, omitting `agoric-sdk`, `node_modules`, +# and `.yarn`, and replacing colons in proposal directory names (children of +# $a3p_dir/proposals) with dashes. +# https://github.com/Agoric/agoric-3-proposals +# +# The result is ready to be uploaded as an artifact from GitHub Actions. +# https://github.com/actions/upload-artifact + +a3p_dir="${1-}" +dest_dir="${2-}" +if ! [ "$#" -eq 2 -a -n "$a3p_dir" -a -n "$dest_dir" ]; then + echo "Usage: $0 " >&2 + exit 64 +fi +if [ -e "$dest_dir" ]; then + echo "Destination already exists: $dest_dir" + exit 1 +fi + +# Because of the exclusions, copying applies to disjoint subtrees of $a3p_dir: +# * children except `agoric-sdk` and `proposals` +# * file children of `proposals`, i.e. `proposals/*` +# * grandchildren of `proposals`, i.e. `proposals/*/*` +# +# We accomplish this by consuming (subdir?, depth, `find` filter?) tuples. +SUBSEP="$(printf '\x1C')" +printf " $SUBSEP 1 $SUBSEP -not -name agoric-sdk -not -name proposals + proposals $SUBSEP 1 $SUBSEP -type f + proposals $SUBSEP 2 +" \ + | sed -E 's/^ *|#.*//g; /^[[:space:]]*$/d;' \ + | while IFS="$SUBSEP" read subdir depth filter; do + find "$a3p_dir/"$subdir -mindepth ${depth:-1} -maxdepth ${depth:-1} \ + -name node_modules -prune -o -name .yarn -prune -o $filter -print \ + | while read -r path; do + relpath="${path#"$a3p_dir/"}" + reldir="$(dirname -- "$relpath")" + dest_subdir="$dest_dir/$reldir" + [ "$reldir" = . ] && dest_subdir="$dest_dir" # remove trailing `/.` + sanitized="${dest_subdir//:/-}" # replace each `:` with `-` + mkdir -p "$sanitized" + cp -r -- "$path" "$sanitized/" + echo "Copied $(dirname -- "$path") to $sanitized" + done \ + | uniq + done diff --git a/scripts/ci/generate-test-coverage-report.sh b/scripts/ci/generate-test-coverage-report.sh new file mode 100755 index 00000000000..032bfd86839 --- /dev/null +++ b/scripts/ci/generate-test-coverage-report.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# CI artifact export expects the files to be under `coverage` (same for /html below) +export NODE_V8_COVERAGE="$PWD/coverage/tmp" + +# clear out old coverage. c8 usually does this but we have to clean=false below so it accumulates across packages +rm -rf "$NODE_V8_COVERAGE" +mkdir -p "$NODE_V8_COVERAGE" + +# the package test:c8 commands will include this +export C8_OPTIONS="--clean=false" + +# XXX uses lerna when `yarn workspaces run` should work, but in v1 it always bails on missing script +yarn lerna run test:c8 + +# report over all src and tools files, not just the ones that were loaded during tests +yarn c8 report --all --include 'packages/*/{src,tools}' --reporter=html-spa --reports-dir=coverage/html diff --git a/scripts/lint-with-types.sh b/scripts/lint-with-types.sh deleted file mode 100755 index a2821b626b0..00000000000 --- a/scripts/lint-with-types.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# TODO consolidate back into one job https://github.com/Agoric/agoric-sdk/pull/8061 - -# argument used by CI to split this across two jobs -SCOPE=$1 - -# taking roughly half the time to eslint all packages -PRIMARY_PACKAGES="@agoric/{cosmos,ertp,governance,inter-protocol,swing-store,swingset-vat,vats,wallet,zoe}" - -case $SCOPE in - primary) - yarn lerna run --scope=$PRIMARY_PACKAGES --no-bail lint - ;; - rest) - yarn lerna run --ignore=$PRIMARY_PACKAGES --no-bail lint - ;; - *) - echo "The regular lint command now lints with types. Just use that." - exit 0 - ;; -esac diff --git a/scripts/report-globals.mts b/scripts/report-globals.ts similarity index 95% rename from scripts/report-globals.mts rename to scripts/report-globals.ts index 50fa82cb7b8..2661d134e6d 100755 --- a/scripts/report-globals.mts +++ b/scripts/report-globals.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env -S node --import ts-blank-space/register /* eslint-disable -- hacky script for irregular reports */ /** @@ -79,6 +79,7 @@ const report = () => { console.log(counts); }; +console.log('Gathering globals...'); // Feel free to disable this while debugging runEslint(); report(); diff --git a/typedoc.json b/typedoc.json index 90667d1f50f..3b8979ae26a 100644 --- a/typedoc.json +++ b/typedoc.json @@ -3,7 +3,6 @@ "packages/*" ], "exclude": [ - "packages/cosmic-proto/" ], "name": "API documentation of Agoric SDK ", "entryPointStrategy": "packages", diff --git a/yarn.lock b/yarn.lock index bb8a5ec3a88..366e1bc92ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== "@agoric/babel-generator@^7.17.6": version "7.17.6" @@ -1160,6 +1160,16 @@ triple-beam "1.3.0" winston "3.3.3" +"@cosmjs/amino@0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.3.tgz#b81d4a2b8d61568431a1afcd871e1344a19d97ff" + integrity sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA== + dependencies: + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + "@cosmjs/amino@^0.32.2", "@cosmjs/amino@^0.32.3", "@cosmjs/amino@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.4.tgz#3908946c0394e6d431694c8992c5147079a1c860" @@ -1199,6 +1209,15 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" +"@cosmjs/encoding@0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.3.tgz#e245ff511fe4a0df7ba427b5187aab69e3468e5b" + integrity sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/encoding@^0.32.1", "@cosmjs/encoding@^0.32.2", "@cosmjs/encoding@^0.32.3", "@cosmjs/encoding@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.4.tgz#646e0e809f7f4f1414d8fa991fb0ffe6c633aede" @@ -1223,6 +1242,13 @@ "@cosmjs/stream" "^0.32.4" xstream "^11.14.0" +"@cosmjs/math@0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.3.tgz#16e4256f4da507b9352327da12ae64056a2ba6c9" + integrity sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg== + dependencies: + bn.js "^5.2.0" + "@cosmjs/math@^0.32.1", "@cosmjs/math@^0.32.2", "@cosmjs/math@^0.32.3", "@cosmjs/math@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.4.tgz#87ac9eadc06696e30a30bdb562a495974bfd0a1a" @@ -1230,6 +1256,18 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/proto-signing@0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz#91ae149b747d18666a6ccc924165b306431f7c0d" + integrity sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg== + dependencies: + "@cosmjs/amino" "^0.32.3" + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + cosmjs-types "^0.9.0" + "@cosmjs/proto-signing@^0.32.1", "@cosmjs/proto-signing@^0.32.2", "@cosmjs/proto-signing@^0.32.3", "@cosmjs/proto-signing@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz#5a06e087c6d677439c8c9b25b5223d5e72c4cd93" @@ -1252,7 +1290,23 @@ ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@^0.32.1", "@cosmjs/stargate@^0.32.2", "@cosmjs/stargate@^0.32.3": +"@cosmjs/stargate@0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.3.tgz#5a92b222ada960ebecea72cc9f366370763f4b66" + integrity sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/proto-signing" "^0.32.3" + "@cosmjs/stream" "^0.32.3" + "@cosmjs/tendermint-rpc" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + cosmjs-types "^0.9.0" + xstream "^11.14.0" + +"@cosmjs/stargate@^0.32.1", "@cosmjs/stargate@^0.32.2", "@cosmjs/stargate@^0.32.3", "@cosmjs/stargate@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.4.tgz#bd0e4d3bf613b629addbf5f875d3d3b50f640af1" integrity sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ== @@ -1268,7 +1322,7 @@ cosmjs-types "^0.9.0" xstream "^11.14.0" -"@cosmjs/stream@^0.32.1", "@cosmjs/stream@^0.32.4": +"@cosmjs/stream@^0.32.1", "@cosmjs/stream@^0.32.3", "@cosmjs/stream@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.4.tgz#83e1f2285807467c56d9ea0e1113f79d9fa63802" integrity sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A== @@ -1291,7 +1345,7 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@^0.32.1", "@cosmjs/utils@^0.32.2", "@cosmjs/utils@^0.32.4": +"@cosmjs/utils@^0.32.1", "@cosmjs/utils@^0.32.2", "@cosmjs/utils@^0.32.3", "@cosmjs/utils@^0.32.4": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.4.tgz#a9a717c9fd7b1984d9cefdd0ef6c6f254060c671" integrity sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w== @@ -1472,312 +1526,272 @@ resolved "https://registry.yarnpkg.com/@datadog/sketches-js/-/sketches-js-2.1.0.tgz#8c7e8028a5fc22ad102fa542b0a446c956830455" integrity sha512-smLocSfrt3s53H/XSVP3/1kP42oqvrkjUPtyaFd1F79ux24oE31BKt+q0c6lsa6hOYrFzsIwyc5GXAI5JmfOew== -"@endo/base64@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@endo/base64/-/base64-1.0.8.tgz#85e18bbab74cc1469b6e3f552e8bb7f1f21bb851" - integrity sha512-wYfwgni3cY7lYCzk/8DD5150j0hukGVgJ1kczRTiGfXyd0QRxjfn0CcWeWph3ML+9Gh+CLOMotiVWQlCGMqrYQ== - -"@endo/bundle-source@^3.4.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@endo/bundle-source/-/bundle-source-3.4.2.tgz#e827ba82897e56fd37e7903b03e350193f64b894" - integrity sha512-aZw9GNzYUMteGz0DwPBGX0fokOWYsGBokvbs8NeR1gOV+WY4bguveFfdVTMV+nZncu06ohAiaw0eFvVDM7kcXQ== - dependencies: - "@endo/base64" "^1.0.8" - "@endo/compartment-mapper" "^1.3.1" - "@endo/evasive-transform" "^1.3.2" - "@endo/init" "^1.1.6" - "@endo/promise-kit" "^1.1.7" - "@endo/where" "^1.0.8" +"@endo/base64@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@endo/base64/-/base64-1.0.9.tgz#53a05e8d461a63443097165397a7aef33a11b251" + integrity sha512-iUZJSE3EeFxHgk5pRaj83Tv6B0BJHJOpV6UqGv0K3UBn4azQysWRR5IzlXzxcVIpPiSVlOhG/6uCqTxP5cE1ug== + +"@endo/bundle-source@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@endo/bundle-source/-/bundle-source-3.5.0.tgz#2678aeebf5e3dda1ee1b0519ac375466a3d1abf2" + integrity sha512-1yWE6s7mn79A2e/8JM4DYNckb29LnD5W1Zm/VPqfpvw8XnJUxg/49Bki0Pdcd2pQDZpCJkb4rnBelFtH6WUelw== + dependencies: + "@endo/base64" "^1.0.9" + "@endo/compartment-mapper" "^1.4.0" + "@endo/evasive-transform" "^1.3.3" + "@endo/init" "^1.1.7" + "@endo/promise-kit" "^1.1.8" + "@endo/where" "^1.0.9" "@rollup/plugin-commonjs" "^19.0.0" "@rollup/plugin-json" "^6.1.0" "@rollup/plugin-node-resolve" "^13.0.0" acorn "^8.2.4" rollup "^2.79.1" + ts-blank-space "^0.4.1" -"@endo/captp@^4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@endo/captp/-/captp-4.4.2.tgz#2026fd609cd8b7fc8b7f30d6fdc53ba0ae85136c" - integrity sha512-v9yH9wy2HdWm+JkGUSA7wOjzftEofXHHnpbwL6gyuG7Ckl8Qr6yFG4F6azkTA/uJt0uFx8Gqj8jrhMt6hWAtAg== +"@endo/captp@^4.4.3": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@endo/captp/-/captp-4.4.3.tgz#4d0078f5437fc9f4e61aa1344cef19939c630c6f" + integrity sha512-t6KJviFO3H7S5MmfSLDx2od4voK0wwAnjFEZXczru5/ggiSfmYWU47czuTFUetK38dWVOhp/TF42I/Y++4sIKQ== dependencies: - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/marshal" "^1.6.1" - "@endo/nat" "^5.0.12" - "@endo/promise-kit" "^1.1.7" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/marshal" "^1.6.2" + "@endo/nat" "^5.0.13" + "@endo/promise-kit" "^1.1.8" -"@endo/check-bundle@^1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@endo/check-bundle/-/check-bundle-1.0.11.tgz#5bd80384a2202f4f01590395d98c3e787aa45d5e" - integrity sha512-f9TIkm1hEDJJ8QLgD/m0R16GXGPolos1KoG/PQwRGYodI+ZiLsQUsWfkL6NgpjjTVA8/BxFkRLHvAmOcCW5pXg== +"@endo/check-bundle@^1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@endo/check-bundle/-/check-bundle-1.0.12.tgz#11157d2d665fbfff0102fa0076f9473009bfa487" + integrity sha512-8pbfnNCelLQJUQLz48OtMl+WT0IuiAWvxVziS9T7qJQhautZoRAdUTtwGYIePg/XrpyxHHWo27wKh8YGG0EUZQ== dependencies: - "@endo/base64" "^1.0.8" - "@endo/compartment-mapper" "^1.3.1" - "@endo/errors" "^1.2.7" + "@endo/base64" "^1.0.9" + "@endo/compartment-mapper" "^1.4.0" + "@endo/errors" "^1.2.8" -"@endo/cjs-module-analyzer@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@endo/cjs-module-analyzer/-/cjs-module-analyzer-1.0.8.tgz#370a2b46a0610323dccc0dc2495be0ff744e6462" - integrity sha512-LGmZf+ehHaXrh0ClDFIIataTsx47Y4YOWDNUZlkOWyugHUAlh5BWoLk6t63GmXFPFs/Bn5KT1fQJqP5aQj3g6A== +"@endo/cjs-module-analyzer@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@endo/cjs-module-analyzer/-/cjs-module-analyzer-1.0.9.tgz#09f042e1e828dce7e2a3729e1b3a7667eb3e30f4" + integrity sha512-uc6SJx0BzTz/JQ2A2SPt2eMVcIZRLyJ9LF94esuQaNoC8ZJOiCDOY7OmiwdIL+xO9qL9uA4sne5/kRTc9bDGEg== -"@endo/common@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@endo/common/-/common-1.2.7.tgz#c8d8d395d6d25a9b59d73591211c001627c150fd" - integrity sha512-h3DCqituzGW+UKlzWm20tMDYJsstByYv7HzqOXnFKtrtrEXj1qE5YJj0QWFxfYlgUsxQQosx1F0BPrnEwRR7MA== +"@endo/common@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@endo/common/-/common-1.2.8.tgz#896e895a79f9ce1db09cbbe0f4bbc67198379088" + integrity sha512-aQ8ZT8XpjaTfIcWHXV4equVVGH/0PVY+HtEDl5Rk75D/p6JMCfoMwk6Gf2LDu9u+KDa8cEuNw+Rzl/bnx02ffw== dependencies: - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/promise-kit" "^1.1.7" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/promise-kit" "^1.1.8" -"@endo/compartment-mapper@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@endo/compartment-mapper/-/compartment-mapper-1.3.1.tgz#bb8cc999feae270f8b8e324b78b058475b019d34" - integrity sha512-1zH5UFC8SJZDBDBLdwX2RkusieLL/+KolAeGQLrYiyXgAjgmCPwlxmrxk33Yc3OQqpBmEEIwgAR+dki8STeacw== +"@endo/compartment-mapper@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@endo/compartment-mapper/-/compartment-mapper-1.4.0.tgz#c44baba774b320b107b5b5e9d7868ed00ec7769f" + integrity sha512-OqR2MX5kXpAe/H6DqiwkoanOZvoVXNeTnLbKxcJ0jweVleCndlJ9oOKTp7OI66GnKRQj/U0Iu4doSm/xcUmlsg== dependencies: - "@endo/cjs-module-analyzer" "^1.0.8" - "@endo/module-source" "^1.1.1" - "@endo/trampoline" "^1.0.2" - "@endo/zip" "^1.0.8" - ses "^1.9.1" - -"@endo/env-options@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@endo/env-options/-/env-options-1.1.7.tgz#f8f9186010cff12506fdd8f5c8cd4d9051830fd8" - integrity sha512-8twSTbM45rzIP0lHw99ei1EaW98H2BXYKjCTUcq1qgK2OvQWaoiXNcJvUQQo1g7i3oPwbXTQsY69L+nTNeCDyA== + "@endo/cjs-module-analyzer" "^1.0.9" + "@endo/module-source" "^1.1.2" + "@endo/trampoline" "^1.0.3" + "@endo/zip" "^1.0.9" + ses "^1.10.0" -"@endo/errors@^1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@endo/errors/-/errors-1.2.6.tgz#d237b08dfb32a1c5474d83b4cbeb6363783a7767" - integrity sha512-Ly8qCgEoc3d23qklib87PPC829KmkpIkPSMnIiEFnTCedVs55LCoXz01bVEanR4lrCB/qkzjx7n21BwWbscc8Q== - dependencies: - ses "^1.9.0" +"@endo/env-options@^1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@endo/env-options/-/env-options-1.1.8.tgz#dbfcfbf7574f2a793155281d035c8d6f809f5828" + integrity sha512-Xtxw9n33I4guo8q0sDyZiRuxlfaopM454AKiELgU7l3tqsylCut6IBZ0fPy4ltSHsBib7M3yF7OEMoIuLwzWVg== -"@endo/errors@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@endo/errors/-/errors-1.2.7.tgz#cd8513a8e5544f4caec3eb47dd2ec101b445ea8f" - integrity sha512-StTidOD6ermjj46VGXHdsRrPDyvD7+xsT1x20hZlYe+bZfUn0q/JvqMq51O2/fVA0UPuVu61uQXD7m5MH7sklw== +"@endo/errors@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@endo/errors/-/errors-1.2.8.tgz#c2ead8072c92115d5959e2d9ca4d1e46b8e0d8fc" + integrity sha512-YmnfN8d2ho6LrEHxthKVOXktOUc8+fePd+Ua1dGAUJWLYBa/vMaYiMuxNelkn4JxREa/7kz5YqIlnscLe4TX3A== dependencies: - ses "^1.9.1" + ses "^1.10.0" -"@endo/eslint-plugin@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@endo/eslint-plugin/-/eslint-plugin-2.2.2.tgz#74bf1b3cecb51792ab983d92f2a622a59341620f" - integrity sha512-tUVKReiAhUBzJaSRBQaUGf0piix3p3ofTDSBeJ3WbRQ6/D8ncTb12aSG0lpy3IfsJxbNRcfKPEulnLggBVzssQ== +"@endo/eslint-plugin@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@endo/eslint-plugin/-/eslint-plugin-2.2.3.tgz#713e35e57469dd52033db7876f0dd5d81769a1b4" + integrity sha512-Agug8uNCIVnYbhSeh3M2FnDcAWPrOCL74IkOh/jRg/s1zeupnUIcBUGyhXwC90ZS2xm4Z3Bo0myXFuKotc22QA== dependencies: requireindex "~1.1.0" tsutils "~3.21.0" - typescript "~5.6.2" + typescript "~5.6.3" typescript-eslint "^7.3.1" -"@endo/evasive-transform@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@endo/evasive-transform/-/evasive-transform-1.3.2.tgz#94d3cd7e6f329e6bed566fd4deb0f95bea8584fe" - integrity sha512-Bd1+PJlXbOk54ICjwHiKVtAIDw8dgM3QfuE4xN8KeInA+0spOMT0QN0NFO7ISvy0Miw4blOszsfM3RnXPqQrSg== +"@endo/evasive-transform@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@endo/evasive-transform/-/evasive-transform-1.3.3.tgz#d82b39ba47d5e234337856579c746695cb065fe6" + integrity sha512-cstX1OykuDiZaFrJoPDgd0jE/6lZatErX/xBykLYH9UfSRxY1/h1jmo9sDgqTl8QnSWcwSjb3dtXSC0CQJXx9w== dependencies: "@agoric/babel-generator" "^7.17.6" "@babel/parser" "^7.23.6" "@babel/traverse" "^7.23.6" source-map-js "^1.2.0" -"@endo/eventual-send@^1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@endo/eventual-send/-/eventual-send-1.2.6.tgz#43d0f4567e3318491b3720bd7d13eef5448f5384" - integrity sha512-wD2OhDDvW8y519q6B8H5jox5mXau6OdTIlYQGzI2lk7xtPasydh2SgdQsX6u1jLAXVcJuNqW7wWgLmvk42ncVA== - dependencies: - "@endo/env-options" "^1.1.7" - -"@endo/eventual-send@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@endo/eventual-send/-/eventual-send-1.2.7.tgz#b4f5408bba1dd1974f147ecb8c346d443b5a31f5" - integrity sha512-5acCJhp2OBgQc9/Sp1BKpMu1xZHvaXaZa7UybRhc5qEKlC1AHt936wkVdypER96pEVllnNYJi1lBoqBfiV5zag== - dependencies: - "@endo/env-options" "^1.1.7" - -"@endo/exo@^1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@endo/exo/-/exo-1.5.6.tgz#312a572992a137682adce4d0506875773b53f087" - integrity sha512-F3CcDBdqsnrAewzydbGELpfTDeaod278PA2CpqNuEBQySdbn93zNuh3KNRkbPrnQSstDCwv4WBZYzqea7RPSzA== +"@endo/eventual-send@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@endo/eventual-send/-/eventual-send-1.2.8.tgz#83bf2ec4a940f2b8d2992eba6902d15eb43ec8f1" + integrity sha512-3SgjX+2X4p7IGLFV7Yn6Rj8cQz71KyyzB645njFS94fWgT5LMzetjHu3+yIkoBSUHbXxl9U7EK1iS8UBPIJjDQ== dependencies: - "@endo/common" "^1.2.7" - "@endo/env-options" "^1.1.7" - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/far" "^1.1.8" - "@endo/pass-style" "^1.4.6" - "@endo/patterns" "^1.4.6" + "@endo/env-options" "^1.1.8" -"@endo/far@^1.0.0": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@endo/far/-/far-1.1.6.tgz#ca5804da58762cf8b7ecbf8bdd902254d898d456" - integrity sha512-rpMzGyyumpk0rXxIh189zimhMJknzfyJX+HCiYHXELk/iuX53HqwqVobP9HWB65lD9M2nwySgXWtxI75Lx4Afw== +"@endo/exo@^1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@endo/exo/-/exo-1.5.7.tgz#7d83a4c2d9c994e6428f914199cc15c8cceb2b9d" + integrity sha512-mVclo0Ll6ujK7SkG+dKroYgE0g3KRv45TvJngRJ4NxTw3U37Kig9ntDVQkDnyNAVziomVLEnkbPUYc4l16Bq3w== dependencies: - "@endo/errors" "^1.2.6" - "@endo/eventual-send" "^1.2.6" - "@endo/pass-style" "^1.4.4" + "@endo/common" "^1.2.8" + "@endo/env-options" "^1.1.8" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/far" "^1.1.9" + "@endo/pass-style" "^1.4.7" + "@endo/patterns" "^1.4.7" -"@endo/far@^1.1.8": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@endo/far/-/far-1.1.8.tgz#c8212b8182dd671719dc54e55f6406115f2966de" - integrity sha512-xtfKPj1bhefpMouI+6q6zjfwDSSnaCZaSDqjClBrx6SnEO1B3ARdxtmiMEOgCdsw1XakvQwq8HDUWqDWEusJFQ== +"@endo/far@^1.0.0", "@endo/far@^1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@endo/far/-/far-1.1.9.tgz#ef14b5d4137309498978f002d4412786c8a879b2" + integrity sha512-R7EBw1T4Wqysh0Q/tNkpth0eb18Y+iigyzYVIbLIs0uZztr5GHLwAOUWGkceCJJ51dSgV9kYiDDeM0wBwv+ZoQ== dependencies: - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/pass-style" "^1.4.6" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/pass-style" "^1.4.7" -"@endo/import-bundle@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@endo/import-bundle/-/import-bundle-1.3.1.tgz#15d9decae5e0a2d418c23894734780e752819d17" - integrity sha512-2zW0JPMZ9Shy5aJac6UvqHv5KWHPLgoArE95ugdrqrDFlirAtb7tt2/siHqUdYsStwbrX5HhMY6QMdbo27gNrQ== +"@endo/import-bundle@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@endo/import-bundle/-/import-bundle-1.3.2.tgz#a441cc147bb53e8a80d19574ae8776fbb841dfa3" + integrity sha512-wsJaFJPTNj3FgMuaywLZYTj2dI1sacZ8it51o84ub9kEXnB3xbaoE2qDjw00xd7cyLvVqq55zo5h+tW9qj8xLA== dependencies: - "@endo/base64" "^1.0.8" - "@endo/compartment-mapper" "^1.3.1" - "@endo/errors" "^1.2.7" - "@endo/where" "^1.0.8" - ses "^1.9.1" + "@endo/base64" "^1.0.9" + "@endo/compartment-mapper" "^1.4.0" + "@endo/errors" "^1.2.8" + "@endo/where" "^1.0.9" + ses "^1.10.0" -"@endo/init@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@endo/init/-/init-1.1.6.tgz#d07aead37ee228bc5ed7c1847e456585201a42d3" - integrity sha512-DMRPXL2lr71NLlurg4VfRxLvnxsDqbqWhuV4+QcgH9cWdg6RBaVn+GgUR8BTU7jGJvRgYVnFtiXCy86FvoPhkQ== +"@endo/init@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@endo/init/-/init-1.1.7.tgz#3ab328ae0145c3b0e247be9cbdc12d3e714fad25" + integrity sha512-JmnJ1YgoLqhmglujm401D0N1IgYPL/TYf03KgwcpfoN72RCHv0nx4iKR1T05tXJPsEawpF94vHKBV41D1MzLgg== dependencies: - "@endo/base64" "^1.0.8" - "@endo/eventual-send" "^1.2.7" - "@endo/lockdown" "^1.0.12" - "@endo/promise-kit" "^1.1.7" + "@endo/base64" "^1.0.9" + "@endo/eventual-send" "^1.2.8" + "@endo/lockdown" "^1.0.13" + "@endo/promise-kit" "^1.1.8" -"@endo/lockdown@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@endo/lockdown/-/lockdown-1.0.12.tgz#589cb12c42a3cc70fc708b72c39582cb8f7e5821" - integrity sha512-2okxPEB3dvK6QN9J7+PADdJCOtCQzMDUlECAByNA+6lScTWPfV0apnI1AenV9Wje+lw7VEMf0Q32iwzhJ6Wv6g== +"@endo/lockdown@^1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@endo/lockdown/-/lockdown-1.0.13.tgz#b78b7a9329ba676b4e82c2e423b12b09a7811123" + integrity sha512-bFELKY1wWP/WqNWsUiP77OiHT8MjHzgrmUosLqx7uhF8u7XSyUOlFQ0pnT5R4rTDZwMNU6VWwPNt/wH7rnUfAw== dependencies: - ses "^1.9.1" + ses "^1.10.0" -"@endo/marshal@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@endo/marshal/-/marshal-1.6.1.tgz#fc65e0bef08b247e5f144998e52325cc03ce98be" - integrity sha512-EJjupTx0OO2N9idA2eL/JabgAWC7T5A0WL1y7C5EeUMZRcVVtoaRaDDVip8jq2GK5kNy767jG5yYyRO93bZ+RA== +"@endo/marshal@^1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@endo/marshal/-/marshal-1.6.2.tgz#b1741eeeb7cea4ec71393d5b221aa45732e2378c" + integrity sha512-fe7oYCMfBdmz7Bj46bcF2VjDyyJoIht5osXpPcw/xX5zSwa6Kt4eHgP5Qwf0HHRkkR1pI1AUQFm6jgNQyAMxxQ== dependencies: - "@endo/common" "^1.2.7" - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/nat" "^5.0.12" - "@endo/pass-style" "^1.4.6" - "@endo/promise-kit" "^1.1.7" + "@endo/common" "^1.2.8" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/nat" "^5.0.13" + "@endo/pass-style" "^1.4.7" + "@endo/promise-kit" "^1.1.8" -"@endo/module-source@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@endo/module-source/-/module-source-1.1.1.tgz#2177dd3ec3a02fa882f5450280b27358f1998228" - integrity sha512-btu6OHq4vqEKgWINyZ+vl4SFLFG2ZfAQORIyrfV7VLDfTR68G1422u/dozWTgmGiooUL5Ht4HHrmkEYbnX0dIQ== +"@endo/module-source@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@endo/module-source/-/module-source-1.1.2.tgz#fab0ebed5f66d2981dae11a8435a67b5c88ad526" + integrity sha512-HvJyZBwxtDbHzaIqmuQBuPN3T6meOF51txuC93WrIYl7g4xnePo1R/wRJDiFfRC55F+tv7/Xdd3lh9dOI+8USg== dependencies: "@agoric/babel-generator" "^7.17.6" "@babel/parser" "^7.23.6" "@babel/traverse" "^7.23.6" "@babel/types" "^7.24.0" - ses "^1.9.1" - -"@endo/nat@^5.0.12": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@endo/nat/-/nat-5.0.12.tgz#80d71e30c55a264f35e0b4ece114e4951373724f" - integrity sha512-MOwIO/rElktFyl9qJLSU0MkFS87AuH55OgHJXyxKS8x9D7u0ke3XnDPMjvg2VRkNvAA/alOGoC6rnfwe2Q9XiQ== - -"@endo/netstring@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@endo/netstring/-/netstring-1.0.12.tgz#b9ac05b8d989a2c88a8b12eae13c4d445101445c" - integrity sha512-9TVonLFE6JOq6Hg0ffTb3+pL7AMSFSpioBXxN4qu/0dPH3T82D+RMnHElO7pnih9fwj53Y9LJB/cmWAHJCkRhg== - dependencies: - "@endo/init" "^1.1.6" - "@endo/promise-kit" "^1.1.7" - "@endo/stream" "^1.2.7" - ses "^1.9.1" + ses "^1.10.0" -"@endo/pass-style@^1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@endo/pass-style/-/pass-style-1.4.4.tgz#01c1d6ffc4af3e39b7c8cb8b912d9f6b28d02e55" - integrity sha512-RlZMt2kKQUYfrxh9G4RZ8eQs+Bb6DwT7P8TbJZGfgIRYajL5I5zAdByz9PA8P0+aj4PZpKnTUfKwlhNs+tNV0w== - dependencies: - "@endo/env-options" "^1.1.7" - "@endo/errors" "^1.2.6" - "@endo/eventual-send" "^1.2.6" - "@endo/promise-kit" "^1.1.6" - "@fast-check/ava" "^1.1.5" +"@endo/nat@^5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@endo/nat/-/nat-5.0.13.tgz#23a465506eba5c52ae91ec4e9b87d630912c6592" + integrity sha512-95slEnftfw7d35oYDXRmKl29KVJM5KXhP6zGBRTnX+ls0lLyw23aSNGnhy0RGbqIq1/kGrq3iQNbevOfrtJdNQ== -"@endo/pass-style@^1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@endo/pass-style/-/pass-style-1.4.6.tgz#75092d33ad5183be120fb662361eef44c28f7768" - integrity sha512-9Tjvi2ZEek9xOOsGy4C5n1yQc91ciqi1r2LNA8BERsl/1g2AuXOtRb/cIVgeUOt1uumO5E1Wg3yKVkcnwLeVqg== - dependencies: - "@endo/env-options" "^1.1.7" - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/promise-kit" "^1.1.7" +"@endo/netstring@^1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@endo/netstring/-/netstring-1.0.13.tgz#061e7abf956e1dab7d61ed1aa4af5bbfdd6bf371" + integrity sha512-Bi9M9Ka/1KT88/1voHCCpzyE/pyCjmvwFR2npfU7QCj3nmNMGY+oPKe6fAVOX9sAYRud7p1gscCR9AkWCuKLLg== + dependencies: + "@endo/init" "^1.1.7" + "@endo/promise-kit" "^1.1.8" + "@endo/stream" "^1.2.8" + ses "^1.10.0" + +"@endo/pass-style@^1.4.7": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@endo/pass-style/-/pass-style-1.4.7.tgz#8a8fd5b23322a4ece80ac6d56502ab8049609263" + integrity sha512-vuIYsA/zQCx1Ikqivfvv0yDWtbF5IGuOLYXzFzDY/VAYjN2U6a6Qgyp8TV8xLaGKqTq+QDlk/WxtFLQ34uu2BQ== + dependencies: + "@endo/env-options" "^1.1.8" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/promise-kit" "^1.1.8" "@fast-check/ava" "^1.1.5" -"@endo/patterns@^1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@endo/patterns/-/patterns-1.4.6.tgz#4e23a6b1f06294ce713c8dd24041201dd242225e" - integrity sha512-gDAMbFp6BzRV4SFvn92mrxt9p3ODtyLAE6SwRt+K9mVDzL5pcjKt+LvKOGy6ngZwPkcgyf6/hzryqNPofb5Lgw== - dependencies: - "@endo/common" "^1.2.7" - "@endo/errors" "^1.2.7" - "@endo/eventual-send" "^1.2.7" - "@endo/marshal" "^1.6.1" - "@endo/promise-kit" "^1.1.7" - -"@endo/promise-kit@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@endo/promise-kit/-/promise-kit-1.1.6.tgz#0357c09973fd28be0ef8cb18fbfbb3cfaf1f993b" - integrity sha512-14HtlfeUfm9voakcDF4hK15NlyzHtlPFBjJh42ZmWW3aGXmUJQTI/yIdv0zPXcMkogCdeBNKXpQSqIsYehAowQ== +"@endo/patterns@^1.4.7": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@endo/patterns/-/patterns-1.4.7.tgz#f3e275b1f3c7b90a352f8879d7470339fede18bf" + integrity sha512-hPWdcpmYX8exTTtAFTrU1eIAZlAKhzPCSb8tvWFPU43DobAlOLez32H+tx0tWRUeZRfFNFBO0nFR+KImDZo1hw== dependencies: - ses "^1.9.0" + "@endo/common" "^1.2.8" + "@endo/errors" "^1.2.8" + "@endo/eventual-send" "^1.2.8" + "@endo/marshal" "^1.6.2" + "@endo/promise-kit" "^1.1.8" -"@endo/promise-kit@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@endo/promise-kit/-/promise-kit-1.1.7.tgz#04c84ef2a2047b94925fcc8ad4feb22cb0a7b2a0" - integrity sha512-WuelSrrgyi01ieUAlaVmQPWOPcKWpifF6t6Cr6ef0Wrmpygp3d45/ucOqKkuVlBckfMQh24/KxAhsiovgy2N2A== +"@endo/promise-kit@^1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@endo/promise-kit/-/promise-kit-1.1.8.tgz#412c7fc746b331fe9f3df2fe1ad5a0944a875013" + integrity sha512-Pfp/y2QtNIr1BlGveANzTxr5sXs4B4BdkLF54WcVyeydi3fqvNdESSTUJSVF6xLefrJf3OqsZ4LxEQTWruMbTw== dependencies: - ses "^1.9.1" + ses "^1.10.0" -"@endo/ses-ava@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@endo/ses-ava/-/ses-ava-1.2.7.tgz#730e102477cf1c316eb04d4e038cdda9728344e7" - integrity sha512-hZbbgQhVUCUOMfpr7Zs8k4oQBJaX5R2x3icWhwReD6b26PUUG2n+HrutYk3Tdtjc9BXCtOZNls3Ql1nqBu2bHA== +"@endo/ses-ava@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@endo/ses-ava/-/ses-ava-1.2.8.tgz#eeafc20e8c9f79021b03ffaa84182e347766594a" + integrity sha512-DVLwSjEB+tlS83seGfeJk3q7JxiZF7Er05PUTk4mOfAgVhCKDcPSEAm1EZ8afWS2cf/f3nZE9n1Vlc8FRBEx/A== dependencies: - "@endo/env-options" "^1.1.7" - "@endo/init" "^1.1.6" - ses "^1.9.1" + "@endo/env-options" "^1.1.8" + "@endo/init" "^1.1.7" + ses "^1.10.0" -"@endo/stream-node@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@endo/stream-node/-/stream-node-1.1.7.tgz#567efb430c1d1fdd25f04813be4b5e894c27ed0d" - integrity sha512-1QrwlfhMAyk2jB9dDK0M1sDiihlDKvRLSuhV0HxJF9eG2GxT+5vCXcu0WMx+O18oXqm0YSnhkMApI+y66eDpOA== +"@endo/stream-node@^1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@endo/stream-node/-/stream-node-1.1.8.tgz#5590c12ab60eee9b140650262d0d8bbe1148a311" + integrity sha512-Lvx8P4Z1vHwbX8HEaJGDd+J4ljkaHA3KcRrAwNCkm+1EKQxiRFVKZQZrA/uCg7P9mVVtv5cAXCl9l7XN/Ti0Vw== dependencies: - "@endo/errors" "^1.2.7" - "@endo/init" "^1.1.6" - "@endo/stream" "^1.2.7" - ses "^1.9.1" + "@endo/errors" "^1.2.8" + "@endo/init" "^1.1.7" + "@endo/stream" "^1.2.8" + ses "^1.10.0" -"@endo/stream@^1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@endo/stream/-/stream-1.2.7.tgz#60743539df3138a4589929d81e7a6df33a87e5aa" - integrity sha512-/ckaNtSFEJcEvpnw15nqH0ard/S2NPIKus4D3lmaH51K+F+cKJ6QRuXcSeTG0TTcIWYhM1YJmD6AQjUTjCBUZA== +"@endo/stream@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@endo/stream/-/stream-1.2.8.tgz#0f2226618bd0190b78ea7e725916265a9b97f8fa" + integrity sha512-Ox+3p+MIkIGtH/x62d0ZJIBW5nzm6jcQ2dDNW/AEpLXNa+Pc7vzBdBdC41CW8n7BbYt+Ak49r4/as+rbKDZiyQ== dependencies: - "@endo/eventual-send" "^1.2.7" - "@endo/promise-kit" "^1.1.7" - ses "^1.9.1" + "@endo/eventual-send" "^1.2.8" + "@endo/promise-kit" "^1.1.8" + ses "^1.10.0" -"@endo/trampoline@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@endo/trampoline/-/trampoline-1.0.2.tgz#2e2e41ccd361f21b4f208c696200150b79e093b2" - integrity sha512-S65oqY4dtRyoMREFWrW7/ujB20vkNWQzg737qnl+5Cjv2ar2te42fOjQfo7EEJ8OekybU38i0iRS6h/ZhXgKfQ== +"@endo/trampoline@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@endo/trampoline/-/trampoline-1.0.3.tgz#24bcd3dee5645a747a37f284716709ffd02ec3cd" + integrity sha512-TYtvWSc97yV/LZDRc5mD4Wt9toKm2UyVjv66FAFiQRsoeKkEaXbus9Ka9byV1MwZv0P1xhCJ5yPV5Q6F9w0Wpw== -"@endo/where@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@endo/where/-/where-1.0.8.tgz#136874439b3bf043a0b4eca17062a384389ea051" - integrity sha512-zOc/laKO3+ioYRAeMR6fyzglipB8mHgIucVjZQigEa4fU4VxgNAJVEGze6Z7SPQ//ZtTcmKGsKaTlZA6dY9KMg== +"@endo/where@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@endo/where/-/where-1.0.9.tgz#eafc3c610c53b273e8b04a6d1211c84bde5f53e6" + integrity sha512-p3kcsy3kNKayOmkFhYXSSzb4igSg/+QdWv7n1RVwPwYcre1Tp7n6xKkAv2c3WsERNzBa1ZjRd3btr9c2MBBmMw== -"@endo/zip@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@endo/zip/-/zip-1.0.8.tgz#1f667e4966ce3aa3c9fc31c180eba966ff2f6891" - integrity sha512-o+qrVrSPJjOyy2a8uGaIQ9lc31XDtVlYvK3/urIWPwajZyAyPp7Yrj0feGK7zjeWzfxSN7ycl27JyhN7lSXITg== +"@endo/zip@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@endo/zip/-/zip-1.0.9.tgz#f16b68d3e03f838de762779e5c9aa1731a27c1fc" + integrity sha512-Iuvm6oZBVQVKpLG6KtjdyTOF2od2lOdjEr2a2UC3ppCxAJRSDC9EQMsE0kkHQra5caRj1JERnoQlqYgn0ZC7ug== "@es-joy/jsdoccomment@~0.43.1": version "0.43.1" @@ -1792,16 +1806,21 @@ jsdoc-type-pratt-parser "~4.0.0" "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/compat@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.2.4.tgz#b69b0d76ce73fe66d7f8633c406acea151f5c559" + integrity sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1818,10 +1837,30 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/eslintrc@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@eslint/js@^9.14.0": + version "9.16.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.16.0.tgz#3df2b2dd3b9163056616886c86e4082f45dbf3f4" + integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg== "@fast-check/ava@^1.1.5": version "1.1.5" @@ -1830,6 +1869,13 @@ dependencies: fast-check "^3.0.0" +"@fast-check/ava@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@fast-check/ava/-/ava-2.0.1.tgz#442756588bdd2bb4d5bfbf869860ad785194ad7d" + integrity sha512-i/fmylk0tXJeB09bThnaqLu7VhbiowND3FdVJaIfULr6vdfk7kXyI9Mh8rS2MyRpWgXl88am3KlKJQk2MBcWAA== + dependencies: + fast-check "^3.0.0" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -1840,12 +1886,37 @@ resolved "https://registry.yarnpkg.com/@github/browserslist-config/-/browserslist-config-1.0.0.tgz#952fe6da3e6b8ed6a368f3a1a08a9d2ef84e8d04" integrity sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@google-cloud/monitoring@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@google-cloud/monitoring/-/monitoring-4.1.0.tgz#193f4d2a2bd9eb1f80220ac7070809fc266434fd" + integrity sha512-LNEHl4bu4HrCS17BMABeV9C+BFupqW02Pgpeu2mncHYkvQdYMr/huseqKhO/RmPqzEkU11fApysRPpv6SWyZRQ== + dependencies: + google-gax "^4.0.3" + +"@grpc/grpc-js@^1.10.9": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.2.tgz#97eda82dd49bb9c24eaf6434ea8d7de446e95aac" + integrity sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1854,10 +1925,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1869,18 +1940,6 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@isaacs/cached@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/cached/-/cached-1.0.1.tgz#b6ad07c346f843fb3f117a0f3401ea8b7f7d4eea" - integrity sha512-7kGcJ9Hc1f4qpTApWz3swxbF9Qv1NF/GxuPtXeTptbsgvJIoufSd0h854Nq/2bw80F5C1onsFgEI05l+q0e4vw== - dependencies: - "@isaacs/catcher" "^1.0.0" - -"@isaacs/catcher@^1.0.0", "@isaacs/catcher@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@isaacs/catcher/-/catcher-1.0.4.tgz#fa5aa6fa43d255b9fe32e1e1f40db6623de2c80d" - integrity sha512-g2klMwbnguClWNnCeQ1zYaDJsvPbIbnjdJPDE0z09MqoejJDZSLK5vIKiClq2Bkg5ubuI8vaN6wfIUi5GYzMVA== - "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2000,6 +2059,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -2689,6 +2753,30 @@ npmlog "^6.0.2" write-file-atomic "^4.0.1" +"@nick134-bit/noblejs@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@nick134-bit/noblejs/-/noblejs-0.0.2.tgz#97597a5d746a113b5493a8051d71ad8225f76a44" + integrity sha512-krCmMZtSifmYeAcuWIIulSnQH+c29CDHTW/6X5SM0UHw4ff6/xMTQFf1ZOlbpf04BCUI7A6j0etOmCdms5NHtg== + dependencies: + "@cosmjs/amino" "0.32.3" + "@cosmjs/encoding" "0.32.3" + "@cosmjs/math" "0.32.3" + "@cosmjs/proto-signing" "0.32.3" + "@cosmjs/stargate" "0.32.3" + typescript "^5.4.5" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/hashes@^1", "@noble/hashes@^1.0.0", "@noble/hashes@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" @@ -3059,7 +3147,7 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.3.0.tgz#27c6f776ac3c1c616651e506a89f438a0ed6a055" integrity sha512-YveTnGNsFFixTKJz09Oi4zYkiLT5af3WpZDu4aIUM7xX+2bHAkOJayFTVQd6zB8kkWPpbua4Ha6Ql00grdLlJQ== -"@opentelemetry/core@1.26.0": +"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.14.0": version "1.26.0" resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.26.0.tgz#7d84265aaa850ed0ca5813f97d831155be42b328" integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ== @@ -3073,13 +3161,6 @@ dependencies: "@opentelemetry/semantic-conventions" "1.9.1" -"@opentelemetry/core@^1.14.0": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.15.2.tgz#5b170bf223a2333884bbc2d29d95812cdbda7c9f" - integrity sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw== - dependencies: - "@opentelemetry/semantic-conventions" "1.15.2" - "@opentelemetry/exporter-logs-otlp-http@0.53.0": version "0.53.0" resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.53.0.tgz#1b4a152ea427ec4581532880fd0d620cc559cb11" @@ -3209,11 +3290,6 @@ "@opentelemetry/resources" "1.9.1" "@opentelemetry/semantic-conventions" "1.9.1" -"@opentelemetry/semantic-conventions@1.15.2": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz#3bafb5de3e20e841dff6cb3c66f4d6e9694c4241" - integrity sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw== - "@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@~1.27.0": version "1.27.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c" @@ -3454,6 +3530,16 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@sec-ant/readable-stream@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" + integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== + "@shikijs/core@1.16.3": version "1.16.3" resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.16.3.tgz#082b53928bf201a8d7cfbe0b5540dc1c609d0a5e" @@ -3479,6 +3565,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sindresorhus/merge-streams@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" + integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3504,6 +3595,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/caseless@*": + version "0.12.5" + resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" + integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== + "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -3630,6 +3726,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== +"@types/long@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/long@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@types/long/-/long-5.0.0.tgz#daaa7b7f74c919c946ff74889d5ca2afe363b2cd" @@ -3686,12 +3787,19 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.0.0": - version "22.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.0.0.tgz#04862a2a71e62264426083abe1e27e87cac05a30" - integrity sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw== +"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.9.0": + version "22.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" + integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== dependencies: - undici-types "~6.11.1" + undici-types "~6.19.8" + +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -3730,6 +3838,16 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/request@^2.48.8": + version "2.48.12" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.12.tgz#0f590f615a10f87da18e9790ac94c29ec4c5ef30" + integrity sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw== + dependencies: + "@types/caseless" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + form-data "^2.5.0" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -3763,6 +3881,11 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/triple-beam@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" @@ -3785,86 +3908,91 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.18.0", "@typescript-eslint/eslint-plugin@^7.0.1": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" - integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== +"@typescript-eslint/eslint-plugin@8.17.0", "@typescript-eslint/eslint-plugin@^8.0.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz#2ee073c421f4e81e02d10e731241664b6253b23c" + integrity sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/type-utils" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.17.0" + "@typescript-eslint/type-utils" "8.17.0" + "@typescript-eslint/utils" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@7.18.0", "@typescript-eslint/parser@^7.0.1": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== +"@typescript-eslint/parser@8.17.0", "@typescript-eslint/parser@^8.0.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.17.0.tgz#2ee972bb12fa69ac625b85813dc8d9a5a053ff52" + integrity sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg== dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.17.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/typescript-estree" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== +"@typescript-eslint/scope-manager@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz#a3f49bf3d4d27ff8d6b2ea099ba465ef4dbcaa3a" + integrity sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" -"@typescript-eslint/type-utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" - integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== +"@typescript-eslint/type-utils@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz#d326569f498cdd0edf58d5bb6030b4ad914e63d3" + integrity sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw== dependencies: - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/typescript-estree" "8.17.0" + "@typescript-eslint/utils" "8.17.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.18.0", "@typescript-eslint/types@^7.2.0": +"@typescript-eslint/types@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.17.0.tgz#ef84c709ef8324e766878834970bea9a7e3b72cf" + integrity sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA== + +"@typescript-eslint/types@^7.2.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== +"@typescript-eslint/typescript-estree@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz#40b5903bc929b1e8dd9c77db3cb52cfb199a2a34" + integrity sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== +"@typescript-eslint/utils@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.17.0.tgz#41c05105a2b6ab7592f513d2eeb2c2c0236d8908" + integrity sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/scope-manager" "8.17.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/typescript-estree" "8.17.0" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== +"@typescript-eslint/visitor-keys@8.17.0": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz#4dbcd0e28b9bf951f4293805bf34f98df45e1aa8" + integrity sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg== dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "8.17.0" + eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -3904,6 +4032,13 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" @@ -3927,16 +4062,21 @@ acorn-walk@^8.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3944,6 +4084,13 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" @@ -4158,15 +4305,16 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.5, array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.5, array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -4174,26 +4322,16 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.filter@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" - integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -array.prototype.findlastindex@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f" - integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" + es-abstract "^1.23.2" es-errors "^1.3.0" + es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.2: @@ -4336,10 +4474,12 @@ ava@^5.3.0, ava@^5.3.1: write-file-atomic "^5.0.1" yargs "^17.7.2" -available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" - integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axe-core@^4.6.2: version "4.7.2" @@ -4431,6 +4571,11 @@ bech32@^1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -4449,7 +4594,7 @@ bfs-path@^1.0.2: resolved "https://registry.yarnpkg.com/bfs-path/-/bfs-path-1.0.2.tgz#9b5fa4b8c4ad226597fc4d2ee15398bdcc644a07" integrity sha512-KTKx2JJtAAAT7C/rJYDXXWA2VLPycAS4kwFktKsxUo0hj4UTtw/Gm5PJuY7Uf3xSlIQNo7HRCSWei2ivncVwbQ== -bignumber.js@9.1.2: +bignumber.js@9.1.2, bignumber.js@^9.0.0: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== @@ -4556,15 +4701,15 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserslist@^4.21.0, browserslist@^4.22.2, browserslist@^4.22.3: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== +browserslist@^4.22.2, browserslist@^4.22.3, browserslist@^4.23.1: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -4573,6 +4718,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -4613,10 +4763,10 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -c8@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-9.1.0.tgz#0e57ba3ab9e5960ab1d650b4a86f71e53cb68112" - integrity sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg== +c8@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/c8/-/c8-10.1.2.tgz#7fe04ced150316e2a623612ab78378289f7e6a9f" + integrity sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@istanbuljs/schema" "^0.1.3" @@ -4625,7 +4775,7 @@ c8@^9.1.0: istanbul-lib-coverage "^3.2.0" istanbul-lib-report "^3.0.1" istanbul-reports "^3.1.6" - test-exclude "^6.0.0" + test-exclude "^7.0.1" v8-to-istanbul "^9.0.0" yargs "^17.7.2" yargs-parser "^21.1.1" @@ -4712,10 +4862,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001587: - version "1.0.30001587" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" - integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== +caniuse-lite@^1.0.30001669: + version "1.0.30001686" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz#0e04b8d90de8753188e93c9989d56cb19d902670" + integrity sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA== case@1.6.3: version "1.6.3" @@ -5004,7 +5154,7 @@ columnify@^1.6.0: strip-ansi "^6.0.1" wcwidth "^1.0.0" -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5016,11 +5166,6 @@ commander@7.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== -commander@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - commander@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" @@ -5276,9 +5421,9 @@ cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -5314,6 +5459,33 @@ dargs@7.0.0, dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + date-time@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" @@ -5377,7 +5549,14 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.6, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +debug@4.3.6: version "4.3.6" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== @@ -5416,6 +5595,11 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" +decode-uri-component@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -5474,7 +5658,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -5615,11 +5799,28 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexify@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.2" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5632,10 +5833,10 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.668: - version "1.4.670" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.670.tgz#0fc5ac92ada8371e898ea72d577ffc888167a017" - integrity sha512-hcijYOWjOtjKrKPtNA6tuLlA/bTLO3heFG8pQA6mLpq7dRydSWicXova5lyxDzp1iVJaYhK7J2OQlGE52KYn7A== +electron-to-chromium@^1.5.41: + version "1.5.70" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.70.tgz#8be2f92e54a3d069c0eefcf766a48bf0f78d93e0" + integrity sha512-P6FPqAWIZrC3sHDAwBitJBs7N7IF58m39XVny7DFseQXK2eiMn7nNQizFf63mWDDUnFvaqsM8FI0+ZZfLkdUGA== elliptic@^6.5.4: version "6.5.4" @@ -5735,57 +5936,57 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3: - version "1.22.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.4.tgz#26eb2e7538c3271141f5754d31aabfdb215f27bf" - integrity sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg== +es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.6" + available-typed-arrays "^1.0.7" call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" es-define-property "^1.0.0" es-errors "^1.3.0" - es-set-tostringtag "^2.0.2" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" get-symbol-description "^1.0.2" - globalthis "^1.0.3" + globalthis "^1.0.4" gopd "^1.0.1" has-property-descriptors "^1.0.2" - has-proto "^1.0.1" + has-proto "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.1" + hasown "^2.0.2" internal-slot "^1.0.7" is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.0" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.2" safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.1" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.14" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + which-typed-array "^1.1.15" es-define-property@^1.0.0: version "1.0.0" @@ -5794,7 +5995,7 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== @@ -5804,14 +6005,21 @@ es-module-lexer@^1.5.3: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== -es-set-tostringtag@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" @@ -5865,10 +6073,10 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" @@ -5938,10 +6146,10 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" @@ -5959,12 +6167,12 @@ eslint-plugin-ava@^14.0.0: pkg-dir "^5.0.0" resolve-from "^5.0.0" -eslint-plugin-escompat@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-escompat/-/eslint-plugin-escompat-3.4.0.tgz#cfd8d3b44fd0bc3d07b8ca15e4b0c15de88a0192" - integrity sha512-ufTPv8cwCxTNoLnTZBFTQ5SxU2w7E7wiMIS7PSxsgP1eAxFjtSaoZ80LRn64hI8iYziE6kJG6gX/ZCJVxh48Bg== +eslint-plugin-escompat@^3.11.3: + version "3.11.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-escompat/-/eslint-plugin-escompat-3.11.4.tgz#8b3c349be47228ada50dd25505044aa5da39835b" + integrity sha512-j0ywwNnIufshOzgAu+PfIig1c7VRClKSNKzpniMT2vXQ4leL5q+e/SpMFQU0nrdL2WFFM44XmhSuwmxb3G0CJg== dependencies: - browserslist "^4.21.0" + browserslist "^4.23.1" eslint-plugin-eslint-comments@^3.1.2, eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" @@ -5984,55 +6192,62 @@ eslint-plugin-filenames@^1.3.2: lodash.snakecase "4.1.1" lodash.upperfirst "4.3.1" -eslint-plugin-github@^4.10.2: - version "4.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-github/-/eslint-plugin-github-4.10.2.tgz#04bee657d4813f2d0f74831658cf5b036168e367" - integrity sha512-F1F5aAFgi1Y5hYoTFzGQACBkw5W1hu2Fu5FSTrMlXqrojJnKl1S2pWO/rprlowRQpt+hzHhqSpsfnodJEVd5QA== +eslint-plugin-github@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-github/-/eslint-plugin-github-5.1.4.tgz#c0c22040b842d1bab0e9afcd210d98e7f6b10f08" + integrity sha512-j5IgIxsDoch06zJzeqPvenfzRXDKI9Z8YwfUg1pm2ay1q44tMSFwvEu6l0uEIrTpA3v8QdPyLr98LqDl1TIhSA== dependencies: + "@eslint/compat" "^1.2.3" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "^9.14.0" "@github/browserslist-config" "^1.0.0" - "@typescript-eslint/eslint-plugin" "^7.0.1" - "@typescript-eslint/parser" "^7.0.1" + "@typescript-eslint/eslint-plugin" "^8.0.0" + "@typescript-eslint/parser" "^8.0.0" aria-query "^5.3.0" eslint-config-prettier ">=8.0.0" - eslint-plugin-escompat "^3.3.3" + eslint-plugin-escompat "^3.11.3" eslint-plugin-eslint-comments "^3.2.0" eslint-plugin-filenames "^1.3.2" eslint-plugin-i18n-text "^1.0.1" eslint-plugin-import "^2.25.2" eslint-plugin-jsx-a11y "^6.7.1" eslint-plugin-no-only-tests "^3.0.0" - eslint-plugin-prettier "^5.0.0" + eslint-plugin-prettier "^5.2.1" eslint-rule-documentation ">=1.0.0" + globals "^15.12.0" jsx-ast-utils "^3.3.2" prettier "^3.0.0" svg-element-attributes "^1.3.1" + typescript-eslint "^8.14.0" eslint-plugin-i18n-text@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz#69ce14f9af7d135cbe8114b1b144a57bb83291dc" integrity sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA== -eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== +eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.31.0: + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jsdoc@^48.5.2: @@ -6078,13 +6293,13 @@ eslint-plugin-no-only-tests@^3.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz#f38e4935c6c6c4842bf158b64aaa20c366fe171b" integrity sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw== -eslint-plugin-prettier@^5.0.0, eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== +eslint-plugin-prettier@^5.1.3, eslint-plugin-prettier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" + synckit "^0.9.1" eslint-plugin-require-extensions@^0.1.3: version "0.1.3" @@ -6126,21 +6341,26 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^8.57.1: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -6179,8 +6399,17 @@ esm@agoric-labs/esm#Agoric-built: version "3.2.25" resolved "https://codeload.github.com/agoric-labs/esm/tar.gz/3603726ad4636b2f865f463188fcaade6375638e" -espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: - version "9.6.1" +espree@^10.0.1: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: + version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: @@ -6199,9 +6428,9 @@ espurify@^2.1.1: integrity sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ== esquery@^1.4.2, esquery@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -6242,6 +6471,19 @@ etag@^1.8.1, etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +ethers@^6.13.4: + version "6.13.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c" + integrity sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -6255,11 +6497,34 @@ event-lite@^0.1.1: resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d" integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +execa@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-9.1.0.tgz#c42845d2b079642b8e07d9de81db13cdb91e7a9b" + integrity sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw== + dependencies: + "@sindresorhus/merge-streams" "^4.0.0" + cross-spawn "^7.0.3" + figures "^6.1.0" + get-stream "^9.0.0" + human-signals "^7.0.0" + is-plain-obj "^4.1.0" + is-stream "^4.0.1" + npm-run-path "^5.2.0" + pretty-ms "^9.0.0" + signal-exit "^4.1.0" + strip-final-newline "^4.0.0" + yoctocolors "^2.0.0" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -6350,6 +6615,11 @@ ext@^1.1.2: dependencies: type "^2.7.2" +extend@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -6385,10 +6655,10 @@ fast-diff@^1.1.2, fast-diff@^1.2.0: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@3, fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== +fast-glob@3, fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -6420,7 +6690,7 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-safe-stringify@2.0.4: version "2.0.4" @@ -6428,9 +6698,9 @@ fast-safe-stringify@2.0.4: integrity sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -6468,6 +6738,13 @@ figures@^5.0.0: escape-string-regexp "^5.0.0" is-unicode-supported "^1.2.0" +figures@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" + integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== + dependencies: + is-unicode-supported "^2.0.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6494,6 +6771,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== + finalhandler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.0.0.tgz#9d3c79156dfa798069db7de7dd53bc37546f564b" @@ -6546,11 +6828,12 @@ find-yarn-workspace-root@^2.0.0: micromatch "^4.0.2" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -6558,10 +6841,10 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== fn.name@1.x.x: version "1.1.0" @@ -6588,6 +6871,16 @@ foreground-child@^3.1.0, foreground-child@^3.1.1: cross-spawn "^7.0.0" signal-exit "^4.0.1" +form-data@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" + integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + safe-buffer "^5.2.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -6699,6 +6992,25 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +gaxios@^6.0.0, gaxios@^6.1.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" + integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + uuid "^9.0.1" + +gcp-metadata@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + dependencies: + gaxios "^6.0.0" + json-bigint "^1.0.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6709,7 +7021,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -6750,6 +7062,14 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" + integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== + dependencies: + "@sec-ant/readable-stream" "^0.4.1" + is-stream "^4.0.1" + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -6857,16 +7177,17 @@ glob@8.0.3: minimatch "^5.0.1" once "^1.3.0" -glob@^10.0.0, glob@^10.2.2, glob@^10.3.7: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob@^10.0.0, glob@^10.2.2, glob@^10.3.7, glob@^10.4.1: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" @@ -6897,20 +7218,31 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.1, globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.12.0: + version "15.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.13.0.tgz#bbec719d69aafef188ecd67954aae76a696010fc" + integrity sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g== + +globalthis@^1.0.1, globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" -globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6933,6 +7265,36 @@ globby@^13.1.4: merge2 "^1.4.1" slash "^4.0.0" +google-auth-library@^9.3.0: + version "9.14.2" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.14.2.tgz#92a53ba32b3a9ff9ced8ed34129edb5a7fa7fb52" + integrity sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA== + dependencies: + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + gaxios "^6.1.1" + gcp-metadata "^6.1.0" + gtoken "^7.0.0" + jws "^4.0.0" + +google-gax@^4.0.3: + version "4.4.1" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-4.4.1.tgz#95a9cf7ee7777ac22d1926a45b5f886dd8beecae" + integrity sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg== + dependencies: + "@grpc/grpc-js" "^1.10.9" + "@grpc/proto-loader" "^0.7.13" + "@types/long" "^4.0.0" + abort-controller "^3.0.0" + duplexify "^4.0.0" + google-auth-library "^9.3.0" + node-fetch "^2.7.0" + object-hash "^3.0.0" + proto3-json-serializer "^2.0.2" + protobufjs "^7.3.2" + retry-request "^7.0.0" + uuid "^9.0.1" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -6950,6 +7312,14 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gtoken@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" + integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== + dependencies: + gaxios "^6.0.0" + jws "^4.0.0" + handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -6996,17 +7366,19 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.1.0.tgz#deb10494cbbe8809bce168a3b961f42969f5ed43" + integrity sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q== + dependencies: + call-bind "^1.0.7" has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.1: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -7033,7 +7405,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0, hasown@^2.0.1: +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -7133,6 +7505,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -7143,6 +7523,11 @@ human-signals@^4.3.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== +human-signals@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-7.0.0.tgz#93e58e0c19cfec1dded4af10cd4969f5ab75f6c8" + integrity sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -7189,9 +7574,9 @@ ignore-walk@^5.0.1: minimatch "^5.0.1" ignore@^5.0.4, ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -7427,6 +7812,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -7461,14 +7853,21 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7490,6 +7889,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== + dependencies: + call-bind "^1.0.7" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -7505,6 +7911,13 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -7522,15 +7935,20 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -7569,6 +7987,11 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-obj@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -7606,12 +8029,17 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-ssh@^1.4.0: version "1.4.0" @@ -7630,6 +8058,11 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" + integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -7651,7 +8084,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.13, is-typed-array@^1.1.9: +is-typed-array@^1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== @@ -7673,6 +8106,16 @@ is-unicode-supported@^1.2.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== +is-unicode-supported@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7680,6 +8123,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -7700,7 +8151,7 @@ isarray@^2.0.5: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" @@ -7745,10 +8196,10 @@ istanbul-reports@^3.1.6: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -7883,6 +8334,18 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -7906,7 +8369,7 @@ json-schema-traverse@^1.0.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1, json-stable-stringify@^1.0.2: version "1.1.1" @@ -7982,6 +8445,30 @@ just-diff@^5.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +jwa@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" + integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -8162,7 +8649,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash.camelcase@4.3.0: +lodash.camelcase@4.3.0, lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== @@ -8247,6 +8734,11 @@ long@*, long@^5.0.0, long@^5.2.0, long@^5.2.1: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -8266,11 +8758,6 @@ lru-cache@^7.14.0, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" - integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== - lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" @@ -8815,7 +9302,7 @@ minimatch@5.1.0: dependencies: brace-expansion "^2.0.1" -"minimatch@6 || 7 || 8 || 9", minimatch@^9.0.1, minimatch@^9.0.4, minimatch@^9.0.5: +"minimatch@6 || 7 || 8 || 9", minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -8925,10 +9412,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -8969,11 +9456,6 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -9073,7 +9555,7 @@ napi-thread-safe-callback@0.0.6: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@^0.6.3: version "0.6.3" @@ -9132,7 +9614,7 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.9, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -9171,10 +9653,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== nofilter@^3.1.0: version "3.1.0" @@ -9335,7 +9817,7 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: +npm-run-path@^5.1.0, npm-run-path@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== @@ -9408,10 +9890,15 @@ object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" @@ -9437,34 +9924,33 @@ object.entries@^1.1.5, object.entries@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -object.fromentries@^2.0.6, object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.6, object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.groupby@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec" - integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - array.prototype.filter "^1.0.3" - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.0.0" + es-abstract "^1.23.2" -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" @@ -9553,16 +10039,16 @@ opentracing@>=0.12.1: integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" ora@^5.4.1: version "5.4.1" @@ -9723,6 +10209,11 @@ p-waterfall@^2.1.1: dependencies: p-reduce "^2.0.0" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + pacote@^13.0.3, pacote@^13.6.1: version "13.6.2" resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" @@ -9802,6 +10293,11 @@ parse-ms@^3.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== +parse-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" + integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== + parse-package-name@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-package-name/-/parse-package-name-1.0.0.tgz#1a108757e4ffc6889d5e78bcc4932a97c097a5a7" @@ -9887,12 +10383,12 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@^0.1.2: @@ -9917,10 +10413,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -9952,7 +10448,7 @@ pify@^5.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pirates@^4.0.4, pirates@^4.0.6: +pirates@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== @@ -9993,6 +10489,11 @@ plur@^5.1.0: dependencies: irregular-plurals "^3.3.0" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + pprof-format@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/pprof-format/-/pprof-format-2.0.7.tgz#526e4361f8b37d16b2ec4bb0696b5292de5046a4" @@ -10050,10 +10551,10 @@ prettier@^2.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.0.0, prettier@^3.3.2, prettier@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@^3.0.0, prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-format@^29.5.0: version "29.5.0" @@ -10071,6 +10572,13 @@ pretty-ms@^8.0.0: dependencies: parse-ms "^3.0.0" +pretty-ms@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.2.0.tgz#e14c0aad6493b69ed63114442a84133d7e560ef0" + integrity sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg== + dependencies: + parse-ms "^4.0.0" + proc-log@^2.0.0, proc-log@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" @@ -10132,7 +10640,14 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -protobufjs@^6.8.8, protobufjs@^7.2.4, protobufjs@^7.2.6, protobufjs@^7.3.0: +proto3-json-serializer@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz#5b705203b4d58f3880596c95fad64902617529dd" + integrity sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ== + dependencies: + protobufjs "^7.2.5" + +protobufjs@^6.8.8, protobufjs@^7.2.4, protobufjs@^7.2.5, protobufjs@^7.2.6, protobufjs@^7.3.0, protobufjs@^7.3.2: version "7.4.0" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== @@ -10182,9 +10697,9 @@ punycode.js@^2.3.1: integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^5.0.1: version "5.0.1" @@ -10203,6 +10718,15 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" +query-string@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.1.1.tgz#dbfebb4196aeb2919915f2b2b81b91b965cf03a0" + integrity sha512-MWkCOVIcJP9QSKU52Ngow6bsAWAPlPK2MludXvcrS2bGZSl+T1qX9MZvRIkqUIkGLJquMJHWfsT6eRqUpp4aWg== + dependencies: + decode-uri-component "^0.4.1" + filter-obj "^5.1.0" + split-on-first "^3.0.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -10373,6 +10897,19 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" + integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + which-builtin-type "^1.1.4" + regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -10402,15 +10939,15 @@ regex@4.3.2: resolved "https://registry.yarnpkg.com/regex/-/regex-4.3.2.tgz#a68a68c9b337a77bf4ce4ed0b4b1a49d97cb3b7b" integrity sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" regexpu-core@^5.3.1: version "5.3.2" @@ -10493,6 +11030,15 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry-request@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-7.0.2.tgz#60bf48cfb424ec01b03fca6665dee91d06dd95f3" + integrity sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w== + dependencies: + "@types/request" "^2.48.8" + extend "^3.0.2" + teeny-request "^9.0.0" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -10529,7 +11075,7 @@ rimraf@^2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" -rimraf@^5.0.0, rimraf@^5.0.5: +rimraf@^5.0.0: version "5.0.5" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== @@ -10633,13 +11179,13 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-array-concat@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" - integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.5" - get-intrinsic "^1.2.2" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -10648,7 +11194,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -10729,19 +11275,12 @@ serve-static@^2.1.0: parseurl "^1.3.3" send "^1.0.0" -ses@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ses/-/ses-1.9.0.tgz#ebf2de9759a21b09550aef0645c3f9b817409381" - integrity sha512-ZDAkixRUIPId1oXVxDhj1sIzFUeJ3vzaJCd64Ra1owuVH6Bcd+IOGrJtiFqUTA+YC9w8jTE9XkZTwin+hkbn5Q== - dependencies: - "@endo/env-options" "^1.1.7" - -ses@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ses/-/ses-1.9.1.tgz#54991a775cea5f9e27292bbb6706941a8203062a" - integrity sha512-izNBxTLopF1wi5CvMdJYfCLWRYZtHGCKEtr2cbBl/Dqz3qzmDFep24I3vUAWye0GYh8aUgLLuGHbfvs5IRKasg== +ses@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/ses/-/ses-1.10.0.tgz#b611dd4605c6a1719665bac159cbd43c84d4f3a9" + integrity sha512-HXmJbNEgY/4hsQfaz5dna39vVKNyvlElRmJYk+bjTqSXSElT0Hr6NKwWVg4j0TxP6IuHp/PNMoWJKIRXzmLbAQ== dependencies: - "@endo/env-options" "^1.1.7" + "@endo/env-options" "^1.1.8" set-blocking@^2.0.0: version "2.0.0" @@ -10760,14 +11299,15 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" setprototypeof@1.2.0: version "1.2.0" @@ -10926,20 +11466,6 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -sock-daemon@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/sock-daemon/-/sock-daemon-1.4.2.tgz#b9d5d1f8b156b20a7c1ceba095da8b8745fac405" - integrity sha512-IzbegWshWWR+UzQ7487mbdYNmfJ1jXUXQBUHooqtpylO+aW0vMVbFN2d2ug3CSPZ0wbG7ZTTGwpUuthIDFIOGg== - dependencies: - rimraf "^5.0.5" - signal-exit "^4.1.0" - socket-post-message "^1.0.3" - -socket-post-message@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/socket-post-message/-/socket-post-message-1.0.3.tgz#638dfca32064eee9a784bb5be9634b19e649ac39" - integrity sha512-UhJaB3xR2oF+HvddFOq2cBZi4zVKOHvdiBo+BaScNxsEUg3TLWSP8BkweKfe07kfH1thjn1hJR0af/w1EtBFjg== - socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -11030,6 +11556,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== +split-on-first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== + split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -11085,6 +11616,18 @@ statuses@2.0.1, statuses@^2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stream-events@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" + integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== + dependencies: + stubs "^3.0.0" + +stream-shift@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -11129,32 +11672,33 @@ string.prototype.padend@^3.0.0: define-properties "^1.2.0" es-abstract "^1.22.1" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -11232,6 +11776,11 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-final-newline@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" + integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -11258,6 +11807,11 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + integrity sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw== + supertap@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" @@ -11317,18 +11871,10 @@ symbol-observable@^2.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - -synckit@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.0.tgz#5b33b458b3775e4466a5b377fba69c63572ae449" - integrity sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg== +synckit@^0.9.0, synckit@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -11384,6 +11930,17 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.2" +teeny-request@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-9.0.0.tgz#18140de2eb6595771b1b02203312dfad79a4716d" + integrity sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g== + dependencies: + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.9" + stream-events "^1.0.5" + uuid "^9.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -11411,6 +11968,15 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +test-exclude@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2" + integrity sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^10.4.1" + minimatch "^9.0.4" + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -11537,12 +12103,12 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -ts-blank-space@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/ts-blank-space/-/ts-blank-space-0.4.1.tgz#3ddc6c7c4009337ffb1811071a8fc55d8076b619" - integrity sha512-i0JvTvFaZcXCj+tcs67G0K3zXgUr1ebGvhmuB3ov0ByFrbuvTOgUwtFEOP8dN+B+ou0wkhosJ8Q4RPfi8mHFQQ== +ts-blank-space@^0.4.1, ts-blank-space@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-blank-space/-/ts-blank-space-0.4.4.tgz#05cbec3873c741f44460ce79822d654a2cc57aea" + integrity sha512-G6GkD6oEJ7j5gG2e5qAizfE4Ap7JXMpnN0CEp9FEt4LExdaqsdwB90aQsaAwcKhiSxVk5KoqFW9xfxTQ4lBUnQ== dependencies: - typescript "5.1.6 - 5.6.x" + typescript "5.1.6 - 5.7.x" tsconfig-paths@^3.15.0: version "3.15.0" @@ -11576,25 +12142,10 @@ tsd@^0.31.1: path-exists "^4.0.0" read-pkg-up "^7.0.0" -tsimp@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/tsimp/-/tsimp-2.0.11.tgz#28b7efb609a070554cedb4309c1a7def662e93ab" - integrity sha512-wRhMmvar8tWHN3ZmykD8f4B4sjCn/f8DFM67LRY+stf/LPa2Kq8ATE2PIi570/DiDJA8kjjxzos3EgP0LmnFLA== - dependencies: - "@isaacs/cached" "^1.0.1" - "@isaacs/catcher" "^1.0.4" - foreground-child "^3.1.1" - mkdirp "^3.0.1" - pirates "^4.0.6" - rimraf "^5.0.5" - signal-exit "^4.1.0" - sock-daemon "^1.4.2" - walk-up-path "^3.0.1" - -"tslib@1 || 2", tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +"tslib@1 || 2", tslib@2.7.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" @@ -11703,44 +12254,50 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== -typed-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz#0608ffe6bca71bf15a45bff0ca2604107a1325f5" - integrity sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" es-errors "^1.3.0" is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -11770,25 +12327,30 @@ typedoc@^0.26.7: shiki "^1.16.2" yaml "^2.5.1" -typescript-eslint@^7.18.0, typescript-eslint@^7.3.1: - version "7.18.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.18.0.tgz#e90d57649b2ad37a7475875fa3e834a6d9f61eb2" - integrity sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA== +typescript-eslint@^7.3.1, typescript-eslint@^8.14.0, typescript-eslint@^8.17.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.17.0.tgz#fa4033c26b3b40f778287bc12918d985481b220b" + integrity sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA== dependencies: - "@typescript-eslint/eslint-plugin" "7.18.0" - "@typescript-eslint/parser" "7.18.0" - "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/eslint-plugin" "8.17.0" + "@typescript-eslint/parser" "8.17.0" + "@typescript-eslint/utils" "8.17.0" -"typescript@5.1.6 - 5.6.x", typescript@^5.6.2, typescript@~5.6.2: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== +"typescript@5.1.6 - 5.7.x", typescript@^5.4.5, typescript@~5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== "typescript@^3 || ^4": version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@~5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" @@ -11809,10 +12371,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.11.1.tgz#432ea6e8efd54a48569705a699e62d8f4981b197" - integrity sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ== +undici-types@~6.19.2, undici-types@~6.19.8: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -11892,13 +12454,13 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -11929,6 +12491,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0, uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -11975,11 +12542,6 @@ walk-up-path@^1.0.0: resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== -walk-up-path@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" - integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -12035,16 +12597,45 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.14: - version "1.1.14" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" - integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== +which-builtin-type@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== dependencies: - available-typed-arrays "^1.0.6" - call-bind "^1.0.5" + call-bind "^1.0.7" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.1" + has-tostringtag "^1.0.2" which@^1.2.9: version "1.3.1" @@ -12091,6 +12682,11 @@ winston@3.3.3: triple-beam "^1.3.0" winston-transport "^4.4.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -12196,6 +12792,11 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + ws@^7, ws@^7.2.0: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -12289,3 +12890,8 @@ yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +yoctocolors@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc" + integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==