From 4d9fc3c90439c84756d75623fc016a335a237280 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 09:31:48 -0600 Subject: [PATCH 001/152] fix: follow @agoric/dapp package naming convention --- _agstate/agoric-servers/package.json | 2 +- api/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_agstate/agoric-servers/package.json b/_agstate/agoric-servers/package.json index 0bca3433..40a9efa4 100644 --- a/_agstate/agoric-servers/package.json +++ b/_agstate/agoric-servers/package.json @@ -1,5 +1,5 @@ { - "name": "dapp-agoric-basics-agservers", + "name": "agoric-basics-agservers", "version": "0.0.1", "description": "Agoric server instances for dapp-agoric-basics", "private": true, diff --git a/api/package.json b/api/package.json index f8845f4b..fddf2b62 100644 --- a/api/package.json +++ b/api/package.json @@ -1,5 +1,5 @@ { "$note": "@agoric/create-dapp@0.1.0 expects an api/package.json", - "name": "dapp-agoric-basics-api", + "name": "agoric-basics-api", "version": "0.1.0" -} \ No newline at end of file +} diff --git a/package.json b/package.json index 16636bf0..f020e922 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "dapp-agoric-basics", + "name": "agoric-basics", "version": "0.1.0", "license": "Apache-2.0", "private": true, From f276c9edba240ad43a3c0824b042024c800ac620 Mon Sep 17 00:00:00 2001 From: Luqi Pan Date: Thu, 7 Mar 2024 17:59:23 -0800 Subject: [PATCH 002/152] chore: use latest instead of main tag for a3p (#19) * chore: use latest instead of main tag for a3p Now that https://github.com/Agoric/agoric-3-proposals/pull/99 is merged * Update docker-compose.yml Co-authored-by: Dan Connolly --------- Co-authored-by: Dan Connolly --- docker-compose.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 15e0a908..9e45abd2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,9 +2,8 @@ version: '3.5' services: agd: - # image publication is WIP - # cf. https://github.com/Agoric/agoric-3-proposals/issues/6 - image: ghcr.io/agoric/agoric-3-proposals:main + # cf. https://github.com/Agoric/agoric-3-proposals + image: ghcr.io/agoric/agoric-3-proposals:latest platform: linux/amd64 ports: - 26656:26656 From 49c81f0fe3ca52363f0234c2dcf127d5ca9691d2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 23:14:53 -0700 Subject: [PATCH 003/152] chore(sell-concert-tickets-proposal): powers types --- contract/src/sell-concert-tickets-proposal.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets-proposal.js index 5ed25ea1..47fcdf79 100644 --- a/contract/src/sell-concert-tickets-proposal.js +++ b/contract/src/sell-concert-tickets-proposal.js @@ -62,29 +62,36 @@ const publishBrandInfo = async (chainStorage, board, brand) => { * Core eval script to start contract * * @param {BootstrapPowers} permittedPowers + * + * @typedef {{ + * installation: PromiseSpaceOf<{ sellConcertTickets: Installation}>; + * instance: PromiseSpaceOf<{ sellConcertTickets: Instance}>; + * brand: PromiseSpaceOf<{ Ticket: Brand }>; + * issuer: PromiseSpaceOf<{ Ticket: Issuer }>; + * }} SellTicketsSpace */ export const startSellConcertTicketsContract = async permittedPowers => { console.error('startSellConcertTicketsContract()...'); + /** @type {BootstrapPowers & SellTicketsSpace} */ + // @ts-expect-error cast + const sellPowers = permittedPowers; const { consume: { board, chainStorage, startUpgradable, zoe }, brand: { consume: { IST: istBrandP }, - // @ts-expect-error dynamic extension to promise space produce: { Ticket: produceTicketBrand }, }, issuer: { consume: { IST: istIssuerP }, - // @ts-expect-error dynamic extension to promise space produce: { Ticket: produceTicketIssuer }, }, installation: { consume: { sellConcertTickets: sellConcertTicketsInstallationP }, }, instance: { - // @ts-expect-error dynamic extension to promise space produce: { sellConcertTickets: produceInstance }, }, - } = permittedPowers; + } = sellPowers; const istIssuer = await istIssuerP; const istBrand = await istBrandP; From c40ef86cc783dbf1045c0370320169b7f0f0df1c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 23:24:44 -0700 Subject: [PATCH 004/152] fixup(test-sell-concet-tickets-contract): types --- contract/test/test-sell-concert-tickets-contract.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index e7a984a0..ea21b7d7 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -101,7 +101,7 @@ test('Start the contract', async t => { * * @param {import('ava').ExecutionContext} t * @param {ZoeService} zoe - * @param {ERef} instance + * @param {ERef>} instance * @param {Purse} purse * @param {[string, NatValue][]} choices * @param {boolean} expectSuccessfulTrade @@ -269,7 +269,12 @@ test('use the code that will go on chain to start the contract', async t => { }, instance: { produce: { sellConcertTickets: sync.instance } }, }; - return powers; + + /** @type {BootstrapPowers} */ + // @ts-expect-error mock + const typedPowers = powers; + + return typedPowers; }; const powers = await mockBootstrap(); From 65d5128999df7dd889a4eff7717bc9dba0b283fe Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 16:18:55 -0600 Subject: [PATCH 005/152] build(contract): devdeps: vats, smart-wallet, xsnap, nat --- contract/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contract/package.json b/contract/package.json index ed97ef41..6b02bf67 100644 --- a/contract/package.json +++ b/contract/package.json @@ -19,9 +19,13 @@ "devDependencies": { "@agoric/deploy-script-support": "^0.10.4-u12.0", "@agoric/eslint-config": "dev", + "@agoric/smart-wallet": "0.5.3", + "@agoric/vats": "0.15.2-u12.0", + "@agoric/xsnap": "0.14.3-u12.0", "@endo/bundle-source": "^2.8.0", "@endo/eslint-plugin": "^0.5.2", "@endo/init": "^0.5.60", + "@endo/nat": "^4.1.27", "@endo/promise-kit": "0.2.56", "@endo/ses-ava": "^0.2.44", "@jessie.js/eslint-plugin": "^0.4.0", From 3186c3ea422a80176910faf37787b50660961fbf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:11:07 -0700 Subject: [PATCH 006/152] build(contract): lint:types; skip lint for generated code --- contract/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contract/package.json b/contract/package.json index 6b02bf67..8d9c8cb4 100644 --- a/contract/package.json +++ b/contract/package.json @@ -14,6 +14,7 @@ "build": "agoric run scripts/build-contract-deployer.js", "test": "ava --verbose", "lint": "eslint '**/*.js'", + "lint:types": "tsc -p jsconfig.json", "lint:fix": "eslint --fix '**/*.js'" }, "devDependencies": { @@ -77,6 +78,7 @@ "sourceType": "module", "ecmaVersion": 2021 }, + "ignorePatterns": "bundles/**.js", "extends": [ "@agoric" ] From e729b72e4b82c5b81ee010d18ad8bc534408b5bf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 14:52:27 -0600 Subject: [PATCH 007/152] build: borrow @agoric/vats patch from swaparoo 0a94313 --- patches/@agoric+vats+0.15.2-u12.0.patch | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 patches/@agoric+vats+0.15.2-u12.0.patch diff --git a/patches/@agoric+vats+0.15.2-u12.0.patch b/patches/@agoric+vats+0.15.2-u12.0.patch new file mode 100644 index 00000000..c023f551 --- /dev/null +++ b/patches/@agoric+vats+0.15.2-u12.0.patch @@ -0,0 +1,16 @@ +diff --git a/node_modules/@agoric/vats/index.js b/node_modules/@agoric/vats/index.js +new file mode 100644 +index 0000000..05aabbc +--- /dev/null ++++ b/node_modules/@agoric/vats/index.js +@@ -0,0 +1,10 @@ ++// @ts-check ++// Ambient types ++import './src/core/types.js'; ++ ++// eslint-disable-next-line import/export -- no named exports ++export * from './src/types.js'; ++export * from './src/nameHub.js'; ++export * from './src/bridge.js'; ++export { makePromiseSpace } from './src/core/promise-space.js'; ++export { makeAgoricNamesAccess } from './src/core/utils.js'; From e430782a7cd9b71db2a9ec5b925163bbb4ef4ee8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 17:52:03 -0600 Subject: [PATCH 008/152] build: patch vats at postinstall --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index f020e922..5acff767 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@babel/highlight": "7.22.5" }, "scripts": { + "postinstall": "patch-package", "start:docker": "cd contract && docker compose up -d", "docker:logs": "cd contract; docker compose logs --tail 200 -f", "docker:bash": "cd contract; docker compose exec agd bash", @@ -48,5 +49,8 @@ "test": "yarn workspaces run test", "test:e2e": "yarn workspace agoric-basics-ui test:e2e", "build": "yarn workspaces run build" + }, + "dependencies": { + "patch-package": "^8.0.0" } } From ef6ed53560b60b8c59d0d4ff6517d5dd135bf797 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:20:10 -0600 Subject: [PATCH 009/152] chore(fixHub): copy b8be868 --- contract/src/fixHub.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 contract/src/fixHub.js diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js new file mode 100644 index 00000000..3e96d1c7 --- /dev/null +++ b/contract/src/fixHub.js @@ -0,0 +1,29 @@ +// @ts-check +import { E, Far } from '@endo/far'; + +const { Fail } = assert; + +/** + * ref https://github.com/Agoric/agoric-sdk/issues/8408#issuecomment-1741445458 + * + * @param {ERef} namesByAddressAdmin + */ +export const fixHub = async namesByAddressAdmin => { + /** @type {import('@agoric/vats').NameHub} */ + const hub = Far('Hub work-around', { + lookup: async (addr, ...rest) => { + await E(namesByAddressAdmin).reserve(addr); + const addressAdmin = await E(namesByAddressAdmin).lookupAdmin(addr); + assert(addressAdmin, 'no admin???'); + const addressHub = E(addressAdmin).readonly(); + if (rest.length === 0) return addressHub; + await E(addressAdmin).reserve(rest[0]); + return E(addressHub).lookup(...rest); + }, + has: _key => Fail`key space not well defined`, + entries: () => Fail`enumeration not supported`, + values: () => Fail`enumeration not supported`, + keys: () => Fail`enumeration not supported`, + }); + return hub; +}; From b9eaf5fab18c5b39c277752d51ae8b793ec16cb9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 10 Mar 2024 17:10:54 -0500 Subject: [PATCH 010/152] chore(fixHub): validate early --- contract/src/fixHub.js | 1 + 1 file changed, 1 insertion(+) diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js index 3e96d1c7..1583c837 100644 --- a/contract/src/fixHub.js +++ b/contract/src/fixHub.js @@ -9,6 +9,7 @@ const { Fail } = assert; * @param {ERef} namesByAddressAdmin */ export const fixHub = async namesByAddressAdmin => { + assert(namesByAddressAdmin, 'no namesByAddressAdmin???'); /** @type {import('@agoric/vats').NameHub} */ const hub = Far('Hub work-around', { lookup: async (addr, ...rest) => { From 270f1c7b776ed50de5254731fd7eab42c37c63b3 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 14:59:18 -0600 Subject: [PATCH 011/152] chore(collectFees): copy from swaparoo ade0474 --- contract/src/collectFees.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 contract/src/collectFees.js diff --git a/contract/src/collectFees.js b/contract/src/collectFees.js new file mode 100644 index 00000000..11fa6be5 --- /dev/null +++ b/contract/src/collectFees.js @@ -0,0 +1,24 @@ +// @jessie-check + +import { atomicTransfer } from '@agoric/zoe/src/contractSupport/index.js'; + +/** + * Provide shared support for providing access to fees from a service contract. + * + * @param {ZCF} zcf + * @param {ZCFSeat} feeSeat + * @param {Brand} feeBrand + * @param {string} keyword + * @returns {Promise>} + */ +export const makeCollectFeesInvitation = (zcf, feeSeat, feeBrand, keyword) => { + const collectFees = seat => { + const amount = feeSeat.getAmountAllocated(keyword, feeBrand); + atomicTransfer(zcf, feeSeat, seat, { [keyword]: amount }, { Fee: amount }); + + seat.exit(); + return `paid out ${amount.value}`; + }; + + return zcf.makeInvitation(collectFees, 'collect fees'); +}; From 049a816ce284aa728a757c9a85cd38d31c4d1482 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 14:57:57 -0600 Subject: [PATCH 012/152] chore(swaparoo): borrow contract code from 85c1a17 --- contract/src/swaparoo.js | 172 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 contract/src/swaparoo.js diff --git a/contract/src/swaparoo.js b/contract/src/swaparoo.js new file mode 100644 index 00000000..aa417f76 --- /dev/null +++ b/contract/src/swaparoo.js @@ -0,0 +1,172 @@ +/** @file swap assets */ +/* eslint @typescript-eslint/no-floating-promises: "warn" */ +// @ts-check + +import { M, matches, mustMatch } from '@endo/patterns'; +import { E, Far } from '@endo/far'; +import '@agoric/zoe/exported.js'; +import { atomicRearrange } from '@agoric/zoe/src/contractSupport/atomicTransfer.js'; +import '@agoric/zoe/src/contracts/exported.js'; +import { AmountShape } from '@agoric/ertp/src/typeGuards.js'; +import { makeCollectFeesInvitation } from './collectFees.js'; + +import { makeTracer } from './debug.js'; + +const { quote: q } = assert; + +const trace = makeTracer('Swaparoo', true); + +const makeNatAmountShape = (brand, min) => + harden({ brand, value: min ? M.gte(min) : M.nat() }); + +export const swapWithFee = (zcf, firstSeat, secondSeat, feeSeat, feeAmount) => { + try { + const { Fee: _, ...firstGive } = firstSeat.getProposal().give; + + atomicRearrange( + zcf, + harden([ + [firstSeat, secondSeat, firstGive], + [secondSeat, firstSeat, secondSeat.getProposal().give], + [firstSeat, feeSeat, { Fee: feeAmount }], + ]), + ); + } catch (err) { + firstSeat.fail(err); + secondSeat.fail(err); + throw err; + } + + firstSeat.exit(); + secondSeat.exit(); + return 'success'; +}; + +let issuerNumber = 1; +const IssuerShape = M.remotable('Issuer'); + +/** + * ref https://github.com/Agoric/agoric-sdk/issues/8408#issuecomment-1741445458 + * + * @param {ERef} namesByAddressAdmin + * @param namesByAddressAdminP + */ +const fixHub = async namesByAddressAdmin => { + /** @type {import('@agoric/vats').NameHub} */ + // @ts-expect-error mock. no has, keys, ... + const hub = Far('Hub work-around', { + lookup: async (addr, key, ...rest) => { + if (!(addr && key && rest.length === 0)) { + throw Error('unsupported'); + } + await E(namesByAddressAdmin).reserve(addr); + const addressAdmin = await E(namesByAddressAdmin).lookupAdmin(addr); + assert(addressAdmin, 'no admin???'); + await E(addressAdmin).reserve(key); + const addressHub = E(addressAdmin).readonly(); + return E(addressHub).lookup(key); + }, + }); + return hub; +}; + +/** + * @param {ZCF<{feeAmount: Amount<'nat'>, namesByAddressAdmin: NamesByAddressAdmin}>} zcf + */ +export const start = async zcf => { + // set up fee handling + const { feeAmount, namesByAddressAdmin } = zcf.getTerms(); + /** @type { ERef> } */ + const stableIssuer = await E(zcf.getZoeService()).getFeeIssuer(); + const feeBrand = await E(stableIssuer).getBrand(); + const { zcfSeat: feeSeat } = zcf.makeEmptySeatKit(); + const feeShape = makeNatAmountShape(feeBrand, feeAmount.value); + const depositFacetFromAddr = fixHub(namesByAddressAdmin); + + /** @type {OfferHandler} */ + const makeSecondInvitation = async ( + firstSeat, + { addr: secondPartyAddress }, + ) => { + mustMatch(secondPartyAddress, M.string()); + const { want, give } = firstSeat.getProposal(); + + const makeSecondProposalShape = want => { + const givePattern = Object.fromEntries( + Object.keys(want).map(k => [k, M.any()]), + ); + + return M.splitRecord({ + give: M.splitRecord(givePattern), + }); + }; + + /** @type {OfferHandler} */ + const secondSeatOfferHandler = secondSeat => { + if (!matches(secondSeat.getProposal(), makeSecondProposalShape(want))) { + // The second invitation was burned; let them both know it didn't work + const error = Error( + `Proposals didn't match, first want: ${q(want)}, second give: ${q( + secondSeat.getProposal().give, + )}`, + ); + secondSeat.fail(error); + firstSeat.fail(error); + return; + } + + return swapWithFee(zcf, firstSeat, secondSeat, feeSeat, feeAmount); + }; + + const secondSeatInvitation = await zcf.makeInvitation( + secondSeatOfferHandler, + 'matchOffer', + { give, want }, // "give" and "want" are from the proposer's perspective + ); + + const secondDepositFacet = await E(depositFacetFromAddr).lookup( + secondPartyAddress, + 'depositFacet', + ); + + await E(secondDepositFacet).receive(secondSeatInvitation); + return 'invitation sent'; + }; + + /** + * returns an offer to create a specific swap + * + * @param {Issuer[]} issuers + */ + const makeFirstInvitation = issuers => { + mustMatch(issuers, M.arrayOf(IssuerShape)); + issuers.forEach(i => { + if (!Object.values(zcf.getTerms().issuers).includes(i)) { + return zcf.saveIssuer(i, `Issuer${issuerNumber++}`); + } + }); + const proposalShape = M.splitRecord({ + give: M.splitRecord({ Fee: feeShape }), + }); + + const firstInvitation = zcf.makeInvitation( + makeSecondInvitation, + 'create a swap', + undefined, + proposalShape, + ); + return firstInvitation; + }; + + const publicFacet = Far('Public', { + makeFirstInvitation, + }); + const creatorFacet = Far('Creator', { + makeCollectFeesInvitation() { + return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee'); + }, + }); + + return harden({ publicFacet, creatorFacet }); +}; +harden(start); From 932f83c5df8d048ebe1999e442995c0af3242c75 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:15:04 -0700 Subject: [PATCH 013/152] fix(swaparoo): handle undefined offerArgs - prune dead code - avoid ++ - fix shadow --- contract/src/swaparoo.js | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/contract/src/swaparoo.js b/contract/src/swaparoo.js index aa417f76..68bea2bc 100644 --- a/contract/src/swaparoo.js +++ b/contract/src/swaparoo.js @@ -1,5 +1,4 @@ /** @file swap assets */ -/* eslint @typescript-eslint/no-floating-promises: "warn" */ // @ts-check import { M, matches, mustMatch } from '@endo/patterns'; @@ -7,15 +6,10 @@ import { E, Far } from '@endo/far'; import '@agoric/zoe/exported.js'; import { atomicRearrange } from '@agoric/zoe/src/contractSupport/atomicTransfer.js'; import '@agoric/zoe/src/contracts/exported.js'; -import { AmountShape } from '@agoric/ertp/src/typeGuards.js'; import { makeCollectFeesInvitation } from './collectFees.js'; -import { makeTracer } from './debug.js'; - const { quote: q } = assert; -const trace = makeTracer('Swaparoo', true); - const makeNatAmountShape = (brand, min) => harden({ brand, value: min ? M.gte(min) : M.nat() }); @@ -49,7 +43,6 @@ const IssuerShape = M.remotable('Issuer'); * ref https://github.com/Agoric/agoric-sdk/issues/8408#issuecomment-1741445458 * * @param {ERef} namesByAddressAdmin - * @param namesByAddressAdminP */ const fixHub = async namesByAddressAdmin => { /** @type {import('@agoric/vats').NameHub} */ @@ -71,7 +64,7 @@ const fixHub = async namesByAddressAdmin => { }; /** - * @param {ZCF<{feeAmount: Amount<'nat'>, namesByAddressAdmin: NamesByAddressAdmin}>} zcf + * @param {ZCF<{feeAmount: Amount<'nat'>, namesByAddressAdmin: import('@agoric/vats').NamesByAddressAdmin}>} zcf */ export const start = async zcf => { // set up fee handling @@ -83,13 +76,13 @@ export const start = async zcf => { const feeShape = makeNatAmountShape(feeBrand, feeAmount.value); const depositFacetFromAddr = fixHub(namesByAddressAdmin); - /** @type {OfferHandler} */ - const makeSecondInvitation = async ( - firstSeat, - { addr: secondPartyAddress }, - ) => { - mustMatch(secondPartyAddress, M.string()); - const { want, give } = firstSeat.getProposal(); + /** + * @param { ZCFSeat } firstSeat + * @param {{ addr: string }} offerArgs + */ + const makeSecondInvitation = async (firstSeat, offerArgs ) => { + mustMatch(offerArgs, harden({ addr: M.string() })); + const { addr: secondPartyAddress } = offerArgs; const makeSecondProposalShape = want => { const givePattern = Object.fromEntries( @@ -101,6 +94,8 @@ export const start = async zcf => { }); }; + const { want, give } = firstSeat.getProposal(); + /** @type {OfferHandler} */ const secondSeatOfferHandler = secondSeat => { if (!matches(secondSeat.getProposal(), makeSecondProposalShape(want))) { @@ -140,11 +135,11 @@ export const start = async zcf => { */ const makeFirstInvitation = issuers => { mustMatch(issuers, M.arrayOf(IssuerShape)); - issuers.forEach(i => { + for (const i of issuers) { if (!Object.values(zcf.getTerms().issuers).includes(i)) { - return zcf.saveIssuer(i, `Issuer${issuerNumber++}`); + zcf.saveIssuer(i, `Issuer${issuerNumber += 1}`); } - }); + }; const proposalShape = M.splitRecord({ give: M.splitRecord({ Fee: feeShape }), }); From d1078b133fe72d84305ebf38f667b6e04ffd30fa Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 14:57:04 -0600 Subject: [PATCH 014/152] chore(start-contract-proposal): borrow from swaparoo 33f5dde --- contract/src/start-contract-proposal.js | 143 ++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 contract/src/start-contract-proposal.js diff --git a/contract/src/start-contract-proposal.js b/contract/src/start-contract-proposal.js new file mode 100644 index 00000000..14f3e582 --- /dev/null +++ b/contract/src/start-contract-proposal.js @@ -0,0 +1,143 @@ +// @ts-check +import { E } from '@endo/far'; +import { makeMarshal } from '@endo/marshal'; +import { AmountMath } from '@agoric/ertp/src/amountMath.js'; + +console.warn('start-contract-proposal.js module evaluating'); + +const { Fail } = assert; + +// vstorage paths under published.* +const BOARD_AUX = 'boardAux'; + +const marshalData = makeMarshal(_val => Fail`data only`); + +const IST_UNIT = 1_000_000n; +const CENT = IST_UNIT / 100n; + +/** + * Make a storage node for auxilliary 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); +}; + +const publishBrandInfo = async (chainStorage, board, brand) => { + const [id, displayInfo] = await Promise.all([ + E(board).getId(brand), + E(brand).getDisplayInfo(), + ]); + const node = makeBoardAuxNode(chainStorage, id); + const aux = marshalData.toCapData(harden({ displayInfo })); + await E(node).setValue(JSON.stringify(aux)); +}; + +const contractName = 'swaparoo'; + +/** + * Core eval script to install contract + * + * @param {BootstrapPowers} powers + */ +export const installContract = async (powers, config) => { + console.log('installContract() ...', contractName); + const { bundleID = Fail`missing bundleID` } = + config.options?.[contractName] || {}; + const { + consume: { zoe }, + installation: { + produce: { [contractName]: produceInstallation }, + }, + } = powers; + + const installation = await E(zoe).installBundleID(bundleID); + produceInstallation.reset(); + produceInstallation.resolve(installation); + console.log(contractName, '(re)installed'); +}; + +/** + * Core eval script to start contract + * + * @param {BootstrapPowers} permittedPowers + */ +export const startContract = async permittedPowers => { + console.error('startContract()...'); + const { + consume: { startUpgradable, namesByAddressAdmin: namesByAddressAdminP }, + brand: { + consume: { IST: istBrandP }, + }, + // issuer: { + // // @ts-expect-error dynamic extension to promise space + // produce: { Place: producePlaceIssuer }, + // }, + installation: { + consume: { [contractName]: installationP }, + }, + instance: { + produce: { [contractName]: produceInstance }, + }, + } = permittedPowers; + + const istBrand = await istBrandP; + const ist = { + brand: istBrand, + }; + // NOTE: TODO all terms for the contract go here + let oneIST = AmountMath.make(istBrand, 1n); + const namesByAddressAdmin = await namesByAddressAdminP; + const terms = { feeAmount: oneIST, namesByAddressAdmin }; + + const installation = await installationP; + + const { instance } = await E(startUpgradable)({ + installation, + label: contractName, + terms, + }); + console.log('CoreEval script: started game contract', instance); + // const {} = await E(zoe).getTerms(instance); + + console.log('CoreEval script: share via agoricNames: none'); + + produceInstance.reset(); + produceInstance.resolve(instance); + + console.log(`${contractName} (re)installed`); +}; + +/** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifest } */ +const contractManifest = { + [startContract.name]: { + consume: { + startUpgradable: true, + namesByAddressAdmin: true, // to convert string addresses to depositFacets + }, + installation: { consume: { [contractName]: true } }, + instance: { produce: { [contractName]: true } }, + brand: { + consume: { + IST: true, // for use in contract terms + }, + }, + }, +}; +harden(contractManifest); + +export const getManifestForContract = ( + { restoreRef }, + { [`${contractName}Ref`]: contractRef }, +) => { + console.log('manifest ref', contractName, contractRef); + return harden({ + manifest: contractManifest, + installations: { + [contractName]: restoreRef(contractRef), + }, + }); +}; From ed1662f3e28c7f94771f985ddf20fc31cbbc7e4d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:13:37 -0700 Subject: [PATCH 015/152] chore(start-contract-proposal): swap bootstrap types - prune dead code - add static types --- contract/src/start-contract-proposal.js | 53 +++++++------------------ 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/contract/src/start-contract-proposal.js b/contract/src/start-contract-proposal.js index 14f3e582..2ae69e0e 100644 --- a/contract/src/start-contract-proposal.js +++ b/contract/src/start-contract-proposal.js @@ -1,50 +1,31 @@ // @ts-check import { E } from '@endo/far'; -import { makeMarshal } from '@endo/marshal'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; console.warn('start-contract-proposal.js module evaluating'); const { Fail } = assert; -// vstorage paths under published.* -const BOARD_AUX = 'boardAux'; - -const marshalData = makeMarshal(_val => Fail`data only`); - -const IST_UNIT = 1_000_000n; -const CENT = IST_UNIT / 100n; +const contractName = 'swaparoo'; /** - * Make a storage node for auxilliary data for a value on the board. - * - * @param {ERef} chainStorage - * @param {string} boardId + * @typedef {{ + * installation: PromiseSpaceOf<{ swaparoo: Installation }>; + * instance: PromiseSpaceOf<{ swaparoo: Instance }>; + * }} SwaparooSpace */ -const makeBoardAuxNode = async (chainStorage, boardId) => { - const boardAux = E(chainStorage).makeChildNode(BOARD_AUX); - return E(boardAux).makeChildNode(boardId); -}; - -const publishBrandInfo = async (chainStorage, board, brand) => { - const [id, displayInfo] = await Promise.all([ - E(board).getId(brand), - E(brand).getDisplayInfo(), - ]); - const node = makeBoardAuxNode(chainStorage, id); - const aux = marshalData.toCapData(harden({ displayInfo })); - await E(node).setValue(JSON.stringify(aux)); -}; - -const contractName = 'swaparoo'; /** * Core eval script to install contract * * @param {BootstrapPowers} powers + * @param {*} config */ export const installContract = async (powers, config) => { console.log('installContract() ...', contractName); + /** @type { BootstrapPowers & SwaparooSpace} */ + // @ts-expect-error cast + const swapPowers = powers; const { bundleID = Fail`missing bundleID` } = config.options?.[contractName] || {}; const { @@ -52,7 +33,7 @@ export const installContract = async (powers, config) => { installation: { produce: { [contractName]: produceInstallation }, }, - } = powers; + } = swapPowers; const installation = await E(zoe).installBundleID(bundleID); produceInstallation.reset(); @@ -67,29 +48,25 @@ export const installContract = async (powers, config) => { */ export const startContract = async permittedPowers => { console.error('startContract()...'); + /** @type { BootstrapPowers & SwaparooSpace} */ + // @ts-expect-error bootstrap powers evolve with BLD staker governance + const swapPowers = permittedPowers; const { consume: { startUpgradable, namesByAddressAdmin: namesByAddressAdminP }, brand: { consume: { IST: istBrandP }, }, - // issuer: { - // // @ts-expect-error dynamic extension to promise space - // produce: { Place: producePlaceIssuer }, - // }, installation: { consume: { [contractName]: installationP }, }, instance: { produce: { [contractName]: produceInstance }, }, - } = permittedPowers; + } = swapPowers; const istBrand = await istBrandP; - const ist = { - brand: istBrand, - }; // NOTE: TODO all terms for the contract go here - let oneIST = AmountMath.make(istBrand, 1n); + const oneIST = AmountMath.make(istBrand, 1n); const namesByAddressAdmin = await namesByAddressAdminP; const terms = { feeAmount: oneIST, namesByAddressAdmin }; From 81af4c4ae5381f9349a9909c710bbb270e263390 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 17:30:45 -0600 Subject: [PATCH 016/152] fixup(swaparoo.proposal): typo --- contract/src/start-contract-proposal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/src/start-contract-proposal.js b/contract/src/start-contract-proposal.js index 2ae69e0e..03e6b25c 100644 --- a/contract/src/start-contract-proposal.js +++ b/contract/src/start-contract-proposal.js @@ -85,7 +85,7 @@ export const startContract = async permittedPowers => { produceInstance.reset(); produceInstance.resolve(instance); - console.log(`${contractName} (re)installed`); + console.log(`${contractName} (re)started`); }; /** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifest } */ From 333dc627589ce64d49f341cc98c62830a3e4c42e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 23:18:11 -0700 Subject: [PATCH 017/152] refactor(bundle-tools): factor out of boot-tools --- contract/test/bundle-tools.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 contract/test/bundle-tools.js diff --git a/contract/test/bundle-tools.js b/contract/test/bundle-tools.js new file mode 100644 index 00000000..5f0ba170 --- /dev/null +++ b/contract/test/bundle-tools.js @@ -0,0 +1,19 @@ +// @ts-check +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; + +/** + * Get bundle ID of a bundle + * + * See @agoric/swingset-vat/docs/bundles.md + * + * @param {{ endoZipBase64Sha512: string }} bundle + * + */ +export const getBundleId = bundle => `b1-${bundle.endoZipBase64Sha512}`; + +export const makeBundleCacheContext = async (_t, dest = 'bundles/') => { + const bundleCache = await makeNodeBundleCache(dest, {}, s => import(s)); + + const shared = {}; + return { bundleCache, shared }; +}; From cfc913b59b6dc1260acc3b7ea2381c57627ff87e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:21:20 -0600 Subject: [PATCH 018/152] chore: objectTools 4c4c0d1 --- contract/src/objectTools.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 contract/src/objectTools.js diff --git a/contract/src/objectTools.js b/contract/src/objectTools.js new file mode 100644 index 00000000..b3f83ff5 --- /dev/null +++ b/contract/src/objectTools.js @@ -0,0 +1,22 @@ +// @ts-check +const { entries, fromEntries } = Object; + +/** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ +export const allValues = async obj => { + const es = await Promise.all( + entries(obj).map(async ([k, v]) => [k, await v]), + ); + return fromEntries(es); +}; + +/** @type { >(obj: T, f: (v: V) => U) => { [K in keyof T]: U }} */ +export const mapValues = (obj, f) => + fromEntries( + entries(obj).map(([p, v]) => { + const entry = [p, f(v)]; + return entry; + }), + ); + +/** @type {(xs: X[], ys: Y[]) => [X, Y][]} */ +export const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]); From 74ae5a00a492c0c00976ab8ffbc6c12a99e0af4a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:12:48 -0700 Subject: [PATCH 019/152] refactor(objectTools): use E.when - one-line await is too clever --- contract/src/objectTools.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contract/src/objectTools.js b/contract/src/objectTools.js index b3f83ff5..25215842 100644 --- a/contract/src/objectTools.js +++ b/contract/src/objectTools.js @@ -1,10 +1,12 @@ // @ts-check +import { E } from '@endo/far'; + const { entries, fromEntries } = Object; /** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ export const allValues = async obj => { const es = await Promise.all( - entries(obj).map(async ([k, v]) => [k, await v]), + entries(obj).map(([k, vp]) => E.when(vp, v => [k, v])), ); return fromEntries(es); }; From f93c6b24b075965413c99c9348f523e8592c898a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:17:12 -0600 Subject: [PATCH 020/152] chore(boot-tools): copy b8be868 --- contract/test/boot-tools.js | 104 ++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 contract/test/boot-tools.js diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js new file mode 100644 index 00000000..03933a95 --- /dev/null +++ b/contract/test/boot-tools.js @@ -0,0 +1,104 @@ +// @ts-check +import { E } from '@endo/far'; +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; +import { makeNameHubKit, makePromiseSpace } from '@agoric/vats'; +import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; +import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; +import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; +import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import buildManualTimer from '@agoric/zoe/tools/manualTimer.js'; +import { makeMockChainStorageRoot } from '@agoric/internal/src/storage-test-utils.js'; + +export const getBundleId = b => `b1-${b.endoZipBase64Sha512}`; + +export const makeBootstrapPowers = async ( + log, + spaceNames = ['installation', 'instance', 'issuer', 'brand'], +) => { + const { produce, consume } = makePromiseSpace(); + + const { admin, vatAdminState } = makeFakeVatAdmin(); + const { zoeService: zoe, feeMintAccess } = makeZoeKitForTest(admin); + const invitationIssuer = await E(zoe).getInvitationIssuer(); + const feeIssuer = await E(zoe).getFeeIssuer(); + const [invitationBrand, feeBrand] = await Promise.all( + [invitationIssuer, feeIssuer].map(i => E(i).getBrand()), + ); + + const { nameHub: agoricNames, nameAdmin: agoricNamesAdmin } = + makeNameHubKit(); + const spaces = await makeWellKnownSpaces(agoricNamesAdmin, log, spaceNames); + + const { nameHub: namesByAddress, nameAdmin: namesByAddressAdmin } = + makeNameHubKit(); + + const chainTimerService = buildManualTimer(); + const timerBrand = await E(chainTimerService).getTimerBrand(); + + const chainStorage = makeMockChainStorageRoot(); + const board = makeFakeBoard(); + + const roMarshaller = await E(board).getReadonlyMarshaller(); + // XXX HACK: mixes on-chain / offchain + const boardAux = async obj => { + const id = await E(board).getId(obj); + const auxData = chainStorage.getBody( + `mockChainStorageRoot.boardAux.${id}`, + roMarshaller, + ); + return auxData; + }; + + produce.zoe.resolve(zoe); + produce.feeMintAccess.resolve(feeMintAccess); + produce.agoricNamesAdmin.resolve(agoricNamesAdmin); + produce.agoricNames.resolve(agoricNames); + produce.namesByAddress.resolve(namesByAddress); + produce.namesByAddressAdmin.resolve(namesByAddressAdmin); + produce.chainTimerService.resolve(chainTimerService); + produce.chainStorage.resolve(chainStorage); + produce.board.resolve(board); + produce.priceAuthority.resolve(board); // XXX + spaces.brand.produce.timer.resolve(timerBrand); + spaces.brand.produce.IST.resolve(feeBrand); + spaces.brand.produce.Invitation.resolve(invitationBrand); + spaces.issuer.produce.IST.resolve(feeIssuer); + spaces.issuer.produce.Invitation.resolve(invitationIssuer); + + /** + * @type {BootstrapPowers & { + * consume: { chainStorage: Promise }, + * brand: { consume: Record> } + * }}} + */ + // @ts-expect-error mock + const powers = { produce, consume, ...spaces }; + + return { powers, vatAdminState, boardAux }; +}; + +export const makeBundleCacheContext = async (_t, dest = 'bundles/') => { + const bundleCache = await makeNodeBundleCache(dest, {}, s => import(s)); + + const shared = {}; + return { bundleCache, shared }; +}; + +export const bootAndInstallBundles = async (t, bundleRoots) => { + t.log('bootstrap'); + const powersKit = await makeBootstrapPowers(t.log); + const { vatAdminState } = powersKit; + + const { bundleCache } = t.context; + /** @type {Record} */ + const bundles = {}; + for (const [name, rootModulePath] of Object.entries(bundleRoots)) { + const bundle = await bundleCache.load(rootModulePath, name); + const bundleID = getBundleId(bundle); + t.log('publish bundle', name, bundleID.slice(0, 8)); + vatAdminState.installBundle(bundleID, bundle); + bundles[name] = bundle; + } + harden(bundles); + return { ...powersKit, bundles }; +}; From f74b4a09f1fe743d45eefc5b2e2d0674739154d5 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 22:03:53 -0600 Subject: [PATCH 021/152] chore(boot-tools): provisionSmartWallet, installBundles, runCoreEval - factor our bundle-tools - prune boardAux hack - move type burden inside contract starters' - initialize balances - punt chainStorage until we use CapData across vats - chore(boot-tools): produce BLD, startUpgradable --- contract/test/boot-tools.js | 212 ++++++++++++++++++++++++++++++------ 1 file changed, 178 insertions(+), 34 deletions(-) diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index 03933a95..de0cc6d3 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -1,17 +1,41 @@ // @ts-check -import { E } from '@endo/far'; -import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; +import { E, Far } from '@endo/far'; import { makeNameHubKit, makePromiseSpace } from '@agoric/vats'; import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; import buildManualTimer from '@agoric/zoe/tools/manualTimer.js'; +import { AmountMath, AssetKind, makeIssuerKit } from '@agoric/ertp'; + +// eslint-disable-next-line import/no-extraneous-dependencies import { makeMockChainStorageRoot } from '@agoric/internal/src/storage-test-utils.js'; -export const getBundleId = b => `b1-${b.endoZipBase64Sha512}`; +import { mockWalletFactory } from './wallet-tools.js'; +import { getBundleId } from './bundle-tools.js'; + +const { entries } = Object; + +/** + * In agoric-sdk, the BootstrapPowers.consume['chainStorage'] type includes undefined because + * of some historical testing practices. It's tedious and unnecessary + * to check for undefined, so here we override the type to say that it's + * never undefined. + * + * @typedef {PromiseSpaceOf<{ chainStorage: StorageNode }>} NonNullChainStorage + */ -export const makeBootstrapPowers = async ( +/** + * Make powers (zoe, timer and name services, etc.) sufficient to test + * deploying and using contracts. priceAuthority is a dummy. + * + * Also return vatAdminState for installing bundles + * and mock chainStorage with support for getBody(). + * + * @param {(...args: unknown[]) => void} log + * @param {string[]} [spaceNames] + */ +export const mockBootstrapPowers = async ( log, spaceNames = ['installation', 'instance', 'issuer', 'brand'], ) => { @@ -38,17 +62,24 @@ export const makeBootstrapPowers = async ( const chainStorage = makeMockChainStorageRoot(); const board = makeFakeBoard(); - const roMarshaller = await E(board).getReadonlyMarshaller(); - // XXX HACK: mixes on-chain / offchain - const boardAux = async obj => { - const id = await E(board).getId(obj); - const auxData = chainStorage.getBody( - `mockChainStorageRoot.boardAux.${id}`, - roMarshaller, + const startUpgradable = ({ + installation, + issuerKeywordRecord, + terms, + privateArgs, + label, + }) => + E(zoe).startInstance( + installation, + issuerKeywordRecord, + terms, + privateArgs, + label, ); - return auxData; - }; + const bldIssuerKit = makeIssuerKit('BLD', 'nat', { decimalPlaces: 6 }); + produce.bldIssuerKit.resolve(bldIssuerKit); + produce.startUpgradable.resolve(startUpgradable); produce.zoe.resolve(zoe); produce.feeMintAccess.resolve(feeMintAccess); produce.agoricNamesAdmin.resolve(agoricNamesAdmin); @@ -58,47 +89,160 @@ export const makeBootstrapPowers = async ( produce.chainTimerService.resolve(chainTimerService); produce.chainStorage.resolve(chainStorage); produce.board.resolve(board); - produce.priceAuthority.resolve(board); // XXX spaces.brand.produce.timer.resolve(timerBrand); + spaces.brand.produce.BLD.resolve(bldIssuerKit.brand); spaces.brand.produce.IST.resolve(feeBrand); spaces.brand.produce.Invitation.resolve(invitationBrand); + spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); spaces.issuer.produce.IST.resolve(feeIssuer); spaces.issuer.produce.Invitation.resolve(invitationIssuer); + produce.priceAuthority.resolve(Far('NullPriceAuthority', {})); /** - * @type {BootstrapPowers & { - * consume: { chainStorage: Promise }, - * brand: { consume: Record> } - * }}} + * @type {BootstrapPowers & NonNullChainStorage} */ // @ts-expect-error mock const powers = { produce, consume, ...spaces }; - return { powers, vatAdminState, boardAux }; + return { powers, vatAdminState, chainStorage }; }; -export const makeBundleCacheContext = async (_t, dest = 'bundles/') => { - const bundleCache = await makeNodeBundleCache(dest, {}, s => import(s)); - - const shared = {}; - return { bundleCache, shared }; -}; - -export const bootAndInstallBundles = async (t, bundleRoots) => { - t.log('bootstrap'); - const powersKit = await makeBootstrapPowers(t.log); - const { vatAdminState } = powersKit; - - const { bundleCache } = t.context; - /** @type {Record} */ +/** + * @param {import('ava').ExecutionContext} t + * @param {BundleCache} bundleCache + * @param {Record} bundleRoots + * @param {InstallBundle} installBundle + * + * @typedef {(id: string, bundle: CachedBundle, name: string) => Promise} InstallBundle + * @typedef {Awaited>} BundleCache + * @typedef {{ moduleFormat: 'endoZipBase64', endoZipBase64Sha512: string }} CachedBundle + */ +export const installBundles = async ( + t, + bundleCache, + bundleRoots, + installBundle, +) => { + /** @type {Record} */ const bundles = {}; + await null; for (const [name, rootModulePath] of Object.entries(bundleRoots)) { const bundle = await bundleCache.load(rootModulePath, name); const bundleID = getBundleId(bundle); t.log('publish bundle', name, bundleID.slice(0, 8)); - vatAdminState.installBundle(bundleID, bundle); + await installBundle(bundleID, bundle, name); bundles[name] = bundle; } harden(bundles); + return bundles; +}; + +export const bootAndInstallBundles = async (t, bundleRoots) => { + t.log('bootstrap'); + const powersKit = await mockBootstrapPowers(t.log); + const { vatAdminState } = powersKit; + + const bundles = await installBundles( + t, + t.context.bundleCache, + bundleRoots, + (bundleID, bundle, _name) => vatAdminState.installBundle(bundleID, bundle), + ); return { ...powersKit, bundles }; }; + +const proposalResultDefault = { + proposal_id: 0, + content: { + '@type': '/agoric.swingset.CoreEvalProposal', + }, + status: 'PROPOSAL_STATUS_PASSED', + voting_end_time: '2020-01-01T01:00:00.0Z', +}; + +/** + * @param {import('ava').ExecutionContext } t + * @param {BundleCache} bundleCache + */ +export const makeMockTools = async (t, bundleCache) => { + t.log('bootstrap'); + const { powers, vatAdminState } = await mockBootstrapPowers(t.log); + + const installBundle = async (bundleID, bundle, _name) => + vatAdminState.installBundle(bundleID, bundle); + + const iKit = { + MNY: makeIssuerKit('MNY'), + Item: makeIssuerKit('Item', AssetKind.SET), + ATOM: makeIssuerKit('ATOM', AssetKind.NAT, { decimalPlaces: 6 }), + }; + const { MNY, Item, ATOM } = iKit; + for (const [name, kit] of entries(iKit)) { + powers.issuer.produce[name].resolve(kit.issuer); + powers.brand.produce[name].resolve(kit.brand); + } + + const { agoricNames, board, zoe, namesByAddressAdmin } = powers.consume; + + const smartWalletIssuers = { + Invitation: await E(zoe).getInvitationIssuer(), + IST: await E(zoe).getFeeIssuer(), + MNY: MNY.issuer, + Item: Item.issuer, + ATOM: ATOM.issuer, + }; + + const boardMarshaller = await E(board).getPublishingMarshaller(); + const walletFactory = mockWalletFactory( + { namesByAddressAdmin, zoe }, + smartWalletIssuers, + ); + + let pid = 0; + const runCoreEval = async ({ behavior, config }) => { + if (!behavior) throw Error('TODO: run core eval without live behavior'); + await behavior(powers, config); + pid += 1; + return { ...proposalResultDefault, proposal_id: pid }; + }; + + // XXX marshal context is not fresh. hm. + const makeQueryTool = () => { + return Far('QT', { + toCapData: x => boardMarshaller.toCapData(x), // XXX remote??? + fromCapData: d => boardMarshaller.fromCapData(d), + queryData: async path => { + const parts = path.split('.'); + if (parts.shift() !== 'published') throw Error(`not found: ${path}`); + if (parts.shift() !== 'agoricNames') throw Error(`not found: ${path}`); + if (parts.length !== 1) throw Error(`not found: ${path}`); + const hub = E(agoricNames).lookup(parts[0]); + const kvs = await E(hub).entries(); + boardMarshaller.toCapData(kvs); // remember object identities + return kvs; + }, + }); + }; + + return { + makeQueryTool, + installBundles: bundleRoots => + installBundles(t, bundleCache, bundleRoots, installBundle), + runCoreEval, + provisionSmartWallet: async (addr, balances) => { + const it = await walletFactory.makeSmartWallet(addr); + for (const [name, qty] of entries(balances)) { + if (!(name in iKit)) { + console.warn('no mint', name, qty); + continue; + } + const { mint, brand } = iKit[name]; + const { decimalPlaces } = brand.getDisplayInfo(); + const value = qty * BigInt(10 ** decimalPlaces); + const pmt = mint.mintPayment(AmountMath.make(brand, value)); + await it.deposit.receive(pmt); + } + return it; + }, + }; +}; From cbcf01d7d53178545ea0933511f90e2ec9159ce0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:18:20 -0600 Subject: [PATCH 022/152] chore(wallet-tools): copy 80ed3cf --- contract/test/wallet-tools.js | 218 ++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 contract/test/wallet-tools.js diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js new file mode 100644 index 00000000..c151fd21 --- /dev/null +++ b/contract/test/wallet-tools.js @@ -0,0 +1,218 @@ +// @ts-check +import { E, Far } from '@endo/far'; +import { makePromiseKit } from '@endo/promise-kit'; +import { allValues, mapValues } from '../src/objectTools.js'; +export { allValues, mapValues }; + +const { values } = Object; + +/** + * @param {{ + * zoe: ERef; + * chainStorage: ERef; + * namesByAddressAdmin: ERef; + * }} powers + * + * @typedef {import('@agoric/smart-wallet').OfferSpec} OfferSpec + * + * @typedef {Awaited['makeSmartWallet']>>>} MockWallet + */ +export const mockWalletFactory = ( + { zoe, namesByAddressAdmin }, + issuerKeywordRecord, +) => { + const DEPOSIT_FACET_KEY = 'depositFacet'; + + const { Fail, quote: q } = assert; + + // const walletsNode = E(chainStorage).makeChildNode('wallet'); + + // TODO: provideSmartWallet + /** @param {string} address */ + const makeSmartWallet = async address => { + const { nameAdmin: addressAdmin } = await E( + namesByAddressAdmin, + ).provideChild(address, [DEPOSIT_FACET_KEY]); + + const entries = await Promise.all( + values(issuerKeywordRecord).map(async issuer => { + const purse = await E(issuer).makeEmptyPurse(); + const brand = await E(issuer).getBrand(); + /** @type {[Brand, Purse]} */ + const entry = [brand, purse]; + return entry; + }), + ); + const purseByBrand = new Map(entries); + const invitationBrand = await E(E(zoe).getInvitationIssuer()).getBrand(); + purseByBrand.has(invitationBrand) || + Fail`no invitation issuer / purse / brand`; + const invitationPurse = purseByBrand.get(invitationBrand); + assert(invitationPurse); + + const depositFacet = Far('DepositFacet', { + /** @param {Payment} pmt */ + receive: async pmt => { + const pBrand = await E(pmt).getAllegedBrand(); + if (!purseByBrand.has(pBrand)) + throw Error(`brand not known/supported: ${pBrand}`); + const purse = purseByBrand.get(pBrand); + assert(purse); + return E(purse).deposit(pmt); + }, + }); + await E(addressAdmin).default(DEPOSIT_FACET_KEY, depositFacet); + + /** @param {ERef} issuer */ + const addIssuer = async issuer => { + const brand = await E(issuer).getBrand(); + if (purseByBrand.has(brand)) { + throw Error(`brand already present`); + } + const purse = await E(issuer).makeEmptyPurse(); + purseByBrand.set(brand, purse); + }; + + // const updatesNode = E(walletsNode).makeChildNode(address); + // const currentNode = E(updatesNode).makeChildNode('current'); + + const getContractInvitation = invitationSpec => { + const { + instance, + publicInvitationMaker, + invitationArgs = [], + } = invitationSpec; + const pf = E(zoe).getPublicFacet(instance); + return E(pf)[publicInvitationMaker](...invitationArgs); + }; + + const getPurseInvitation = async invitationSpec => { + // const { instance, description } = invitationSpec; + const invitationAmount = await E(invitationPurse).getCurrentAmount(); + console.log( + '@@TODO: check invitation amount against instance', + invitationAmount, + ); + return E(invitationPurse).withdraw(invitationAmount); + }; + + const offerToInvitationMakers = new Map(); + const getContinuingInvitation = async spec => { + const { previousOffer, invitationMakerName, invitationArgs = [] } = spec; + const makers = + offerToInvitationMakers.get(previousOffer) || + Fail`${previousOffer} not found`; + return E(makers)[invitationMakerName](...invitationArgs); + }; + const seatById = new Map(); + const tryExit = id => + E(seatById.get(id) || Fail`${id} not found`).tryExit(); + /** @param {OfferSpec} offerSpec */ + async function* executeOffer(offerSpec) { + const { invitationSpec, proposal = {}, offerArgs } = offerSpec; + const { source } = invitationSpec; + const getter = + { + contract: getContractInvitation, + purse: getPurseInvitation, + continuing: getContinuingInvitation, + }[source] || Fail`unsupported source: ${source}`; + const invitation = await getter(invitationSpec); + const pmts = await allValues( + mapValues(proposal.give || {}, async amt => { + const { brand } = amt; + if (!purseByBrand.has(brand)) + throw Error(`brand not known/supported: ${brand}`); + const purse = purseByBrand.get(brand); + assert(purse); + return E(purse).withdraw(amt); + }), + ); + // XXX throwing here is unhandled somehow. + const seat = await E(zoe).offer(invitation, proposal, pmts, offerArgs); + seatById.set(offerSpec.id, seat); + // console.log(address, offerSpec.id, 'got seat'); + yield { updated: 'offerStatus', status: offerSpec }; + const result0 = await E(seat).getOfferResult(); + const result = typeof result0 === 'object' ? 'UNPUBLISHED' : result0; + // console.log(address, offerSpec.id, 'got result', result); + yield { updated: 'offerStatus', status: { ...offerSpec, result } }; + if (typeof result0 === 'object' && 'invitationMakers' in result0) { + offerToInvitationMakers.set(offerSpec.id, result0.invitationMakers); + } + const [payouts, numWantsSatisfied] = await Promise.all([ + E(seat).getPayouts(), + E(seat).numWantsSatisfied(), + ]); + yield { + updated: 'offerStatus', + status: { ...offerSpec, result, numWantsSatisfied }, + }; + const amts = await allValues( + mapValues(payouts, pmtP => + Promise.resolve(pmtP).then(pmt => depositFacet.receive(pmt)), + ), + ); + // console.log(address, offerSpec.id, 'got payouts', amts); + yield { + updated: 'offerStatus', + status: { ...offerSpec, result, numWantsSatisfied, payouts: amts }, + }; + } + + return { + deposit: depositFacet, + offers: Far('Offers', { executeOffer, addIssuer, tryExit }), + peek: Far('Wallet Peek', { + purseNotifier: brand => + E( + purseByBrand.get(brand) || Fail`${q(brand)}`, + ).getCurrentAmountNotifier(), + }), + }; + }; + + return harden({ makeSmartWallet }); +}; + +/** + * Seat-like API from updates + * @param {*} updates + */ +export const seatLike = updates => { + const sync = { + result: makePromiseKit(), + payouts: makePromiseKit(), + }; + (async () => { + try { + // XXX an error here is somehow and unhandled rejection + for await (const update of updates) { + if (update.updated !== 'offerStatus') continue; + const { result, payouts } = update.status; + if ('result' in update.status) sync.result.resolve(result); + if ('payouts' in update.status) sync.payouts.resolve(payouts); + } + } catch (reason) { + sync.result.reject(reason); + sync.payouts.reject(reason); + throw reason; + } + })(); + return harden({ + getOfferResult: () => sync.result.promise, + getPayouts: () => sync.payouts.promise, + }); +}; + +export const makeWalletFactory = async ( + { zoe, namesByAddressAdmin, chainStorage }, + issuers, +) => { + const invitationIssuer = await E(zoe).getInvitationIssuer(); + const walletFactory = mockWalletFactory( + { zoe, namesByAddressAdmin, chainStorage }, + { Invitation: invitationIssuer, ...issuers }, + ); + return walletFactory; +}; From 7bf4b24b3acbeb1d1df53a85f766ee6e0e11cdc1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 23:45:16 -0600 Subject: [PATCH 023/152] fix(wallet-tools): select among >1 pending invitations - chore: notifier -> async iterator - seatLike: return on payout amounts - missing param decl; lint - prune unused makeWalletFactory - getPayouts -> getPayoutAmounts, with type - docs(wallet-tools): invitationSpec types --- contract/test/wallet-tools.js | 127 +++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 54 deletions(-) diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index c151fd21..6412d7fe 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -1,19 +1,34 @@ +/** + * @file smart-wallet test tools + * + * @see {mockWalletFactory} + */ // @ts-check import { E, Far } from '@endo/far'; import { makePromiseKit } from '@endo/promise-kit'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import { makeNotifier } from '@agoric/notifier'; + import { allValues, mapValues } from '../src/objectTools.js'; -export { allValues, mapValues }; + +/** + * @typedef {import('@agoric/smart-wallet/src/offers.js').OfferSpec} OfferSpec + * @typedef {import('@agoric/smart-wallet/src/smartWallet.js').UpdateRecord} UpdateRecord + * @typedef {import('@agoric/smart-wallet/src/invitations.js').InvitationSpec} InvitationSpec + */ const { values } = Object; +const { Fail, quote: q } = assert; + +const DEPOSIT_FACET_KEY = 'depositFacet'; // XXX does agoric-sdk export this? /** * @param {{ * zoe: ERef; - * chainStorage: ERef; * namesByAddressAdmin: ERef; * }} powers - * - * @typedef {import('@agoric/smart-wallet').OfferSpec} OfferSpec + * @param {IssuerKeywordRecord} issuerKeywordRecord * * @typedef {Awaited['makeSmartWallet']>>>} MockWallet */ @@ -21,13 +36,6 @@ export const mockWalletFactory = ( { zoe, namesByAddressAdmin }, issuerKeywordRecord, ) => { - const DEPOSIT_FACET_KEY = 'depositFacet'; - - const { Fail, quote: q } = assert; - - // const walletsNode = E(chainStorage).makeChildNode('wallet'); - - // TODO: provideSmartWallet /** @param {string} address */ const makeSmartWallet = async address => { const { nameAdmin: addressAdmin } = await E( @@ -58,24 +66,14 @@ export const mockWalletFactory = ( throw Error(`brand not known/supported: ${pBrand}`); const purse = purseByBrand.get(pBrand); assert(purse); - return E(purse).deposit(pmt); + const amt = await E(purse).deposit(pmt); + console.log('receive', address, amt); + return amt; }, }); await E(addressAdmin).default(DEPOSIT_FACET_KEY, depositFacet); - /** @param {ERef} issuer */ - const addIssuer = async issuer => { - const brand = await E(issuer).getBrand(); - if (purseByBrand.has(brand)) { - throw Error(`brand already present`); - } - const purse = await E(issuer).makeEmptyPurse(); - purseByBrand.set(brand, purse); - }; - - // const updatesNode = E(walletsNode).makeChildNode(address); - // const currentNode = E(updatesNode).makeChildNode('current'); - + /** @param {InvitationSpec & { source: 'contract'}} invitationSpec */ const getContractInvitation = invitationSpec => { const { instance, @@ -86,17 +84,24 @@ export const mockWalletFactory = ( return E(pf)[publicInvitationMaker](...invitationArgs); }; + /** @param {InvitationSpec & { source: 'purse'}} invitationSpec */ const getPurseInvitation = async invitationSpec => { - // const { instance, description } = invitationSpec; const invitationAmount = await E(invitationPurse).getCurrentAmount(); - console.log( - '@@TODO: check invitation amount against instance', - invitationAmount, + // TODO: check instance too + const detail = invitationAmount.value.find( + d => d.description === invitationSpec.description, + ); + detail || + Fail`${q(invitationSpec.description)} not found in ${q( + invitationAmount, + )}`; + return E(invitationPurse).withdraw( + harden({ brand: invitationAmount.brand, value: [detail] }), ); - return E(invitationPurse).withdraw(invitationAmount); }; const offerToInvitationMakers = new Map(); + /** @param {InvitationSpec & { source: 'continuing'}} spec */ const getContinuingInvitation = async spec => { const { previousOffer, invitationMakerName, invitationArgs = [] } = spec; const makers = @@ -107,7 +112,14 @@ export const mockWalletFactory = ( const seatById = new Map(); const tryExit = id => E(seatById.get(id) || Fail`${id} not found`).tryExit(); - /** @param {OfferSpec} offerSpec */ + + /** + * Execute an offer (spec) and return a stream of updates + * that would be sent to vstorage. + * + * @param {OfferSpec} offerSpec + * @returns {AsyncGenerator} + */ async function* executeOffer(offerSpec) { const { invitationSpec, proposal = {}, offerArgs } = offerSpec; const { source } = invitationSpec; @@ -160,15 +172,27 @@ export const mockWalletFactory = ( }; } + /** + * Get a stream of balance updates for a purse of a given brand. + * + * @param {Brand} brand + */ + async function* purseUpdates(brand) { + const purse = + purseByBrand.get(brand) || + Fail`no purse for ${q(brand)}; issuer missing? ${q( + issuerKeywordRecord, + )}`; + const n = makeNotifier(E(purse).getCurrentAmountNotifier()); + for await (const amount of n) { + yield amount; + } + } + return { deposit: depositFacet, - offers: Far('Offers', { executeOffer, addIssuer, tryExit }), - peek: Far('Wallet Peek', { - purseNotifier: brand => - E( - purseByBrand.get(brand) || Fail`${q(brand)}`, - ).getCurrentAmountNotifier(), - }), + offers: Far('Offers', { executeOffer, tryExit }), + peek: Far('Wallet Peek', { purseUpdates }), }; }; @@ -176,22 +200,29 @@ export const mockWalletFactory = ( }; /** - * Seat-like API from updates - * @param {*} updates + * Seat-like API from wallet updates + * + * @param {AsyncGenerator} updates */ export const seatLike = updates => { const sync = { result: makePromiseKit(), + /** @type {PromiseKit} */ payouts: makePromiseKit(), }; (async () => { + await null; try { // XXX an error here is somehow and unhandled rejection for await (const update of updates) { if (update.updated !== 'offerStatus') continue; const { result, payouts } = update.status; if ('result' in update.status) sync.result.resolve(result); - if ('payouts' in update.status) sync.payouts.resolve(payouts); + if ('payouts' in update.status && payouts) { + sync.payouts.resolve(payouts); + console.debug('paid out', update.status.id); + return; + } } } catch (reason) { sync.result.reject(reason); @@ -201,18 +232,6 @@ export const seatLike = updates => { })(); return harden({ getOfferResult: () => sync.result.promise, - getPayouts: () => sync.payouts.promise, + getPayoutAmounts: () => sync.payouts.promise, }); }; - -export const makeWalletFactory = async ( - { zoe, namesByAddressAdmin, chainStorage }, - issuers, -) => { - const invitationIssuer = await E(zoe).getInvitationIssuer(); - const walletFactory = mockWalletFactory( - { zoe, namesByAddressAdmin, chainStorage }, - { Invitation: invitationIssuer, ...issuers }, - ); - return walletFactory; -}; From 1f035fa66b03f58f352b470ad982ad2e2d1d6650 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 14:49:38 -0600 Subject: [PATCH 024/152] chore(test-swap-wallet): copy from swaparoo https://github.com/agoric-labs/dapp-swaparoo/blob/main/contract/test/test-swap-wallet.js cb6cd8f --- contract/test/test-swap-wallet.js | 444 ++++++++++++++++++++++++++++++ 1 file changed, 444 insertions(+) create mode 100644 contract/test/test-swap-wallet.js diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js new file mode 100644 index 00000000..3df7b136 --- /dev/null +++ b/contract/test/test-swap-wallet.js @@ -0,0 +1,444 @@ +// @ts-check +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { createRequire } from 'node:module'; +import { E, Far } from '@endo/far'; +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; +import { makePromiseSpace, makeNameHubKit } from '@agoric/vats'; +import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; +import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; +import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { AmountMath, makeIssuerKit } from '@agoric/ertp'; +import { + installContract, + startContract, +} from '../src/start-contract-proposal.js'; +import { makeStableFaucet } from './mintStable.js'; + +/** @type {import('ava').TestFn>>} */ +const test = anyTest; + +const myRequire = createRequire(import.meta.url); + +const assets = { + swaparoo: myRequire.resolve('../src/swaparoo.js'), +}; +const contractName = 'swaparoo'; + +const makeTestContext = async t => { + const bundleCache = await makeNodeBundleCache('bundles/', {}, s => import(s)); + + return { bundleCache, shared: {} }; +}; + +test.before(async t => (t.context = await makeTestContext(t))); + +/** + * Mock enough powers for startSwaparoo permit. + * Plus access to load bundles, peek at vstorage, and mint IST and BLD. + * + * @param {(...args: unknown[]) => void} log + */ +const mockBootstrap = async log => { + const { produce, consume } = makePromiseSpace(); + const { admin, vatAdminState } = makeFakeVatAdmin(); + const { zoeService: zoe, feeMintAccess } = makeZoeKitForTest(admin); + const feeIssuer = await E(zoe).getFeeIssuer(); + const feeBrand = await E(feeIssuer).getBrand(); + + const { rootNode: chainStorage, data } = makeFakeStorageKit('published'); + + const { nameAdmin: agoricNamesAdmin } = makeNameHubKit(); + const spaces = await makeWellKnownSpaces(agoricNamesAdmin, log, [ + 'installation', + 'instance', + 'issuer', + 'brand', + ]); + + const { nameAdmin: namesByAddressAdmin } = makeNameHubKit(); + + const startUpgradable = ({ + installation, + issuerKeywordRecord, + terms, + privateArgs, + label, + }) => + E(zoe).startInstance( + installation, + issuerKeywordRecord, + terms, + privateArgs, + label, + ); + + const bldIssuerKit = makeIssuerKit('BLD', 'nat', { decimalPlaces: 6 }); + produce.bldIssuerKit.resolve(bldIssuerKit); + produce.zoe.resolve(zoe); + produce.startUpgradable.resolve(startUpgradable); + produce.feeMintAccess.resolve(feeMintAccess); + produce.chainStorage.resolve(chainStorage); + produce.namesByAddressAdmin.resolve(namesByAddressAdmin); + spaces.issuer.produce.IST.resolve(feeIssuer); + spaces.brand.produce.IST.resolve(feeBrand); + spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); + spaces.brand.produce.BLD.resolve(bldIssuerKit.brand); + + const powers = { produce, consume, ...spaces }; + + return { powers, vatAdminState }; +}; + +test.serial('bootstrap and start contract', async t => { + t.log('bootstrap'); + const { powers, vatAdminState } = await mockBootstrap(console.log); + + const { bundleCache } = t.context; + const bundle = await bundleCache.load(assets.swaparoo, contractName); + const bundleID = `b1-${bundle.endoZipBase64Sha512}`; + t.log('publish bundle', bundleID.slice(0, 8)); + vatAdminState.installBundle(bundleID, bundle); + + t.log('install contract'); + const config = { options: { [contractName]: { bundleID } } }; + await installContract(powers, config); // `agoric run` style proposal does this for us + t.log('start contract'); + await startContract(powers); + + const instance = await powers.instance.consume[contractName]; + t.log(instance); + t.is(typeof instance, 'object'); + + Object.assign(t.context.shared, { powers }); +}); + +/** + * @param {*} wellKnown + * @param {MockWallet} wallet + * @param {Amount} beansAmount + * @param {Amount} cowsAmount + * @param {string} depositAddress + * @param {boolean} [alicePays] + */ +const startAlice = async ( + wellKnown, + wallet, + beansAmount, + cowsAmount, + depositAddress, + alicePays = true, +) => { + const instance = wellKnown.instance[contractName]; + + // Let's presume the terms are in vstorage somewhere... say... boardAux + const terms = wellKnown.terms.get(instance); + const { feeAmount } = terms; + + const proposal = { + give: { MagicBeans: beansAmount, Fee: feeAmount }, + want: { + Cow: cowsAmount, + ...(alicePays ? {} : { Refund: feeAmount }), + }, + }; + + const offerSpec = { + id: 'alice-swap-1', + invitationSpec: { + source: 'contract', + instance, + publicInvitationMaker: 'makeFirstInvitation', + invitationArgs: [[wellKnown.issuer.BLD, wellKnown.issuer.IST]], + }, + proposal, + offerArgs: { addr: depositAddress }, + }; + + const updates = E(wallet.offers).executeOffer(offerSpec); + return updates; +}; + +/** + * @param {*} wellKnown + * @param {MockWallet} wallet + * @param {Amount} beansAmount + * @param {Amount} cowsAmount + * @param {boolean} [jackPays] + */ +const startJack = async ( + wellKnown, + wallet, + beansAmount, + cowsAmount, + jackPays = false, +) => { + const instance = wellKnown.instance[contractName]; + const terms = wellKnown.terms.get(instance); + const { feeAmount } = terms; + + const proposal = { + want: { MagicBeans: beansAmount }, + give: { + Cow: cowsAmount, + ...(jackPays ? { Refund: feeAmount } : {}), + }, + }; + + const offerSpec = { + id: 'jack-123', + invitationSpec: { + source: 'purse', + instance, + // description is required??? + }, + proposal, + }; + + return E(wallet.offers).executeOffer(offerSpec); +}; + +const { entries, fromEntries } = Object; + +/** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ +const allValues = async obj => { + const es = await Promise.all( + entries(obj).map(async ([k, v]) => [k, await v]), + ); + return fromEntries(es); +}; + +/** @type { >(obj: T, f: (v: V) => U) => Record} */ +const mapValues = (obj, f) => + fromEntries(entries(obj).map(([p, v]) => [p, f(v)])); + +/** + * @param {{ + * zoe: ERef; + * chainStorage: ERef; + * namesByAddressAdmin: ERef; + * }} powers + * + * @typedef {import('@agoric/smart-wallet').OfferSpec} OfferSpec + * + * @typedef {Awaited['makeSmartWallet']>>>} MockWallet + */ +const mockWalletFactory = ( + { zoe, namesByAddressAdmin }, + issuerKeywordRecord, +) => { + const DEPOSIT_FACET_KEY = 'depositFacet'; + + const { Fail } = assert; + + // const walletsNode = E(chainStorage).makeChildNode('wallet'); + + // TODO: provideSmartWallet + /** @param {string} address */ + const makeSmartWallet = async address => { + const { nameAdmin: addressAdmin } = await E( + namesByAddressAdmin, + ).provideChild(address, [DEPOSIT_FACET_KEY]); + + const purseByBrand = new Map(); + await allValues( + mapValues(issuerKeywordRecord, async issuer => { + const purse = await E(issuer).makeEmptyPurse(); + const brand = await E(issuer).getBrand(); + purseByBrand.set(brand, purse); + }), + ); + const invitationBrand = await E(E(zoe).getInvitationIssuer()).getBrand(); + purseByBrand.has(invitationBrand) || + Fail`no invitation issuer / purse / brand`; + const invitationPurse = purseByBrand.get(invitationBrand); + + const depositFacet = Far('DepositFacet', { + /** @param {Payment} pmt */ + receive: async pmt => { + const pBrand = await E(pmt).getAllegedBrand(); + if (!purseByBrand.has(pBrand)) + throw Error(`brand not known/supported: ${pBrand}`); + const purse = purseByBrand.get(pBrand); + return E(purse).deposit(pmt); + }, + }); + await E(addressAdmin).default(DEPOSIT_FACET_KEY, depositFacet); + + // const updatesNode = E(walletsNode).makeChildNode(address); + // const currentNode = E(updatesNode).makeChildNode('current'); + + const getContractInvitation = invitationSpec => { + const { + instance, + publicInvitationMaker, + invitationArgs = [], + } = invitationSpec; + const pf = E(zoe).getPublicFacet(instance); + return E(pf)[publicInvitationMaker](...invitationArgs); + }; + + const getPurseInvitation = async invitationSpec => { + // const { instance, description } = invitationSpec; + const invitationAmount = await E(invitationPurse).getCurrentAmount(); + console.log( + '@@TODO: check invitation amount against instance', + invitationAmount, + ); + return E(invitationPurse).withdraw(invitationAmount); + }; + + /** @param {OfferSpec} offerSpec */ + async function* executeOffer(offerSpec) { + const { invitationSpec, proposal, offerArgs } = offerSpec; + const { source } = invitationSpec; + const invitation = await (source === 'contract' + ? getContractInvitation(invitationSpec) + : source === 'purse' + ? getPurseInvitation(invitationSpec) + : Fail`unsupported source: ${source}`); + const pmts = await allValues( + mapValues(proposal.give, async amt => { + const { brand } = amt; + if (!purseByBrand.has(brand)) + throw Error(`brand not known/supported: ${brand}`); + const purse = purseByBrand.get(brand); + return E(purse).withdraw(amt); + }), + ); + const seat = await E(zoe).offer(invitation, proposal, pmts, offerArgs); + // console.log(address, offerSpec.id, 'got seat'); + yield { updated: 'OfferStatus', status: offerSpec }; + const result = await E(seat).getOfferResult(); + // console.log(address, offerSpec.id, 'got result', result); + yield { updated: 'OfferStatus', status: { ...offerSpec, result } }; + const [payouts, numWantsSatisfied] = await Promise.all([ + E(seat).getPayouts(), + E(seat).numWantsSatisfied(), + ]); + yield { + updated: 'OfferStatus', + status: { ...offerSpec, result, numWantsSatisfied }, + }; + const amts = await allValues( + mapValues(payouts, pmtP => + Promise.resolve(pmtP).then(pmt => depositFacet.receive(pmt)), + ), + ); + // console.log(address, offerSpec.id, 'got payouts', amts); + yield { + updated: 'OfferStatus', + status: { ...offerSpec, result, numWantsSatisfied, payouts: amts }, + }; + } + + return { deposit: depositFacet, offers: Far('Offers', { executeOffer }) }; + }; + + return harden({ makeSmartWallet }); +}; + +test.serial('basic swap', async t => { + const ONE_IST = 1_000_000n; + const addr = { + alice: 'agoric1alice', + jack: 'agoric1jack', + }; + + const { + shared: { powers }, + bundleCache, + } = t.context; + + const { zoe, feeMintAccess, bldIssuerKit } = powers.consume; + const instance = await powers.instance.consume[contractName]; + // TODO: we presume terms are available... perhaps in boardAux + const terms = await E(zoe).getTerms(instance); + + // A higher fidelity test would get these from vstorage + const wellKnown = { + brand: { + IST: await powers.brand.consume.IST, + BLD: await powers.brand.consume.BLD, + }, + issuer: { + IST: await powers.issuer.consume.IST, + BLD: await powers.issuer.consume.BLD, + Invitation: await E(zoe).getInvitationIssuer(), + }, + instance: { + [contractName]: instance, + }, + terms: new Map([[instance, terms]]), + }; + + const beans = x => AmountMath.make(wellKnown.brand.IST, x); + const fiveBeans = beans(5n); + + const cowAmount = AmountMath.make( + wellKnown.brand.BLD, + // makeCopyBag([['Milky White', 1n]]), + 10n, + ); + + const { mintBrandedPayment } = makeStableFaucet({ + bundleCache, + feeMintAccess, + zoe, + }); + const bldPurse = E(E.get(bldIssuerKit).issuer).makeEmptyPurse(); + await E(bldPurse).deposit( + await E(E.get(bldIssuerKit).mint).mintPayment(cowAmount), + ); + + const walletFactory = mockWalletFactory(powers.consume, wellKnown.issuer); + const wallet = { + alice: await walletFactory.makeSmartWallet(addr.alice), + jack: await walletFactory.makeSmartWallet(addr.jack), + }; + + await E(wallet.alice.deposit).receive(await mintBrandedPayment(ONE_IST)); + await E(wallet.alice.deposit).receive( + await mintBrandedPayment(fiveBeans.value), + ); + const aliceUpdates = await startAlice( + wellKnown, + wallet.alice, + fiveBeans, + cowAmount, + addr.jack, + ); + + const seated = await aliceUpdates.next(); + const aliceResult = await aliceUpdates.next(); + t.is(aliceResult.value.status.result, 'invitation sent'); + + await E(wallet.jack.deposit).receive(await mintBrandedPayment(ONE_IST)); + await E(wallet.jack.deposit).receive( + await E(E.get(bldIssuerKit).mint).mintPayment(cowAmount), + ); + const jackUpdates = await startJack( + wellKnown, + wallet.jack, + fiveBeans, + cowAmount, + ); + + const getPayouts = async updates => { + for await (const update of updates) { + if (update.updated === 'OfferStatus' && 'payouts' in update.status) { + return update.status.payouts; + } + } + }; + + const jackPayouts = await getPayouts(jackUpdates); + t.log('jack got', jackPayouts); + const actualBeansAmount = jackPayouts['MagicBeans']; + t.deepEqual(actualBeansAmount, fiveBeans); + + const alicePayouts = await getPayouts(aliceUpdates); + t.log('alice got', alicePayouts); + const actualCowAmount = alicePayouts['Cow']; + t.deepEqual(actualCowAmount, cowAmount); +}); From 2f33cd877fbe235a66835d47cf7aed10b5593b9f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:22:35 -0700 Subject: [PATCH 025/152] chore(test-swap-wallet): lint, types, etc. - OfferStatus -> offerStatus - use seatLike - getPayoutAmounts - clean up TODO --- contract/test/test-swap-wallet.js | 90 ++++++++++++++++--------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index 3df7b136..a451ee59 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -7,13 +7,17 @@ import { makePromiseSpace, makeNameHubKit } from '@agoric/vats'; import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; -import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; import { AmountMath, makeIssuerKit } from '@agoric/ertp'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; + import { installContract, startContract, } from '../src/start-contract-proposal.js'; import { makeStableFaucet } from './mintStable.js'; +import { seatLike } from './wallet-tools.js'; /** @type {import('ava').TestFn>>} */ const test = anyTest; @@ -25,7 +29,7 @@ const assets = { }; const contractName = 'swaparoo'; -const makeTestContext = async t => { +const makeTestContext = async _t => { const bundleCache = await makeNodeBundleCache('bundles/', {}, s => import(s)); return { bundleCache, shared: {} }; @@ -46,7 +50,7 @@ const mockBootstrap = async log => { const feeIssuer = await E(zoe).getFeeIssuer(); const feeBrand = await E(feeIssuer).getBrand(); - const { rootNode: chainStorage, data } = makeFakeStorageKit('published'); + const { rootNode: chainStorage } = makeFakeStorageKit('published'); const { nameAdmin: agoricNamesAdmin } = makeNameHubKit(); const spaces = await makeWellKnownSpaces(agoricNamesAdmin, log, [ @@ -85,6 +89,8 @@ const mockBootstrap = async log => { spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); spaces.brand.produce.BLD.resolve(bldIssuerKit.brand); + /** @type {BootstrapPowers} */ + // @ts-expect-error mock / cast const powers = { produce, consume, ...spaces }; return { powers, vatAdminState }; @@ -143,6 +149,7 @@ const startAlice = async ( }, }; + /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ const offerSpec = { id: 'alice-swap-1', invitationSpec: { @@ -185,12 +192,13 @@ const startJack = async ( }, }; + /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ const offerSpec = { id: 'jack-123', invitationSpec: { source: 'purse', instance, - // description is required??? + description: 'matchOffer', }, proposal, }; @@ -203,7 +211,7 @@ const { entries, fromEntries } = Object; /** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ const allValues = async obj => { const es = await Promise.all( - entries(obj).map(async ([k, v]) => [k, await v]), + entries(obj).map(async ([k, vP]) => Promise.resolve(vP).then(v => [k, v])), ); return fromEntries(es); }; @@ -213,13 +221,18 @@ const mapValues = (obj, f) => fromEntries(entries(obj).map(([p, v]) => [p, f(v)])); /** + * @deprecated use wallet-tools instead + * * @param {{ * zoe: ERef; * chainStorage: ERef; * namesByAddressAdmin: ERef; * }} powers * - * @typedef {import('@agoric/smart-wallet').OfferSpec} OfferSpec + * @param {IssuerKeywordRecord} issuerKeywordRecord + * + * @typedef {import('@agoric/smart-wallet/src/offers.js').OfferSpec} OfferSpec + * @typedef {import('@agoric/smart-wallet/src/smartWallet.js').UpdateRecord} UpdateRecord * * @typedef {Awaited['makeSmartWallet']>>>} MockWallet */ @@ -282,23 +295,28 @@ const mockWalletFactory = ( // const { instance, description } = invitationSpec; const invitationAmount = await E(invitationPurse).getCurrentAmount(); console.log( - '@@TODO: check invitation amount against instance', + 'TODO: check invitation amount against instance', invitationAmount, + invitationSpec, ); return E(invitationPurse).withdraw(invitationAmount); }; - /** @param {OfferSpec} offerSpec */ + const sourceImpl = { + contract: getContractInvitation, + purse: getPurseInvitation, + }; + /** + * @param {OfferSpec} offerSpec + * @returns {AsyncGenerator} + */ async function* executeOffer(offerSpec) { const { invitationSpec, proposal, offerArgs } = offerSpec; const { source } = invitationSpec; - const invitation = await (source === 'contract' - ? getContractInvitation(invitationSpec) - : source === 'purse' - ? getPurseInvitation(invitationSpec) - : Fail`unsupported source: ${source}`); + const impl = sourceImpl[source] || Fail`unsupported source: ${source}`; + const invitation = await impl(invitationSpec); const pmts = await allValues( - mapValues(proposal.give, async amt => { + mapValues(proposal.give || {}, async amt => { const { brand } = amt; if (!purseByBrand.has(brand)) throw Error(`brand not known/supported: ${brand}`); @@ -308,16 +326,16 @@ const mockWalletFactory = ( ); const seat = await E(zoe).offer(invitation, proposal, pmts, offerArgs); // console.log(address, offerSpec.id, 'got seat'); - yield { updated: 'OfferStatus', status: offerSpec }; + yield { updated: 'offerStatus', status: offerSpec }; const result = await E(seat).getOfferResult(); // console.log(address, offerSpec.id, 'got result', result); - yield { updated: 'OfferStatus', status: { ...offerSpec, result } }; + yield { updated: 'offerStatus', status: { ...offerSpec, result } }; const [payouts, numWantsSatisfied] = await Promise.all([ E(seat).getPayouts(), E(seat).numWantsSatisfied(), ]); yield { - updated: 'OfferStatus', + updated: 'offerStatus', status: { ...offerSpec, result, numWantsSatisfied }, }; const amts = await allValues( @@ -327,7 +345,7 @@ const mockWalletFactory = ( ); // console.log(address, offerSpec.id, 'got payouts', amts); yield { - updated: 'OfferStatus', + updated: 'offerStatus', status: { ...offerSpec, result, numWantsSatisfied, payouts: amts }, }; } @@ -401,44 +419,28 @@ test.serial('basic swap', async t => { await E(wallet.alice.deposit).receive( await mintBrandedPayment(fiveBeans.value), ); - const aliceUpdates = await startAlice( - wellKnown, - wallet.alice, - fiveBeans, - cowAmount, - addr.jack, + const aliceSeat = seatLike( + await startAlice(wellKnown, wallet.alice, fiveBeans, cowAmount, addr.jack), ); - const seated = await aliceUpdates.next(); - const aliceResult = await aliceUpdates.next(); - t.is(aliceResult.value.status.result, 'invitation sent'); + const aliceResult = await E(aliceSeat).getOfferResult(); + t.is(aliceResult, 'invitation sent'); await E(wallet.jack.deposit).receive(await mintBrandedPayment(ONE_IST)); await E(wallet.jack.deposit).receive( await E(E.get(bldIssuerKit).mint).mintPayment(cowAmount), ); - const jackUpdates = await startJack( - wellKnown, - wallet.jack, - fiveBeans, - cowAmount, + const jackSeat = seatLike( + await startJack(wellKnown, wallet.jack, fiveBeans, cowAmount), ); - const getPayouts = async updates => { - for await (const update of updates) { - if (update.updated === 'OfferStatus' && 'payouts' in update.status) { - return update.status.payouts; - } - } - }; - - const jackPayouts = await getPayouts(jackUpdates); + const jackPayouts = await jackSeat.getPayoutAmounts(); t.log('jack got', jackPayouts); - const actualBeansAmount = jackPayouts['MagicBeans']; + const actualBeansAmount = jackPayouts.MagicBeans; t.deepEqual(actualBeansAmount, fiveBeans); - const alicePayouts = await getPayouts(aliceUpdates); + const alicePayouts = await aliceSeat.getPayoutAmounts(); t.log('alice got', alicePayouts); - const actualCowAmount = alicePayouts['Cow']; + const actualCowAmount = alicePayouts.Cow; t.deepEqual(actualCowAmount, cowAmount); }); From 065b0ccf27bdb4eb163d02af6d9d396e585a7cbc Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 17:33:44 -0600 Subject: [PATCH 026/152] refactor(test-swap-wallet): use boot-tools, object-tools - refactor: use wallet-tools - refactor: follow x.contract.js pattern - refactor: use getBundleId helper --- .../src/{swaparoo.js => swaparoo.contract.js} | 0 contract/test/test-swap-wallet.js | 247 +----------------- 2 files changed, 14 insertions(+), 233 deletions(-) rename contract/src/{swaparoo.js => swaparoo.contract.js} (100%) diff --git a/contract/src/swaparoo.js b/contract/src/swaparoo.contract.js similarity index 100% rename from contract/src/swaparoo.js rename to contract/src/swaparoo.contract.js diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index a451ee59..ad2d05c2 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -1,108 +1,39 @@ // @ts-check import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import { createRequire } from 'node:module'; -import { E, Far } from '@endo/far'; -import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; -import { makePromiseSpace, makeNameHubKit } from '@agoric/vats'; -import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; -import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; -import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; -import { AmountMath, makeIssuerKit } from '@agoric/ertp'; - -// eslint-disable-next-line import/no-extraneous-dependencies -import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { E } from '@endo/far'; +import { AmountMath } from '@agoric/ertp'; +import { mockBootstrapPowers } from './boot-tools.js'; import { installContract, startContract, } from '../src/start-contract-proposal.js'; import { makeStableFaucet } from './mintStable.js'; -import { seatLike } from './wallet-tools.js'; +import { mockWalletFactory, seatLike } from './wallet-tools.js'; +import { getBundleId, makeBundleCacheContext } from './bundle-tools.js'; + +/** @typedef {import('./wallet-tools.js').MockWallet} MockWallet */ -/** @type {import('ava').TestFn>>} */ +/** @type {import('ava').TestFn>>} */ const test = anyTest; -const myRequire = createRequire(import.meta.url); +const nodeRequire = createRequire(import.meta.url); -const assets = { - swaparoo: myRequire.resolve('../src/swaparoo.js'), -}; const contractName = 'swaparoo'; - -const makeTestContext = async _t => { - const bundleCache = await makeNodeBundleCache('bundles/', {}, s => import(s)); - - return { bundleCache, shared: {} }; +const assets = { + [contractName]: nodeRequire.resolve(`../src/${contractName}.contract.js`), }; -test.before(async t => (t.context = await makeTestContext(t))); - -/** - * Mock enough powers for startSwaparoo permit. - * Plus access to load bundles, peek at vstorage, and mint IST and BLD. - * - * @param {(...args: unknown[]) => void} log - */ -const mockBootstrap = async log => { - const { produce, consume } = makePromiseSpace(); - const { admin, vatAdminState } = makeFakeVatAdmin(); - const { zoeService: zoe, feeMintAccess } = makeZoeKitForTest(admin); - const feeIssuer = await E(zoe).getFeeIssuer(); - const feeBrand = await E(feeIssuer).getBrand(); - - const { rootNode: chainStorage } = makeFakeStorageKit('published'); - - const { nameAdmin: agoricNamesAdmin } = makeNameHubKit(); - const spaces = await makeWellKnownSpaces(agoricNamesAdmin, log, [ - 'installation', - 'instance', - 'issuer', - 'brand', - ]); - - const { nameAdmin: namesByAddressAdmin } = makeNameHubKit(); - - const startUpgradable = ({ - installation, - issuerKeywordRecord, - terms, - privateArgs, - label, - }) => - E(zoe).startInstance( - installation, - issuerKeywordRecord, - terms, - privateArgs, - label, - ); - - const bldIssuerKit = makeIssuerKit('BLD', 'nat', { decimalPlaces: 6 }); - produce.bldIssuerKit.resolve(bldIssuerKit); - produce.zoe.resolve(zoe); - produce.startUpgradable.resolve(startUpgradable); - produce.feeMintAccess.resolve(feeMintAccess); - produce.chainStorage.resolve(chainStorage); - produce.namesByAddressAdmin.resolve(namesByAddressAdmin); - spaces.issuer.produce.IST.resolve(feeIssuer); - spaces.brand.produce.IST.resolve(feeBrand); - spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); - spaces.brand.produce.BLD.resolve(bldIssuerKit.brand); - - /** @type {BootstrapPowers} */ - // @ts-expect-error mock / cast - const powers = { produce, consume, ...spaces }; - - return { powers, vatAdminState }; -}; +test.before(async t => (t.context = await makeBundleCacheContext(t))); test.serial('bootstrap and start contract', async t => { t.log('bootstrap'); - const { powers, vatAdminState } = await mockBootstrap(console.log); + const { powers, vatAdminState } = await mockBootstrapPowers(t.log); const { bundleCache } = t.context; const bundle = await bundleCache.load(assets.swaparoo, contractName); - const bundleID = `b1-${bundle.endoZipBase64Sha512}`; + const bundleID = getBundleId(bundle); t.log('publish bundle', bundleID.slice(0, 8)); vatAdminState.installBundle(bundleID, bundle); @@ -206,156 +137,6 @@ const startJack = async ( return E(wallet.offers).executeOffer(offerSpec); }; -const { entries, fromEntries } = Object; - -/** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ -const allValues = async obj => { - const es = await Promise.all( - entries(obj).map(async ([k, vP]) => Promise.resolve(vP).then(v => [k, v])), - ); - return fromEntries(es); -}; - -/** @type { >(obj: T, f: (v: V) => U) => Record} */ -const mapValues = (obj, f) => - fromEntries(entries(obj).map(([p, v]) => [p, f(v)])); - -/** - * @deprecated use wallet-tools instead - * - * @param {{ - * zoe: ERef; - * chainStorage: ERef; - * namesByAddressAdmin: ERef; - * }} powers - * - * @param {IssuerKeywordRecord} issuerKeywordRecord - * - * @typedef {import('@agoric/smart-wallet/src/offers.js').OfferSpec} OfferSpec - * @typedef {import('@agoric/smart-wallet/src/smartWallet.js').UpdateRecord} UpdateRecord - * - * @typedef {Awaited['makeSmartWallet']>>>} MockWallet - */ -const mockWalletFactory = ( - { zoe, namesByAddressAdmin }, - issuerKeywordRecord, -) => { - const DEPOSIT_FACET_KEY = 'depositFacet'; - - const { Fail } = assert; - - // const walletsNode = E(chainStorage).makeChildNode('wallet'); - - // TODO: provideSmartWallet - /** @param {string} address */ - const makeSmartWallet = async address => { - const { nameAdmin: addressAdmin } = await E( - namesByAddressAdmin, - ).provideChild(address, [DEPOSIT_FACET_KEY]); - - const purseByBrand = new Map(); - await allValues( - mapValues(issuerKeywordRecord, async issuer => { - const purse = await E(issuer).makeEmptyPurse(); - const brand = await E(issuer).getBrand(); - purseByBrand.set(brand, purse); - }), - ); - const invitationBrand = await E(E(zoe).getInvitationIssuer()).getBrand(); - purseByBrand.has(invitationBrand) || - Fail`no invitation issuer / purse / brand`; - const invitationPurse = purseByBrand.get(invitationBrand); - - const depositFacet = Far('DepositFacet', { - /** @param {Payment} pmt */ - receive: async pmt => { - const pBrand = await E(pmt).getAllegedBrand(); - if (!purseByBrand.has(pBrand)) - throw Error(`brand not known/supported: ${pBrand}`); - const purse = purseByBrand.get(pBrand); - return E(purse).deposit(pmt); - }, - }); - await E(addressAdmin).default(DEPOSIT_FACET_KEY, depositFacet); - - // const updatesNode = E(walletsNode).makeChildNode(address); - // const currentNode = E(updatesNode).makeChildNode('current'); - - const getContractInvitation = invitationSpec => { - const { - instance, - publicInvitationMaker, - invitationArgs = [], - } = invitationSpec; - const pf = E(zoe).getPublicFacet(instance); - return E(pf)[publicInvitationMaker](...invitationArgs); - }; - - const getPurseInvitation = async invitationSpec => { - // const { instance, description } = invitationSpec; - const invitationAmount = await E(invitationPurse).getCurrentAmount(); - console.log( - 'TODO: check invitation amount against instance', - invitationAmount, - invitationSpec, - ); - return E(invitationPurse).withdraw(invitationAmount); - }; - - const sourceImpl = { - contract: getContractInvitation, - purse: getPurseInvitation, - }; - /** - * @param {OfferSpec} offerSpec - * @returns {AsyncGenerator} - */ - async function* executeOffer(offerSpec) { - const { invitationSpec, proposal, offerArgs } = offerSpec; - const { source } = invitationSpec; - const impl = sourceImpl[source] || Fail`unsupported source: ${source}`; - const invitation = await impl(invitationSpec); - const pmts = await allValues( - mapValues(proposal.give || {}, async amt => { - const { brand } = amt; - if (!purseByBrand.has(brand)) - throw Error(`brand not known/supported: ${brand}`); - const purse = purseByBrand.get(brand); - return E(purse).withdraw(amt); - }), - ); - const seat = await E(zoe).offer(invitation, proposal, pmts, offerArgs); - // console.log(address, offerSpec.id, 'got seat'); - yield { updated: 'offerStatus', status: offerSpec }; - const result = await E(seat).getOfferResult(); - // console.log(address, offerSpec.id, 'got result', result); - yield { updated: 'offerStatus', status: { ...offerSpec, result } }; - const [payouts, numWantsSatisfied] = await Promise.all([ - E(seat).getPayouts(), - E(seat).numWantsSatisfied(), - ]); - yield { - updated: 'offerStatus', - status: { ...offerSpec, result, numWantsSatisfied }, - }; - const amts = await allValues( - mapValues(payouts, pmtP => - Promise.resolve(pmtP).then(pmt => depositFacet.receive(pmt)), - ), - ); - // console.log(address, offerSpec.id, 'got payouts', amts); - yield { - updated: 'offerStatus', - status: { ...offerSpec, result, numWantsSatisfied, payouts: amts }, - }; - } - - return { deposit: depositFacet, offers: Far('Offers', { executeOffer }) }; - }; - - return harden({ makeSmartWallet }); -}; - test.serial('basic swap', async t => { const ONE_IST = 1_000_000n; const addr = { From 7637311073783af7bbd4e5f41cd2565e1f1b2730 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 17:42:58 -0600 Subject: [PATCH 027/152] refactor(swaparoo): follow X.proposal.js pattern --- .../src/{start-contract-proposal.js => swaparoo.proposal.js} | 2 +- contract/test/test-swap-wallet.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) rename contract/src/{start-contract-proposal.js => swaparoo.proposal.js} (98%) diff --git a/contract/src/start-contract-proposal.js b/contract/src/swaparoo.proposal.js similarity index 98% rename from contract/src/start-contract-proposal.js rename to contract/src/swaparoo.proposal.js index 03e6b25c..99fa888c 100644 --- a/contract/src/start-contract-proposal.js +++ b/contract/src/swaparoo.proposal.js @@ -2,7 +2,7 @@ import { E } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; -console.warn('start-contract-proposal.js module evaluating'); +console.warn('swaparoo.proposal.js module evaluating'); const { Fail } = assert; diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index ad2d05c2..e1e1e5ee 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -5,10 +5,7 @@ import { E } from '@endo/far'; import { AmountMath } from '@agoric/ertp'; import { mockBootstrapPowers } from './boot-tools.js'; -import { - installContract, - startContract, -} from '../src/start-contract-proposal.js'; +import { installContract, startContract } from '../src/swaparoo.proposal.js'; import { makeStableFaucet } from './mintStable.js'; import { mockWalletFactory, seatLike } from './wallet-tools.js'; import { getBundleId, makeBundleCacheContext } from './bundle-tools.js'; From 5ebd71c243ea5e26bb866090c1d1d64b6eb42199 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 12 Mar 2024 12:39:45 -0500 Subject: [PATCH 028/152] refactor(swaparoo): use fixHub - refactor: clarify want1, give1 - style: lint --- contract/src/swaparoo.contract.js | 39 +++++++------------------------ 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index 68bea2bc..b8164903 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -7,6 +7,7 @@ import '@agoric/zoe/exported.js'; import { atomicRearrange } from '@agoric/zoe/src/contractSupport/atomicTransfer.js'; import '@agoric/zoe/src/contracts/exported.js'; import { makeCollectFeesInvitation } from './collectFees.js'; +import { fixHub } from './fixHub.js'; const { quote: q } = assert; @@ -39,30 +40,6 @@ export const swapWithFee = (zcf, firstSeat, secondSeat, feeSeat, feeAmount) => { let issuerNumber = 1; const IssuerShape = M.remotable('Issuer'); -/** - * ref https://github.com/Agoric/agoric-sdk/issues/8408#issuecomment-1741445458 - * - * @param {ERef} namesByAddressAdmin - */ -const fixHub = async namesByAddressAdmin => { - /** @type {import('@agoric/vats').NameHub} */ - // @ts-expect-error mock. no has, keys, ... - const hub = Far('Hub work-around', { - lookup: async (addr, key, ...rest) => { - if (!(addr && key && rest.length === 0)) { - throw Error('unsupported'); - } - await E(namesByAddressAdmin).reserve(addr); - const addressAdmin = await E(namesByAddressAdmin).lookupAdmin(addr); - assert(addressAdmin, 'no admin???'); - await E(addressAdmin).reserve(key); - const addressHub = E(addressAdmin).readonly(); - return E(addressHub).lookup(key); - }, - }); - return hub; -}; - /** * @param {ZCF<{feeAmount: Amount<'nat'>, namesByAddressAdmin: import('@agoric/vats').NamesByAddressAdmin}>} zcf */ @@ -80,7 +57,7 @@ export const start = async zcf => { * @param { ZCFSeat } firstSeat * @param {{ addr: string }} offerArgs */ - const makeSecondInvitation = async (firstSeat, offerArgs ) => { + const makeSecondInvitation = async (firstSeat, offerArgs) => { mustMatch(offerArgs, harden({ addr: M.string() })); const { addr: secondPartyAddress } = offerArgs; @@ -94,14 +71,14 @@ export const start = async zcf => { }); }; - const { want, give } = firstSeat.getProposal(); + const { want: want1, give: give1 } = firstSeat.getProposal(); /** @type {OfferHandler} */ const secondSeatOfferHandler = secondSeat => { - if (!matches(secondSeat.getProposal(), makeSecondProposalShape(want))) { + if (!matches(secondSeat.getProposal(), makeSecondProposalShape(want1))) { // The second invitation was burned; let them both know it didn't work const error = Error( - `Proposals didn't match, first want: ${q(want)}, second give: ${q( + `Proposals didn't match, first want: ${q(want1)}, second give: ${q( secondSeat.getProposal().give, )}`, ); @@ -116,7 +93,7 @@ export const start = async zcf => { const secondSeatInvitation = await zcf.makeInvitation( secondSeatOfferHandler, 'matchOffer', - { give, want }, // "give" and "want" are from the proposer's perspective + { give: give1, want: want1 }, // "give" and "want" are from the proposer's perspective ); const secondDepositFacet = await E(depositFacetFromAddr).lookup( @@ -137,9 +114,9 @@ export const start = async zcf => { mustMatch(issuers, M.arrayOf(IssuerShape)); for (const i of issuers) { if (!Object.values(zcf.getTerms().issuers).includes(i)) { - zcf.saveIssuer(i, `Issuer${issuerNumber += 1}`); + zcf.saveIssuer(i, `Issuer${(issuerNumber += 1)}`); } - }; + } const proposalShape = M.splitRecord({ give: M.splitRecord({ Fee: feeShape }), }); From b0151daae014e6ce24fdbfd086dbc265c1322279 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 22:43:55 -0600 Subject: [PATCH 029/152] test(swap): snapshot offers --- contract/test/test-swap-wallet.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index e1e1e5ee..89d3cb6a 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -48,6 +48,7 @@ test.serial('bootstrap and start contract', async t => { }); /** + * @param {import('ava').ExecutionContext} t * @param {*} wellKnown * @param {MockWallet} wallet * @param {Amount} beansAmount @@ -56,6 +57,7 @@ test.serial('bootstrap and start contract', async t => { * @param {boolean} [alicePays] */ const startAlice = async ( + t, wellKnown, wallet, beansAmount, @@ -89,12 +91,14 @@ const startAlice = async ( proposal, offerArgs: { addr: depositAddress }, }; + t.snapshot(offerSpec, 'alice makes offer'); const updates = E(wallet.offers).executeOffer(offerSpec); return updates; }; /** + * @param {import('ava').ExecutionContext} t * @param {*} wellKnown * @param {MockWallet} wallet * @param {Amount} beansAmount @@ -102,6 +106,7 @@ const startAlice = async ( * @param {boolean} [jackPays] */ const startJack = async ( + t, wellKnown, wallet, beansAmount, @@ -130,6 +135,7 @@ const startJack = async ( }, proposal, }; + t.snapshot(offerSpec, 'jack makes offer'); return E(wallet.offers).executeOffer(offerSpec); }; @@ -198,7 +204,14 @@ test.serial('basic swap', async t => { await mintBrandedPayment(fiveBeans.value), ); const aliceSeat = seatLike( - await startAlice(wellKnown, wallet.alice, fiveBeans, cowAmount, addr.jack), + await startAlice( + t, + wellKnown, + wallet.alice, + fiveBeans, + cowAmount, + addr.jack, + ), ); const aliceResult = await E(aliceSeat).getOfferResult(); @@ -209,7 +222,7 @@ test.serial('basic swap', async t => { await E(E.get(bldIssuerKit).mint).mintPayment(cowAmount), ); const jackSeat = seatLike( - await startJack(wellKnown, wallet.jack, fiveBeans, cowAmount), + await startJack(t, wellKnown, wallet.jack, fiveBeans, cowAmount), ); const jackPayouts = await jackSeat.getPayoutAmounts(); From 7028fce5ef71bbb8645878f52e7cf6a62a7d5430 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 22:44:27 -0600 Subject: [PATCH 030/152] chore(swap): generated snapshots --- .../test/snapshots/test-swap-wallet.js.md | 70 ++++++++++++++++++ .../test/snapshots/test-swap-wallet.js.snap | Bin 0 -> 898 bytes 2 files changed, 70 insertions(+) create mode 100644 contract/test/snapshots/test-swap-wallet.js.md create mode 100644 contract/test/snapshots/test-swap-wallet.js.snap diff --git a/contract/test/snapshots/test-swap-wallet.js.md b/contract/test/snapshots/test-swap-wallet.js.md new file mode 100644 index 00000000..9d356e00 --- /dev/null +++ b/contract/test/snapshots/test-swap-wallet.js.md @@ -0,0 +1,70 @@ +# Snapshot report for `test/test-swap-wallet.js` + +The actual snapshot is saved in `test-swap-wallet.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## basic swap + +> alice makes offer + + { + id: 'alice-swap-1', + invitationSpec: { + instance: Object @Alleged: InstanceHandle {}, + invitationArgs: [ + [ + Object @Alleged: BLD issuer {}, + Object @Alleged: ZDEFAULT issuer {}, + ], + ], + publicInvitationMaker: 'makeFirstInvitation', + source: 'contract', + }, + offerArgs: { + addr: 'agoric1jack', + }, + proposal: { + give: { + Fee: { + brand: Object @Alleged: ZDEFAULT brand {}, + value: 1n, + }, + MagicBeans: { + brand: Object @Alleged: ZDEFAULT brand {}, + value: 5n, + }, + }, + want: { + Cow: { + brand: Object @Alleged: BLD brand {}, + value: 10n, + }, + }, + }, + } + +> jack makes offer + + { + id: 'jack-123', + invitationSpec: { + description: 'matchOffer', + instance: Object @Alleged: InstanceHandle {}, + source: 'purse', + }, + proposal: { + give: { + Cow: { + brand: Object @Alleged: BLD brand {}, + value: 10n, + }, + }, + want: { + MagicBeans: { + brand: Object @Alleged: ZDEFAULT brand {}, + value: 5n, + }, + }, + }, + } diff --git a/contract/test/snapshots/test-swap-wallet.js.snap b/contract/test/snapshots/test-swap-wallet.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..b8134522c6d911e26a6c661ae64f7b06ca0a172a GIT binary patch literal 898 zcmV-|1AY8KRzV95%6 z32l(n=O2p*00000000B6RnKb^K@{G%KhiWwo5a>uib76$DjG|BC_R{3tCf~gwcw9~ zOg7VWo9*tpvuUjeQbD|V62yZC3*tfi4?KxT!Ha){7X|4-6vTtRopd*w*|Z^G$Rm?| z-%P&u&3j*7u9Qt%ud(eN>KUF%*UE$$dVy^c$6yw5*sATZhdY%D@yHGBks|d-{tJ?z zP2%S{j4H-sj2(;tNaP{0SYD&L2M{iExts)j5~vbn5hD+RB7v3%*{B4|3^5Izj`}}5 zT9lw4;2oY9Wcv+k!|;e_*w$5t>O8*}$@khTE7UEyRmM|8&`c#A*LG}1OisFlnTr?% zV;kc=2&Cm!(n*lNB4kg5B}JGrEKAY}j4@e&_O_D&NzTa;l7_`RV(FA;?#gW|ZgG@JE~#xc%+Bw6Ya(X>|fWr!a0~Jm~Du%E1nu z^e26^cy^2n{=9=b?@9+)u=)ctzcEgsr8p#rUYzGMXzRjmW&D1@Sr7G z^q??xUp~OV@FHGg?k&a#@plrjJNtr=Zx|rDYy7{kplmGw# literal 0 HcmV?d00001 From 96d1681232b35b0eaf7977ed98110ecca2a10c35 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:22:20 -0600 Subject: [PATCH 031/152] chore(postalSvc): copy 3d899ff --- contract/src/postalSvc.js | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 contract/src/postalSvc.js diff --git a/contract/src/postalSvc.js b/contract/src/postalSvc.js new file mode 100644 index 00000000..045d8374 --- /dev/null +++ b/contract/src/postalSvc.js @@ -0,0 +1,64 @@ +// @ts-check +import { E, Far } from '@endo/far'; +import { M, mustMatch } from '@endo/patterns'; +import { withdrawFromSeat } from '@agoric/zoe/src/contractSupport/zoeHelpers.js'; + +const { keys, values } = Object; + +/** + * @typedef {object} PostalSvcTerms + * @property {import('@agoric/vats').NameHub} namesByAddress + */ + +/** @param {ZCF} zcf */ +export const start = zcf => { + const { namesByAddress, issuers } = zcf.getTerms(); + mustMatch(namesByAddress, M.remotable('namesByAddress')); + console.log('postalSvc issuers', Object.keys(issuers)); + + /** + * @param {string} addr + * @returns {ERef} + */ + const getDepositFacet = addr => { + assert.typeof(addr, 'string'); + return E(namesByAddress).lookup(addr, 'depositFacet'); + }; + + /** + * @param {string} addr + * @param {Payment} pmt + */ + const sendTo = (addr, pmt) => E(getDepositFacet(addr)).receive(pmt); + + /** @param {string} recipient */ + const makeSendInvitation = recipient => { + assert.typeof(recipient, 'string'); + + /** @type {OfferHandler} */ + const handleSend = async seat => { + const { give } = seat.getProposal(); + const depositFacet = await getDepositFacet(recipient); + const payouts = await withdrawFromSeat(zcf, seat, give); + + // XXX partial failure? return payments? + await Promise.all( + values(payouts).map(pmtP => + Promise.resolve(pmtP).then(pmt => E(depositFacet).receive(pmt)), + ), + ); + seat.exit(); + return `sent ${keys(payouts).join(', ')}`; + }; + + return zcf.makeInvitation(handleSend, 'send'); + }; + + const publicFacet = Far('postalSvc', { + lookup: (...path) => E(namesByAddress).lookup(...path), + getDepositFacet, + sendTo, + makeSendInvitation, + }); + return { publicFacet }; +}; From 6fe5ee460c2fb91543ea88c27d97e2feda8c15bf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:16:17 -0600 Subject: [PATCH 032/152] chore(start-postalSvc.js): copy b8be868 --- contract/src/start-postalSvc.js | 99 +++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 contract/src/start-postalSvc.js diff --git a/contract/src/start-postalSvc.js b/contract/src/start-postalSvc.js new file mode 100644 index 00000000..4da0b4b4 --- /dev/null +++ b/contract/src/start-postalSvc.js @@ -0,0 +1,99 @@ +/** + * @file core eval script* to start the postalSvc contract. + * + * * see test-gimix-proposal.js to make a script from this file. + * + * The `permit` export specifies the corresponding permit. + */ +// @ts-check + +import { E } from '@endo/far'; +import { fixHub } from './fixHub.js'; + +const trace = (...args) => console.log('start-postalSvc', ...args); + +const fail = msg => { + throw Error(msg); +}; + +/** + * @typedef { typeof import('../src/postalSvc.js').start } PostalSvcFn + * + * @typedef {{ + * produce: { postalSvcKit: Producer }, + * installation: { + * consume: { postalSvc: Promise> }, + * produce: { postalSvc: Producer> }, + * } + * instance: { + * consume: { postalSvc: Promise['instance']> }, + * produce: { postalSvc: Producer['instance']> }, + * } + * }} PostalSvcPowers + */ +/** + * @deprecated use contractStarter + * a la starterSam in ../test/market-actors.js + * + * @param {BootstrapPowers & PostalSvcPowers} powers + * @param {{ options?: { postalSvc: { + * bundleID: string; + * issuerNames?: string[]; + * }}}} config + */ +export const startPostalSvc = async (powers, config) => { + console.warn('DEPRECATED. Use contractStarter. See starterSam example.'); + + const { + consume: { zoe, namesByAddressAdmin }, + installation: { + produce: { postalSvc: produceInstallation }, + }, + instance: { + produce: { postalSvc: produceInstance }, + }, + issuer: { consume: consumeIssuer }, + } = powers; + const { + bundleID = fail(`no bundleID`), + issuerNames = ['IST', 'Invitation'], + } = config.options?.postalSvc ?? {}; + + /** @type {Installation} */ + const installation = await E(zoe).installBundleID(bundleID); + produceInstallation.resolve(installation); + + const namesByAddress = await fixHub(namesByAddressAdmin); + + const issuers = Object.fromEntries( + issuerNames.map(n => [n, consumeIssuer[n]]), + ); + const { instance } = await E(zoe).startInstance(installation, issuers, { + namesByAddress, + }); + produceInstance.resolve(instance); + + trace('postalSvc started'); +}; + +export const manifest = /** @type {const} */ ({ + [startPostalSvc.name]: { + consume: { + agoricNames: true, + namesByAddress: true, + namesByAddressAdmin: true, + zoe: true, + }, + installation: { + produce: { postalSvc: true }, + }, + instance: { + produce: { postalSvc: true }, + }, + }, +}); + +export const permit = JSON.stringify(Object.values(manifest)[0]); + +// script completion value +startPostalSvc; From ba133ec15dc46aad40fbf0a1daa1f02d8a72168c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 14:07:19 -0600 Subject: [PATCH 033/152] chore(start-postalSvc): match builder patterns - not deprecated - permit tweak, handle undefined config - ATOM not available from consume.issuer - move type burden to callee --- contract/src/start-postalSvc.js | 38 ++++++++++++++------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/contract/src/start-postalSvc.js b/contract/src/start-postalSvc.js index 4da0b4b4..f603795f 100644 --- a/contract/src/start-postalSvc.js +++ b/contract/src/start-postalSvc.js @@ -1,8 +1,6 @@ /** * @file core eval script* to start the postalSvc contract. * - * * see test-gimix-proposal.js to make a script from this file. - * * The `permit` export specifies the corresponding permit. */ // @ts-check @@ -12,9 +10,7 @@ import { fixHub } from './fixHub.js'; const trace = (...args) => console.log('start-postalSvc', ...args); -const fail = msg => { - throw Error(msg); -}; +const { Fail } = assert; /** * @typedef { typeof import('../src/postalSvc.js').start } PostalSvcFn @@ -31,33 +27,31 @@ const fail = msg => { * } * }} PostalSvcPowers */ + /** - * @deprecated use contractStarter - * a la starterSam in ../test/market-actors.js - * - * @param {BootstrapPowers & PostalSvcPowers} powers + * @param {BootstrapPowers} powers * @param {{ options?: { postalSvc: { * bundleID: string; * issuerNames?: string[]; - * }}}} config + * }}}} [config] */ export const startPostalSvc = async (powers, config) => { - console.warn('DEPRECATED. Use contractStarter. See starterSam example.'); - + /** @type { BootstrapPowers & PostalSvcPowers} */ + // @ts-expect-error bootstrap powers evolve with BLD staker governance + const postalPowers = powers; const { - consume: { zoe, namesByAddressAdmin }, + consume: { zoe, namesByAddressAdmin, agoricNames }, installation: { produce: { postalSvc: produceInstallation }, }, instance: { produce: { postalSvc: produceInstance }, }, - issuer: { consume: consumeIssuer }, - } = powers; + } = postalPowers; const { - bundleID = fail(`no bundleID`), - issuerNames = ['IST', 'Invitation'], - } = config.options?.postalSvc ?? {}; + bundleID = Fail`no bundleID`, + issuerNames = ['IST', 'Invitation', 'BLD', 'ATOM'], + } = config?.options?.postalSvc ?? {}; /** @type {Installation} */ const installation = await E(zoe).installBundleID(bundleID); @@ -65,8 +59,9 @@ export const startPostalSvc = async (powers, config) => { const namesByAddress = await fixHub(namesByAddressAdmin); + // XXX ATOM isn't available via consume.issuer.ATOM. Odd. const issuers = Object.fromEntries( - issuerNames.map(n => [n, consumeIssuer[n]]), + issuerNames.map(n => [n, E(agoricNames).lookup('issuer', n)]), ); const { instance } = await E(zoe).startInstance(installation, issuers, { namesByAddress, @@ -93,7 +88,6 @@ export const manifest = /** @type {const} */ ({ }, }); -export const permit = JSON.stringify(Object.values(manifest)[0]); +export const permit = Object.values(manifest)[0]; -// script completion value -startPostalSvc; +export const main = startPostalSvc; From f49c04e68b496a314f9c52b62c683c1a85d35be7 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 02:13:33 -0600 Subject: [PATCH 034/152] test(nameProxy): works in 1 case --- contract/test/ui-kit-goals/test-nameProxy.js | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 contract/test/ui-kit-goals/test-nameProxy.js diff --git a/contract/test/ui-kit-goals/test-nameProxy.js b/contract/test/ui-kit-goals/test-nameProxy.js new file mode 100644 index 00000000..aa6561c1 --- /dev/null +++ b/contract/test/ui-kit-goals/test-nameProxy.js @@ -0,0 +1,26 @@ +import '@endo/init/debug.js'; +import test from 'ava'; + +import { Far } from '@endo/far'; +import { makeNameHubKit } from '@agoric/vats'; +import { makeNameProxy } from './name-service-client.js'; + +test('makeNameProxy makes NameHub lookup convenient', async t => { + const k0 = makeNameHubKit(); + const kb = makeNameHubKit(); + k0.nameAdmin.update('brand', kb.nameHub, kb.nameAdmin); + const atomBrand = Far('Atom Brand', {}); + kb.nameAdmin.update('Atom', atomBrand); + + const agoricNames = k0.nameHub; + + const A = makeNameProxy(agoricNames); + + const ab = await A.brand.Atom; + t.log('brand', ab); + t.is(ab, atomBrand); + + const b = await A.brand; + t.log('hub', b); + t.is(b, kb.nameHub); +}); From 0e5393065f8f79d89ab6940f5833b4957d0507ab Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 14:54:59 -0600 Subject: [PATCH 035/152] feat(name-service-client): makeAgoricNames, makeNameProxy --- .../test/ui-kit-goals/name-service-client.js | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 contract/test/ui-kit-goals/name-service-client.js diff --git a/contract/test/ui-kit-goals/name-service-client.js b/contract/test/ui-kit-goals/name-service-client.js new file mode 100644 index 00000000..2ccb6647 --- /dev/null +++ b/contract/test/ui-kit-goals/name-service-client.js @@ -0,0 +1,55 @@ +// @ts-check +import { E, Far } from '@endo/far'; + +/** @param {{ queryData: (path: string) => any }} qt */ +export const makeAgoricNames = async qt => { + assert(qt); + const nameHubCache = new Map(); + + /** @param {string} kind */ + const lookupKind = async kind => { + assert.typeof(kind, 'string'); + if (nameHubCache.has(kind)) { + return nameHubCache.get(kind); + } + const entries = await qt.queryData(`published.agoricNames.${kind}`); + const record = Object.fromEntries(entries); + const hub = Far('NameHub', { + lookup: name => record[name], + keys: () => entries.map(e => e[0]), + entries: () => entries, + }); + nameHubCache.set(kind, hub); + return hub; + }; + + const invalidate = () => { + nameHubCache.clear(); + }; + + const hub0 = Far('Hub', { + lookup: async (kind, ...more) => { + const hub2 = lookupKind(kind); + if (more.length > 0) { + return E(hub2).lookup(...more); + } + return hub2; + }, + }); + + return { lookup: hub0.lookup, invalidate }; +}; +const pmethods = harden(['then', 'catch', 'finally']); +// See also: https://github.com/endojs/endo/tree/mfig-o/packages/o +/** @param {ERef>} nodeP */ + +export const makeNameProxy = nodeP => + new Proxy(nodeP, { + get(target, prop, _rx) { + assert.typeof(prop, 'string'); + if (pmethods.includes(prop)) { + return target[prop].bind(target); + } + return makeNameProxy(E(target).lookup(prop)); + }, + }); From 09e06222249d5465a9e71424c9859505e8de173d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:19:11 -0600 Subject: [PATCH 036/152] chore(market-actors): copy b39f531 --- contract/test/market-actors.js | 467 +++++++++++++++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 contract/test/market-actors.js diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js new file mode 100644 index 00000000..d618b18d --- /dev/null +++ b/contract/test/market-actors.js @@ -0,0 +1,467 @@ +// @ts-check +import { E, getInterfaceOf } from '@endo/far'; +import { makePromiseKit } from '@endo/promise-kit'; +import { AmountMath } from '@agoric/ertp/src/amountMath.js'; +import { allValues, mapValues, seatLike } from './wallet-tools.js'; + +const { entries, fromEntries, keys } = Object; +const { Fail } = assert; + +/** + * @typedef {{ + * brand: Record> & { timer: unknown } + * issuer: Record> + * instance: Record> + * installation: Record> + * }} WellKnown + */ + +/** + * @typedef {{ + * assetKind: Map + * }} WellKnownKinds + */ + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ wallet: import('./wallet-tools.js').MockWallet }} mine + * @param { WellKnown & WellKnownKinds } wellKnown + * @param {{ + * rxAddr: string, + * toSend: AmountKeywordRecord, + * svcInstance?: Instance, + * }} shared + */ +export const payerPete = async ( + t, + { wallet }, + wellKnown, + { rxAddr, toSend, svcInstance }, +) => { + const instance = await (svcInstance || wellKnown.instance.postalSvc); + + t.log('Pete offers to send to', rxAddr, 'via contract', instance); + const updates = await E(wallet.offers).executeOffer({ + id: 'peteSend1', + invitationSpec: { + source: 'contract', + instance, + publicInvitationMaker: 'makeSendInvitation', + invitationArgs: [rxAddr], + }, + proposal: { give: toSend }, + }); + + for await (const update of updates) { + // t.log('pete update', update); + if (update?.status?.payouts) { + for (const [kwd, amt] of Object.entries(update?.status?.payouts)) { + const { brand } = amt; + const kind = + wellKnown.assetKind.get(brand) || Fail`no kind for brand ${kwd}`; + t.log('Pete payout should be empty', amt); + t.deepEqual(amt, AmountMath.makeEmpty(brand, kind)); + } + t.is(update?.status?.numWantsSatisfied, 1); + break; + } + } +}; + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ wallet: import('./wallet-tools.js').MockWallet, }} mine + * @param {WellKnown & WellKnownKinds} wellKnown + * @param {{ toSend: AmountKeywordRecord }} shared + */ +export const receiverRose = async (t, { wallet }, wellKnown, { toSend }) => { + const { makeEmpty } = AmountMath; + const purseNotifier = await allValues( + mapValues(toSend, amt => E(wallet.peek).purseNotifier(amt.brand)), + ); + + const initial = await allValues( + mapValues(purseNotifier, pn => E(pn).getUpdateSince()), + ); + for (const [name, update] of Object.entries(initial)) { + t.log('Rose', name, 'purse starts emtpy', update.value); + const brand = toSend[name].brand; + const kind = wellKnown.assetKind.get(brand) || Fail`${brand}`; + t.deepEqual(update.value, makeEmpty(brand, kind)); + } + + const done = await allValues( + Object.fromEntries( + Object.entries(initial).map(([name, update]) => { + const amtP = E(purseNotifier[name]) + .getUpdateSince(update.updateCount) + .then(u => { + t.log('Rose rxd', u.value); + t.deepEqual(u.value, toSend[name]); + return u.value; + }); + return [name, amtP]; + }), + ), + ); + t.log('Rose got balance updates', Object.keys(done)); + t.deepEqual(Object.keys(done), Object.keys(toSend)); +}; + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ wallet: import('./wallet-tools.js').MockWallet, }} mine + * @param {{ toSend: AmountKeywordRecord }} shared + */ +export const receiverRex = async (t, { wallet }, { toSend }) => { + const purseNotifier = await allValues( + mapValues(toSend, amt => E(wallet.peek).purseNotifier(amt.brand)), + ); + + const initial = await allValues( + mapValues(purseNotifier, pn => E(pn).getUpdateSince()), + ); + + const done = await allValues( + fromEntries( + entries(initial).map(([name, update]) => { + const amtP = E(purseNotifier[name]) + .getUpdateSince(update.updateCount) + .then(u => { + t.log('Rex rxd', u.value); + t.deepEqual(u.value, toSend[name]); + return u.value; + }); + return [name, amtP]; + }), + ), + ); + t.log('Rex got balance updates', keys(done)); + t.deepEqual(keys(done), keys(toSend)); +}; + +export const senderContract = async ( + t, + { zoe, terms: { postalSvc: instance, destAddr: addr1 } }, +) => { + const iIssuer = await E(zoe).getInvitationIssuer(); + const iBrand = await E(iIssuer).getBrand(); + const postalSvc = E(zoe).getPublicFacet(instance); + const purse = await E(iIssuer).makeEmptyPurse(); + + const noInvitations = AmountMath.make(iBrand, harden([])); + const pmt1 = await E(purse).withdraw(noInvitations); + + t.log( + 'senderContract: E(', + getInterfaceOf(await postalSvc), + ').sendTo(', + addr1, + ',', + noInvitations, + ')', + ); + const sent = await E(postalSvc).sendTo(addr1, pmt1); + t.deepEqual(sent, noInvitations); +}; + +/** + * Auxiliary data + * @typedef {{ + * boardAux: (obj: unknown) => Promise + * }} BoardAux + */ + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ + * wallet: import('./wallet-tools.js').MockWallet, + * }} mine + * @param { WellKnown & BoardAux} wellKnown + */ +export const starterSam = async (t, mine, wellKnown) => { + const { wallet } = mine; + + const checkKeys = (label, actual, expected) => { + label && t.log(label, actual); + t.deepEqual(keys(actual), keys(expected)); + }; + const first = array => { + t.true(Array.isArray(array)); + t.is(array.length, 1); + const [it] = array; + return it; + }; + const brand = { + Invitation: await wellKnown.brand.Invitation, + }; + const instance = { + contractStarter: await wellKnown.instance.contractStarter, + }; + + const expected = { + result: 'UNPUBLISHED', + payouts: { + Fee: { brand: brand.IST, value: 0n }, + Handles: { + brand: brand.Invitation, + value: [ + { + customDetails: { + installation: true, + instance: true, + }, + description: true, + handle: true, + installation: true, + instance: instance.contractStarter, + }, + ], + }, + }, + }; + + let offerSeq = 0; + /** @param {{ bundleID: string, label?: string}} opts */ + const install = async opts => { + const starterAux = await wellKnown.boardAux(instance.contractStarter); + const { prices } = starterAux.terms; + const { installBundleID: Fee } = prices; + t.log('sam gives', Fee, 'to install', opts.label); + const updates = await E(wallet.offers).executeOffer({ + id: `install-${(offerSeq += 1)}`, + invitationSpec: { + source: 'contract', + instance: instance.contractStarter, + publicInvitationMaker: 'makeInstallInvitation', + }, + proposal: { give: { Fee } }, + offerArgs: opts, + }); + const payouts = await E(seatLike(updates)).getPayouts(); + t.log('sam install paid', payouts); + const { + value: [ + { + customDetails: { installation }, + }, + ], + } = payouts.Handles; + return installation; + }; + + const getPostalSvcTerms = async () => { + const { + terms: { namesByAddress }, + } = await wellKnown.boardAux(instance.contractStarter); + t.log('Sam got namesByAddress from contractStarter terms', namesByAddress); + return { namesByAddress }; + }; + + /** + * @template SF + * @param {import('../src/contractStarter.js').StartOptions} opts + */ + const installAndStart = async opts => { + t.log( + 'Sam starts', + opts.instanceLabel, + 'from', + (opts.bundleID || '').slice(0, 8), + ); + const starterAux = await wellKnown.boardAux(instance.contractStarter); + const { prices } = starterAux.terms; + const { add } = AmountMath; + const Fee = add(prices.installBundleID, prices.startInstance); + t.log('sam gives', Fee, 'to start', opts.instanceLabel); + + const updates = await E(wallet.offers).executeOffer({ + id: `samStart-${(offerSeq += 1)}`, + invitationSpec: { + source: 'contract', + instance: instance.contractStarter, + publicInvitationMaker: 'makeStartInvitation', + invitationArgs: [opts], + }, + proposal: { give: { Fee } }, + }); + + const seat = seatLike(updates); + + const result = await E(seat).getOfferResult(); + t.log('Sam gets result', result); + t.is(result, expected.result); + + const payouts = await E(seat).getPayouts(); + checkKeys(undefined, payouts, expected.payouts); + const { Handles } = payouts; + t.is(Handles.brand, expected.payouts.Handles.brand); + const details = first(Handles.value); + const [details0] = expected.payouts.Handles.value; + checkKeys(undefined, details, details0); + t.is(details.instance, details0.instance); + checkKeys( + 'Sam gets instance etc.', + details.customDetails, + details0.customDetails, + ); + + return details.customDetails; + }; + + return { install, getPostalSvcTerms, installAndStart }; +}; + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ + * wallet: import('./wallet-tools.js').MockWallet + * }} mine + * @param {*} wellKnown + */ +export const launcherLarry = async (t, { wallet }, wellKnown) => { + const { timerService: timer } = wellKnown; + const timerBrand = await wellKnown.brand.timer; + const MNY = { + brand: await wellKnown.brand.MNY, + issuer: await wellKnown.issuer.MNY, + }; + + const instance = { + contractStarter: await wellKnown.instance.contractStarter, + }; + + let offerSeq = 0; + let launchOfferId; + const deadline = harden({ timerBrand, absValue: 10n }); + + const launch = async ( + installation, + customTerms = { name: 'BRD', supplyQty: 1_000_000n }, + ) => { + !launchOfferId || Fail`already launched`; + + t.log('Larry prepares to launch', customTerms, 'at', deadline); + const { name } = customTerms; + const starterAux = await wellKnown.boardAux(instance.contractStarter); + const { startInstance } = starterAux.terms.prices; + + const startOpts = { + instanceLabel: `${name}-launch`, + installation, + issuerKeywordRecord: { Deposit: MNY.issuer }, + customTerms: { ...customTerms, deadline }, + }; + /** @type {import('@agoric/smart-wallet').OfferSpec} */ + + const id = `launch-${(offerSeq += 1)}`; + t.log('Larry pays', startInstance, 'to start', startOpts.label); + const updates = await E(wallet.offers).executeOffer({ + id, + invitationSpec: { + source: 'contract', + instance: instance.contractStarter, + publicInvitationMaker: 'makeStartInvitation', + invitationArgs: [startOpts], + }, + proposal: { + give: { Fee: startInstance }, + }, + }); + + const seat = seatLike(updates); + const result = await E(seat).getOfferResult(); + t.log('larry launch result', result); + const { Handles } = await E(seat).getPayouts(); + const { instance: launched } = Handles.value[0].customDetails; + t.log('larry launch instance', launched); + launchOfferId = id; + + return launched; + }; + + const collect = async () => { + t.log('Larry collects at', deadline); + const id = `collect-${(offerSeq += 1)}`; + const up2 = await E(wallet.offers).executeOffer({ + id, + invitationSpec: { + source: 'continuing', + previousOffer: launchOfferId, + invitationMakerName: 'Collect', + }, + proposal: { + want: { Deposit: AmountMath.make(MNY.brand, 0n) }, + exit: { afterDeadline: { timer, deadline } }, + }, + }); + const seat = seatLike(up2); + const result = await E(seat).getOfferResult(); + t.log('result', result); + const proceeds = await E(seat).getPayouts(); + t.log('Larry collected', proceeds); + }; + return { launch, collect }; +}; + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ + * wallet: import('./wallet-tools.js').MockWallet, + * ix: number, + * qty: bigint, + * }} mine + * @param {*} wk + */ +export const makeFan = (t, { wallet, ix, qty }, wk) => { + let offerSeq = 0; + const deposit = async instance => { + const { terms } = await wk.boardAux(instance); + const { brands, issuers } = terms; + // t.log(ix, 'fan found brands', brands); + + await E(wallet.offers).addIssuer(issuers.Share); + await E(wallet.offers).addIssuer(issuers.BRD); + + const updates = await E(wallet.offers).executeOffer({ + id: `deposit-${(offerSeq += 1)}`, + invitationSpec: { + source: 'contract', + instance, + publicInvitationMaker: 'makeDepositInvitation', + }, + proposal: { + give: { Deposit: AmountMath.make(brands.Deposit, qty) }, + want: { Shares: AmountMath.make(brands.Share, qty) }, + }, + }); + const seat = seatLike(updates); + const payouts = await E(seat).getPayouts(); + t.log(ix, 'fan got', payouts.Shares); + return payouts.Shares; + }; + + const redeem = async instance => { + const { terms } = await wk.boardAux(instance); + const { brands } = terms; + + const updates = await E(wallet.offers).executeOffer({ + id: `redeem-${(offerSeq += 1)}`, + invitationSpec: { + source: 'contract', + instance, + publicInvitationMaker: 'makeRedeemInvitation', + }, + proposal: { + give: { Shares: AmountMath.make(brands.Share, qty) }, + want: { Minted: AmountMath.make(brands.BRD, 1n) }, + }, + }); + const seat = seatLike(updates); + const payouts = await E(seat).getPayouts(); + t.log(ix, 'fan got', payouts.Minted); + return payouts.Minted; + }; + + return { deposit, redeem }; +}; From f6f1a77e9a9a76509a320adec31120a682dfda41 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 02:11:00 -0600 Subject: [PATCH 037/152] fix(market-actors): don't cheat on assetKind - chore: purseNotifer -> purseUpdates - chore: prune starter, launcher actors - getPayoutAmounts --- contract/test/market-actors.js | 409 +++++---------------------------- 1 file changed, 52 insertions(+), 357 deletions(-) diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index d618b18d..59a71d2a 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -1,11 +1,14 @@ // @ts-check import { E, getInterfaceOf } from '@endo/far'; -import { makePromiseKit } from '@endo/promise-kit'; -import { AmountMath } from '@agoric/ertp/src/amountMath.js'; -import { allValues, mapValues, seatLike } from './wallet-tools.js'; +import { AmountMath, AssetKind } from '@agoric/ertp/src/amountMath.js'; +import { allValues, mapValues } from '../src/objectTools.js'; +import { seatLike } from './wallet-tools.js'; +import { + makeNameProxy, + makeAgoricNames, +} from './ui-kit-goals/name-service-client.js'; const { entries, fromEntries, keys } = Object; -const { Fail } = assert; /** * @typedef {{ @@ -24,21 +27,25 @@ const { Fail } = assert; /** * @param {import('ava').ExecutionContext} t - * @param {{ wallet: import('./wallet-tools.js').MockWallet }} mine - * @param { WellKnown & WellKnownKinds } wellKnown + * @param {{ + * wallet: import('./wallet-tools.js').MockWallet; + * queryTool: Pick; + * }} mine * @param {{ * rxAddr: string, - * toSend: AmountKeywordRecord, - * svcInstance?: Instance, + * toSend: AmountKeywordRecord; * }} shared */ export const payerPete = async ( t, - { wallet }, - wellKnown, - { rxAddr, toSend, svcInstance }, + { wallet, queryTool }, + { rxAddr, toSend }, ) => { - const instance = await (svcInstance || wellKnown.instance.postalSvc); + const hub = await makeAgoricNames(queryTool); + /** @type {WellKnown} */ + const agoricNames = makeNameProxy(hub); + + const instance = await agoricNames.instance.postalSvc; t.log('Pete offers to send to', rxAddr, 'via contract', instance); const updates = await E(wallet.offers).executeOffer({ @@ -52,60 +59,51 @@ export const payerPete = async ( proposal: { give: toSend }, }); - for await (const update of updates) { - // t.log('pete update', update); - if (update?.status?.payouts) { - for (const [kwd, amt] of Object.entries(update?.status?.payouts)) { - const { brand } = amt; - const kind = - wellKnown.assetKind.get(brand) || Fail`no kind for brand ${kwd}`; - t.log('Pete payout should be empty', amt); - t.deepEqual(amt, AmountMath.makeEmpty(brand, kind)); - } - t.is(update?.status?.numWantsSatisfied, 1); - break; - } + const seat = seatLike(updates); + const payouts = await E(seat).getPayoutAmounts(); + for (const [kwd, amt] of entries(payouts)) { + const { brand } = amt; + const kind = AssetKind.NAT; // TODO: handle non-fungible amounts + t.log('Pete payout should be empty', kwd, amt); + t.deepEqual(amt, AmountMath.makeEmpty(brand, kind)); } }; /** * @param {import('ava').ExecutionContext} t * @param {{ wallet: import('./wallet-tools.js').MockWallet, }} mine - * @param {WellKnown & WellKnownKinds} wellKnown * @param {{ toSend: AmountKeywordRecord }} shared */ -export const receiverRose = async (t, { wallet }, wellKnown, { toSend }) => { - const { makeEmpty } = AmountMath; - const purseNotifier = await allValues( - mapValues(toSend, amt => E(wallet.peek).purseNotifier(amt.brand)), +export const receiverRose = async (t, { wallet }, { toSend }) => { + console.time('rose'); + console.timeLog('rose', 'before notifiers'); + const purseNotifier = mapValues(toSend, amt => + wallet.peek.purseUpdates(amt.brand), ); + console.timeLog('rose', 'after notifiers; before initial'); const initial = await allValues( - mapValues(purseNotifier, pn => E(pn).getUpdateSince()), + mapValues(purseNotifier, pn => pn.next().then(u => u.value)), ); - for (const [name, update] of Object.entries(initial)) { - t.log('Rose', name, 'purse starts emtpy', update.value); - const brand = toSend[name].brand; - const kind = wellKnown.assetKind.get(brand) || Fail`${brand}`; - t.deepEqual(update.value, makeEmpty(brand, kind)); - } + console.timeLog('rose', 'got initial', initial); + t.log('Rose initial', initial); + t.deepEqual(keys(initial), keys(toSend)); const done = await allValues( - Object.fromEntries( - Object.entries(initial).map(([name, update]) => { - const amtP = E(purseNotifier[name]) - .getUpdateSince(update.updateCount) - .then(u => { - t.log('Rose rxd', u.value); - t.deepEqual(u.value, toSend[name]); - return u.value; - }); + fromEntries( + entries(initial).map(([name, _update]) => { + const amtP = purseNotifier[name].next().then(u => { + const expected = AmountMath.add(initial[name], toSend[name]); + t.log('Rose updated balance', name, u.value); + t.deepEqual(u.value, expected); + return u.value; + }); return [name, amtP]; }), ), ); - t.log('Rose got balance updates', Object.keys(done)); - t.deepEqual(Object.keys(done), Object.keys(toSend)); + t.log('Rose got balance updates', keys(done)); + t.deepEqual(keys(done), keys(toSend)); }; /** @@ -114,19 +112,17 @@ export const receiverRose = async (t, { wallet }, wellKnown, { toSend }) => { * @param {{ toSend: AmountKeywordRecord }} shared */ export const receiverRex = async (t, { wallet }, { toSend }) => { - const purseNotifier = await allValues( - mapValues(toSend, amt => E(wallet.peek).purseNotifier(amt.brand)), + const purseUpdates = await allValues( + mapValues(toSend, amt => E(wallet.peek).purseUpdates(amt.brand)), ); - const initial = await allValues( - mapValues(purseNotifier, pn => E(pn).getUpdateSince()), - ); + const initial = await allValues(mapValues(purseUpdates, pn => E(pn).next())); const done = await allValues( fromEntries( - entries(initial).map(([name, update]) => { - const amtP = E(purseNotifier[name]) - .getUpdateSince(update.updateCount) + keys(initial).map(name => { + const amtP = E(purseUpdates[name]) + .next() .then(u => { t.log('Rex rxd', u.value); t.deepEqual(u.value, toSend[name]); @@ -164,304 +160,3 @@ export const senderContract = async ( const sent = await E(postalSvc).sendTo(addr1, pmt1); t.deepEqual(sent, noInvitations); }; - -/** - * Auxiliary data - * @typedef {{ - * boardAux: (obj: unknown) => Promise - * }} BoardAux - */ - -/** - * @param {import('ava').ExecutionContext} t - * @param {{ - * wallet: import('./wallet-tools.js').MockWallet, - * }} mine - * @param { WellKnown & BoardAux} wellKnown - */ -export const starterSam = async (t, mine, wellKnown) => { - const { wallet } = mine; - - const checkKeys = (label, actual, expected) => { - label && t.log(label, actual); - t.deepEqual(keys(actual), keys(expected)); - }; - const first = array => { - t.true(Array.isArray(array)); - t.is(array.length, 1); - const [it] = array; - return it; - }; - const brand = { - Invitation: await wellKnown.brand.Invitation, - }; - const instance = { - contractStarter: await wellKnown.instance.contractStarter, - }; - - const expected = { - result: 'UNPUBLISHED', - payouts: { - Fee: { brand: brand.IST, value: 0n }, - Handles: { - brand: brand.Invitation, - value: [ - { - customDetails: { - installation: true, - instance: true, - }, - description: true, - handle: true, - installation: true, - instance: instance.contractStarter, - }, - ], - }, - }, - }; - - let offerSeq = 0; - /** @param {{ bundleID: string, label?: string}} opts */ - const install = async opts => { - const starterAux = await wellKnown.boardAux(instance.contractStarter); - const { prices } = starterAux.terms; - const { installBundleID: Fee } = prices; - t.log('sam gives', Fee, 'to install', opts.label); - const updates = await E(wallet.offers).executeOffer({ - id: `install-${(offerSeq += 1)}`, - invitationSpec: { - source: 'contract', - instance: instance.contractStarter, - publicInvitationMaker: 'makeInstallInvitation', - }, - proposal: { give: { Fee } }, - offerArgs: opts, - }); - const payouts = await E(seatLike(updates)).getPayouts(); - t.log('sam install paid', payouts); - const { - value: [ - { - customDetails: { installation }, - }, - ], - } = payouts.Handles; - return installation; - }; - - const getPostalSvcTerms = async () => { - const { - terms: { namesByAddress }, - } = await wellKnown.boardAux(instance.contractStarter); - t.log('Sam got namesByAddress from contractStarter terms', namesByAddress); - return { namesByAddress }; - }; - - /** - * @template SF - * @param {import('../src/contractStarter.js').StartOptions} opts - */ - const installAndStart = async opts => { - t.log( - 'Sam starts', - opts.instanceLabel, - 'from', - (opts.bundleID || '').slice(0, 8), - ); - const starterAux = await wellKnown.boardAux(instance.contractStarter); - const { prices } = starterAux.terms; - const { add } = AmountMath; - const Fee = add(prices.installBundleID, prices.startInstance); - t.log('sam gives', Fee, 'to start', opts.instanceLabel); - - const updates = await E(wallet.offers).executeOffer({ - id: `samStart-${(offerSeq += 1)}`, - invitationSpec: { - source: 'contract', - instance: instance.contractStarter, - publicInvitationMaker: 'makeStartInvitation', - invitationArgs: [opts], - }, - proposal: { give: { Fee } }, - }); - - const seat = seatLike(updates); - - const result = await E(seat).getOfferResult(); - t.log('Sam gets result', result); - t.is(result, expected.result); - - const payouts = await E(seat).getPayouts(); - checkKeys(undefined, payouts, expected.payouts); - const { Handles } = payouts; - t.is(Handles.brand, expected.payouts.Handles.brand); - const details = first(Handles.value); - const [details0] = expected.payouts.Handles.value; - checkKeys(undefined, details, details0); - t.is(details.instance, details0.instance); - checkKeys( - 'Sam gets instance etc.', - details.customDetails, - details0.customDetails, - ); - - return details.customDetails; - }; - - return { install, getPostalSvcTerms, installAndStart }; -}; - -/** - * @param {import('ava').ExecutionContext} t - * @param {{ - * wallet: import('./wallet-tools.js').MockWallet - * }} mine - * @param {*} wellKnown - */ -export const launcherLarry = async (t, { wallet }, wellKnown) => { - const { timerService: timer } = wellKnown; - const timerBrand = await wellKnown.brand.timer; - const MNY = { - brand: await wellKnown.brand.MNY, - issuer: await wellKnown.issuer.MNY, - }; - - const instance = { - contractStarter: await wellKnown.instance.contractStarter, - }; - - let offerSeq = 0; - let launchOfferId; - const deadline = harden({ timerBrand, absValue: 10n }); - - const launch = async ( - installation, - customTerms = { name: 'BRD', supplyQty: 1_000_000n }, - ) => { - !launchOfferId || Fail`already launched`; - - t.log('Larry prepares to launch', customTerms, 'at', deadline); - const { name } = customTerms; - const starterAux = await wellKnown.boardAux(instance.contractStarter); - const { startInstance } = starterAux.terms.prices; - - const startOpts = { - instanceLabel: `${name}-launch`, - installation, - issuerKeywordRecord: { Deposit: MNY.issuer }, - customTerms: { ...customTerms, deadline }, - }; - /** @type {import('@agoric/smart-wallet').OfferSpec} */ - - const id = `launch-${(offerSeq += 1)}`; - t.log('Larry pays', startInstance, 'to start', startOpts.label); - const updates = await E(wallet.offers).executeOffer({ - id, - invitationSpec: { - source: 'contract', - instance: instance.contractStarter, - publicInvitationMaker: 'makeStartInvitation', - invitationArgs: [startOpts], - }, - proposal: { - give: { Fee: startInstance }, - }, - }); - - const seat = seatLike(updates); - const result = await E(seat).getOfferResult(); - t.log('larry launch result', result); - const { Handles } = await E(seat).getPayouts(); - const { instance: launched } = Handles.value[0].customDetails; - t.log('larry launch instance', launched); - launchOfferId = id; - - return launched; - }; - - const collect = async () => { - t.log('Larry collects at', deadline); - const id = `collect-${(offerSeq += 1)}`; - const up2 = await E(wallet.offers).executeOffer({ - id, - invitationSpec: { - source: 'continuing', - previousOffer: launchOfferId, - invitationMakerName: 'Collect', - }, - proposal: { - want: { Deposit: AmountMath.make(MNY.brand, 0n) }, - exit: { afterDeadline: { timer, deadline } }, - }, - }); - const seat = seatLike(up2); - const result = await E(seat).getOfferResult(); - t.log('result', result); - const proceeds = await E(seat).getPayouts(); - t.log('Larry collected', proceeds); - }; - return { launch, collect }; -}; - -/** - * @param {import('ava').ExecutionContext} t - * @param {{ - * wallet: import('./wallet-tools.js').MockWallet, - * ix: number, - * qty: bigint, - * }} mine - * @param {*} wk - */ -export const makeFan = (t, { wallet, ix, qty }, wk) => { - let offerSeq = 0; - const deposit = async instance => { - const { terms } = await wk.boardAux(instance); - const { brands, issuers } = terms; - // t.log(ix, 'fan found brands', brands); - - await E(wallet.offers).addIssuer(issuers.Share); - await E(wallet.offers).addIssuer(issuers.BRD); - - const updates = await E(wallet.offers).executeOffer({ - id: `deposit-${(offerSeq += 1)}`, - invitationSpec: { - source: 'contract', - instance, - publicInvitationMaker: 'makeDepositInvitation', - }, - proposal: { - give: { Deposit: AmountMath.make(brands.Deposit, qty) }, - want: { Shares: AmountMath.make(brands.Share, qty) }, - }, - }); - const seat = seatLike(updates); - const payouts = await E(seat).getPayouts(); - t.log(ix, 'fan got', payouts.Shares); - return payouts.Shares; - }; - - const redeem = async instance => { - const { terms } = await wk.boardAux(instance); - const { brands } = terms; - - const updates = await E(wallet.offers).executeOffer({ - id: `redeem-${(offerSeq += 1)}`, - invitationSpec: { - source: 'contract', - instance, - publicInvitationMaker: 'makeRedeemInvitation', - }, - proposal: { - give: { Shares: AmountMath.make(brands.Share, qty) }, - want: { Minted: AmountMath.make(brands.BRD, 1n) }, - }, - }); - const seat = seatLike(updates); - const payouts = await E(seat).getPayouts(); - t.log(ix, 'fan got', payouts.Minted); - return payouts.Minted; - }; - - return { deposit, redeem }; -}; From e29dfa25dd5727a64a818e1334bdaa7679fd2a44 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 17:14:35 -0600 Subject: [PATCH 038/152] chore(test-postalSvc): copy from ag-power-tools c75c0dd --- contract/test/test-postalSvc.js | 152 ++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 contract/test/test-postalSvc.js diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js new file mode 100644 index 00000000..fb4c6d6f --- /dev/null +++ b/contract/test/test-postalSvc.js @@ -0,0 +1,152 @@ +// @ts-check +// XXX what's the state-of-the-art in ava setup? +// eslint-disable-next-line import/order +import { test as anyTest } from './prepare-test-env-ava.js'; + +import { createRequire } from 'module'; + +import { E } from '@endo/far'; +import { AmountMath, AssetKind } from '@agoric/ertp/src/amountMath.js'; +import { makeIssuerKit } from '@agoric/ertp'; +import { startPostalSvc } from '../src/start-postalSvc.js'; +import { + bootAndInstallBundles, + getBundleId, + makeBundleCacheContext, +} from './boot-tools.js'; +import { allValues, mapValues, mockWalletFactory } from './wallet-tools.js'; +import { + payerPete, + receiverRex, + receiverRose, + senderContract, +} from './market-actors.js'; + +const { entries, fromEntries, keys } = Object; + +/** @type {import('ava').TestFn>>} */ +const test = anyTest; + +const nodeRequire = createRequire(import.meta.url); + +const bundleRoots = { + postalSvc: nodeRequire.resolve('../src/postalSvc.js'), +}; + +test.before(async t => (t.context = await makeBundleCacheContext(t))); + +test('deliver payment using offer', async t => { + const { powers: p0, bundles } = await bootAndInstallBundles(t, bundleRoots); + /** @type { typeof p0 & import('../src/start-postalSvc.js').PostalSvcPowers} */ + // @ts-expect-error bootstrap powers evolve with BLD staker governance + const powers = p0; + + const iKit = { + MNY: makeIssuerKit('MNY'), + Item: makeIssuerKit('Item', AssetKind.SET), + }; + const { MNY, Item } = iKit; + entries(iKit).forEach(([name, kit]) => { + powers.issuer.produce[name].resolve(kit.issuer); + powers.brand.produce[name].resolve(kit.brand); + }); + + const bundleID = getBundleId(bundles.postalSvc); + await startPostalSvc(powers, { + options: { postalSvc: { bundleID, issuerNames: ['MNY', 'Item'] } }, + }); + + const { zoe, namesByAddressAdmin, chainStorage } = powers.consume; + + const smartWalletIssuers = { + Invitation: await E(zoe).getInvitationIssuer(), + IST: await E(zoe).getFeeIssuer(), + MNY: MNY.issuer, + Item: Item.issuer, + }; + + const walletFactory = mockWalletFactory( + { zoe, namesByAddressAdmin, chainStorage }, + smartWalletIssuers, + ); + + const wellKnown = { + installation: {}, + // TODO: have pete check installation before making an offer? + // hm. don't think walletFactory supports that. + instance: powers.instance.consume, + issuer: {}, + brand: powers.brand.consume, + assetKind: new Map( + /** @type {[Brand, AssetKind][]} */ ([ + [MNY.brand, AssetKind.NAT], + [Item.brand, AssetKind.SET], + ]), + ), + }; + const { make: amt } = AmountMath; + const shared = { + rxAddr: 'agoric1receiverRose', + toSend: { + Pmt: amt(MNY.brand, 3n), + Inventory: amt(Item.brand, harden(['map'])), + }, + }; + + const wallet = { + pete: await walletFactory.makeSmartWallet('agoric1payerPete'), + rose: await walletFactory.makeSmartWallet(shared.rxAddr), + }; + await E(wallet.pete.deposit).receive( + MNY.mint.mintPayment(amt(MNY.brand, 10n)), + ); + await E(wallet.pete.deposit).receive( + Item.mint.mintPayment(amt(Item.brand, harden(['potion', 'map']))), + ); + + await Promise.all([ + payerPete(t, { wallet: wallet.pete }, wellKnown, shared), + receiverRose(t, { wallet: wallet.rose }, wellKnown, shared), + ]); +}); + +test('send invitation* from contract using publicFacet of postalSvc', async t => { + const { powers: p0, bundles } = await bootAndInstallBundles(t, bundleRoots); + /** @type { typeof p0 & import('../src/start-postalSvc.js').PostalSvcPowers} */ + // @ts-expect-error bootstrap powers evolve with BLD staker governance + const powers = p0; + + const bundleID = getBundleId(bundles.postalSvc); + await startPostalSvc(powers, { options: { postalSvc: { bundleID } } }); + + const { zoe, namesByAddressAdmin, chainStorage } = powers.consume; + const smartWalletIssuers = { + Invitation: await E(zoe).getInvitationIssuer(), + IST: await E(zoe).getFeeIssuer(), + }; + + const walletFactory = mockWalletFactory( + { zoe, namesByAddressAdmin, chainStorage }, + smartWalletIssuers, + ); + const instance = await powers.instance.consume.postalSvc; + + const shared = { + rxAddr: 'agoric1receiverRex', + toSend: { + ToDoNothing: AmountMath.make( + await powers.brand.consume.Invitation, + harden([]), + ), + }, + }; + + const wallet = await walletFactory.makeSmartWallet(shared.rxAddr); + const terms = { postalSvc: instance, destAddr: shared.rxAddr }; + await Promise.all([ + senderContract(t, { zoe, terms }), + receiverRex(t, { wallet }, shared), + ]); +}); + +test.todo('partial failure: send N+1 payments where >= 1 delivery fails'); From 576a18fbb4d03767b54fd1bdc42b6d179fb8ebd8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 18:07:59 -0600 Subject: [PATCH 039/152] style(test-postalSvc): lint --- contract/test/test-postalSvc.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index fb4c6d6f..912705e5 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -14,7 +14,7 @@ import { getBundleId, makeBundleCacheContext, } from './boot-tools.js'; -import { allValues, mapValues, mockWalletFactory } from './wallet-tools.js'; +import { mockWalletFactory } from './wallet-tools.js'; import { payerPete, receiverRex, @@ -22,7 +22,7 @@ import { senderContract, } from './market-actors.js'; -const { entries, fromEntries, keys } = Object; +const { entries } = Object; /** @type {import('ava').TestFn>>} */ const test = anyTest; @@ -46,10 +46,10 @@ test('deliver payment using offer', async t => { Item: makeIssuerKit('Item', AssetKind.SET), }; const { MNY, Item } = iKit; - entries(iKit).forEach(([name, kit]) => { + for (const [name, kit] of entries(iKit)) { powers.issuer.produce[name].resolve(kit.issuer); powers.brand.produce[name].resolve(kit.brand); - }); + } const bundleID = getBundleId(bundles.postalSvc); await startPostalSvc(powers, { From e90ef59c490b4715b0ea751881daad46449e0269 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 18:26:01 -0600 Subject: [PATCH 040/152] chore(boot-tools): refine bundle logging --- contract/test/boot-tools.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index de0cc6d3..5ee947bd 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -108,20 +108,20 @@ export const mockBootstrapPowers = async ( }; /** - * @param {import('ava').ExecutionContext} t * @param {BundleCache} bundleCache * @param {Record} bundleRoots * @param {InstallBundle} installBundle + * @param {(...args: unknown[]) => void} log * * @typedef {(id: string, bundle: CachedBundle, name: string) => Promise} InstallBundle * @typedef {Awaited>} BundleCache * @typedef {{ moduleFormat: 'endoZipBase64', endoZipBase64Sha512: string }} CachedBundle */ export const installBundles = async ( - t, bundleCache, bundleRoots, installBundle, + log = console.log, ) => { /** @type {Record} */ const bundles = {}; @@ -129,7 +129,7 @@ export const installBundles = async ( for (const [name, rootModulePath] of Object.entries(bundleRoots)) { const bundle = await bundleCache.load(rootModulePath, name); const bundleID = getBundleId(bundle); - t.log('publish bundle', name, bundleID.slice(0, 8)); + log('publish bundle', name, bundleID.slice(0, 8)); await installBundle(bundleID, bundle, name); bundles[name] = bundle; } @@ -143,10 +143,10 @@ export const bootAndInstallBundles = async (t, bundleRoots) => { const { vatAdminState } = powersKit; const bundles = await installBundles( - t, t.context.bundleCache, bundleRoots, (bundleID, bundle, _name) => vatAdminState.installBundle(bundleID, bundle), + t.log, ); return { ...powersKit, bundles }; }; @@ -199,7 +199,12 @@ export const makeMockTools = async (t, bundleCache) => { ); let pid = 0; - const runCoreEval = async ({ behavior, config }) => { + const runCoreEval = async ({ + behavior, + config, + entryFile: _e, + name: _todo, + }) => { if (!behavior) throw Error('TODO: run core eval without live behavior'); await behavior(powers, config); pid += 1; @@ -226,8 +231,8 @@ export const makeMockTools = async (t, bundleCache) => { return { makeQueryTool, - installBundles: bundleRoots => - installBundles(t, bundleCache, bundleRoots, installBundle), + installBundles: (bundleRoots, log) => + installBundles(bundleCache, bundleRoots, installBundle, log), runCoreEval, provisionSmartWallet: async (addr, balances) => { const it = await walletFactory.makeSmartWallet(addr); From d0bc156ac9f44b197607df4997cd4c075d98e1a5 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 22:06:57 -0600 Subject: [PATCH 041/152] test(postalSvc): toward e2e testing with runCoreEval - test: contract instance is available - separate tests for runCoreEval etc. - start using CapData across vats - makeNameProxy for A.brand.ATOM - refactor agoricNames - real addresses - move initial balances into provisionSmartWallet, since we can't access ERTP mints in the e2e case - concise dockerExec - t.log for bundles, core eval - WIP: leave CapData to another level WIP: revert e2e postalSvc testing --- contract/test/test-postalSvc.js | 191 ++++++++++++++++++++------------ 1 file changed, 118 insertions(+), 73 deletions(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 912705e5..43a2aabf 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -5,15 +5,11 @@ import { test as anyTest } from './prepare-test-env-ava.js'; import { createRequire } from 'module'; -import { E } from '@endo/far'; -import { AmountMath, AssetKind } from '@agoric/ertp/src/amountMath.js'; -import { makeIssuerKit } from '@agoric/ertp'; +import { E, passStyleOf } from '@endo/far'; +import { AmountMath } from '@agoric/ertp/src/amountMath.js'; import { startPostalSvc } from '../src/start-postalSvc.js'; -import { - bootAndInstallBundles, - getBundleId, - makeBundleCacheContext, -} from './boot-tools.js'; +import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; +import { makeBundleCacheContext, getBundleId } from './bundle-tools.js'; import { mockWalletFactory } from './wallet-tools.js'; import { payerPete, @@ -21,10 +17,9 @@ import { receiverRose, senderContract, } from './market-actors.js'; +import { makeAgoricNames, makeNameProxy } from './ui-kit-goals/queryKit.js'; -const { entries } = Object; - -/** @type {import('ava').TestFn>>} */ +/** @type {import('ava').TestFn>>} */ const test = anyTest; const nodeRequire = createRequire(import.meta.url); @@ -33,103 +28,153 @@ const bundleRoots = { postalSvc: nodeRequire.resolve('../src/postalSvc.js'), }; -test.before(async t => (t.context = await makeBundleCacheContext(t))); +const scriptRoots = { + postalSvc: nodeRequire.resolve('../src/start-postalSvc.js'), +}; + +/** @param {import('ava').ExecutionContext} t */ +const makeTestContext = async t => { + const bc = await makeBundleCacheContext(t); + + console.time('makeTestTools'); + console.timeLog('makeTestTools', 'start'); + const tools = await makeMockTools(t, bc.bundleCache); + console.timeEnd('makeTestTools'); -test('deliver payment using offer', async t => { - const { powers: p0, bundles } = await bootAndInstallBundles(t, bundleRoots); - /** @type { typeof p0 & import('../src/start-postalSvc.js').PostalSvcPowers} */ - // @ts-expect-error bootstrap powers evolve with BLD staker governance - const powers = p0; + return { ...tools, ...bc }; +}; + +test.before(async t => (t.context = await makeTestContext(t))); - const iKit = { - MNY: makeIssuerKit('MNY'), - Item: makeIssuerKit('Item', AssetKind.SET), +test.serial('well-known brand (ATOM) is available', async t => { + const { makeQueryTool } = t.context; + const hub0 = makeAgoricNames(makeQueryTool()); + const agoricNames = makeNameProxy(hub0); + await null; + const brand = { + ATOM: await agoricNames.brand.ATOM, }; - const { MNY, Item } = iKit; - for (const [name, kit] of entries(iKit)) { - powers.issuer.produce[name].resolve(kit.issuer); - powers.brand.produce[name].resolve(kit.brand); - } + t.log(brand); + t.is(passStyleOf(brand.ATOM), 'remotable'); +}); +test.serial('install bundle: postalSvc / send', async t => { + const { installBundles } = t.context; + console.time('installBundles'); + console.timeLog('installBundles', Object.keys(bundleRoots).length, 'todo'); + const bundles = await installBundles(bundleRoots, (...args) => + console.timeLog('installBundles', ...args), + ); + console.timeEnd('installBundles'); + + const id = getBundleId(bundles.postalSvc); + const shortId = id.slice(0, 8); + t.log('postalSvc', shortId); + t.is(id.length, 3 + 128, 'bundleID length'); + t.regex(id, /^b1-.../); + + Object.assign(t.context.shared, { bundles }); +}); + +test.serial('deploy contract with core eval: postalSvc / send', async t => { + const { runCoreEval } = t.context; + const { bundles } = t.context.shared; const bundleID = getBundleId(bundles.postalSvc); - await startPostalSvc(powers, { - options: { postalSvc: { bundleID, issuerNames: ['MNY', 'Item'] } }, + + const name = 'send'; + const result = await runCoreEval({ + name, + behavior: startPostalSvc, + entryFile: scriptRoots.postalSvc, + config: { + options: { postalSvc: { bundleID, issuerNames: ['ATOM', 'Item'] } }, + }, }); - const { zoe, namesByAddressAdmin, chainStorage } = powers.consume; + t.log(result.voting_end_time, '#', result.proposal_id, name); + t.like(result, { + content: { + '@type': '/agoric.swingset.CoreEvalProposal', + }, + status: 'PROPOSAL_STATUS_PASSED', + }); +}); - const smartWalletIssuers = { - Invitation: await E(zoe).getInvitationIssuer(), - IST: await E(zoe).getFeeIssuer(), - MNY: MNY.issuer, - Item: Item.issuer, - }; +test.serial('agoricNames.instances has contract: postalSvc', async t => { + const { makeQueryTool } = t.context; + const hub0 = makeAgoricNames(makeQueryTool()); + const agoricNames = makeNameProxy(hub0); + await null; + const instance = await agoricNames.instance.postalSvc; + t.log(instance); + t.is(passStyleOf(instance), 'remotable'); +}); - const walletFactory = mockWalletFactory( - { zoe, namesByAddressAdmin, chainStorage }, - smartWalletIssuers, - ); +test.serial('deliver payment using offer', async t => { + const { provisionSmartWallet, makeQueryTool } = t.context; + const qt = makeQueryTool(); + const hub0 = makeAgoricNames(qt); + /** @type {import('./market-actors.js').WellKnown} */ + const agoricNames = makeNameProxy(hub0); - const wellKnown = { - installation: {}, - // TODO: have pete check installation before making an offer? - // hm. don't think walletFactory supports that. - instance: powers.instance.consume, - issuer: {}, - brand: powers.brand.consume, - assetKind: new Map( - /** @type {[Brand, AssetKind][]} */ ([ - [MNY.brand, AssetKind.NAT], - [Item.brand, AssetKind.SET], - ]), - ), - }; + await null; const { make: amt } = AmountMath; const shared = { - rxAddr: 'agoric1receiverRose', + rxAddr: 'agoric1aap7m84dt0rwhhfw49d4kv2gqetzl56vn8aaxj', toSend: { - Pmt: amt(MNY.brand, 3n), - Inventory: amt(Item.brand, harden(['map'])), + Pmt: amt(await agoricNames.brand.ATOM, 3n), + // TODO non-fungible: Inventory: amt(Item.brand, harden(['map'])), }, }; const wallet = { - pete: await walletFactory.makeSmartWallet('agoric1payerPete'), - rose: await walletFactory.makeSmartWallet(shared.rxAddr), + pete: await provisionSmartWallet( + 'agoric1xe269y3fhye8nrlduf826wgn499y6wmnv32tw5', + { ATOM: 10n, BLD: 75n }, + ), + rose: await provisionSmartWallet(shared.rxAddr, { + BLD: 20n, + // TODO non-fungibles: Item: amt(Item.brand, harden(['potion', 'map'])), + }), }; - await E(wallet.pete.deposit).receive( - MNY.mint.mintPayment(amt(MNY.brand, 10n)), - ); - await E(wallet.pete.deposit).receive( - Item.mint.mintPayment(amt(Item.brand, harden(['potion', 'map']))), - ); + const pqt = makeQueryTool(); + for (const kind of ['instance', 'brand']) { + const entries = await E(E(hub0).lookup(kind)).entries(); + pqt.fromCapData(qt.toCapData(entries)); + } await Promise.all([ - payerPete(t, { wallet: wallet.pete }, wellKnown, shared), - receiverRose(t, { wallet: wallet.rose }, wellKnown, shared), + payerPete(t, { wallet: wallet.pete, queryTool: pqt }, shared), + receiverRose(t, { wallet: wallet.rose }, shared), ]); }); +test.todo('E2E: send using publicFacet using contract'); + test('send invitation* from contract using publicFacet of postalSvc', async t => { - const { powers: p0, bundles } = await bootAndInstallBundles(t, bundleRoots); - /** @type { typeof p0 & import('../src/start-postalSvc.js').PostalSvcPowers} */ - // @ts-expect-error bootstrap powers evolve with BLD staker governance - const powers = p0; + const { powers, bundles } = await bootAndInstallBundles(t, bundleRoots); const bundleID = getBundleId(bundles.postalSvc); - await startPostalSvc(powers, { options: { postalSvc: { bundleID } } }); + await startPostalSvc(powers, { + options: { postalSvc: { bundleID, issuerNames: ['IST', 'Invitation'] } }, + }); - const { zoe, namesByAddressAdmin, chainStorage } = powers.consume; + const { zoe, namesByAddressAdmin } = powers.consume; const smartWalletIssuers = { Invitation: await E(zoe).getInvitationIssuer(), IST: await E(zoe).getFeeIssuer(), }; + // TODO: use CapData across vats + // const boardMarshaller = await E(board).getPublishingMarshaller(); const walletFactory = mockWalletFactory( - { zoe, namesByAddressAdmin, chainStorage }, + { zoe, namesByAddressAdmin }, smartWalletIssuers, ); - const instance = await powers.instance.consume.postalSvc; + /** @type {import('../src/start-postalSvc.js').PostalSvcPowers} */ + // @ts-expect-error cast + const postalSpace = powers; + const instance = await postalSpace.instance.consume.postalSvc; const shared = { rxAddr: 'agoric1receiverRex', From f6935ec97a5c4b105187436a71c1c7cdd5964c3c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 22:39:54 -0600 Subject: [PATCH 042/152] test(postalSvc): snapshot offer sent by client/front-end --- contract/test/market-actors.js | 7 +++++-- contract/test/test-postalSvc.js | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index 59a71d2a..b4f53438 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -48,7 +48,8 @@ export const payerPete = async ( const instance = await agoricNames.instance.postalSvc; t.log('Pete offers to send to', rxAddr, 'via contract', instance); - const updates = await E(wallet.offers).executeOffer({ + /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ + const sendOffer = { id: 'peteSend1', invitationSpec: { source: 'contract', @@ -57,7 +58,9 @@ export const payerPete = async ( invitationArgs: [rxAddr], }, proposal: { give: toSend }, - }); + }; + t.snapshot(sendOffer, 'client sends offer'); + const updates = await E(wallet.offers).executeOffer(sendOffer); const seat = seatLike(updates); const payouts = await E(seat).getPayoutAmounts(); diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 43a2aabf..62dfac5f 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -17,7 +17,10 @@ import { receiverRose, senderContract, } from './market-actors.js'; -import { makeAgoricNames, makeNameProxy } from './ui-kit-goals/queryKit.js'; +import { + makeNameProxy, + makeAgoricNames, +} from './ui-kit-goals/name-service-client.js'; /** @type {import('ava').TestFn>>} */ const test = anyTest; From f25ccc3064fcf3ef7a91fe861cc76d9d2961b426 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 22:40:12 -0600 Subject: [PATCH 043/152] chore: generated snapshots --- contract/test/snapshots/test-postalSvc.js.md | 29 ++++++++++++++++++ .../test/snapshots/test-postalSvc.js.snap | Bin 0 -> 543 bytes 2 files changed, 29 insertions(+) create mode 100644 contract/test/snapshots/test-postalSvc.js.md create mode 100644 contract/test/snapshots/test-postalSvc.js.snap diff --git a/contract/test/snapshots/test-postalSvc.js.md b/contract/test/snapshots/test-postalSvc.js.md new file mode 100644 index 00000000..ee2f600e --- /dev/null +++ b/contract/test/snapshots/test-postalSvc.js.md @@ -0,0 +1,29 @@ +# Snapshot report for `test/test-postalSvc.js` + +The actual snapshot is saved in `test-postalSvc.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## deliver payment using offer + +> client sends offer + + { + id: 'peteSend1', + invitationSpec: { + instance: Object @Alleged: InstanceHandle {}, + invitationArgs: [ + 'agoric1aap7m84dt0rwhhfw49d4kv2gqetzl56vn8aaxj', + ], + publicInvitationMaker: 'makeSendInvitation', + source: 'contract', + }, + proposal: { + give: { + Pmt: { + brand: Object @Alleged: ATOM brand {}, + value: 3n, + }, + }, + }, + } diff --git a/contract/test/snapshots/test-postalSvc.js.snap b/contract/test/snapshots/test-postalSvc.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..674ff436c94cb9786c8897212af61b84a8370791 GIT binary patch literal 543 zcmV+)0^t2YRzVKoHeRmSZ5qHi4m_(F`>+B$!|r8h50~gqhILaXPK# zi_a(J?yMwCitq`vP=%kMp`zyl_yN9vf}vt{i4IQyqnw@2P}yj1gi51qJVq^yV!4@Qmgq^sEPER~47@e3e4qoZ9eTf{dPj9m zwF&J$wD;pf=0v=n}`jTXta|e34Y`jT|i=ph~tp*Z}xM!zyS)s6tp~ zMWzmNC9DO(C&%%^2*5tbpa#%1qzswlc0iLV`*y+P&9pLEA h{$Aw9&^9Ppj8bzc%KK#KD9z=4`UkozhT(k!004H^18@KU literal 0 HcmV?d00001 From 8359e2317548c9f53b2332207ec88503c125e37b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 23:00:22 -0600 Subject: [PATCH 044/152] docs: distinguish Rose from Rex with comments --- contract/test/market-actors.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index b4f53438..fa5808d7 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -73,6 +73,10 @@ export const payerPete = async ( }; /** + * Rose expects to receive `shared.toSend` amounts. + * She expects initial balances to be empty; + * and relies on `wellKnown.assetKind` to make an empty amount from a brand. + * * @param {import('ava').ExecutionContext} t * @param {{ wallet: import('./wallet-tools.js').MockWallet, }} mine * @param {{ toSend: AmountKeywordRecord }} shared @@ -110,6 +114,9 @@ export const receiverRose = async (t, { wallet }, { toSend }) => { }; /** + * Rex expects to receive `shared.toSend` amounts. + * Rex doesn't check his initial balances + * * @param {import('ava').ExecutionContext} t * @param {{ wallet: import('./wallet-tools.js').MockWallet, }} mine * @param {{ toSend: AmountKeywordRecord }} shared From 836e0bab30da64f75cbc26a6db2f629990562473 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 23:04:29 -0600 Subject: [PATCH 045/152] refactor: factor trackDeposits out of Rose, Rex --- contract/test/market-actors.js | 51 ++++++++++++++++------------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index fa5808d7..b63d918e 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -72,6 +72,21 @@ export const payerPete = async ( } }; +const trackDeposits = async (t, initial, purseUpdates, toSend) => + allValues( + fromEntries( + entries(initial).map(([name, _update]) => { + const amtP = purseUpdates[name].next().then(u => { + const expected = AmountMath.add(initial[name], toSend[name]); + t.log('updated balance', name, u.value); + t.deepEqual(u.value, expected); + return u.value; + }); + return [name, amtP]; + }), + ), + ); + /** * Rose expects to receive `shared.toSend` amounts. * She expects initial balances to be empty; @@ -96,19 +111,7 @@ export const receiverRose = async (t, { wallet }, { toSend }) => { t.log('Rose initial', initial); t.deepEqual(keys(initial), keys(toSend)); - const done = await allValues( - fromEntries( - entries(initial).map(([name, _update]) => { - const amtP = purseNotifier[name].next().then(u => { - const expected = AmountMath.add(initial[name], toSend[name]); - t.log('Rose updated balance', name, u.value); - t.deepEqual(u.value, expected); - return u.value; - }); - return [name, amtP]; - }), - ), - ); + const done = await trackDeposits(t, initial, purseNotifier, toSend); t.log('Rose got balance updates', keys(done)); t.deepEqual(keys(done), keys(toSend)); }; @@ -126,22 +129,16 @@ export const receiverRex = async (t, { wallet }, { toSend }) => { mapValues(toSend, amt => E(wallet.peek).purseUpdates(amt.brand)), ); - const initial = await allValues(mapValues(purseUpdates, pn => E(pn).next())); - - const done = await allValues( - fromEntries( - keys(initial).map(name => { - const amtP = E(purseUpdates[name]) - .next() - .then(u => { - t.log('Rex rxd', u.value); - t.deepEqual(u.value, toSend[name]); - return u.value; - }); - return [name, amtP]; - }), + const initial = await allValues( + mapValues(purseUpdates, up => + E(up) + .next() + .then(u => u.value), ), ); + + const done = await trackDeposits(t, initial, purseUpdates, toSend); + t.log('Rex got balance updates', keys(done)); t.deepEqual(keys(done), keys(toSend)); }; From f1d684faed4b76430f64ab83f99816486383675e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 23:27:46 -0600 Subject: [PATCH 046/152] refactor: follow X.contract.js pattern; spell out postalService --- ...ostalSvc.js => postal-service.contract.js} | 2 +- contract/src/start-postalSvc.js | 42 +++++++++---------- contract/test/market-actors.js | 10 ++--- contract/test/test-postalSvc.js | 38 +++++++++-------- 4 files changed, 47 insertions(+), 45 deletions(-) rename contract/src/{postalSvc.js => postal-service.contract.js} (96%) diff --git a/contract/src/postalSvc.js b/contract/src/postal-service.contract.js similarity index 96% rename from contract/src/postalSvc.js rename to contract/src/postal-service.contract.js index 045d8374..2fdd4880 100644 --- a/contract/src/postalSvc.js +++ b/contract/src/postal-service.contract.js @@ -14,7 +14,7 @@ const { keys, values } = Object; export const start = zcf => { const { namesByAddress, issuers } = zcf.getTerms(); mustMatch(namesByAddress, M.remotable('namesByAddress')); - console.log('postalSvc issuers', Object.keys(issuers)); + console.log('postal-service issuers', Object.keys(issuers)); /** * @param {string} addr diff --git a/contract/src/start-postalSvc.js b/contract/src/start-postalSvc.js index f603795f..afd48b2a 100644 --- a/contract/src/start-postalSvc.js +++ b/contract/src/start-postalSvc.js @@ -1,5 +1,5 @@ /** - * @file core eval script* to start the postalSvc contract. + * @file core eval script* to start the postalService contract. * * The `permit` export specifies the corresponding permit. */ @@ -8,52 +8,52 @@ import { E } from '@endo/far'; import { fixHub } from './fixHub.js'; -const trace = (...args) => console.log('start-postalSvc', ...args); +const trace = (...args) => console.log('start-postalService', ...args); const { Fail } = assert; /** - * @typedef { typeof import('../src/postalSvc.js').start } PostalSvcFn + * @typedef { typeof import('./postal-service.contract.js').start } PostalServiceFn * * @typedef {{ - * produce: { postalSvcKit: Producer }, + * produce: { postalServiceKit: Producer }, * installation: { - * consume: { postalSvc: Promise> }, - * produce: { postalSvc: Producer> }, + * consume: { postalService: Promise> }, + * produce: { postalService: Producer> }, * } * instance: { - * consume: { postalSvc: Promise['instance']> }, - * produce: { postalSvc: Producer['instance']> }, + * consume: { postalService: Promise['instance']> }, + * produce: { postalService: Producer['instance']> }, * } - * }} PostalSvcPowers + * }} PostalServicePowers */ /** * @param {BootstrapPowers} powers - * @param {{ options?: { postalSvc: { + * @param {{ options?: { postalService: { * bundleID: string; * issuerNames?: string[]; * }}}} [config] */ -export const startPostalSvc = async (powers, config) => { - /** @type { BootstrapPowers & PostalSvcPowers} */ +export const startPostalService = async (powers, config) => { + /** @type { BootstrapPowers & PostalServicePowers} */ // @ts-expect-error bootstrap powers evolve with BLD staker governance const postalPowers = powers; const { consume: { zoe, namesByAddressAdmin, agoricNames }, installation: { - produce: { postalSvc: produceInstallation }, + produce: { postalService: produceInstallation }, }, instance: { - produce: { postalSvc: produceInstance }, + produce: { postalService: produceInstance }, }, } = postalPowers; const { bundleID = Fail`no bundleID`, issuerNames = ['IST', 'Invitation', 'BLD', 'ATOM'], - } = config?.options?.postalSvc ?? {}; + } = config?.options?.postalService ?? {}; - /** @type {Installation} */ + /** @type {Installation} */ const installation = await E(zoe).installBundleID(bundleID); produceInstallation.resolve(installation); @@ -68,11 +68,11 @@ export const startPostalSvc = async (powers, config) => { }); produceInstance.resolve(instance); - trace('postalSvc started'); + trace('postalService started'); }; export const manifest = /** @type {const} */ ({ - [startPostalSvc.name]: { + [startPostalService.name]: { consume: { agoricNames: true, namesByAddress: true, @@ -80,14 +80,14 @@ export const manifest = /** @type {const} */ ({ zoe: true, }, installation: { - produce: { postalSvc: true }, + produce: { postalService: true }, }, instance: { - produce: { postalSvc: true }, + produce: { postalService: true }, }, }, }); export const permit = Object.values(manifest)[0]; -export const main = startPostalSvc; +export const main = startPostalService; diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index b63d918e..4668fcc8 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -45,7 +45,7 @@ export const payerPete = async ( /** @type {WellKnown} */ const agoricNames = makeNameProxy(hub); - const instance = await agoricNames.instance.postalSvc; + const instance = await agoricNames.instance.postalService; t.log('Pete offers to send to', rxAddr, 'via contract', instance); /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ @@ -145,11 +145,11 @@ export const receiverRex = async (t, { wallet }, { toSend }) => { export const senderContract = async ( t, - { zoe, terms: { postalSvc: instance, destAddr: addr1 } }, + { zoe, terms: { postalService: instance, destAddr: addr1 } }, ) => { const iIssuer = await E(zoe).getInvitationIssuer(); const iBrand = await E(iIssuer).getBrand(); - const postalSvc = E(zoe).getPublicFacet(instance); + const postalService = E(zoe).getPublicFacet(instance); const purse = await E(iIssuer).makeEmptyPurse(); const noInvitations = AmountMath.make(iBrand, harden([])); @@ -157,13 +157,13 @@ export const senderContract = async ( t.log( 'senderContract: E(', - getInterfaceOf(await postalSvc), + getInterfaceOf(await postalService), ').sendTo(', addr1, ',', noInvitations, ')', ); - const sent = await E(postalSvc).sendTo(addr1, pmt1); + const sent = await E(postalService).sendTo(addr1, pmt1); t.deepEqual(sent, noInvitations); }; diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 62dfac5f..534ac3d3 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -7,7 +7,7 @@ import { createRequire } from 'module'; import { E, passStyleOf } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; -import { startPostalSvc } from '../src/start-postalSvc.js'; +import { startPostalService } from '../src/start-postalSvc.js'; import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; import { makeBundleCacheContext, getBundleId } from './bundle-tools.js'; import { mockWalletFactory } from './wallet-tools.js'; @@ -61,7 +61,7 @@ test.serial('well-known brand (ATOM) is available', async t => { t.is(passStyleOf(brand.ATOM), 'remotable'); }); -test.serial('install bundle: postalSvc / send', async t => { +test.serial('install bundle: postalService / send', async t => { const { installBundles } = t.context; console.time('installBundles'); console.timeLog('installBundles', Object.keys(bundleRoots).length, 'todo'); @@ -70,27 +70,27 @@ test.serial('install bundle: postalSvc / send', async t => { ); console.timeEnd('installBundles'); - const id = getBundleId(bundles.postalSvc); + const id = getBundleId(bundles.postalService); const shortId = id.slice(0, 8); - t.log('postalSvc', shortId); + t.log('postalService', shortId); t.is(id.length, 3 + 128, 'bundleID length'); t.regex(id, /^b1-.../); Object.assign(t.context.shared, { bundles }); }); -test.serial('deploy contract with core eval: postalSvc / send', async t => { +test.serial('deploy contract with core eval: postalService / send', async t => { const { runCoreEval } = t.context; const { bundles } = t.context.shared; - const bundleID = getBundleId(bundles.postalSvc); + const bundleID = getBundleId(bundles.postalService); const name = 'send'; const result = await runCoreEval({ name, - behavior: startPostalSvc, - entryFile: scriptRoots.postalSvc, + behavior: startPostalService, + entryFile: scriptRoots.postalService, config: { - options: { postalSvc: { bundleID, issuerNames: ['ATOM', 'Item'] } }, + options: { postalService: { bundleID, issuerNames: ['ATOM', 'Item'] } }, }, }); @@ -103,12 +103,12 @@ test.serial('deploy contract with core eval: postalSvc / send', async t => { }); }); -test.serial('agoricNames.instances has contract: postalSvc', async t => { +test.serial('agoricNames.instances has contract: postalService', async t => { const { makeQueryTool } = t.context; const hub0 = makeAgoricNames(makeQueryTool()); const agoricNames = makeNameProxy(hub0); await null; - const instance = await agoricNames.instance.postalSvc; + const instance = await agoricNames.instance.postalService; t.log(instance); t.is(passStyleOf(instance), 'remotable'); }); @@ -154,12 +154,14 @@ test.serial('deliver payment using offer', async t => { test.todo('E2E: send using publicFacet using contract'); -test('send invitation* from contract using publicFacet of postalSvc', async t => { +test('send invitation* from contract using publicFacet of postalService', async t => { const { powers, bundles } = await bootAndInstallBundles(t, bundleRoots); - const bundleID = getBundleId(bundles.postalSvc); - await startPostalSvc(powers, { - options: { postalSvc: { bundleID, issuerNames: ['IST', 'Invitation'] } }, + const bundleID = getBundleId(bundles.postalService); + await startPostalService(powers, { + options: { + postalService: { bundleID, issuerNames: ['IST', 'Invitation'] }, + }, }); const { zoe, namesByAddressAdmin } = powers.consume; @@ -174,10 +176,10 @@ test('send invitation* from contract using publicFacet of postalSvc', async t => { zoe, namesByAddressAdmin }, smartWalletIssuers, ); - /** @type {import('../src/start-postalSvc.js').PostalSvcPowers} */ + /** @type {import('../src/start-postalSvc.js').PostalServicePowers} */ // @ts-expect-error cast const postalSpace = powers; - const instance = await postalSpace.instance.consume.postalSvc; + const instance = await postalSpace.instance.consume.postalService; const shared = { rxAddr: 'agoric1receiverRex', @@ -190,7 +192,7 @@ test('send invitation* from contract using publicFacet of postalSvc', async t => }; const wallet = await walletFactory.makeSmartWallet(shared.rxAddr); - const terms = { postalSvc: instance, destAddr: shared.rxAddr }; + const terms = { postalService: instance, destAddr: shared.rxAddr }; await Promise.all([ senderContract(t, { zoe, terms }), receiverRex(t, { wallet }, shared), From b7dc97a2196ab64c80a9727e5176c1ecd7fb0c4a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 00:05:51 -0600 Subject: [PATCH 047/152] refactor: follow X.proposal.js pattern --- .../{start-postalSvc.js => postal-service.proposal.js} | 0 contract/test/test-postalSvc.js | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) rename contract/src/{start-postalSvc.js => postal-service.proposal.js} (100%) diff --git a/contract/src/start-postalSvc.js b/contract/src/postal-service.proposal.js similarity index 100% rename from contract/src/start-postalSvc.js rename to contract/src/postal-service.proposal.js diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 534ac3d3..34012a90 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -7,7 +7,7 @@ import { createRequire } from 'module'; import { E, passStyleOf } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; -import { startPostalService } from '../src/start-postalSvc.js'; +import { startPostalService } from '../src/postal-service.proposal.js'; import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; import { makeBundleCacheContext, getBundleId } from './bundle-tools.js'; import { mockWalletFactory } from './wallet-tools.js'; @@ -28,11 +28,11 @@ const test = anyTest; const nodeRequire = createRequire(import.meta.url); const bundleRoots = { - postalSvc: nodeRequire.resolve('../src/postalSvc.js'), + postalService: nodeRequire.resolve('../src/postal-service.contract.js'), }; const scriptRoots = { - postalSvc: nodeRequire.resolve('../src/start-postalSvc.js'), + postalService: nodeRequire.resolve('../src/postal-service.proposal.js'), }; /** @param {import('ava').ExecutionContext} t */ @@ -176,7 +176,7 @@ test('send invitation* from contract using publicFacet of postalService', async { zoe, namesByAddressAdmin }, smartWalletIssuers, ); - /** @type {import('../src/start-postalSvc.js').PostalServicePowers} */ + /** @type {import('../src/postal-service.proposal.js').PostalServicePowers} */ // @ts-expect-error cast const postalSpace = powers; const instance = await postalSpace.instance.consume.postalService; From f356af715e2db032af6b03ed5f08d6fb57edd07d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 00:17:44 -0600 Subject: [PATCH 048/152] chore(postal-service.proposal): punt trace() --- contract/src/postal-service.proposal.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contract/src/postal-service.proposal.js b/contract/src/postal-service.proposal.js index afd48b2a..abf42fe0 100644 --- a/contract/src/postal-service.proposal.js +++ b/contract/src/postal-service.proposal.js @@ -8,8 +8,6 @@ import { E } from '@endo/far'; import { fixHub } from './fixHub.js'; -const trace = (...args) => console.log('start-postalService', ...args); - const { Fail } = assert; /** @@ -68,7 +66,7 @@ export const startPostalService = async (powers, config) => { }); produceInstance.resolve(instance); - trace('postalService started'); + console.log('postalService started'); }; export const manifest = /** @type {const} */ ({ From ffd4cfdd30d4abb760a0be4c9acd0bc7a3e18ef1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 16:19:00 -0600 Subject: [PATCH 049/152] refactor: use E.when() Co-authored-by: Chris Hibbert --- contract/src/postal-service.contract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 2fdd4880..8c2efd6a 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -44,7 +44,7 @@ export const start = zcf => { // XXX partial failure? return payments? await Promise.all( values(payouts).map(pmtP => - Promise.resolve(pmtP).then(pmt => E(depositFacet).receive(pmt)), + E.when(pmtP, pmt => E(depositFacet).receive(pmt)), ), ); seat.exit(); From 5e0fa9a098384ca7078cdb92aff87f7ee629b98b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 16:23:04 -0600 Subject: [PATCH 050/152] test(postalSvc): TODO -> test.todo() --- contract/test/test-postalSvc.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 34012a90..03653492 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -113,6 +113,8 @@ test.serial('agoricNames.instances has contract: postalService', async t => { t.is(passStyleOf(instance), 'remotable'); }); +test.todo('deliver payment using offer with non-fungible'); + test.serial('deliver payment using offer', async t => { const { provisionSmartWallet, makeQueryTool } = t.context; const qt = makeQueryTool(); @@ -126,7 +128,6 @@ test.serial('deliver payment using offer', async t => { rxAddr: 'agoric1aap7m84dt0rwhhfw49d4kv2gqetzl56vn8aaxj', toSend: { Pmt: amt(await agoricNames.brand.ATOM, 3n), - // TODO non-fungible: Inventory: amt(Item.brand, harden(['map'])), }, }; @@ -137,7 +138,6 @@ test.serial('deliver payment using offer', async t => { ), rose: await provisionSmartWallet(shared.rxAddr, { BLD: 20n, - // TODO non-fungibles: Item: amt(Item.brand, harden(['potion', 'map'])), }), }; const pqt = makeQueryTool(); From 53c139c8419c54d4c0a59e5aef49e5c088af5459 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 10:45:21 -0600 Subject: [PATCH 051/152] WIP: with a3p use-lo-bundle-cost, we don't need to lower it --- contract/Makefile | 35 ------------------- contract/scripts/run-chain.sh | 1 - contract/scripts/voteLatestProposalAndWait.sh | 5 --- 3 files changed, 41 deletions(-) delete mode 100755 contract/scripts/voteLatestProposalAndWait.sh diff --git a/contract/Makefile b/contract/Makefile index 1fa4f265..3ba9a096 100644 --- a/contract/Makefile +++ b/contract/Makefile @@ -27,41 +27,6 @@ mint100: yarn --silent agops vaults open --wantMinted 100 --giveCollateral 100 >/tmp/want-ist.json && \ yarn --silent agops perf satisfaction --executeOffer /tmp/want-ist.json --from user1 --keyring-backend=test -# https://agoric.explorers.guru/proposal/61 -lower-bundle-cost: bundles/lower-bundle-cost.json ./scripts/voteLatestProposalAndWait.sh - agd tx gov submit-proposal param-change bundles/lower-bundle-cost.json \ - $(SIGN_BROADCAST_OPTS) \ - --from user1 - ./scripts/voteLatestProposalAndWait.sh - # agd query swingset params - - -bundles/swingset-params.json: - mkdir -p bundles/ - agd query swingset params -o json >$@ - -.ONESHELL: -bundles/lower-bundle-cost.json: bundles/swingset-params.json - @read PARAMS < bundles/swingset-params.json; export PARAMS - node - <<- EOF >$@ - const storageByte = '20000000'; - const paramChange = { - title: 'Lower Bundle Cost to 0.02 IST/Kb (a la mainnet 61)', - description: '0.02 IST/Kb', - deposit: '10000000ubld', - changes: [{ - subspace: 'swingset', - key: 'beans_per_unit', - value: '...', - }], - }; - const params = JSON.parse(process.env.PARAMS); - const ix = params.beans_per_unit.findIndex(({key}) => key === 'storageByte'); - params.beans_per_unit[ix].beans = storageByte; - paramChange.changes[0].value = params.beans_per_unit; - console.log(JSON.stringify(paramChange, null, 2)); - EOF - # Keep mint4k around a while for compatibility mint4k: make FUNDS=1000$(ATOM) fund-acct diff --git a/contract/scripts/run-chain.sh b/contract/scripts/run-chain.sh index 6534eae6..e6435bd4 100755 --- a/contract/scripts/run-chain.sh +++ b/contract/scripts/run-chain.sh @@ -64,7 +64,6 @@ waitForBlock 2 approveProposals & make -C /workspace/contract mint100 -make -C /workspace/contract lower-bundle-cost # bring back chain process to foreground wait diff --git a/contract/scripts/voteLatestProposalAndWait.sh b/contract/scripts/voteLatestProposalAndWait.sh deleted file mode 100755 index dd303f49..00000000 --- a/contract/scripts/voteLatestProposalAndWait.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -ueo pipefail - -. /usr/src/upgrade-test-scripts/env_setup.sh -voteLatestProposalAndWait From be5fe58dc21a396792bc4fd015ccaf062b117249 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 16:37:47 -0600 Subject: [PATCH 052/152] Revert "fixup! chore(start-postalSvc): match builder patterns" This reverts commit 751f6c0d8d619dfe57e02decd06160b1440d56bf. --- contract/src/postal-service.proposal.js | 1 + 1 file changed, 1 insertion(+) diff --git a/contract/src/postal-service.proposal.js b/contract/src/postal-service.proposal.js index abf42fe0..1c97fe96 100644 --- a/contract/src/postal-service.proposal.js +++ b/contract/src/postal-service.proposal.js @@ -47,6 +47,7 @@ export const startPostalService = async (powers, config) => { }, } = postalPowers; const { + // separate line for bundling bundleID = Fail`no bundleID`, issuerNames = ['IST', 'Invitation', 'BLD', 'ATOM'], } = config?.options?.postalService ?? {}; From 7a26f1bd0a189db6ea5b619048200de1072808d0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 19:28:58 -0600 Subject: [PATCH 053/152] chore(makeHttpClient) copy from @agoric/casting --- contract/test/ui-kit-goals/makeHttpClient.js | 57 ++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 contract/test/ui-kit-goals/makeHttpClient.js diff --git a/contract/test/ui-kit-goals/makeHttpClient.js b/contract/test/ui-kit-goals/makeHttpClient.js new file mode 100644 index 00000000..0a72ccac --- /dev/null +++ b/contract/test/ui-kit-goals/makeHttpClient.js @@ -0,0 +1,57 @@ +// @ts-check + +const { freeze } = Object; + +const filterBadStatus = res => { + if (res.status >= 400) { + throw new Error(`Bad status on response: ${res.status}`); + } + return res; +}; + +/** + * Make an RpcClient using explicit access to the network. + * + * The RpcClient implementations included in cosmjs + * such as {@link https://cosmos.github.io/cosmjs/latest/tendermint-rpc/classes/HttpClient.html HttpClient} + * use ambient authority (fetch or axios) for network access. + * + * To facilitate cooperation without vulnerability, + * as well as unit testing, etc. this RpcClient maker takes + * network access as a parameter, following + * {@link https://github.com/Agoric/agoric-sdk/wiki/OCap-Discipline|OCap Discipline}. + * + * @param {string} url + * @param {typeof window.fetch} fetch + * @returns {import('@cosmjs/tendermint-rpc').RpcClient} + */ +export const makeHttpClient = (url, fetch) => { + const headers = {}; // XXX needed? + + // based on cosmjs 0.30.1: + // https://github.com/cosmos/cosmjs/blob/33271bc51cdc865cadb647a1b7ab55d873637f39/packages/tendermint-rpc/src/rpcclients/http.ts#L37 + // https://github.com/cosmos/cosmjs/blob/33271bc51cdc865cadb647a1b7ab55d873637f39/packages/tendermint-rpc/src/rpcclients/httpclient.ts#L25 + return freeze({ + disconnect: () => { + // nothing to be done + }, + + /** + * @param {import('@cosmjs/json-rpc').JsonRpcRequest} request + */ + execute: async request => { + const settings = { + method: 'POST', + body: request ? JSON.stringify(request) : undefined, + headers: { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'Content-Type': 'application/json', + ...headers, + }, + }; + return fetch(url, settings) + .then(filterBadStatus) + .then(res => res.json()); + }, + }); +}; From 3e626681e10953bf8a9858b1ee4f4d4c4181cee2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 23:43:54 -0600 Subject: [PATCH 054/152] feat(makeHttpClient): makeAPI - document transition from LCD --- contract/test/ui-kit-goals/makeHttpClient.js | 53 ++++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/contract/test/ui-kit-goals/makeHttpClient.js b/contract/test/ui-kit-goals/makeHttpClient.js index 0a72ccac..7033d83c 100644 --- a/contract/test/ui-kit-goals/makeHttpClient.js +++ b/contract/test/ui-kit-goals/makeHttpClient.js @@ -1,7 +1,10 @@ // @ts-check +import { Far } from '@endo/far'; const { freeze } = Object; +const jsonType = { 'Content-Type': 'application/json' }; + const filterBadStatus = res => { if (res.status >= 400) { throw new Error(`Bad status on response: ${res.status}`); @@ -43,11 +46,7 @@ export const makeHttpClient = (url, fetch) => { const settings = { method: 'POST', body: request ? JSON.stringify(request) : undefined, - headers: { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'application/json', - ...headers, - }, + headers: { ...jsonType, ...headers }, }; return fetch(url, settings) .then(filterBadStatus) @@ -55,3 +54,47 @@ export const makeHttpClient = (url, fetch) => { }, }); }; + +/** + * gRPC-gateway REST API access + * + * @see {@link https://docs.cosmos.network/v0.45/core/grpc_rest.html#rest-server Cosmos SDK REST Server} + * + * Note: avoid Legacy REST routes, per + * {@link https://docs.cosmos.network/v0.45/migrations/rest.html Cosmos SDK REST Endpoints Migration}. + * + * @param {string} apiAddress nodes default to port 1317 + * @param {object} io + * @param {typeof fetch} io.fetch + */ +export const makeAPI = (apiAddress, { fetch }) => { + assert.typeof(apiAddress, 'string'); + + /** + * @param {string} href + * @param {object} [options] + * @param {Record} [options.headers] + */ + const getJSON = (href, options = {}) => { + const opts = { + keepalive: true, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }; + const url = `${apiAddress}${href}`; + return fetch(url, opts).then(r => { + if (!r.ok) throw Error(r.statusText); + return r.json().then(data => { + return data; + }); + }); + }; + + return Far('LCD', { + getJSON, + latestBlock: () => getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), + }); +}; +/** @typedef {ReturnType} LCD */ From cfd0b1a739735772dab7a400866e55e645ebfe43 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 23:44:31 -0600 Subject: [PATCH 055/152] chore(batchQuery): copy vstorage utils from ag-power-tools --- contract/test/ui-kit-goals/batchQuery.js | 175 +++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 contract/test/ui-kit-goals/batchQuery.js diff --git a/contract/test/ui-kit-goals/batchQuery.js b/contract/test/ui-kit-goals/batchQuery.js new file mode 100644 index 00000000..3f4d3cb7 --- /dev/null +++ b/contract/test/ui-kit-goals/batchQuery.js @@ -0,0 +1,175 @@ +// @ts-check +import { E } from '@endo/far'; + +/** @typedef {'children' | 'data'} AgoricChainStoragePathKind */ +/** @template T @typedef {import('@endo/marshal').FromCapData} FromCapData */ +/** @template T @typedef {import('@endo/eventual-send').ERef} ERef */ + +/** + * @param {[kind: AgoricChainStoragePathKind, item: string]} path + */ +export const pathToKey = path => path.join('.'); + +/** @param {string} key */ +export const keyToPath = key => { + const [kind, ...rest] = key.split('.'); + assert(kind === 'children' || kind === 'data'); + /** @type {[kind: 'children' | 'data', item: string]} */ + const out = [kind, rest.join('.')]; +}; + +/** + * @template T + * @param {(value: string) => T} f + * @param {AsyncGenerator} chunks + */ +async function* mapHistory(f, chunks) { + for await (const chunk of chunks) { + if (chunk === undefined) continue; + for (const value of chunk.reverse()) { + yield f(value); + } + } +} + +/** + * @param {ERef} lcd + */ +export const makeVStorage = lcd => { + const getJSON = (href, options) => E(lcd).getJSON(href, options); + + // height=0 is the same as omitting height and implies the highest block + const href = (path = 'published', { kind = 'data' } = {}) => + `/agoric/vstorage/${kind}/${path}`; + const headers = height => + height ? { 'x-cosmos-block-height': `${height}` } : undefined; + + const readStorage = ( + path = 'published', + { kind = 'data', height = 0 } = {}, + ) => + getJSON(href(path, { kind }), { headers: headers(height) }).catch(err => { + throw Error(`cannot read ${kind} of ${path}: ${err.message}`); + }); + const readCell = (path, opts) => + readStorage(path, opts) + .then(data => data.value) + .then(s => (s === '' ? {} : JSON.parse(s))); + + /** + * Read values going back as far as available + * + * @param {string} path + * @param {number | string} [minHeight] + */ + async function* readHistory(path, minHeight = undefined) { + // undefined the first iteration, to query at the highest + let blockHeight; + await null; + do { + // console.debug('READING', { blockHeight }); + /** @type {string[]} */ + let values = []; + try { + ({ blockHeight, values } = await readCell(path, { + kind: 'data', + height: blockHeight && Number(blockHeight) - 1, + })); + // console.debug('readAt returned', { blockHeight }); + } catch (err) { + if (err.message.match(/unknown request/)) { + // XXX FIXME + // console.error(err); + break; + } + throw err; + } + yield values; + // console.debug('PUSHED', values); + // console.debug('NEW', { blockHeight, minHeight }); + if (minHeight && Number(blockHeight) <= Number(minHeight)) break; + } while (blockHeight > 0); + } + + /** + * @template T + * @param {(value: string) => T} f + * @param {string} path + * @param {number | string} [minHeight] + */ + const readHistoryBy = (f, path, minHeight) => + mapHistory(f, readHistory(path, minHeight)); + + return { + lcd, + readStorage, + readCell, + readHistory, + readHistoryBy, + }; +}; + +/** @typedef {ReturnType} VStorage */ + +/** @param {string | unknown} d */ +const parseIfJSON = d => { + if (typeof d !== 'string') return d; + try { + return JSON.parse(d); + } catch { + return d; + } +}; + +/** + * @param {ReturnType} vstorage + * @param {FromCapData} unmarshal + * @param {[AgoricChainStoragePathKind, string][]} paths + */ +export const batchVstorageQuery = async (vstorage, unmarshal, paths) => { + const requests = paths.map(([kind, path]) => + vstorage.readStorage(path, { kind }), + ); + + return Promise.all(requests).then(responses => + responses.map((res, index) => { + if (paths[index][0] === 'children') { + return [ + pathToKey(paths[index]), + { value: res.children, blockHeight: undefined }, + ]; + } + + if (!res.value) { + return [ + pathToKey(paths[index]), + { + error: `Cannot parse value of response for path [${ + paths[index] + }]: ${JSON.stringify(res)}`, + }, + ]; + } + + const data = parseIfJSON(res.value); + + const latestValue = + typeof data.values !== 'undefined' + ? parseIfJSON(data.values[data.values.length - 1]) + : parseIfJSON(data.value); + + const unserialized = + typeof latestValue.slots !== 'undefined' + ? unmarshal(latestValue) + : latestValue; + + return [ + pathToKey(paths[index]), + { + blockHeight: data.blockHeight, + value: unserialized, + }, + ]; + }), + ); +}; From 5ddbf72767d4569a11936bfdad1db8f0a587f7ea Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 16:22:56 -0700 Subject: [PATCH 056/152] fix(batchQuery): keyToPath return --- contract/test/ui-kit-goals/batchQuery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/contract/test/ui-kit-goals/batchQuery.js b/contract/test/ui-kit-goals/batchQuery.js index 3f4d3cb7..d53468e6 100644 --- a/contract/test/ui-kit-goals/batchQuery.js +++ b/contract/test/ui-kit-goals/batchQuery.js @@ -16,6 +16,7 @@ export const keyToPath = key => { assert(kind === 'children' || kind === 'data'); /** @type {[kind: 'children' | 'data', item: string]} */ const out = [kind, rest.join('.')]; + return out; }; /** From bffac8e1b72594934ea4762d24d5d1b9c2604227 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 23:44:14 -0600 Subject: [PATCH 057/152] chore(marshalTables): copy from ag-power-tools --- contract/test/ui-kit-goals/marshalTables.js | 49 +++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 contract/test/ui-kit-goals/marshalTables.js diff --git a/contract/test/ui-kit-goals/marshalTables.js b/contract/test/ui-kit-goals/marshalTables.js new file mode 100644 index 00000000..3c658658 --- /dev/null +++ b/contract/test/ui-kit-goals/marshalTables.js @@ -0,0 +1,49 @@ +import { Far, makeMarshal } from '@endo/marshal'; + +/** + * @template Val + * @param {(val: Val, size: number) => unknown} makeSlot + * @param {(slot: unknown, iface: string | undefined) => Val} makeVal + * @returns + */ +const makeTranslationTable = (makeSlot, makeVal) => { + /** @type {Map} */ + const valToSlot = new Map(); + /** @type {Map} */ + const slotToVal = new Map(); + + /** @type {(val: Val) => unknown} */ + const convertValToSlot = val => { + if (valToSlot.has(val)) return valToSlot.get(val); + const slot = makeSlot(val, valToSlot.size); + valToSlot.set(val, slot); + slotToVal.set(slot, val); + return slot; + }; + + /** @type {(slot: unknown, iface: string | undefined) => Val} */ + const convertSlotToVal = (slot, iface) => { + if (slot === null) return makeVal(slot, iface); + if (slotToVal.has(slot)) return slotToVal.get(slot); + const val = makeVal(slot, iface); + valToSlot.set(val, slot); + slotToVal.set(slot, val); + return val; + }; + + return harden({ convertValToSlot, convertSlotToVal }); +}; + +/** @type {(slot: unknown, iface: string | undefined) => any} */ +const synthesizeRemotable = (slot, iface) => + Far(`${(iface ?? '').replace(/^Alleged: /, '')}#${slot}`, {}); + +export const makeClientMarshaller = () => { + const { convertValToSlot, convertSlotToVal } = makeTranslationTable(val => { + throw new Error(`unknown value: ${val}`); + }, synthesizeRemotable); + + return makeMarshal(convertValToSlot, convertSlotToVal, { + serializeBodyFormat: 'smallcaps', + }); +}; From 27b218570be8b8d100f10af262a361459fe4f61d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 23 Feb 2024 23:19:22 -0600 Subject: [PATCH 058/152] feat(marshalTables): caller-supplied valToSlot in client marshal --- contract/test/ui-kit-goals/marshalTables.js | 22 ++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/contract/test/ui-kit-goals/marshalTables.js b/contract/test/ui-kit-goals/marshalTables.js index 3c658658..2b67f2a0 100644 --- a/contract/test/ui-kit-goals/marshalTables.js +++ b/contract/test/ui-kit-goals/marshalTables.js @@ -2,9 +2,8 @@ import { Far, makeMarshal } from '@endo/marshal'; /** * @template Val - * @param {(val: Val, size: number) => unknown} makeSlot - * @param {(slot: unknown, iface: string | undefined) => Val} makeVal - * @returns + * @param {(val: Val, size: number) => string} makeSlot + * @param {(slot: string, iface: string | undefined) => Val} makeVal */ const makeTranslationTable = (makeSlot, makeVal) => { /** @type {Map} */ @@ -12,7 +11,7 @@ const makeTranslationTable = (makeSlot, makeVal) => { /** @type {Map} */ const slotToVal = new Map(); - /** @type {(val: Val) => unknown} */ + /** @type {(val: Val) => string} */ const convertValToSlot = val => { if (valToSlot.has(val)) return valToSlot.get(val); const slot = makeSlot(val, valToSlot.size); @@ -21,7 +20,7 @@ const makeTranslationTable = (makeSlot, makeVal) => { return slot; }; - /** @type {(slot: unknown, iface: string | undefined) => Val} */ + /** @type {(slot: string | null, iface: string | undefined) => Val} */ const convertSlotToVal = (slot, iface) => { if (slot === null) return makeVal(slot, iface); if (slotToVal.has(slot)) return slotToVal.get(slot); @@ -34,14 +33,19 @@ const makeTranslationTable = (makeSlot, makeVal) => { return harden({ convertValToSlot, convertSlotToVal }); }; -/** @type {(slot: unknown, iface: string | undefined) => any} */ +/** @type {(slot: string, iface: string | undefined) => any} */ const synthesizeRemotable = (slot, iface) => Far(`${(iface ?? '').replace(/^Alleged: /, '')}#${slot}`, {}); -export const makeClientMarshaller = () => { - const { convertValToSlot, convertSlotToVal } = makeTranslationTable(val => { +/** @param {(v: unknown) => string} [valToSlot] */ +export const makeClientMarshaller = valToSlot => { + const noNewSlots = val => { throw new Error(`unknown value: ${val}`); - }, synthesizeRemotable); + }; + const { convertValToSlot, convertSlotToVal } = makeTranslationTable( + valToSlot || noNewSlots, + synthesizeRemotable, + ); return makeMarshal(convertValToSlot, convertSlotToVal, { serializeBodyFormat: 'smallcaps', From 2f30f431a4c5ccb65acd0e9d3a41a824d3f5fdef Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 16:14:21 -0600 Subject: [PATCH 059/152] docs(marshalTables): note connection to @agoric/rpc - fix types --- contract/test/ui-kit-goals/marshalTables.js | 46 +++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/contract/test/ui-kit-goals/marshalTables.js b/contract/test/ui-kit-goals/marshalTables.js index 2b67f2a0..7913e66f 100644 --- a/contract/test/ui-kit-goals/marshalTables.js +++ b/contract/test/ui-kit-goals/marshalTables.js @@ -1,29 +1,55 @@ +/** + * @file marshal tools for vstorage clients + * + * TODO: integrate back into @agoric/rpc + * - fixes: calls to makeClientMarshaller share static mutable state + * https://github.com/Agoric/ui-kit/issues/73 + * - fits in this plain .js project + */ +// @ts-check import { Far, makeMarshal } from '@endo/marshal'; /** + * The null slot indicates that identity is not intended to be preserved. + * + * @typedef { string | null } WildSlot + */ + +/** + * Implement conventional parts of convertValToSlot, convertSlotToVal functions + * for use with makeMarshal based on a slot <-> value translation table, + * indexed in both directions. Caller supplies functions for making + * slots, values when not present in the table. + * * @template Val * @param {(val: Val, size: number) => string} makeSlot - * @param {(slot: string, iface: string | undefined) => Val} makeVal + * @param {(slot: WildSlot, iface: string | undefined) => Val} makeVal */ const makeTranslationTable = (makeSlot, makeVal) => { - /** @type {Map} */ + /** @type {Map} */ const valToSlot = new Map(); - /** @type {Map} */ + /** @type {Map} */ const slotToVal = new Map(); /** @type {(val: Val) => string} */ const convertValToSlot = val => { - if (valToSlot.has(val)) return valToSlot.get(val); + if (valToSlot.has(val)) { + // @ts-expect-error https://github.com/microsoft/TypeScript/issues/13086 + return valToSlot.get(val); + } const slot = makeSlot(val, valToSlot.size); valToSlot.set(val, slot); slotToVal.set(slot, val); return slot; }; - /** @type {(slot: string | null, iface: string | undefined) => Val} */ + /** @type {(slot: WildSlot, iface: string | undefined) => Val} */ const convertSlotToVal = (slot, iface) => { if (slot === null) return makeVal(slot, iface); - if (slotToVal.has(slot)) return slotToVal.get(slot); + if (slotToVal.has(slot)) { + // @ts-expect-error https://github.com/microsoft/TypeScript/issues/13086 + return slotToVal.get(slot); + } const val = makeVal(slot, iface); valToSlot.set(val, slot); slotToVal.set(slot, val); @@ -37,7 +63,13 @@ const makeTranslationTable = (makeSlot, makeVal) => { const synthesizeRemotable = (slot, iface) => Far(`${(iface ?? '').replace(/^Alleged: /, '')}#${slot}`, {}); -/** @param {(v: unknown) => string} [valToSlot] */ +/** + * Make a marshaller that synthesizes a remotable the first + * time it sees a slot identifier, allowing clients to recognize + * object identity for brands, instances, etc. + * + * @param {(v: unknown) => string} [valToSlot] + */ export const makeClientMarshaller = valToSlot => { const noNewSlots = val => { throw new Error(`unknown value: ${val}`); From aaf8a34329a9081ac26deee4ce10a2278ac43a43 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 23:44:51 -0600 Subject: [PATCH 060/152] chore(makeQueryKit): copy from ag-trade --- contract/test/ui-kit-goals/queryKit.js | 107 +++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 contract/test/ui-kit-goals/queryKit.js diff --git a/contract/test/ui-kit-goals/queryKit.js b/contract/test/ui-kit-goals/queryKit.js new file mode 100644 index 00000000..fa789d9e --- /dev/null +++ b/contract/test/ui-kit-goals/queryKit.js @@ -0,0 +1,107 @@ +import { E, Far } from '@endo/far'; +import { batchVstorageQuery, makeVStorage } from './batchQuery.js'; +import { makeClientMarshaller } from './marshalTables.js'; + +/** + * @param {string} addr + * @param {object} powers + * @param {QueryTool} powers.query + * @param {import('./batchQuery.js').VStorage} powers.vstorage + */ +export const makeWalletView = (addr, { query, vstorage }) => { + return Far('WalletQuery', { + current: () => query.queryData(`published.wallet.${addr}.current`), + /** + * TODO: visit in chunks by block + * @param {ERef<{visit: (r: UpdateRecord) => void}>} visitor + * @param {number} [minHeight] + */ + history: async (visitor, minHeight) => { + const history = vstorage.readHistoryBy( + s => query.fromCapData(JSON.parse(s)), + `published.wallet.${addr}`, + minHeight, + ); + for await (const record of history) { + await E(visitor).visit(record); + } + }, + }); +}; +/** @typedef {ReturnType} WalletView } */ + +/** @param {ERef} lcd */ +export const makeQueryKit = lcd => { + const m = makeClientMarshaller(); + const vstorage = makeVStorage(lcd); + + /** @param {['children' | 'data', string][]} paths */ + const batchQuery = async paths => + batchVstorageQuery(vstorage, m.fromCapData, paths); + + /** @param {string} path */ + const queryData = async path => { + const [[_p, answer]] = await batchQuery([['data', path]]); + if (typeof answer === 'string') return answer; + if (answer.error) throw Error(answer.error); + return answer.value; + }; + + /** @param {string} path */ + const queryChildren = async path => { + const [[_p, answer]] = await batchQuery([['children', path]]); + if (typeof answer === 'string') return answer; + if (answer.error) throw Error(answer.error); + return answer.value; + }; + + const nameHubCache = new Map(); + + /** @param {string} kind */ + const lookupKind = async kind => { + assert.typeof(kind, 'string'); + if (nameHubCache.has(kind)) { + return nameHubCache.get(kind); + } + const entries = await queryData(`published.agoricNames.${kind}`); + const record = Object.fromEntries(entries); + const hub = Far('NameHub', { + lookup: name => record[name], + keys: () => entries.map(e => e[0]), + entries: () => entries, + }); + nameHubCache.set(kind, hub); + return hub; + }; + + const invalidate = () => { + nameHubCache.clear(); + }; + + /** + * @param {string} first + * @param {string} kind + * @param {string} [name] + */ + const lookup = async (first, kind, name) => { + assert.equal(first, 'agoricNames'); + const hub = await lookupKind(kind); + if (!name) return hub; + return hub.lookup(name); + }; + + const query = Far('QueryTool', { + batchQuery, + queryData, + queryChildren, + lookup, + invalidate, + fromCapData: m.fromCapData, + toCapData: m.toCapData, + // XXX wrong layer? add makeWalletView(query) helper function instead? + walletView: addr => makeWalletView(addr, { query, vstorage }), + }); + + return { vstorage, query }; +}; +/** @typedef {Awaited>['query']} QueryTool */ From f983af4ae230c14fcb61d240339a1c6e7c019b3f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 02:13:59 -0600 Subject: [PATCH 061/152] feat(queryKit): follow - WIP: overlaps casting - move progress reporting into delay()? hm.. - iterTools: poll, dedup, mapIter - slot type, UpdateRecord import --- contract/test/ui-kit-goals/queryKit.js | 125 ++++++++++++++++--------- 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/contract/test/ui-kit-goals/queryKit.js b/contract/test/ui-kit-goals/queryKit.js index fa789d9e..7559c961 100644 --- a/contract/test/ui-kit-goals/queryKit.js +++ b/contract/test/ui-kit-goals/queryKit.js @@ -1,7 +1,77 @@ +// @ts-check + import { E, Far } from '@endo/far'; -import { batchVstorageQuery, makeVStorage } from './batchQuery.js'; +import { batchVstorageQuery } from './batchQuery.js'; import { makeClientMarshaller } from './marshalTables.js'; +/** + * Iter tools... + * + * @template {Promise} PT + * @param {() => PT} fn + * @param {{ delay: (ms: number) => Promise, period?: number }} opts + */ +export async function* poll(fn, { delay, period = 1000 }) { + await null; + for (;;) { + const x = await fn(); + yield x; + await delay(period); + } +} + +/** + * @template {Promise} PT + * @param {AsyncGenerator>} src + * @param {(a: unknown, b: unknown) => boolean} [equal] + */ +export async function* dedup(src, equal = (x, y) => x === y) { + let last; + for await (const x of src) { + if (!equal(x, last)) { + yield x; + last = x; + } + } +} + +/** + * @template {Promise} PT + * @template {Promise} PU + * @param {AsyncGenerator>} src + * @param {(x: Awaited) => PU} fn + */ +export async function* mapIter(src, fn) { + for await (const item of src) { + yield fn(item); + } +} + +/** + * @param {string} key + * @param {object} io + * @param {import('./batchQuery.js').VStorage} io.vstorage + * @param {(ms: number, opts?: unknown) => Promise} io.delay + */ +export async function* eachVstorageUpdate(key, { vstorage, delay }) { + const { stringify: q } = JSON; + const updates = dedup( + poll(() => vstorage.readCell(key, { kind: 'data' }), { + delay, + period: 2000, + }), + (a, b) => q(a) === q(b), + ); + + for await (const cell of updates) { + // use blockHeight? + const { values } = cell; + for (const value of values) { + yield value; + } + } +} + /** * @param {string} addr * @param {object} powers @@ -13,7 +83,7 @@ export const makeWalletView = (addr, { query, vstorage }) => { current: () => query.queryData(`published.wallet.${addr}.current`), /** * TODO: visit in chunks by block - * @param {ERef<{visit: (r: UpdateRecord) => void}>} visitor + * @param {ERef<{visit: (r: import('@agoric/smart-wallet/src/smartWallet.js').UpdateRecord) => void}>} visitor * @param {number} [minHeight] */ history: async (visitor, minHeight) => { @@ -30,11 +100,11 @@ export const makeWalletView = (addr, { query, vstorage }) => { }; /** @typedef {ReturnType} WalletView } */ -/** @param {ERef} lcd */ -export const makeQueryKit = lcd => { - const m = makeClientMarshaller(); - const vstorage = makeVStorage(lcd); - +/** + * @param {import('./batchQuery.js').VStorage} vstorage + * @param {import('@endo/marshal').Marshal} [m] + */ +export const makeQueryKit = (vstorage, m = makeClientMarshaller()) => { /** @param {['children' | 'data', string][]} paths */ const batchQuery = async paths => batchVstorageQuery(vstorage, m.fromCapData, paths); @@ -55,47 +125,18 @@ export const makeQueryKit = lcd => { return answer.value; }; - const nameHubCache = new Map(); - - /** @param {string} kind */ - const lookupKind = async kind => { - assert.typeof(kind, 'string'); - if (nameHubCache.has(kind)) { - return nameHubCache.get(kind); + async function* follow(path, { delay }) { + for await (const txt of eachVstorageUpdate(path, { vstorage, delay })) { + const value = m.fromCapData(JSON.parse(txt)); + yield value; } - const entries = await queryData(`published.agoricNames.${kind}`); - const record = Object.fromEntries(entries); - const hub = Far('NameHub', { - lookup: name => record[name], - keys: () => entries.map(e => e[0]), - entries: () => entries, - }); - nameHubCache.set(kind, hub); - return hub; - }; - - const invalidate = () => { - nameHubCache.clear(); - }; - - /** - * @param {string} first - * @param {string} kind - * @param {string} [name] - */ - const lookup = async (first, kind, name) => { - assert.equal(first, 'agoricNames'); - const hub = await lookupKind(kind); - if (!name) return hub; - return hub.lookup(name); - }; + } const query = Far('QueryTool', { batchQuery, queryData, + follow, queryChildren, - lookup, - invalidate, fromCapData: m.fromCapData, toCapData: m.toCapData, // XXX wrong layer? add makeWalletView(query) helper function instead? From be308a75f3dc8a50b01b8041472e318a1f540d36 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 18:57:49 -0600 Subject: [PATCH 062/152] chore(agd-lib): copy from agoric-3-proposals; .ts -> .js --- contract/test/agd-lib.js | 137 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 contract/test/agd-lib.js diff --git a/contract/test/agd-lib.js b/contract/test/agd-lib.js new file mode 100644 index 00000000..84ab0aac --- /dev/null +++ b/contract/test/agd-lib.js @@ -0,0 +1,137 @@ +import assert from 'node:assert'; + +const { freeze } = Object; + +const agdBinary = 'agd'; + +/** + * @param {{ + * execFileSync: typeof import('child_process').execFileSync; + * }} io + */ +export const makeAgd = ({ execFileSync }) => { + /** + * @param { { + * home?: string; + * keyringBackend?: string; + * rpcAddrs?: string[]; + * }} opts + */ + const make = ({ home, keyringBackend, rpcAddrs } = {}) => { + const keyringArgs = [ + ...(home ? ['--home', home] : []), + ...(keyringBackend ? [`--keyring-backend`, keyringBackend] : []), + ]; + if (rpcAddrs) { + assert.equal( + rpcAddrs.length, + 1, + 'XXX rpcAddrs must contain only one entry', + ); + } + const nodeArgs = [...(rpcAddrs ? [`--node`, rpcAddrs[0]] : [])]; + + /** + * @param {string[]} args + * @param {import('child_process').ExecFileSyncOptionsWithStringEncoding} [opts] + */ + const exec = (args, opts) => execFileSync(agdBinary, args, opts).toString(); + + const outJson = ['--output', 'json']; + + const ro = freeze({ + status: async () => JSON.parse(exec([...nodeArgs, 'status'])), + /** + * @param {| [kind: 'gov', domain: string, ...rest: any] + * | [kind: 'tx', txhash: string] + * | [mod: 'vstorage', kind: 'data' | 'children', path: string], + * } qArgs + */ + query: async qArgs => { + const out = exec(['query', ...qArgs, ...nodeArgs, ...outJson], { + encoding: 'utf-8', + stdio: ['ignore', 'pipe', 'ignore'], + }); + + try { + return JSON.parse(out); + } catch (e) { + console.error(e); + console.info('output:', out); + } + }, + }); + const nameHub = freeze({ + /** + * NOTE: synchronous I/O + * + * @param {string[]} path + */ + lookup: (...path) => { + if (!Array.isArray(path)) { + // TODO: use COND || Fail`` + throw TypeError(); + } + if (path.length !== 1) { + throw Error(`path length limited to 1: ${path.length}`); + } + const [name] = path; + const txt = exec(['keys', 'show', `--address`, name, ...keyringArgs]); + return txt.trim(); + }, + }); + const rw = freeze({ + /** + * TODO: gas + * @param {string[]} txArgs + * @param {{ chainId: string; from: string; yes?: boolean }} opts + */ + tx: async (txArgs, { chainId, from, yes }) => { + const yesArg = yes ? ['--yes'] : []; + const args = [ + ...nodeArgs, + ...[`--chain-id`, chainId], + ...keyringArgs, + ...[`--from`, from], + 'tx', + ...['--broadcast-mode', 'block'], + ...txArgs, + ...yesArg, + ...outJson, + ]; + const out = exec(args); + try { + return JSON.parse(out); + } catch (e) { + console.error(e); + console.info('output:', out); + } + }, + ...ro, + ...nameHub, + readOnly: () => ro, + nameHub: () => nameHub, + keys: { + /** + * @param {string} name + * @param {string} mnemonic + */ + add: (name, mnemonic) => { + return execFileSync( + agdBinary, + [...keyringArgs, 'keys', 'add', name, '--recover'], + { input: mnemonic }, + ).toString(); + }, + }, + /** + * @param {Record} opts + */ + withOpts: opts => make({ home, keyringBackend, rpcAddrs, ...opts }), + }); + return rw; + }; + return make(); +}; + +/** @typedef {ReturnType} Agd */ From 4fd2da58210d52ff270c49fbf7cdfc3140bad9bd Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 02:09:04 -0600 Subject: [PATCH 063/152] fix(agd-lib): detect tx errors; supply enough gas - narrow execSync type --- contract/test/agd-lib.js | 66 +++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/contract/test/agd-lib.js b/contract/test/agd-lib.js index 84ab0aac..060677b2 100644 --- a/contract/test/agd-lib.js +++ b/contract/test/agd-lib.js @@ -1,3 +1,4 @@ +// @ts-check import assert from 'node:assert'; const { freeze } = Object; @@ -5,9 +6,28 @@ const { freeze } = Object; const agdBinary = 'agd'; /** - * @param {{ - * execFileSync: typeof import('child_process').execFileSync; - * }} io + * @param {Record} record - e.g. { color: 'blue' } + * @returns {string[]} - e.g. ['--color', 'blue'] + */ +export const flags = record => { + // TODO? support --yes with boolean? + + /** @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(); +}; + +/** + * @callback ExecSync + * @param {string} file + * @param {string[]} args + * @param {{ encoding: 'utf-8' } & { [k: string]: unknown }} opts + * @returns {string} + */ + +/** + * @param {{ execFileSync: ExecSync }} io */ export const makeAgd = ({ execFileSync }) => { /** @@ -18,10 +38,7 @@ export const makeAgd = ({ execFileSync }) => { * }} opts */ const make = ({ home, keyringBackend, rpcAddrs } = {}) => { - const keyringArgs = [ - ...(home ? ['--home', home] : []), - ...(keyringBackend ? [`--keyring-backend`, keyringBackend] : []), - ]; + const keyringArgs = flags({ home, 'keyring-backend': keyringBackend }); if (rpcAddrs) { assert.equal( rpcAddrs.length, @@ -29,22 +46,23 @@ export const makeAgd = ({ execFileSync }) => { 'XXX rpcAddrs must contain only one entry', ); } - const nodeArgs = [...(rpcAddrs ? [`--node`, rpcAddrs[0]] : [])]; + const nodeArgs = flags({ node: rpcAddrs && rpcAddrs[0] }); /** * @param {string[]} args - * @param {import('child_process').ExecFileSyncOptionsWithStringEncoding} [opts] + * @param {*} [opts] */ - const exec = (args, opts) => execFileSync(agdBinary, args, opts).toString(); + const exec = (args, opts = { encoding: 'utf-8' }) => + execFileSync(agdBinary, args, opts); - const outJson = ['--output', 'json']; + const outJson = flags({ output: 'json' }); const ro = freeze({ status: async () => JSON.parse(exec([...nodeArgs, 'status'])), /** * @param {| [kind: 'gov', domain: string, ...rest: any] * | [kind: 'tx', txhash: string] - * | [mod: 'vstorage', kind: 'data' | 'children', path: string], + * | [mod: 'vstorage', kind: 'data' | 'children', path: string] * } qArgs */ query: async qArgs => { @@ -87,21 +105,27 @@ export const makeAgd = ({ execFileSync }) => { * @param {{ chainId: string; from: string; yes?: boolean }} opts */ tx: async (txArgs, { chainId, from, yes }) => { - const yesArg = yes ? ['--yes'] : []; const args = [ - ...nodeArgs, - ...[`--chain-id`, chainId], - ...keyringArgs, - ...[`--from`, from], 'tx', - ...['--broadcast-mode', 'block'], ...txArgs, - ...yesArg, + ...nodeArgs, + ...keyringArgs, + ...flags({ 'chain-id': chainId, from }), + ...flags({ + 'broadcast-mode': 'block', + gas: 'auto', + 'gas-adjustment': '1.4', + }), + ...(yes ? ['--yes'] : []), ...outJson, ]; const out = exec(args); try { - return JSON.parse(out); + const detail = JSON.parse(out); + if (detail.code !== 0) { + throw Error(detail.raw_log); + } + return detail; } catch (e) { console.error(e); console.info('output:', out); @@ -120,7 +144,7 @@ export const makeAgd = ({ execFileSync }) => { return execFileSync( agdBinary, [...keyringArgs, 'keys', 'add', name, '--recover'], - { input: mnemonic }, + { encoding: 'utf-8', input: mnemonic }, ).toString(); }, }, From 70fae0f7f5e975e99e40ba7cc7bc74f753dc089c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 21 Feb 2024 20:34:45 -0600 Subject: [PATCH 064/152] feat(e2e-tools): installBundles, provisionSmartWallet w/clean logs - preserve partial progress and don't mint100 if we're not installing any bundles - block sync - purseUpdates for vbank assets - follow cosmos balances - types: handle null jsonrpc result - refactor: makeAPI, ExecSync - complete some types - punt addIssuer --- contract/test/e2e-tools.js | 587 +++++++++++++++++++++++++++++++++++++ 1 file changed, 587 insertions(+) create mode 100644 contract/test/e2e-tools.js diff --git a/contract/test/e2e-tools.js b/contract/test/e2e-tools.js new file mode 100644 index 00000000..8955fd60 --- /dev/null +++ b/contract/test/e2e-tools.js @@ -0,0 +1,587 @@ +// @ts-check + +import { E, Far } from '@endo/far'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Nat } from '@endo/nat'; +import { flags, makeAgd } from './agd-lib.js'; +import { makeHttpClient, makeAPI } from './ui-kit-goals/makeHttpClient.js'; +import { dedup, makeQueryKit, poll } from './ui-kit-goals/queryKit.js'; +import { getBundleId } from './bundle-tools.js'; +import { makeVStorage } from './ui-kit-goals/batchQuery.js'; + +const BLD = '000000ubld'; + +const makeRunner = execFile => { + const $ = (file, ...args) => { + // console.error(cmd); + + return new Promise((resolve, reject) => { + execFile(file, args, { encoding: 'utf8' }, (err, out) => { + if (err) return reject(err); + resolve(out); + }); + }); + }; + return $; +}; + +export const txAbbr = tx => { + // eslint-disable-next-line camelcase + const { txhash, code, height, gas_used } = tx; + // eslint-disable-next-line camelcase + return { txhash, code, height, gas_used }; +}; + +/** + * @param {object} io + * @param {import('@cosmjs/tendermint-rpc').RpcClient} io.rpc + * @param {(ms: number, info?: unknown) => Promise} io.delay + */ +const makeBlockTool = ({ rpc, delay }) => { + let id = 1; + const waitForBootstrap = async (period = 2000, info = {}) => { + await null; + for (;;) { + id += 1; + const data = await rpc + .execute({ jsonrpc: '2.0', id, method: 'status', params: [] }) + .catch(_err => {}); + + if (!data) throw Error('no data from status'); + + if (data.jsonrpc !== '2.0') { + await delay(period, { ...info, method: 'status' }); + continue; + } + + const lastHeight = data.result.sync_info.latest_block_height; + + if (lastHeight !== '1') { + return Number(lastHeight); + } + + await delay(period, { ...info, lastHeight }); + } + }; + + let last; + const waitForBlock = async (times = 1, info = {}) => { + await null; + for (let time = 0; time < times; time += 1) { + for (;;) { + const cur = await waitForBootstrap(2000, { ...info, last }); + + if (cur !== last) { + last = cur; + break; + } + + await delay(1000, info); + } + time += 1; + } + }; + + return { waitForBootstrap, waitForBlock }; +}; +/** @typedef {ReturnType} BlockTool */ + +/** + * @param {string} fullPath + * @param {object} opts + * @param {string} opts.id + * @param {import('./agd-lib').Agd} opts.agd + * @param {import('./ui-kit-goals/queryKit.js').QueryTool['follow']} opts.follow + * @param {(ms: number) => Promise} opts.delay + * @param {typeof console.log} [opts.progress] + * @param {string} [opts.chainId] + * @param {string} [opts.installer] + * @param {string} [opts.bundleId] + */ +const installBundle = async (fullPath, opts) => { + const { id, agd, delay, follow, progress = console.log } = opts; + const { chainId = 'agoriclocal', installer = 'user1' } = opts; + const from = await agd.lookup(installer); + + const explainDelay = (ms, info) => { + progress('follow', { ...info, delay: ms / 1000 }, '...'); + return delay(ms); + }; + const updates = follow('bundles', { delay: explainDelay }); + await updates.next(); + const tx = await agd.tx( + ['swingset', 'install-bundle', `@${fullPath}`, '--gas', 'auto'], + { from, chainId, yes: true }, + ); + progress({ id, installTx: tx.txhash, height: tx.height }); + + const { value: confirm } = await updates.next(); + assert(!confirm.error, confirm.error); + assert.equal(confirm.installed, true); + if (opts.bundleId) { + assert.equal(`b1-${confirm.endoZipBase64Sha512}`, opts.bundleId); + } + // TODO: return block height at which confirm went into vstorage + return { tx, confirm }; +}; + +/** + * @param {string} address + * @param {Record} balances + * @param {{ + * agd: import('./agd-lib').Agd; + * blockTool: BlockTool; + * lcd: import('./ui-kit-goals/makeHttpClient.js').LCD; + * delay: (ms: number) => Promise; + * chainId?: string; + * whale?: string; + * progress?: typeof console.log; + * }} opts + * @returns {Promise} + */ +export const provisionSmartWallet = async ( + address, + balances, + { + agd, + blockTool, + lcd, + delay, + chainId = 'agoriclocal', + whale = 'validator', + progress = console.log, + }, +) => { + const { query: q } = makeQueryKit(makeVStorage(lcd)); + + const vbankEntries = await q.queryData('published.agoricNames.vbankAsset'); + const byName = Object.fromEntries( + vbankEntries.map(([_denom, info]) => [info.issuerName, info]), + ); + progress({ send: balances, to: address }); + + /** + * @param {string} denom + * @param {bigint} value + */ + const sendFromWhale = async (denom, value) => { + const amount = `${value}${denom}`; + progress({ amount, to: address }); + // TODO: refactor agd.tx to support a per-sender object + // that enforces one-tx-per-block so this + // ad-hoc waitForBlock stuff is not necessary. + await agd.tx(['bank', 'send', whale, address, amount], { + chainId, + from: whale, + yes: true, + }); + await blockTool.waitForBlock(1, { step: 'bank send' }); + }; + + for await (const [name, qty] of Object.entries(balances)) { + const info = byName[name]; + if (!info) { + throw Error(name); + } + const { denom, displayInfo } = info; + const { decimalPlaces } = displayInfo; + const value = Nat(Number(qty) * 10 ** decimalPlaces); + await sendFromWhale(denom, value); + } + + progress({ provisioning: address }); + await agd.tx( + ['swingset', 'provision-one', 'my-wallet', address, 'SMART_WALLET'], + { chainId, from: address, yes: true }, + ); + + const info = await q.queryData(`published.wallet.${address}.current`); + progress({ + provisioned: address, + purses: info.purses.length, + used: info.offerToUsedInvitation.length, + }); + + /** @param {import('@agoric/smart-wallet/src/smartWallet.js').BridgeAction} bridgeAction */ + const sendAction = async bridgeAction => { + const capData = q.toCapData(harden(bridgeAction)); + const offerBody = JSON.stringify(capData); + const txInfo = await agd.tx( + ['swingset', 'wallet-action', offerBody, '--allow-spend'], + { from: address, chainId, yes: true }, + ); + return txInfo; + }; + + /** @param {import('@agoric/smart-wallet/src/offers.js').OfferSpec} offer */ + async function* executeOffer(offer) { + const updates = q.follow(`published.wallet.${address}`, { delay }); + const txInfo = await sendAction({ method: 'executeOffer', offer }); + console.debug('spendAction', txInfo); + for await (const update of updates) { + // console.log('update', address, update); + if (update.updated !== 'offerStatus' || update.status.id !== offer.id) { + continue; + } + yield update; + } + } + + /** @type {import('./wallet-tools.js').MockWallet['offers']} */ + const offers = Far('Offers', { + executeOffer, + /** @param {string|number} offerId */ + tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), + }); + + /** @type {import('./wallet-tools.js').MockWallet['deposit']} */ + const deposit = Far('DepositFacet', { + receive: async payment => { + const brand = await E(payment).getAllegedBrand(); + const asset = vbankEntries.find(([_denom, a]) => a.brand === brand); + if (!asset) throw Error(`unknown brand`); + /** @type {Issuer} */ + const issuer = asset.issuer; + const amt = await E(issuer).getAmountOf(payment); + await sendFromWhale(asset.denom, amt.value); + return amt; + }, + }); + + const { stringify: lit } = JSON; + /** + * @returns {Promise<{ + * balances: Coins, + * pagination:unknown} + * >} + * @typedef {{ denom: string, amount: string}[]} Coins + */ + const getCosmosBalances = () => + lcd.getJSON(`/cosmos/bank/v1beta1/balances/${address}`); + const cosmosBalanceUpdates = () => + dedup(poll(getCosmosBalances, { delay }), (a, b) => lit(a) === lit(b)); + + async function* vbankAssetBalanceUpdates(denom, brand) { + for await (const { balances: haystack } of cosmosBalanceUpdates()) { + for (const candidate of haystack) { + if (candidate.denom === denom) { + const amt = harden({ brand, value: BigInt(candidate.amount) }); + yield amt; + } + } + } + } + + async function* purseUpdates(brand) { + const brandAssetInfo = Object.values(byName).find(a => a.brand === brand); + await null; + if (brandAssetInfo) { + yield* vbankAssetBalanceUpdates(brandAssetInfo.denom, brand); + return; + } + const updates = q.follow(`published.wallet.${address}`, { delay }); + for await (const update of updates) { + if (update.updated !== 'balance') { + // console.log('skip: not balance', update.updated, address); + continue; + } + /** @type {Amount} */ + const amt = update.currentAmount; + if (amt.brand !== brand) { + // console.log('brand expected', brand, 'got', amt.brand, address); + continue; + } + yield amt; + } + } + + /** @type {import('./wallet-tools.js').MockWallet['peek']} */ + const peek = Far('Peek', { purseUpdates }); + + return { offers, deposit, peek }; +}; + +/** + * @param {{ + * agd: import('./agd-lib').Agd; + * blockTool: BlockTool; + * validator?: string; + * chainId?: string + * }} opts + * @returns {Promise<{ proposal_id: string, voting_end_time: unknown, status: string }>} + */ +const voteLatestProposalAndWait = async ({ + agd, + blockTool, + chainId = 'agoriclocal', + validator = 'validator', +}) => { + await blockTool.waitForBlock(1, { before: 'get latest proposal' }); + const proposalsData = await agd.query(['gov', 'proposals']); + const lastProposal = proposalsData.proposals.at(-1); + const lastProposalId = lastProposal.id || lastProposal.proposal_id; + + await blockTool.waitForBlock(1, { + before: 'deposit', + on: lastProposalId, + }); + + const deposit = '50000000ubld'; + const sigOpts = { from: validator, chainId, yes: true }; + await agd.tx(['gov', 'deposit', lastProposalId, deposit], sigOpts); + + await blockTool.waitForBlock(1, { before: 'vote', on: lastProposalId }); + + await agd.tx(['gov', 'vote', lastProposalId, 'yes'], sigOpts); + + let info = {}; + for ( + ; + info.status !== 'PROPOSAL_STATUS_REJECTED' && + info.status !== 'PROPOSAL_STATUS_PASSED'; + await blockTool.waitForBlock(1, { step: `voting`, on: lastProposalId }) + ) { + info = await agd.query(['gov', 'proposal', lastProposalId]); + console.log( + `Waiting for proposal ${lastProposalId} to pass (status=${info.status})`, + ); + } + + // @ts-expect-error cast + return info; +}; + +/** + * @param {import('ava').ExecutionContext} t + * @param {{ + * evals: {permit: string, code: string}[] + * title: string, + * description: string, + * }} info + * @param {{ + * agd: import('./agd-lib').Agd; + * blockTool: BlockTool; + * proposer?: string; + * deposit?: string; + * chainId?: string; + * }} opts + */ +const runCoreEval = async ( + t, + { evals, title, description }, + { + agd, + blockTool, + chainId = 'agoriclocal', + proposer = 'validator', + deposit = `10${BLD}`, + }, +) => { + const from = await agd.lookup(proposer); + const info = { title, description }; + t.log('submit proposal', title); + + // TODO? double-check that bundles are loaded + + const evalPaths = evals.map(e => [e.permit, e.code]).flat(); + t.log(evalPaths); + console.log('await tx', evalPaths); + const result = await agd.tx( + [ + 'gov', + 'submit-proposal', + 'swingset-core-eval', + ...evalPaths, + ...flags({ ...info, deposit }), + ], + { from, chainId, yes: true }, + ); + t.log(txAbbr(result)); + t.is(result.code, 0); + + console.log('await voteLatestProposalAndWait', evalPaths); + const detail = await voteLatestProposalAndWait({ agd, blockTool }); + t.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 }); + + t.is(detail.status, 'PROPOSAL_STATUS_PASSED'); + return detail; +}; + +/** + * @param {import('ava').ExecutionContext } t + * @param {import('./mintStable.js').BundleCache} bundleCache + * @param {object} io + * @param {import('./agd-lib.js').ExecSync} io.execFileSync + * @param {typeof import('child_process').execFile} io.execFile + * @param {typeof window.fetch} io.fetch + * @param {typeof window.setTimeout} io.setTimeout + * @param {string} [io.bundleDir] + * @param {typeof import('fs/promises').writeFile} io.writeFile + * @param {(...parts: string[]) => string} [io.join] + */ +export const makeE2ETools = ( + t, + bundleCache, + { + execFile, + execFileSync, + fetch, + setTimeout, + writeFile, + bundleDir = 'bundles', + join = (...parts) => parts.join('/'), + }, +) => { + const agd = makeAgd({ execFileSync }).withOpts({ keyringBackend: 'test' }); + const rpc = makeHttpClient('http://localhost:26657', fetch); + const lcd = makeAPI('http://localhost:1317', { fetch }); + const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + + const explainDelay = (ms, info) => { + 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 }, '...'); + } + return delay(ms); + }; + const blockTool = makeBlockTool({ rpc, delay: explainDelay }); + const $ = makeRunner(execFile); + + // TODO: use this to start docker if necessary + const runPackageScript = async (scriptName, ...args) => + $('yarn', 'run', '--silent', scriptName, ...args); + + const runMake = async (...args) => $('make', '--silent', ...args); + + const vstorage = makeVStorage(lcd); + const qt = makeQueryKit(vstorage); + + /** + * @param {Record} bundleRoots + * @param {typeof console.log} progress + */ + const installBundles = async (bundleRoots, progress) => { + await null; + /** @type {Record} */ + const bundles = {}; + for (const [name, rootModPath] of Object.entries(bundleRoots)) { + const bundle = await bundleCache.load(rootModPath, name); + bundles[name] = bundle; + const fullPath = join(bundleDir, `bundle-${name}.json`); + try { + const todo = await runMake(`${fullPath}.installed`); + if (todo.trim() === '') { + progress({ name, upToDate: `${fullPath}.installed` }); + continue; + } + } catch (_err) { + // not yet bundled + } + const bundleJSON = JSON.stringify(bundle); + await writeFile(fullPath, bundleJSON); + const shortId = getBundleId(bundle).slice(0, 8); + + if (Object.keys(bundles).length === 1) { + progress('mint 100 IST'); + await runPackageScript('docker:make', 'mint100'); + } + + const bundleSizeMb = (bundleJSON.length / 1_000_000).toFixed(3); + progress('installing', name, shortId, bundleSizeMb, 'Mb'); + const { tx, confirm } = await installBundle(fullPath, { + id: shortId, + agd, + follow: qt.query.follow, + progress, + delay, + bundleId: getBundleId(bundle), + }); + progress({ + name, + id: shortId, + installHeight: tx.height, + installed: confirm.installed, + }); + + await writeFile( + `${fullPath}.installed`, + JSON.stringify( + { + name, + entry: rootModPath, + bundleFile: `${fullPath}`, + bundleSize: bundleJSON.length, + tx, + vstorage: confirm, + }, + null, + 2, + ), + ); + } + return harden(bundles); + }; + + /** + * @param {{ + * name: string, + * title?: string, + * description?: string, + * config?: unknown, + * } & { + * behavior?: Function, + * } & ({ builderPath: string } | { entryFile: string }) + * } info + */ + const buildAndRunCoreEval = async info => { + if ('builderPath' in info) { + throw Error('@@TODO: agoric run style'); + } + const { name, title = name, description = title, entryFile } = info; + const eval0 = { + code: `bundles/deploy-${name}.js`, + permit: `bundles/deploy-${name}-permit.json`, + }; + await null; + try { + const todo = await runMake(`${eval0.code}.done`); + if (todo.trim() === '') { + const txt = await $('cat', `${eval0.code}.done`); + const proposal = JSON.parse(txt); + console.log({ + coreEval: name, + upToDate: `${eval0.code}.done`, + id: proposal.proposal_id, + done: proposal.voting_end_time.slice(0, '2024-02-23T03:54'.length), + }); + return proposal; + } + } catch (_err) { + // not yet bundled + } + const detail = { evals: [eval0], title, description }; + await runPackageScript('build:deployer', entryFile); + const proposal = await runCoreEval(t, detail, { agd, blockTool }); + await writeFile( + `${eval0.code}.done`, + JSON.stringify( + { ...proposal, name, title, description, entry: entryFile }, + null, + 2, + ), + ); + return proposal; + }; + + return { + makeQueryTool: () => makeQueryKit(vstorage).query, + installBundles, + runCoreEval: buildAndRunCoreEval, + provisionSmartWallet: (address, amount) => + provisionSmartWallet(address, amount, { agd, blockTool, lcd, delay }), + }; +}; From 82e4ac42f2acb62848a24d36e6954b7913b236d3 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Mon, 4 Mar 2024 18:27:01 -0600 Subject: [PATCH 065/152] test(postalSvc): e2e --- contract/test/test-postalSvc.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 03653492..c9f9a057 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -1,15 +1,20 @@ // @ts-check +/* global setTimeout, fetch */ // XXX what's the state-of-the-art in ava setup? // eslint-disable-next-line import/order import { test as anyTest } from './prepare-test-env-ava.js'; import { createRequire } from 'module'; +import { env as ambientEnv } from 'node:process'; +import * as ambientChildProcess from 'node:child_process'; +import * as ambientFsp from 'node:fs/promises'; import { E, passStyleOf } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; import { startPostalService } from '../src/postal-service.proposal.js'; import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; import { makeBundleCacheContext, getBundleId } from './bundle-tools.js'; +import { makeE2ETools } from './e2e-tools.js'; import { mockWalletFactory } from './wallet-tools.js'; import { payerPete, @@ -39,9 +44,34 @@ const scriptRoots = { const makeTestContext = async t => { const bc = await makeBundleCacheContext(t); + const { E2E } = ambientEnv; + const { execFileSync, execFile } = ambientChildProcess; + const { writeFile } = ambientFsp; + + /** @type {import('./agd-lib.js').ExecSync} */ + const dockerExec = (file, args, opts = { encoding: 'utf-8' }) => { + const workdir = '/workspace/contract'; + const execArgs = ['compose', 'exec', '--workdir', workdir, 'agd']; + opts.verbose && + console.log('docker compose exec', JSON.stringify([file, ...args])); + return execFileSync('docker', [...execArgs, file, ...args], opts); + }; + console.time('makeTestTools'); console.timeLog('makeTestTools', 'start'); - const tools = await makeMockTools(t, bc.bundleCache); + // installBundles, + // runCoreEval, + // provisionSmartWallet, + // runPackageScript??? + const tools = await (E2E + ? makeE2ETools(t, bc.bundleCache, { + execFileSync: dockerExec, + execFile, + fetch, + setTimeout, + writeFile, + }) + : makeMockTools(t, bc.bundleCache)); console.timeEnd('makeTestTools'); return { ...tools, ...bc }; From 9c8a83ad6e6a0174d2b00010d1f9e01405da2cda Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 16:26:08 -0600 Subject: [PATCH 066/152] docs(postal-service.proposal): note script builder --- contract/src/postal-service.proposal.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contract/src/postal-service.proposal.js b/contract/src/postal-service.proposal.js index 1c97fe96..475d49ea 100644 --- a/contract/src/postal-service.proposal.js +++ b/contract/src/postal-service.proposal.js @@ -1,6 +1,8 @@ /** * @file core eval script* to start the postalService contract. * + * * see rollup.config.mjs to make a script from this file. + * * The `permit` export specifies the corresponding permit. */ // @ts-check From c9d9257ff170e19d23ce8463334b491ef361dd17 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 22 Feb 2024 15:23:06 -0600 Subject: [PATCH 067/152] feat: bundle start-postalSvc --- contract/package.json | 2 + contract/rollup.config.mjs | 40 +++++++++++++++++ contract/tools/rollup-plugin-core-eval.js | 55 +++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 contract/rollup.config.mjs create mode 100644 contract/tools/rollup-plugin-core-eval.js diff --git a/contract/package.json b/contract/package.json index 8d9c8cb4..8d84b43e 100644 --- a/contract/package.json +++ b/contract/package.json @@ -12,6 +12,8 @@ "make:help": "make list", "start": "yarn docker:make clean start-contract print-key", "build": "agoric run scripts/build-contract-deployer.js", + "build:deployer": "rollup -c rollup.config.mjs", + "build:send-deployer": "yarn run build:deployer src/start-postalSvc.js", "test": "ava --verbose", "lint": "eslint '**/*.js'", "lint:types": "tsc -p jsconfig.json", diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs new file mode 100644 index 00000000..71ced49c --- /dev/null +++ b/contract/rollup.config.mjs @@ -0,0 +1,40 @@ +/** + * @file rollup configuration to bundle core-eval script + * + * Supports developing core-eval script, permit as a module: + * - import { E } from '@endo/far' + * We can strip this declaration during bundling + * since the core-eval scope includes exports of @endo/far + * - `bundleID = ...` is replaced using updated/cached bundle hash + * - `main` export is appended as script completion value + * - `permit` export is emitted as JSON + */ +// @ts-check +import { + coreEvalGlobals, + moduleToScript, + configureBundleID, + emitPermit, +} from './tools/rollup-plugin-core-eval.js'; +import { permit } from './src/postal-service.proposal.js'; + +/** @type {import('rollup').RollupOptions} */ +const config = { + output: { + globals: coreEvalGlobals, + file: 'bundles/deploy-send.js', + format: 'es', + footer: 'main', + }, + external: ['@endo/far'], + plugins: [ + configureBundleID({ + name: 'postalService', + rootModule: './src/postal-service.contract.js', + cache: 'bundles', + }), + moduleToScript(), + emitPermit({ permit, file: 'deploy-send-permit.json' }), + ], +}; +export default config; diff --git a/contract/tools/rollup-plugin-core-eval.js b/contract/tools/rollup-plugin-core-eval.js new file mode 100644 index 00000000..27eb6f13 --- /dev/null +++ b/contract/tools/rollup-plugin-core-eval.js @@ -0,0 +1,55 @@ +// @ts-check +/* eslint-disable import/no-extraneous-dependencies */ +import '@endo/init'; +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; + +export const coreEvalGlobals = { + E: 'E', + Far: 'Far', +}; + +const redactImportDecls = txt => + txt.replace(/^\s*import\b\s*(.*)/gm, '// XMPORT: $1'); +const omitExportKewords = txt => txt.replace(/^\s*export\b\s*/gm, ''); +// cf. ses rejectImportExpressions +// https://github.com/endojs/endo/blob/ebc8f66e9498f13085a8e64e17fc2f5f7b528faa/packages/ses/src/transforms.js#L143 +const hideImportExpr = txt => txt.replace(/\bimport\b/g, 'XMPORT'); + +export const moduleToScript = () => ({ + name: 'module-to-script', + generateBundle: (_opts, bundle, _isWrite) => { + for (const fileName of Object.keys(bundle)) { + bundle[fileName].code = hideImportExpr( + redactImportDecls(omitExportKewords(bundle[fileName].code)), + ); + } + }, +}); + +export const configureBundleID = ({ name, rootModule, cache }) => { + const pattern = new RegExp(`bundleID\\b = Fail.*`, 'g'); + const bundleCacheP = makeNodeBundleCache(cache, {}, s => import(s)); + return { + name: 'configureBundleID', + transform: async (code, _id) => { + const bundle = await bundleCacheP.then(c => c.load(rootModule, name)); + const revised = code.replace( + pattern, + `bundleID = ${JSON.stringify(`b1-${bundle.endoZipBase64Sha512}`)},`, + ); + if (revised === code) return null; + return { code: revised }; + }, + }; +}; + +export const emitPermit = ({ permit, file }) => ({ + name: 'emit-permit', + generateBundle(_opts, _bundle) { + this.emitFile({ + type: 'asset', + fileName: file, + source: JSON.stringify(permit, null, 2), + }); + }, +}); From f665a264fc0453cf24c09820b271ef1f8b34db4e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 29 Feb 2024 23:40:03 -0700 Subject: [PATCH 068/152] WIP: xsnap resolution --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 5acff767..ad0d868f 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@endo/ses-ava": "0.2.40", "@endo/netstring": "0.3.26", "@endo/stream-node": "0.2.26", + "@agoric/xsnap": "0.14.3-u12.0", "@babel/code-frame": "7.18.6", "@babel/highlight": "7.22.5" }, From 9a8eac0dcea13d5700a5ac8a43fc69c182e48ae8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:08:06 -0600 Subject: [PATCH 069/152] chore(e2e): move from test/ to tools/ --- contract/{test => tools}/agd-lib.js | 0 contract/{test => tools}/bundle-tools.js | 0 contract/{test => tools}/e2e-tools.js | 24 +++++++++---------- .../ui-kit-goals/batchQuery.js | 0 .../ui-kit-goals/makeHttpClient.js | 0 .../ui-kit-goals/marshalTables.js | 0 .../ui-kit-goals/name-service-client.js | 0 .../{test => tools}/ui-kit-goals/queryKit.js | 0 .../ui-kit-goals/test-nameProxy.js | 0 9 files changed, 12 insertions(+), 12 deletions(-) rename contract/{test => tools}/agd-lib.js (100%) rename contract/{test => tools}/bundle-tools.js (100%) rename contract/{test => tools}/e2e-tools.js (95%) rename contract/{test => tools}/ui-kit-goals/batchQuery.js (100%) rename contract/{test => tools}/ui-kit-goals/makeHttpClient.js (100%) rename contract/{test => tools}/ui-kit-goals/marshalTables.js (100%) rename contract/{test => tools}/ui-kit-goals/name-service-client.js (100%) rename contract/{test => tools}/ui-kit-goals/queryKit.js (100%) rename contract/{test => tools}/ui-kit-goals/test-nameProxy.js (100%) diff --git a/contract/test/agd-lib.js b/contract/tools/agd-lib.js similarity index 100% rename from contract/test/agd-lib.js rename to contract/tools/agd-lib.js diff --git a/contract/test/bundle-tools.js b/contract/tools/bundle-tools.js similarity index 100% rename from contract/test/bundle-tools.js rename to contract/tools/bundle-tools.js diff --git a/contract/test/e2e-tools.js b/contract/tools/e2e-tools.js similarity index 95% rename from contract/test/e2e-tools.js rename to contract/tools/e2e-tools.js index 8955fd60..aa88d8c5 100644 --- a/contract/test/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -90,7 +90,7 @@ const makeBlockTool = ({ rpc, delay }) => { * @param {string} fullPath * @param {object} opts * @param {string} opts.id - * @param {import('./agd-lib').Agd} opts.agd + * @param {import('./agd-lib.js').Agd} opts.agd * @param {import('./ui-kit-goals/queryKit.js').QueryTool['follow']} opts.follow * @param {(ms: number) => Promise} opts.delay * @param {typeof console.log} [opts.progress] @@ -129,7 +129,7 @@ const installBundle = async (fullPath, opts) => { * @param {string} address * @param {Record} balances * @param {{ - * agd: import('./agd-lib').Agd; + * agd: import('./agd-lib.js').Agd; * blockTool: BlockTool; * lcd: import('./ui-kit-goals/makeHttpClient.js').LCD; * delay: (ms: number) => Promise; @@ -137,7 +137,7 @@ const installBundle = async (fullPath, opts) => { * whale?: string; * progress?: typeof console.log; * }} opts - * @returns {Promise} + * @returns {Promise} */ export const provisionSmartWallet = async ( address, @@ -227,14 +227,14 @@ export const provisionSmartWallet = async ( } } - /** @type {import('./wallet-tools.js').MockWallet['offers']} */ + /** @type {import('../test/wallet-tools.js').MockWallet['offers']} */ const offers = Far('Offers', { executeOffer, /** @param {string|number} offerId */ tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), }); - /** @type {import('./wallet-tools.js').MockWallet['deposit']} */ + /** @type {import('../test/wallet-tools.js').MockWallet['deposit']} */ const deposit = Far('DepositFacet', { receive: async payment => { const brand = await E(payment).getAllegedBrand(); @@ -295,7 +295,7 @@ export const provisionSmartWallet = async ( } } - /** @type {import('./wallet-tools.js').MockWallet['peek']} */ + /** @type {import('../test/wallet-tools.js').MockWallet['peek']} */ const peek = Far('Peek', { purseUpdates }); return { offers, deposit, peek }; @@ -303,7 +303,7 @@ export const provisionSmartWallet = async ( /** * @param {{ - * agd: import('./agd-lib').Agd; + * agd: import('./agd-lib.js').Agd; * blockTool: BlockTool; * validator?: string; * chainId?: string @@ -352,14 +352,14 @@ const voteLatestProposalAndWait = async ({ }; /** - * @param {import('ava').ExecutionContext} t + * @param {Pick} t * @param {{ * evals: {permit: string, code: string}[] * title: string, * description: string, * }} info * @param {{ - * agd: import('./agd-lib').Agd; + * agd: import('./agd-lib.js').Agd; * blockTool: BlockTool; * proposer?: string; * deposit?: string; @@ -411,8 +411,8 @@ const runCoreEval = async ( }; /** - * @param {import('ava').ExecutionContext } t - * @param {import('./mintStable.js').BundleCache} bundleCache + * @param {Pick} t + * @param {import('../test/mintStable.js').BundleCache} bundleCache * @param {object} io * @param {import('./agd-lib.js').ExecSync} io.execFileSync * @param {typeof import('child_process').execFile} io.execFile @@ -466,7 +466,7 @@ export const makeE2ETools = ( */ const installBundles = async (bundleRoots, progress) => { await null; - /** @type {Record} */ + /** @type {Record} */ const bundles = {}; for (const [name, rootModPath] of Object.entries(bundleRoots)) { const bundle = await bundleCache.load(rootModPath, name); diff --git a/contract/test/ui-kit-goals/batchQuery.js b/contract/tools/ui-kit-goals/batchQuery.js similarity index 100% rename from contract/test/ui-kit-goals/batchQuery.js rename to contract/tools/ui-kit-goals/batchQuery.js diff --git a/contract/test/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js similarity index 100% rename from contract/test/ui-kit-goals/makeHttpClient.js rename to contract/tools/ui-kit-goals/makeHttpClient.js diff --git a/contract/test/ui-kit-goals/marshalTables.js b/contract/tools/ui-kit-goals/marshalTables.js similarity index 100% rename from contract/test/ui-kit-goals/marshalTables.js rename to contract/tools/ui-kit-goals/marshalTables.js diff --git a/contract/test/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js similarity index 100% rename from contract/test/ui-kit-goals/name-service-client.js rename to contract/tools/ui-kit-goals/name-service-client.js diff --git a/contract/test/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js similarity index 100% rename from contract/test/ui-kit-goals/queryKit.js rename to contract/tools/ui-kit-goals/queryKit.js diff --git a/contract/test/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js similarity index 100% rename from contract/test/ui-kit-goals/test-nameProxy.js rename to contract/tools/ui-kit-goals/test-nameProxy.js From c44e06cecefc351782472d9fc24d60065503ed40 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:08:26 -0600 Subject: [PATCH 070/152] WIP(market-actors): update e2e --- contract/test/market-actors.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/test/market-actors.js b/contract/test/market-actors.js index 4668fcc8..53102e72 100644 --- a/contract/test/market-actors.js +++ b/contract/test/market-actors.js @@ -6,7 +6,7 @@ import { seatLike } from './wallet-tools.js'; import { makeNameProxy, makeAgoricNames, -} from './ui-kit-goals/name-service-client.js'; +} from '../tools/ui-kit-goals/name-service-client.js'; const { entries, fromEntries, keys } = Object; @@ -29,7 +29,7 @@ const { entries, fromEntries, keys } = Object; * @param {import('ava').ExecutionContext} t * @param {{ * wallet: import('./wallet-tools.js').MockWallet; - * queryTool: Pick; + * queryTool: Pick; * }} mine * @param {{ * rxAddr: string, From 92a1ca406b57d57638961f00d256107d755569c1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:08:45 -0600 Subject: [PATCH 071/152] WIP(test-postalSvc): update tools/ --- contract/test/test-postalSvc.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index c9f9a057..483d9a51 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -13,8 +13,8 @@ import { E, passStyleOf } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; import { startPostalService } from '../src/postal-service.proposal.js'; import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; -import { makeBundleCacheContext, getBundleId } from './bundle-tools.js'; -import { makeE2ETools } from './e2e-tools.js'; +import { makeBundleCacheContext, getBundleId } from '../tools/bundle-tools.js'; +import { makeE2ETools } from '../tools/e2e-tools.js'; import { mockWalletFactory } from './wallet-tools.js'; import { payerPete, @@ -25,7 +25,7 @@ import { import { makeNameProxy, makeAgoricNames, -} from './ui-kit-goals/name-service-client.js'; +} from '../tools/ui-kit-goals/name-service-client.js'; /** @type {import('ava').TestFn>>} */ const test = anyTest; @@ -48,7 +48,7 @@ const makeTestContext = async t => { const { execFileSync, execFile } = ambientChildProcess; const { writeFile } = ambientFsp; - /** @type {import('./agd-lib.js').ExecSync} */ + /** @type {import('../tools/agd-lib.js').ExecSync} */ const dockerExec = (file, args, opts = { encoding: 'utf-8' }) => { const workdir = '/workspace/contract'; const execArgs = ['compose', 'exec', '--workdir', workdir, 'agd']; From 5fea081a224653f721573003a1e4b68c6891eb9e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:09:10 -0600 Subject: [PATCH 072/152] build(contract): bundle-source is a dependency (for deploy script) --- contract/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/package.json b/contract/package.json index 8d84b43e..5672941f 100644 --- a/contract/package.json +++ b/contract/package.json @@ -25,7 +25,6 @@ "@agoric/smart-wallet": "0.5.3", "@agoric/vats": "0.15.2-u12.0", "@agoric/xsnap": "0.14.3-u12.0", - "@endo/bundle-source": "^2.8.0", "@endo/eslint-plugin": "^0.5.2", "@endo/init": "^0.5.60", "@endo/nat": "^4.1.27", @@ -54,6 +53,7 @@ "dependencies": { "@agoric/ertp": "^0.16.3-u12.0", "@agoric/zoe": "^0.26.3-u12.0", + "@endo/bundle-source": "^2.8.0", "@endo/far": "^0.2.22", "@endo/marshal": "^0.8.9", "@endo/patterns": "^0.2.5" From ac7d6524b40df13d45045c9698f8a9a49c11d397 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:09:35 -0600 Subject: [PATCH 073/152] build(jsconfig): include tools --- contract/jsconfig.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contract/jsconfig.json b/contract/jsconfig.json index e7dca004..3e5c6fbb 100644 --- a/contract/jsconfig.json +++ b/contract/jsconfig.json @@ -15,5 +15,11 @@ "strictNullChecks": true, "moduleResolution": "node" }, - "include": ["src/**/*.js", "test/**/*.js", "exported.js", "globals.d.ts"] + "include": [ + "src/**/*.js", + "test/**/*.js", + "tools/**/*.js", + "exported.js", + "globals.d.ts" + ] } From b48cfa9911b0eaee6d140ef817f4acacb9a950b6 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:25:48 -0600 Subject: [PATCH 074/152] WIP(deploy-contract): read agoricNames.brand from local chain --- contract/scripts/deploy-contract.js | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 contract/scripts/deploy-contract.js diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js new file mode 100644 index 00000000..8d0dede8 --- /dev/null +++ b/contract/scripts/deploy-contract.js @@ -0,0 +1,36 @@ +#!/usr/bin/env node +/* global process, fetch, setTimeout */ +// @ts-check +import '@endo/init'; +import fsp from 'node:fs/promises'; +import { execFile, execFileSync } from 'node:child_process'; + +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; +import { makeE2ETools } from '../tools/e2e-tools.js'; + +const main = async (bundleDir = 'bundles') => { + const { argv, env } = process; + const { writeFile } = fsp; + + const bundleCache = makeNodeBundleCache(bundleDir, {}, s => import(s)); + + const t = { + log: console.log, + is: (actual, expected, message) => assert.equal(actual, expected, message), + }; + + const tools = makeE2ETools(t, bundleCache, { + execFile, + execFileSync, + fetch, + setTimeout, + writeFile, + bundleDir, + }); + + const qt = tools.makeQueryTool(); + const brand = await qt.queryData('published.agoricNames.brand'); + console.log(brand); +}; + +main().catch(err => console.error(err)); From df9929f1b4550b531fc72ed965791d46fbe39599 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:26:51 -0600 Subject: [PATCH 075/152] WIP(deploy-contract): CLI stuff --- contract/scripts/deploy-contract.js | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js index 8d0dede8..386f1df5 100644 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -8,10 +8,43 @@ import { execFile, execFileSync } from 'node:child_process'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { makeE2ETools } from '../tools/e2e-tools.js'; +/** + * @template T + * @param {T | null | undefined } x + * @returns {T} + */ +const NonNullish = x => { + if (x === undefined || x === null) throw assert.error('NonNullish'); + return x; +}; + +/** + * @param {string[]} args + * @param {{ [k: string]: boolean | undefined }} [style] + */ +const getopts = (args, style = {}) => { + /** @type {{ [k: string]: string}} */ + const flags = {}; + while (args.length > 0) { + const arg = NonNullish(args.shift()); + if (arg.startsWith('--')) { + const name = arg.slice('--'.length); + if (style[name] === true) { + flags[name] = ''; + continue; + } + if (args.length <= 0) throw RangeError(`no value for ${arg}`); + flags[name] = NonNullish(args.shift()); + } + } + return harden(flags); +}; + const main = async (bundleDir = 'bundles') => { const { argv, env } = process; const { writeFile } = fsp; + const opts = getopts(argv.slice(2)); const bundleCache = makeNodeBundleCache(bundleDir, {}, s => import(s)); const t = { From 24fd6997cf3ea632a803817e79e9105c2768b162 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:31:21 -0600 Subject: [PATCH 076/152] WIP(boot-tools): update e2e --- contract/test/boot-tools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index 5ee947bd..9bb824a4 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -12,7 +12,7 @@ import { AmountMath, AssetKind, makeIssuerKit } from '@agoric/ertp'; import { makeMockChainStorageRoot } from '@agoric/internal/src/storage-test-utils.js'; import { mockWalletFactory } from './wallet-tools.js'; -import { getBundleId } from './bundle-tools.js'; +import { getBundleId } from '../tools/bundle-tools.js'; const { entries } = Object; From ff86deb62981f5bc0c92f42037e684aa87be88a2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:50:04 -0600 Subject: [PATCH 077/152] feat(e2e): parameterize rpc, api addresses --- contract/tools/e2e-tools.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index aa88d8c5..4b5e6218 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -419,6 +419,8 @@ const runCoreEval = async ( * @param {typeof window.fetch} io.fetch * @param {typeof window.setTimeout} io.setTimeout * @param {string} [io.bundleDir] + * @param {string} [io.rpcAddress] + * @param {string} [io.apiAddress] * @param {typeof import('fs/promises').writeFile} io.writeFile * @param {(...parts: string[]) => string} [io.join] */ @@ -432,12 +434,14 @@ export const makeE2ETools = ( setTimeout, writeFile, bundleDir = 'bundles', + rpcAddress = 'http://localhost:26657', + apiAddress = 'http://localhost:1317', join = (...parts) => parts.join('/'), }, ) => { const agd = makeAgd({ execFileSync }).withOpts({ keyringBackend: 'test' }); - const rpc = makeHttpClient('http://localhost:26657', fetch); - const lcd = makeAPI('http://localhost:1317', { fetch }); + const rpc = makeHttpClient(rpcAddress, fetch); + const lcd = makeAPI(apiAddress, { fetch }); const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); const explainDelay = (ms, info) => { From f075db6b842cb411464a696a2463243eb08c81e1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 17:52:32 -0600 Subject: [PATCH 078/152] WIP(deploy-contract): install bundle, preserving progress --- contract/scripts/deploy-contract.js | 34 ++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js index 386f1df5..61ffefb2 100644 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -4,9 +4,15 @@ import '@endo/init'; import fsp from 'node:fs/promises'; import { execFile, execFileSync } from 'node:child_process'; +import { basename } from 'node:path'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { makeE2ETools } from '../tools/e2e-tools.js'; +import { getBundleId } from '../tools/bundle-tools.js'; + +const Usage = ` +deploy-contract CONTRACT.js +`; /** * @template T @@ -42,28 +48,44 @@ const getopts = (args, style = {}) => { const main = async (bundleDir = 'bundles') => { const { argv, env } = process; + const [entry] = argv.slice(2); + if (!entry) throw Error(Usage); const { writeFile } = fsp; - const opts = getopts(argv.slice(2)); - const bundleCache = makeNodeBundleCache(bundleDir, {}, s => import(s)); + const progress = (...args) => console.warn(...args); // stderr + + const bundleCache = await makeNodeBundleCache(bundleDir, {}, s => import(s)); const t = { log: console.log, is: (actual, expected, message) => assert.equal(actual, expected, message), }; + /** @type {import('../tools/agd-lib.js').ExecSync} */ + const dockerExec = (file, args, opts = { encoding: 'utf-8' }) => { + const workdir = '/workspace/contract'; + const execArgs = ['compose', 'exec', '--workdir', workdir, 'agd']; + opts.verbose && + console.log('docker compose exec', JSON.stringify([file, ...args])); + return execFileSync('docker', [...execArgs, file, ...args], opts); + }; + + const opts = getopts(argv.slice(2)); + const tools = makeE2ETools(t, bundleCache, { execFile, - execFileSync, + execFileSync: dockerExec, fetch, setTimeout, writeFile, bundleDir, }); - const qt = tools.makeQueryTool(); - const brand = await qt.queryData('published.agoricNames.brand'); - console.log(brand); + const name = basename(entry) + .replace(/\.js$/, '') + .replace(/\.contract$/, ''); + + const bundles = await tools.installBundles({ [name]: entry }, progress); }; main().catch(err => console.error(err)); From 516b3f2141fadce17cf01a30f70c83e9296e563f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 18:13:20 -0600 Subject: [PATCH 079/152] WIP(contract/package): more rename postalSvc -> postal-service --- contract/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/package.json b/contract/package.json index 5672941f..2863695e 100644 --- a/contract/package.json +++ b/contract/package.json @@ -13,7 +13,7 @@ "start": "yarn docker:make clean start-contract print-key", "build": "agoric run scripts/build-contract-deployer.js", "build:deployer": "rollup -c rollup.config.mjs", - "build:send-deployer": "yarn run build:deployer src/start-postalSvc.js", + "build:postal-service-deployer": "yarn run build:deployer src/postal-service.proposal.js", "test": "ava --verbose", "lint": "eslint '**/*.js'", "lint:types": "tsc -p jsconfig.json", From 7f47b7d7620b1a9b79d31c996aac42991aa5617c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 18:13:45 -0600 Subject: [PATCH 080/152] WIP(rollup.config): send -> postal-service --- contract/rollup.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index 71ced49c..ec0bec20 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -22,7 +22,7 @@ import { permit } from './src/postal-service.proposal.js'; const config = { output: { globals: coreEvalGlobals, - file: 'bundles/deploy-send.js', + file: 'bundles/deploy-postal-service.js', format: 'es', footer: 'main', }, @@ -34,7 +34,7 @@ const config = { cache: 'bundles', }), moduleToScript(), - emitPermit({ permit, file: 'deploy-send-permit.json' }), + emitPermit({ permit, file: 'deploy-postal-service-permit.json' }), ], }; export default config; From d934023eb7c1d14f2c76b87c20e6504f21cd560f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 18:15:32 -0600 Subject: [PATCH 081/152] WIP(deploy-contract): run core eval --- contract/scripts/deploy-contract.js | 46 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js index 61ffefb2..9b4dd843 100644 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -8,10 +8,9 @@ import { basename } from 'node:path'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { makeE2ETools } from '../tools/e2e-tools.js'; -import { getBundleId } from '../tools/bundle-tools.js'; const Usage = ` -deploy-contract CONTRACT.js +deploy-contract CONTRACT.js [--core CORE_EVAL.js] `; /** @@ -25,31 +24,32 @@ const NonNullish = x => { }; /** - * @param {string[]} args + * @param {string[]} argv * @param {{ [k: string]: boolean | undefined }} [style] */ -const getopts = (args, style = {}) => { +const getopts = (argv, style = {}) => { /** @type {{ [k: string]: string}} */ const flags = {}; - while (args.length > 0) { - const arg = NonNullish(args.shift()); + const args = []; + while (argv.length > 0) { + const arg = NonNullish(argv.shift()); if (arg.startsWith('--')) { const name = arg.slice('--'.length); if (style[name] === true) { flags[name] = ''; continue; } - if (args.length <= 0) throw RangeError(`no value for ${arg}`); - flags[name] = NonNullish(args.shift()); + if (argv.length <= 0) throw RangeError(`no value for ${arg}`); + flags[name] = NonNullish(argv.shift()); + } else { + args.push(arg); } } - return harden(flags); + return harden({ flags, args }); }; const main = async (bundleDir = 'bundles') => { const { argv, env } = process; - const [entry] = argv.slice(2); - if (!entry) throw Error(Usage); const { writeFile } = fsp; const progress = (...args) => console.warn(...args); // stderr @@ -70,8 +70,6 @@ const main = async (bundleDir = 'bundles') => { return execFileSync('docker', [...execArgs, file, ...args], opts); }; - const opts = getopts(argv.slice(2)); - const tools = makeE2ETools(t, bundleCache, { execFile, execFileSync: dockerExec, @@ -81,11 +79,25 @@ const main = async (bundleDir = 'bundles') => { bundleDir, }); - const name = basename(entry) - .replace(/\.js$/, '') - .replace(/\.contract$/, ''); + const { flags, args } = getopts(argv.slice(2)); + const [entry] = args; + if (!entry) throw Error(Usage); + + const name = + flags.name || + basename(entry) + .replace(/\.js$/, '') + .replace(/\.contract$/, ''); + + await tools.installBundles({ [name]: entry }, progress); - const bundles = await tools.installBundles({ [name]: entry }, progress); + if (flags.core) { + const result = await tools.runCoreEval({ + name, + entryFile: flags.core, + }); + progress(result); + } }; main().catch(err => console.error(err)); From 4547fec30a59b54651ad7c4ff10f7ffc4083f8a5 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Mar 2024 18:41:03 -0600 Subject: [PATCH 082/152] WIP(deploy-contract): CLI option stuff --- contract/scripts/deploy-contract.js | 53 ++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js index 9b4dd843..0838c0d4 100644 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -9,8 +9,21 @@ import { basename } from 'node:path'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { makeE2ETools } from '../tools/e2e-tools.js'; +const opt0 = { + service: 'agd', + workdir: '/workspace/contract', +}; + const Usage = ` -deploy-contract CONTRACT.js [--core CORE_EVAL.js] +deploy-contract [options] CONTRACT.js + +Options: + --help print usage + --name name root for bundle, core eval (default: CONTRACT) + --core CORE_EVAL.js core eval entry module (cf rollup.config.mjs) + --service SVC docker compose service to run agd (default: ${opt0.service}) + use . to run agd outside docker. + --workdir DIR workdir for docker service (default: ${opt0.workdir}) `; /** @@ -48,6 +61,19 @@ const getopts = (argv, style = {}) => { return harden({ flags, args }); }; +const mockExecutionContext = () => { + const withSkip = o => + Object.assign(o, { + skip: (...xs) => {}, + }); + return { + log: withSkip((...args) => console.log(...args)), + is: withSkip((actual, expected, message) => + assert.equal(actual, expected, message), + ), + }; +}; + const main = async (bundleDir = 'bundles') => { const { argv, env } = process; const { writeFile } = fsp; @@ -56,30 +82,33 @@ const main = async (bundleDir = 'bundles') => { const bundleCache = await makeNodeBundleCache(bundleDir, {}, s => import(s)); - const t = { - log: console.log, - is: (actual, expected, message) => assert.equal(actual, expected, message), - }; + const { flags: given, args } = getopts(argv.slice(2)); + /** @type {typeof given} */ + const flags = { ...opt0, ...given }; + if (given.help) { + progress(Usage); + return; + } + const { workdir, service } = flags; /** @type {import('../tools/agd-lib.js').ExecSync} */ - const dockerExec = (file, args, opts = { encoding: 'utf-8' }) => { - const workdir = '/workspace/contract'; - const execArgs = ['compose', 'exec', '--workdir', workdir, 'agd']; + const dockerExec = (file, dargs, opts = { encoding: 'utf-8' }) => { + const execArgs = ['compose', 'exec', '--workdir', workdir, service]; opts.verbose && - console.log('docker compose exec', JSON.stringify([file, ...args])); - return execFileSync('docker', [...execArgs, file, ...args], opts); + console.log('docker compose exec', JSON.stringify([file, ...dargs])); + return execFileSync('docker', [...execArgs, file, ...dargs], opts); }; + const t = mockExecutionContext(); const tools = makeE2ETools(t, bundleCache, { execFile, - execFileSync: dockerExec, + execFileSync: service === '.' ? execFileSync : dockerExec, fetch, setTimeout, writeFile, bundleDir, }); - const { flags, args } = getopts(argv.slice(2)); const [entry] = args; if (!entry) throw Error(Usage); From 74c34713f956dd5f4e1d6fe23db9eba4ea26eadd Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:47:29 -0600 Subject: [PATCH 083/152] chore(postal-svc): customTermsShape --- contract/src/postal-service.contract.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 8c2efd6a..02a4ad8f 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -5,6 +5,13 @@ import { withdrawFromSeat } from '@agoric/zoe/src/contractSupport/zoeHelpers.js' const { keys, values } = Object; +/** @type {import('./@types/zoe-contract-facet').ContractMeta} */ +export const meta = harden({ + customTermsShape: { namesByAddress: M.remotable('namesByAddress') }, +}); +// compatibility with an earlier contract metadata API +export const { customTermsShape } = meta; + /** * @typedef {object} PostalSvcTerms * @property {import('@agoric/vats').NameHub} namesByAddress From 2ed721f792ecc672c8d1765bfbdf374a8e00bf51 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:48:21 -0600 Subject: [PATCH 084/152] chore(@types/zcf): ContractMeta --- contract/src/@types/zoe-contract-facet.d.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 contract/src/@types/zoe-contract-facet.d.ts diff --git a/contract/src/@types/zoe-contract-facet.d.ts b/contract/src/@types/zoe-contract-facet.d.ts new file mode 100644 index 00000000..4de2f477 --- /dev/null +++ b/contract/src/@types/zoe-contract-facet.d.ts @@ -0,0 +1,8 @@ +import type { CopyRecord } from '@endo/pass-style'; + +// export type {ContractMeta} from '@agoric/zoe/src/contractFacet/types-ambient'; +export type ContractMeta = { + customTermsShape?: CopyRecord | undefined; + privateArgsShape?: CopyRecord | undefined; + upgradability?: 'none' | 'canBeUpgraded' | 'canUpgrade' | undefined; +}; From 5847b4f8ec48761b613381f012330b374f892e80 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:48:49 -0600 Subject: [PATCH 085/152] refactor(start-contract): factor out of postal-service.proposal --- contract/src/platform-goals/start-contract.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 contract/src/platform-goals/start-contract.js diff --git a/contract/src/platform-goals/start-contract.js b/contract/src/platform-goals/start-contract.js new file mode 100644 index 00000000..3ba34dd7 --- /dev/null +++ b/contract/src/platform-goals/start-contract.js @@ -0,0 +1,53 @@ +/** + * @file core eval script* to start typical contracts. + */ +// @ts-check + +import { E } from '@endo/far'; + +/** + * @param {BootstrapPowers} powers + * @param {{ name: string, bundleID: string }} opts + */ +export const installContract = async ( + { consume: { zoe }, installation: { produce: produceInstallation } }, + { name, bundleID }, +) => { + const installation = await E(zoe).installBundleID(bundleID); + produceInstallation[name].reset(); + produceInstallation[name].resolve(installation); + console.log(name, 'installed as', bundleID.slice(0, 8)); + return installation; +}; + +/** + * @param {BootstrapPowers} powers + * @param {{ + * name: string; + * startArgs?: StartArgs; + * }} opts + * + * @typedef {Partial>[0]>} StartArgs + */ +export const startContract = async (powers, { name, startArgs }) => { + const { + consume: { startUpgradable }, + installation: { consume: consumeInstallation }, + instance: { produce: produceInstance }, + } = powers; + + const installation = await consumeInstallation[name]; + + console.log(name, 'start args:', startArgs); + const started = await E(startUpgradable)({ + ...startArgs, + installation, + label: name, + }); + const { instance } = started; + produceInstance[name].reset(); + produceInstance[name].resolve(instance); + + console.log(name, 'started'); + return started; +}; From 090a9b2b48475b53689006d52ce697984e17abfe Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:57:19 -0600 Subject: [PATCH 086/152] chore(postal-service.contract): export start fn type --- contract/src/postal-service.contract.js | 1 + 1 file changed, 1 insertion(+) diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 02a4ad8f..2bd08ff2 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -69,3 +69,4 @@ export const start = zcf => { }); return { publicFacet }; }; +/** @typedef { typeof start } PostalServiceFn */ From 1b8349b4eaba3547c8c0bf36c7c782b3c5c5e00c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:58:01 -0600 Subject: [PATCH 087/152] WIP(postal-service.proposal): factor out start-contract --- contract/src/postal-service.proposal.js | 60 +++++++++---------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/contract/src/postal-service.proposal.js b/contract/src/postal-service.proposal.js index 475d49ea..3d9d3574 100644 --- a/contract/src/postal-service.proposal.js +++ b/contract/src/postal-service.proposal.js @@ -9,24 +9,15 @@ import { E } from '@endo/far'; import { fixHub } from './fixHub.js'; +import { + installContract, + startContract, +} from './platform-goals/start-contract.js'; +import { allValues } from './objectTools.js'; const { Fail } = assert; -/** - * @typedef { typeof import('./postal-service.contract.js').start } PostalServiceFn - * - * @typedef {{ - * produce: { postalServiceKit: Producer }, - * installation: { - * consume: { postalService: Promise> }, - * produce: { postalService: Producer> }, - * } - * instance: { - * consume: { postalService: Promise['instance']> }, - * produce: { postalService: Producer['instance']> }, - * } - * }} PostalServicePowers - */ +const contractName = 'postalService'; /** * @param {BootstrapPowers} powers @@ -36,40 +27,33 @@ const { Fail } = assert; * }}}} [config] */ export const startPostalService = async (powers, config) => { - /** @type { BootstrapPowers & PostalServicePowers} */ - // @ts-expect-error bootstrap powers evolve with BLD staker governance - const postalPowers = powers; const { - consume: { zoe, namesByAddressAdmin, agoricNames }, - installation: { - produce: { postalService: produceInstallation }, - }, - instance: { - produce: { postalService: produceInstance }, - }, - } = postalPowers; + consume: { namesByAddressAdmin, agoricNames }, + } = powers; const { // separate line for bundling bundleID = Fail`no bundleID`, issuerNames = ['IST', 'Invitation', 'BLD', 'ATOM'], - } = config?.options?.postalService ?? {}; + } = config?.options?.[contractName] ?? {}; - /** @type {Installation} */ - const installation = await E(zoe).installBundleID(bundleID); - produceInstallation.resolve(installation); + const installation = await installContract(powers, { + name: contractName, + bundleID, + }); const namesByAddress = await fixHub(namesByAddressAdmin); + const terms = harden({ namesByAddress }); - // XXX ATOM isn't available via consume.issuer.ATOM. Odd. - const issuers = Object.fromEntries( - issuerNames.map(n => [n, E(agoricNames).lookup('issuer', n)]), + const issuerKeywordRecord = await allValues( + Object.fromEntries( + issuerNames.map(n => [n, E(agoricNames).lookup('issuer', n)]), + ), ); - const { instance } = await E(zoe).startInstance(installation, issuers, { - namesByAddress, - }); - produceInstance.resolve(instance); - console.log('postalService started'); + await startContract(powers, { + name: contractName, + startArgs: { installation, issuerKeywordRecord, terms }, + }); }; export const manifest = /** @type {const} */ ({ From a7676d8280b47a3874a3c09871cfa9c308d07c54 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 00:58:39 -0600 Subject: [PATCH 088/152] test(test-postalSvc): test permit - never mind PostalServicePowers type --- contract/test/test-postalSvc.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 483d9a51..5b0f9c33 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -8,10 +8,11 @@ import { createRequire } from 'module'; import { env as ambientEnv } from 'node:process'; import * as ambientChildProcess from 'node:child_process'; import * as ambientFsp from 'node:fs/promises'; - import { E, passStyleOf } from '@endo/far'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; -import { startPostalService } from '../src/postal-service.proposal.js'; +import { extract } from '@agoric/vats/src/core/utils.js'; + +import { permit, startPostalService } from '../src/postal-service.proposal.js'; import { bootAndInstallBundles, makeMockTools } from './boot-tools.js'; import { makeBundleCacheContext, getBundleId } from '../tools/bundle-tools.js'; import { makeE2ETools } from '../tools/e2e-tools.js'; @@ -188,7 +189,8 @@ test('send invitation* from contract using publicFacet of postalService', async const { powers, bundles } = await bootAndInstallBundles(t, bundleRoots); const bundleID = getBundleId(bundles.postalService); - await startPostalService(powers, { + const postalPowers = extract(permit, powers); + await startPostalService(postalPowers, { options: { postalService: { bundleID, issuerNames: ['IST', 'Invitation'] }, }, @@ -206,10 +208,10 @@ test('send invitation* from contract using publicFacet of postalService', async { zoe, namesByAddressAdmin }, smartWalletIssuers, ); - /** @type {import('../src/postal-service.proposal.js').PostalServicePowers} */ - // @ts-expect-error cast - const postalSpace = powers; - const instance = await postalSpace.instance.consume.postalService; + + /** @type {StartedInstanceKit['instance']} */ + // @ts-expect-error not (yet?) in BootstrapPowers + const instance = await powers.instance.consume.postalService; const shared = { rxAddr: 'agoric1receiverRex', From 263d4878d2345a074b41f9da70b7083231e88aee Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 01:20:50 -0600 Subject: [PATCH 089/152] feat: narrow publishBrandInfo power https://github.com/Agoric/dapp-offer-up/commit/0c894f6b7126ccfa575c11117e82e87c93a67186 --- contract/src/platform-goals/boardAux.js | 114 ++++++++++++++++++ contract/src/platform-goals/core-types.d.ts | 58 +++++++++ .../src/platform-goals/marshal-produce.js | 34 ++++++ 3 files changed, 206 insertions(+) create mode 100644 contract/src/platform-goals/boardAux.js create mode 100644 contract/src/platform-goals/core-types.d.ts create mode 100644 contract/src/platform-goals/marshal-produce.js diff --git a/contract/src/platform-goals/boardAux.js b/contract/src/platform-goals/boardAux.js new file mode 100644 index 00000000..0da3e361 --- /dev/null +++ b/contract/src/platform-goals/boardAux.js @@ -0,0 +1,114 @@ +// @ts-check +import { E, Far } from '@endo/far'; + +const { Fail } = assert; + +// vstorage paths under published.* +const BOARD_AUX = 'boardAux'; + +/** + * @param {import('@agoric/zone').Zone} zone + * @param {Marshaller} marshalData + * @param {{ + * board: ERef; + * chainStorage: ERef; + * }} powers + */ +export const makeBoardAuxManager = (zone, marshalData, powers) => { + const { board, chainStorage } = powers; + const store = zone.mapStore('boardAux'); + const boardAux = E(chainStorage).makeChildNode(BOARD_AUX); + + const formatValue = value => { + const aux = marshalData.toCapData(value); + // max length? + return JSON.stringify(aux); + }; + + const boardAuxNode = key => + E.when(E(board).getId(key), boardId => E(boardAux).makeChildNode(boardId)); + + const init = async (key, value) => { + store.init(key, value); + await E(boardAuxNode(key)).setValue(formatValue(value)); + }; + + const update = async (key, value) => { + if (store.has(key)) { + store.set(key, value); + } else { + store.init(key, value); + } + await E(boardAuxNode(key)).setValue(formatValue(value)); + }; + + /** + * Publish displayInfo of a brand to vstorage under its boardId. + * + * Works only once per brand. + * @see {BoardAuxAdmin} to over-write aux info + * + * @param {Brand} brand + */ + const publishBrandInfo = brand => + E.when( + Promise.all([E(brand).getAllegedName(), E(brand).getDisplayInfo()]), + ([allegedName, displayInfo]) => + init(brand, harden({ allegedName, displayInfo })), + ); + + return harden({ + brandAuxPublisher: Far('BrandAuxPublisher', { publishBrandInfo }), + boardAuxTOFU: Far('BoardAuxTOFU', { publishBrandInfo, init }), + boardAuxAdmin: Far('BoardAuxAdmin', { publishBrandInfo, init, update }), + }); +}; +/** @typedef {ReturnType} BoardAuxManager */ + +/** @typedef {BoardAuxManager['brandAuxPublisher']} BrandAuxPublisher */ +/** @typedef {BoardAuxManager['boardAuxTOFU']} BoardAuxTOFU */ +/** @typedef {BoardAuxManager['boardAuxAdmin']} BoardAuxAdmin */ + +/** + * @typedef {import('./core-types').PromiseSpaceOf<{ + * brandAuxPublisher: BrandAuxPublisher; + * boardAuxTOFU: BoardAuxTOFU; + * boardAuxAdmin: BoardAuxAdmin; + * }>} BoardAuxPowers + */ + +/** + * @param {import('./core-types').BootstrapPowers + * & import('./marshal-produce').Endo1Space + * & BoardAuxPowers + * } powers + */ +export const produceBoardAuxManager = async powers => { + const { zone } = powers; + const { board, chainStorage, endo1 } = powers.consume; + const { marshal } = await endo1; + const { makeMarshal } = marshal; + const marshalData = makeMarshal(_val => Fail`data only`); + + const mgr = makeBoardAuxManager(zone, marshalData, { board, chainStorage }); + powers.produce.brandAuxPublisher.reset(); + powers.produce.boardAuxTOFU.reset(); + powers.produce.boardAuxAdmin.reset(); + powers.produce.brandAuxPublisher.resolve(mgr.brandAuxPublisher); + powers.produce.boardAuxTOFU.resolve(mgr.boardAuxTOFU); + powers.produce.boardAuxAdmin.resolve(mgr.boardAuxAdmin); +}; + +export const permit = { + zone: true, + consume: { board: true, chainStorage: true, endo1: true }, + produce: { + brandAuxPublisher: true, + boardAuxTOFU: true, + boardAuxAdmin: true, + }, +}; + +export const manifest = { + [produceBoardAuxManager.name]: permit, +}; diff --git a/contract/src/platform-goals/core-types.d.ts b/contract/src/platform-goals/core-types.d.ts new file mode 100644 index 00000000..162b5df6 --- /dev/null +++ b/contract/src/platform-goals/core-types.d.ts @@ -0,0 +1,58 @@ +import type { Zone } from '@agoric/zone'; + +// XXX how to import types from @agoric/vats? +// cf. https://github.com/Agoric/agoric-sdk/blob/master/packages/vats/src/core/types-ambient.d.ts +type Board = { getId: (key: unknown) => string }; + +type WellKnown = { + asset: 'BLD' | 'IST'; + contract: 'VaultFactory' | 'FeeDistributor'; +}; + +// TODO: include AssetKind { IST: 'nat', ... } +type AssetsSpace = { + brand: PromiseSpaceOf>; + issuer: PromiseSpaceOf>; +}; + +// TODO: include contract start function types +type ContractSpace = { + installation: PromiseSpaceOf>; + instance: PromiseSpaceOf>; +}; + +type WellKnownSpaces = AssetsSpace & + ContractSpace; + +type BootstrapSpace = PromiseSpaceOf<{ + chainStorage: StorageNode; + board: Board; + startUpgradable: (...args: unknown[]) => any; + zoe: ZoeService; +}>; + +type BootstrapPowers = BootstrapSpace & + WellKnownSpaces & { + zone: Zone; + }; + +type Producer = { + resolve: (v: ERef) => void; + reject: (r: unknown) => void; + reset: (reason?: unknown) => void; +}; + +/** + * @template B - Bidirectional + * @template C - Consume only + * @template P - Produce only + */ +type PromiseSpaceOf = { + consume: { [K in keyof (B & C)]: Promise<(B & C)[K]> }; + produce: { [K in keyof (B & P)]: Producer<(B & P)[K]> }; +}; + +type BootstrapManifestPermit = + | true + | string + | { [key: string]: BootstrapManifestPermit }; diff --git a/contract/src/platform-goals/marshal-produce.js b/contract/src/platform-goals/marshal-produce.js new file mode 100644 index 00000000..9344208c --- /dev/null +++ b/contract/src/platform-goals/marshal-produce.js @@ -0,0 +1,34 @@ +// @ts-check +import * as marshal from '@endo/marshal'; +import * as patterns from '@endo/patterns'; + +/** + * @typedef {{ + * endo1: { + * marshal: typeof import('@endo/marshal'); + * patterns: typeof import('@endo/patterns'); + * } + * }} Endo1Modules + * @typedef {import('./core-types').PromiseSpaceOf} Endo1Space + */ + +/** + * Make @endo/marshal, @endo/patterns available to CoreEval scripts. + * + * @param {import('./core-types').BootstrapPowers & Endo1Space} permittedPowers + */ +export const produceEndoModules = permittedPowers => { + const { produce } = permittedPowers; + const endo = { marshal, patterns }; + produce.endo1.resolve(endo); +}; + +/** @type {import('./core-types').BootstrapManifestPermit} */ +export const permit = { + /** @type {Record} */ + produce: { endo1: true }, +}; + +export const manifest = { + [produceEndoModules.name]: permit, +}; From ca42d628e22b9351dfb4dfa778c60965f3b783ab Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 01:49:17 -0600 Subject: [PATCH 090/152] chore(boot-tools): zone --- contract/test/boot-tools.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index 9bb824a4..95a15d8b 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -7,6 +7,8 @@ import { makeFakeVatAdmin } from '@agoric/zoe/tools/fakeVatAdmin.js'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; import buildManualTimer from '@agoric/zoe/tools/manualTimer.js'; import { AmountMath, AssetKind, makeIssuerKit } from '@agoric/ertp'; +import { makeScalarMapStore } from '@agoric/store'; +import { makeDurableZone } from '@agoric/zone/durable.js'; // eslint-disable-next-line import/no-extraneous-dependencies import { makeMockChainStorageRoot } from '@agoric/internal/src/storage-test-utils.js'; @@ -39,6 +41,8 @@ export const mockBootstrapPowers = async ( log, spaceNames = ['installation', 'instance', 'issuer', 'brand'], ) => { + const baggage = makeScalarMapStore('testing'); + const zone = makeDurableZone(baggage); const { produce, consume } = makePromiseSpace(); const { admin, vatAdminState } = makeFakeVatAdmin(); @@ -102,7 +106,7 @@ export const mockBootstrapPowers = async ( * @type {BootstrapPowers & NonNullChainStorage} */ // @ts-expect-error mock - const powers = { produce, consume, ...spaces }; + const powers = { produce, consume, ...spaces, zone }; return { powers, vatAdminState, chainStorage }; }; From 6c67748298a626f6962664ce8474837a2aea02b9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 01:49:58 -0600 Subject: [PATCH 091/152] refactor(sell-concert-tickets-proposal): use brandAuxPublisher - use installContract, startContract --- contract/src/sell-concert-tickets-proposal.js | 126 +++++++----------- 1 file changed, 46 insertions(+), 80 deletions(-) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets-proposal.js index 47fcdf79..eef10415 100644 --- a/contract/src/sell-concert-tickets-proposal.js +++ b/contract/src/sell-concert-tickets-proposal.js @@ -1,17 +1,16 @@ // @ts-check import { E } from '@endo/far'; -import { makeMarshal } from '@endo/marshal'; import { AmountMath } from '@agoric/ertp/src/amountMath.js'; - -console.warn('start proposal module evaluating'); +import { + installContract, + startContract, +} from './platform-goals/start-contract.js'; const { Fail } = assert; -// vstorage paths under published.* -const BOARD_AUX = 'boardAux'; - -const marshalData = makeMarshal(_val => Fail`data only`); +console.warn('start proposal module evaluating'); +const contractName = 'sellConcertTickets'; const IST_UNIT = 1_000_000n; export const makeInventory = (brand, baseUnit) => { @@ -37,46 +36,27 @@ export const makeTerms = (brand, baseUnit) => { }; }; -/** - * Make a storage node for auxilliary 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); -}; - -const publishBrandInfo = async (chainStorage, board, brand) => { - const [id, displayInfo] = await Promise.all([ - E(board).getId(brand), - E(brand).getDisplayInfo(), - ]); - const node = makeBoardAuxNode(chainStorage, id); - const aux = marshalData.toCapData(harden({ displayInfo })); - await E(node).setValue(JSON.stringify(aux)); -}; - /** * Core eval script to start contract * - * @param {BootstrapPowers} permittedPowers + * @param {BootstrapPowers } permittedPowers + * @param {*} config * * @typedef {{ - * installation: PromiseSpaceOf<{ sellConcertTickets: Installation}>; - * instance: PromiseSpaceOf<{ sellConcertTickets: Instance}>; * brand: PromiseSpaceOf<{ Ticket: Brand }>; * issuer: PromiseSpaceOf<{ Ticket: Issuer }>; * }} SellTicketsSpace */ -export const startSellConcertTicketsContract = async permittedPowers => { +export const startSellConcertTicketsContract = async ( + permittedPowers, + config, +) => { console.error('startSellConcertTicketsContract()...'); - /** @type {BootstrapPowers & SellTicketsSpace} */ + /** @type {BootstrapPowers & SellTicketsSpace & import('./platform-goals/boardAux').BoardAuxPowers} */ // @ts-expect-error cast const sellPowers = permittedPowers; const { - consume: { board, chainStorage, startUpgradable, zoe }, + consume: { brandAuxPublisher, zoe }, brand: { consume: { IST: istBrandP }, produce: { Ticket: produceTicketBrand }, @@ -85,29 +65,31 @@ export const startSellConcertTicketsContract = async permittedPowers => { consume: { IST: istIssuerP }, produce: { Ticket: produceTicketIssuer }, }, - installation: { - consume: { sellConcertTickets: sellConcertTicketsInstallationP }, - }, - instance: { - produce: { sellConcertTickets: produceInstance }, - }, } = sellPowers; + const { + // separate line for bundling + bundleID = Fail`no bundleID`, + } = config?.options?.[contractName] ?? {}; const istIssuer = await istIssuerP; const istBrand = await istBrandP; const terms = makeTerms(istBrand, 1n * IST_UNIT); - // agoricNames gets updated each time; the promise space only once XXXXXXX - const installation = await sellConcertTicketsInstallationP; + const installation = await installContract(permittedPowers, { + name: contractName, + bundleID, + }); - const { instance } = await E(startUpgradable)({ - installation, - issuerKeywordRecord: { Price: istIssuer }, - label: 'sellConcertTickets', - terms, + const { instance } = await startContract(permittedPowers, { + name: contractName, + startArgs: { + installation, + issuerKeywordRecord: { Price: istIssuer }, + terms, + }, }); - console.log('CoreEval script: started contract', instance); + const { brands: { Ticket: brand }, issuers: { Ticket: issuer }, @@ -115,44 +97,28 @@ export const startSellConcertTicketsContract = async permittedPowers => { console.log('CoreEval script: share via agoricNames:', brand); - produceInstance.reset(); - produceInstance.resolve(instance); - produceTicketBrand.reset(); produceTicketIssuer.reset(); produceTicketBrand.resolve(brand); produceTicketIssuer.resolve(issuer); - await publishBrandInfo(chainStorage, board, brand); + await E(brandAuxPublisher).publishBrandInfo(brand); console.log('sellConcertTickets (re)started'); }; -/** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifest } */ -const sellConcertTicketsManifest = { - [startSellConcertTicketsContract.name]: { - consume: { - agoricNames: true, - board: true, // to publish boardAux info for NFT brand - chainStorage: true, // to publish boardAux info for NFT brand - startUpgradable: true, // to start contract and save adminFacet - zoe: true, // to get contract terms, including issuer/brand - }, - installation: { consume: { sellConcertTickets: true } }, - issuer: { consume: { IST: true }, produce: { Ticket: true } }, - brand: { consume: { IST: true }, produce: { Ticket: true } }, - instance: { produce: { sellConcertTickets: true } }, +/** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifestPermit } */ +export const permit = harden({ + consume: { + agoricNames: true, + brandAuxPublisher: true, + startUpgradable: true, // to start contract and save adminFacet + zoe: true, // to get contract terms, including issuer/brand }, -}; -harden(sellConcertTicketsManifest); - -export const getManifestForSellConcertTickets = ( - { restoreRef }, - { sellConcertTicketsRef }, -) => { - return harden({ - manifest: sellConcertTicketsManifest, - installations: { - sellConcertTickets: restoreRef(sellConcertTicketsRef), - }, - }); -}; + installation: { + consume: { [contractName]: true }, + produce: { [contractName]: true }, + }, + instance: { produce: { [contractName]: true } }, + issuer: { consume: { IST: true }, produce: { Ticket: true } }, + brand: { consume: { IST: true }, produce: { Ticket: true } }, +}); From f7fa32b22fa38f4c599385aea5e9a050401cc974 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 01:51:17 -0600 Subject: [PATCH 092/152] style(test-sell): lint --- contract/test/test-sell-concert-tickets-contract.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index ea21b7d7..3c000a49 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -135,7 +135,9 @@ const alice = async ( const seat = E(zoe).offer(toTrade, proposal, { Price: pmt }); const resultP = E(seat).getOfferResult(); - await (expectSuccessfulTrade ? t.notThrowsAsync(resultP) : t.throwsAsync(resultP)); + await (expectSuccessfulTrade + ? t.notThrowsAsync(resultP) + : t.throwsAsync(resultP)); if (!expectSuccessfulTrade) { return; } From b6528bbb9055dc636941b445f77fa21f79b5a16b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 01:51:33 -0600 Subject: [PATCH 093/152] refactor(test-sell): use mockBootstrapPowers, produceBoardAuxManager --- .../test-sell-concert-tickets-contract.js | 89 ++++--------------- 1 file changed, 18 insertions(+), 71 deletions(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index 3c000a49..75df7742 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -21,6 +21,10 @@ import { makeTerms, } from '../src/sell-concert-tickets-proposal.js'; import { bagPrice } from '../src/sell-concert-tickets.contract.js'; +import { getBundleId } from '../tools/bundle-tools.js'; +import { mockBootstrapPowers } from './boot-tools.js'; +import { produceEndoModules } from '../src/platform-goals/marshal-produce.js'; +import { produceBoardAuxManager } from '../src/platform-goals/boardAux.js'; /** @typedef {typeof import('../src/sell-concert-tickets.contract.js').start} AssetContractFn */ @@ -218,82 +222,25 @@ test('Trade in IST rather than play money', async t => { }); test('use the code that will go on chain to start the contract', async t => { - const noop = harden(() => {}); - - // Starting the contract consumes an installation - // and produces an instance, brand, and issuer. - // We coordinate these with promises. - const makeProducer = () => ({ ...makePromiseKit(), reset: noop }); - const sync = { - installation: makeProducer(), - instance: makeProducer(), - brand: makeProducer(), - issuer: makeProducer(), - }; - - /** - * Chain bootstrap makes a number of powers available - * to code approved by BLD staker governance. - * - * Here we simulate the ones needed for starting this contract. - */ - const mockBootstrap = async () => { - const board = { getId: noop }; - const chainStorage = Far('chainStorage', { - makeChildNode: async () => chainStorage, - setValue: async () => {}, - }); - - const { zoe } = t.context; - const startUpgradable = async ({ - installation, - issuerKeywordRecord, - label, - terms, - }) => - E(zoe).startInstance(installation, issuerKeywordRecord, terms, {}, label); - const feeIssuer = await E(zoe).getFeeIssuer(); - const feeBrand = await E(feeIssuer).getBrand(); - - const pFor = x => Promise.resolve(x); - const powers = { - consume: { zoe, chainStorage, startUpgradable, board }, - brand: { - consume: { IST: pFor(feeBrand) }, - produce: { Ticket: sync.brand }, - }, - issuer: { - consume: { IST: pFor(feeIssuer) }, - produce: { Ticket: sync.issuer }, - }, - installation: { - consume: { sellConcertTickets: sync.installation.promise }, - }, - instance: { produce: { sellConcertTickets: sync.instance } }, - }; - - /** @type {BootstrapPowers} */ - // @ts-expect-error mock - const typedPowers = powers; - - return typedPowers; - }; - - const powers = await mockBootstrap(); - - // Code to install the contract is automatically - // generated by `agoric run`. No need to test that part. - const { zoe, bundle } = t.context; - const installation = E(zoe).install(bundle); - sync.installation.resolve(installation); + const { bundle } = t.context; + const bundleID = getBundleId(bundle); + const { powers, vatAdminState } = await mockBootstrapPowers(t.log); + const { feeMintAccess, zoe } = powers.consume; // When the BLD staker governance proposal passes, // the startup function gets called. - await startSellConcertTicketsContract(powers); - const instance = await sync.instance.promise; + vatAdminState.installBundle(bundleID, bundle); + await Promise.all([ + produceEndoModules(powers), + produceBoardAuxManager(powers), + startSellConcertTicketsContract(powers, { + options: { sellConcertTickets: { bundleID } }, + }), + ]); + const instance = await powers.instance.consume.sellConcertTickets; // Now that we have the instance, resume testing as above. - const { feeMintAccess, bundleCache } = t.context; + const { bundleCache } = t.context; const { faucet } = makeStableFaucet({ bundleCache, feeMintAccess, zoe }); await alice(t, zoe, instance, await faucet(5n * UNIT6)); }); From 631d9d2b983e4be1d37d5ad2349cf2de03774f96 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 02:12:40 -0600 Subject: [PATCH 094/152] chore(sell-proposal): avoid bundling from other packages --- contract/src/sell-concert-tickets-proposal.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets-proposal.js index eef10415..b20cabb5 100644 --- a/contract/src/sell-concert-tickets-proposal.js +++ b/contract/src/sell-concert-tickets-proposal.js @@ -1,6 +1,6 @@ // @ts-check import { E } from '@endo/far'; -import { AmountMath } from '@agoric/ertp/src/amountMath.js'; +// import { AmountMath } from '@agoric/ertp/src/amountMath.js'; import { installContract, startContract, @@ -13,6 +13,11 @@ console.warn('start proposal module evaluating'); const contractName = 'sellConcertTickets'; const IST_UNIT = 1_000_000n; +// avoid bundling from other packages +const AmountMath = { + make: (brand, value) => harden({ brand, value }), +}; + export const makeInventory = (brand, baseUnit) => { return { frontRow: { From cce884fba1102ca559d325f54d77458dc1dd0529 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 02:23:53 -0600 Subject: [PATCH 095/152] chore(rollup.config): both sell and pay contracts --- contract/rollup.config.mjs | 48 +++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index ec0bec20..6ff70303 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -16,25 +16,57 @@ import { configureBundleID, emitPermit, } from './tools/rollup-plugin-core-eval.js'; -import { permit } from './src/postal-service.proposal.js'; +import { permit as postalServicePermit } from './src/postal-service.proposal.js'; +import { permit as sellPermit } from './src/sell-concert-tickets-proposal.js'; -/** @type {import('rollup').RollupOptions} */ -const config = { +/** + * @param {*} opts + * @returns {import('rollup').RollupOptions} + */ +const config1 = ({ + name, + coreEntry, + coreScript, + contractEntry, + permit, + permitFile, +}) => ({ + input: coreEntry, output: { globals: coreEvalGlobals, - file: 'bundles/deploy-postal-service.js', + file: coreScript, format: 'es', footer: 'main', }, external: ['@endo/far'], plugins: [ configureBundleID({ - name: 'postalService', - rootModule: './src/postal-service.contract.js', + name, + rootModule: contractEntry, cache: 'bundles', }), moduleToScript(), - emitPermit({ permit, file: 'deploy-postal-service-permit.json' }), + emitPermit({ permit, file: permitFile }), ], -}; +}); + +/** @type {import('rollup').RollupOptions[]} */ +const config = [ + config1({ + name: 'postalService', + coreEntry: './src/postal-service.proposal.js', + coreScript: 'bundles/deploy-postal-service.js', + contractEntry: './src/postal-service.contract.js', + permit: postalServicePermit, + permitFile: 'deploy-postal-service-permit.json', + }), + config1({ + name: 'sell-concert-tickets', + coreEntry: './src/sell-concert-tickets-proposal.js', + coreScript: 'bundles/deploy-sell-concert-tickets.js', + contractEntry: './src/sell-concert-tickets.contract.js', + permit: sellPermit, + permitFile: 'deploy-sell-concert-tickets-permit.json', + }), +]; export default config; From 6c5fc040360cb47e9c6405e1c6c56ff44ce108d4 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 02:24:23 -0600 Subject: [PATCH 096/152] chore(sell proposal): main --- contract/src/sell-concert-tickets-proposal.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets-proposal.js index b20cabb5..edf2e5e5 100644 --- a/contract/src/sell-concert-tickets-proposal.js +++ b/contract/src/sell-concert-tickets-proposal.js @@ -127,3 +127,5 @@ export const permit = harden({ issuer: { consume: { IST: true }, produce: { Ticket: true } }, brand: { consume: { IST: true }, produce: { Ticket: true } }, }); + +export const main = startSellConcertTicketsContract; From 83ca7fab3649bc3daff0d9463831ac3e64067127 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 10:08:43 -0600 Subject: [PATCH 097/152] feat(start-contract): publish issuers, brands --- contract/src/platform-goals/start-contract.js | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/contract/src/platform-goals/start-contract.js b/contract/src/platform-goals/start-contract.js index 3ba34dd7..6317565c 100644 --- a/contract/src/platform-goals/start-contract.js +++ b/contract/src/platform-goals/start-contract.js @@ -25,11 +25,15 @@ export const installContract = async ( * @param {{ * name: string; * startArgs?: StartArgs; + * issuerNames?: string[]; * }} opts * * @typedef {Partial>[0]>} StartArgs */ -export const startContract = async (powers, { name, startArgs }) => { +export const startContract = async ( + powers, + { name, startArgs, issuerNames }, +) => { const { consume: { startUpgradable }, installation: { consume: consumeInstallation }, @@ -49,5 +53,32 @@ export const startContract = async (powers, { name, startArgs }) => { produceInstance[name].resolve(instance); console.log(name, 'started'); + + if (issuerNames) { + /** @type {BootstrapPowers & import('./boardAux').BoardAuxPowers} */ + // @ts-expect-error cast + const auxPowers = powers; + + const { zoe, brandAuxPublisher } = auxPowers.consume; + const { produce: produceIssuer } = auxPowers.issuer; + const { produce: produceBrand } = auxPowers.brand; + const { brands, issuers } = await E(zoe).getTerms(instance); + + await Promise.all( + issuerNames.map(async issuerName => { + const brand = brands[issuerName]; + const issuer = issuers[issuerName]; + console.log('CoreEval script: share via agoricNames:', brand); + + produceBrand[issuerName].reset(); + produceIssuer[issuerName].reset(); + produceBrand[issuerName].resolve(brand); + produceIssuer[issuerName].resolve(issuer); + + await E(brandAuxPublisher).publishBrandInfo(brand); + }), + ); + } + return started; }; From 58abf2caf8dd74fb83f0e7c8d9a6748338a3effe Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 10:11:17 -0600 Subject: [PATCH 098/152] refactor(sell proposal): delegate issuer publishing to the platform --- contract/src/sell-concert-tickets-proposal.js | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets-proposal.js index edf2e5e5..28faa1c8 100644 --- a/contract/src/sell-concert-tickets-proposal.js +++ b/contract/src/sell-concert-tickets-proposal.js @@ -1,6 +1,6 @@ // @ts-check -import { E } from '@endo/far'; // import { AmountMath } from '@agoric/ertp/src/amountMath.js'; +import { allValues } from './objectTools.js'; import { installContract, startContract, @@ -8,8 +8,6 @@ import { const { Fail } = assert; -console.warn('start proposal module evaluating'); - const contractName = 'sellConcertTickets'; const IST_UNIT = 1_000_000n; @@ -56,59 +54,35 @@ export const startSellConcertTicketsContract = async ( permittedPowers, config, ) => { - console.error('startSellConcertTicketsContract()...'); - /** @type {BootstrapPowers & SellTicketsSpace & import('./platform-goals/boardAux').BoardAuxPowers} */ - // @ts-expect-error cast - const sellPowers = permittedPowers; - const { - consume: { brandAuxPublisher, zoe }, - brand: { - consume: { IST: istBrandP }, - produce: { Ticket: produceTicketBrand }, - }, - issuer: { - consume: { IST: istIssuerP }, - produce: { Ticket: produceTicketIssuer }, - }, - } = sellPowers; + console.log('core eval for', contractName); const { // separate line for bundling bundleID = Fail`no bundleID`, } = config?.options?.[contractName] ?? {}; - const istIssuer = await istIssuerP; - const istBrand = await istBrandP; - - const terms = makeTerms(istBrand, 1n * IST_UNIT); - const installation = await installContract(permittedPowers, { name: contractName, bundleID, }); - const { instance } = await startContract(permittedPowers, { + const ist = await allValues({ + brand: permittedPowers.brand.consume.IST, + issuer: permittedPowers.issuer.consume.IST, + }); + + const terms = makeTerms(ist.brand, 1n * IST_UNIT); + + await startContract(permittedPowers, { name: contractName, startArgs: { installation, - issuerKeywordRecord: { Price: istIssuer }, + issuerKeywordRecord: { Price: ist.issuer }, terms, }, + issuerNames: ['Ticket'], }); - const { - brands: { Ticket: brand }, - issuers: { Ticket: issuer }, - } = await E(zoe).getTerms(instance); - - console.log('CoreEval script: share via agoricNames:', brand); - - produceTicketBrand.reset(); - produceTicketIssuer.reset(); - produceTicketBrand.resolve(brand); - produceTicketIssuer.resolve(issuer); - - await E(brandAuxPublisher).publishBrandInfo(brand); - console.log('sellConcertTickets (re)started'); + console.log(contractName, '(re)started'); }; /** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifestPermit } */ From 7033dc75df25fbba22b404fe2fe3387724d5df30 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:41:47 -0600 Subject: [PATCH 099/152] chore(board-aux.core): rename; export main --- .../src/platform-goals/{boardAux.js => board-aux.core.js} | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) rename contract/src/platform-goals/{boardAux.js => board-aux.core.js} (96%) diff --git a/contract/src/platform-goals/boardAux.js b/contract/src/platform-goals/board-aux.core.js similarity index 96% rename from contract/src/platform-goals/boardAux.js rename to contract/src/platform-goals/board-aux.core.js index 0da3e361..bca7b6ff 100644 --- a/contract/src/platform-goals/boardAux.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -79,7 +79,7 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { /** * @param {import('./core-types').BootstrapPowers - * & import('./marshal-produce').Endo1Space + * & import('./endo1.core').Endo1Space * & BoardAuxPowers * } powers */ @@ -109,6 +109,4 @@ export const permit = { }, }; -export const manifest = { - [produceBoardAuxManager.name]: permit, -}; +export const main = produceBoardAuxManager; From 38bd5c6a931937ba52bcc99a91ed3abe11df9e0c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:42:17 -0600 Subject: [PATCH 100/152] chore(endo1.core): rename; export main --- .../src/platform-goals/{marshal-produce.js => endo1.core.js} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename contract/src/platform-goals/{marshal-produce.js => endo1.core.js} (92%) diff --git a/contract/src/platform-goals/marshal-produce.js b/contract/src/platform-goals/endo1.core.js similarity index 92% rename from contract/src/platform-goals/marshal-produce.js rename to contract/src/platform-goals/endo1.core.js index 9344208c..f17e04f0 100644 --- a/contract/src/platform-goals/marshal-produce.js +++ b/contract/src/platform-goals/endo1.core.js @@ -29,6 +29,4 @@ export const permit = { produce: { endo1: true }, }; -export const manifest = { - [produceEndoModules.name]: permit, -}; +export const main = produceEndoModules; From 139aa5b6f8c9dddef7b19214fd0b911e463e8105 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:42:50 -0600 Subject: [PATCH 101/152] WIP(rollup.config): rollup endo1, board-aux too --- contract/rollup.config.mjs | 50 ++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index 6ff70303..bcc8b3c0 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -10,6 +10,7 @@ * - `permit` export is emitted as JSON */ // @ts-check +import { nodeResolve } from '@rollup/plugin-node-resolve'; import { coreEvalGlobals, moduleToScript, @@ -18,6 +19,8 @@ import { } from './tools/rollup-plugin-core-eval.js'; import { permit as postalServicePermit } from './src/postal-service.proposal.js'; import { permit as sellPermit } from './src/sell-concert-tickets-proposal.js'; +import { permit as endo1Permit } from './src/platform-goals/endo1.core.js'; +import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js'; /** * @param {*} opts @@ -26,10 +29,10 @@ import { permit as sellPermit } from './src/sell-concert-tickets-proposal.js'; const config1 = ({ name, coreEntry, - coreScript, - contractEntry, + contractEntry = `./src/${name}.contract.js`, + coreScript = `bundles/deploy-${name}.js`, + permitFile = `deploy-${name}-permit.json`, permit, - permitFile, }) => ({ input: coreEntry, output: { @@ -40,11 +43,16 @@ const config1 = ({ }, external: ['@endo/far'], plugins: [ - configureBundleID({ - name, - rootModule: contractEntry, - cache: 'bundles', - }), + nodeResolve(), + ...(contractEntry + ? [ + configureBundleID({ + name, + rootModule: contractEntry, + cache: 'bundles', + }), + ] + : []), moduleToScript(), emitPermit({ permit, file: permitFile }), ], @@ -53,20 +61,26 @@ const config1 = ({ /** @type {import('rollup').RollupOptions[]} */ const config = [ config1({ - name: 'postalService', - coreEntry: './src/postal-service.proposal.js', - coreScript: 'bundles/deploy-postal-service.js', - contractEntry: './src/postal-service.contract.js', - permit: postalServicePermit, - permitFile: 'deploy-postal-service-permit.json', + name: 'endo1', + permit: endo1Permit, + coreEntry: `./src/platform-goals/endo1.core.js`, + contractEntry: null, + }), + config1({ + name: 'board-aux', + permit: boardAuxPermit, + coreEntry: `./src/platform-goals/board-aux.core.js`, + contractEntry: null, }), config1({ name: 'sell-concert-tickets', - coreEntry: './src/sell-concert-tickets-proposal.js', - coreScript: 'bundles/deploy-sell-concert-tickets.js', - contractEntry: './src/sell-concert-tickets.contract.js', + coreEntry: `./src/sell-concert-tickets-proposal.js`, permit: sellPermit, - permitFile: 'deploy-sell-concert-tickets-permit.json', + }), + config1({ + name: 'postal-service', + coreEntry: `./src/postal-service.proposal.js`, + permit: postalServicePermit, }), ]; export default config; From a52f821dc80d677766191140176134533b5f733a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:43:24 -0600 Subject: [PATCH 102/152] test(test-build-proposal): hex doubles size; use build:deployer - show original size as well as compressed --- contract/test/test-build-proposal.js | 75 ++++++++++++++++++++++------ contract/test/utils.js | 15 ------ 2 files changed, 59 insertions(+), 31 deletions(-) delete mode 100644 contract/test/utils.js diff --git a/contract/test/test-build-proposal.js b/contract/test/test-build-proposal.js index 040afb77..df3710ac 100644 --- a/contract/test/test-build-proposal.js +++ b/contract/test/test-build-proposal.js @@ -1,29 +1,72 @@ /* eslint-disable import/order -- https://github.com/endojs/endo/issues/1235 */ import { test } from './prepare-test-env-ava.js'; -import { execSync } from 'node:child_process'; +import { execFile } from 'node:child_process'; import { promises as fs } from 'node:fs'; -import { makeCompressFile } from './utils.js'; +import { Buffer } from 'buffer'; +import { gzip } from 'zlib'; +import { promisify } from 'util'; +import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; -test.before(t => (t.context.compressFile = makeCompressFile(fs.readFile))); +test.before(async t => { + const bundleCache = await makeNodeBundleCache('bundles', {}, s => import(s)); -test.only('proposal builder generates compressed bundles less than 1MB', async t => { - const stdout = execSync('agoric run scripts/build-contract-deployer.js', { encoding: 'utf8' }); - t.log('agoric run stdout:', stdout); - t.truthy(stdout, 'Proposal successfully bundled.'); + /** + * @param {string} name of an _already cached_ bundle + */ + const compressBundle = async name => { + const rootPath = undefined; // not needed since bundle is already cached + const bundle = await bundleCache.load(rootPath, name); + const fileContents = JSON.stringify(bundle); + const buffer = Buffer.from(fileContents, 'utf-8'); + const compressed = await promisify(gzip)(buffer); + return { bundle, compressed }; + }; - const regex = /agd tx swingset install-bundle @(.*?)\.json/g; - const bundles = Array.from(stdout.matchAll(regex), m => `${m[1]}.json`); - t.assert(bundles.length, 'Found bundles in stdout'); + const $ = (file, ...args) => { + // console.error(cmd); - for (const bundle of bundles) { + return new Promise((resolve, reject) => { + execFile(file, args, { encoding: 'utf8' }, (err, out) => { + if (err) return reject(err); + resolve(out); + }); + }); + }; + + const runPackageScript = async (scriptName, ...args) => + $('yarn', 'run', '--silent', scriptName, ...args); + + const listBundles = async (bundleDir = 'bundles') => { + const candidates = await fs.readdir(bundleDir); + const matches = candidates.filter(n => /^bundle-.*\.js$/.test(n)); + // console.log('listBundles', { candidates, matches }); + return matches.map(base => { + const name = base.replace(/^bundle-/, '').replace(/\.js$/, ''); + return name; + }); + }; + t.context = { compressBundle, $, runPackageScript, listBundles }; +}); + +test('bundles from build:deployer meet 1MB request limit', async t => { + const { runPackageScript, listBundles, compressBundle } = t.context; + await runPackageScript('build:deployer'); + + const bundles = await listBundles(); + t.assert(bundles.length, 'Found bundles'); + + const MB = 1024 * 1024; + for (const bundleName of bundles) { // eslint-disable-next-line @jessie.js/safe-await-separator - const buffer = await t.context.compressFile(bundle); + const { bundle, compressed: buffer } = await compressBundle(bundleName); t.assert(buffer); - const sizeInMb = buffer.length / (1024 * 1024); - t.assert(sizeInMb < 1, 'Compressed bundle is less than 1MB'); + const sizeInMb = buffer.length / MB; + // JSON RPC hex encoding doubles the size + t.assert(sizeInMb * 2 < 1, 'Compressed bundle is less than 0.5MB'); t.log({ - bundleId: bundle.split('cache/')[1].split('.json')[0], - compressedSize: `${sizeInMb} MB`, + bundleName, + compressedSize: `${sizeInMb.toFixed(3)} MB`, + originallySize: `${(JSON.stringify(bundle).length / MB).toFixed(3)} MB`, }); } }); diff --git a/contract/test/utils.js b/contract/test/utils.js deleted file mode 100644 index fda5f9f1..00000000 --- a/contract/test/utils.js +++ /dev/null @@ -1,15 +0,0 @@ -import { gzip } from 'zlib'; -import { promisify } from 'util'; -import { Buffer } from 'buffer'; - -/** - * @typedef {import('fs').promises['readFile']} PromisifiedFSReadFile - */ - -/** @param {PromisifiedFSReadFile} readFile */ -export const makeCompressFile = readFile => async filePath => { - const fileContents = await readFile(filePath, 'utf8'); - const buffer = Buffer.from(fileContents, 'utf-8'); - const compressed = await promisify(gzip)(buffer); - return compressed; -}; From 0ef7de59a5b45ca850596a0da09449c887d7f9f2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:44:41 -0600 Subject: [PATCH 103/152] WIP(build-contract-deployer): prune in favor of deploy-contract.js --- contract/scripts/build-contract-deployer.js | 45 --------------------- 1 file changed, 45 deletions(-) delete mode 100644 contract/scripts/build-contract-deployer.js diff --git a/contract/scripts/build-contract-deployer.js b/contract/scripts/build-contract-deployer.js deleted file mode 100644 index 66107c57..00000000 --- a/contract/scripts/build-contract-deployer.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file Permission Contract Deployment builder - * - * Creates files for starting an instance of the contract: - * * contract source and instantiation proposal bundles to be published via - * `agd tx swingset install-bundle` - * * start-sell-concert-tickets-permit.json and start-sell-concert-tickets.js to submit the - * instantiation proposal via `agd tx gov submit-proposal swingset-core-eval` - * - * Usage: - * agoric run build-contract-deployer.js - */ - -import { makeHelpers } from '@agoric/deploy-script-support'; -import { getManifestForSellConcertTickets } from '../src/sell-concert-tickets-proposal.js'; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').ProposalBuilder} */ -export const sellConcertTicketsProposalBuilder = async ({ - publishRef, - install, -}) => { - return harden({ - sourceSpec: '../src/sell-concert-tickets-proposal.js', - getManifestCall: [ - getManifestForSellConcertTickets.name, - { - sellConcertTicketsRef: publishRef( - install( - '../src/sell-concert-tickets.contract.js', - '../bundles/bundle-sell-concert-tickets.js', - { - persist: true, - }, - ), - ), - }, - ], - }); -}; - -/** @type {DeployScriptFunction} */ -export default async (homeP, endowments) => { - const { writeCoreProposal } = await makeHelpers(homeP, endowments); - await writeCoreProposal('start-sell-concert-tickets', sellConcertTicketsProposalBuilder); -}; From 3d887882b32f0f2410571e3d1e46e1dab70ac5f0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:45:05 -0600 Subject: [PATCH 104/152] WIP(deploy-contract): handle multiple evals, 0 contracts --- contract/scripts/deploy-contract.js | 49 ++++++++++++++++------------- 1 file changed, 27 insertions(+), 22 deletions(-) mode change 100644 => 100755 contract/scripts/deploy-contract.js diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js old mode 100644 new mode 100755 index 0838c0d4..439b4b90 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -15,12 +15,13 @@ const opt0 = { }; const Usage = ` -deploy-contract [options] CONTRACT.js +deploy-contract [options] [--install ] [--evals ...] Options: --help print usage - --name name root for bundle, core eval (default: CONTRACT) - --core CORE_EVAL.js core eval entry module (cf rollup.config.mjs) + --install entry module of contract to install + --evals entry modules of core evals to run + (cf rollup.config.mjs) --service SVC docker compose service to run agd (default: ${opt0.service}) use . to run agd outside docker. --workdir DIR workdir for docker service (default: ${opt0.workdir}) @@ -38,10 +39,10 @@ const NonNullish = x => { /** * @param {string[]} argv - * @param {{ [k: string]: boolean | undefined }} [style] + * @param {{ [k: string]: boolean | [] | undefined }} [style] */ const getopts = (argv, style = {}) => { - /** @type {{ [k: string]: string}} */ + /** @type {{ [k: string]: string }} */ const flags = {}; const args = []; while (argv.length > 0) { @@ -49,10 +50,15 @@ const getopts = (argv, style = {}) => { if (arg.startsWith('--')) { const name = arg.slice('--'.length); if (style[name] === true) { - flags[name] = ''; + flags[name] = '+'; continue; } if (argv.length <= 0) throw RangeError(`no value for ${arg}`); + if (Array.isArray(style[name])) { + flags[name] = '+'; + args.push(...argv); + break; + } flags[name] = NonNullish(argv.shift()); } else { args.push(arg); @@ -75,14 +81,14 @@ const mockExecutionContext = () => { }; const main = async (bundleDir = 'bundles') => { - const { argv, env } = process; + const { argv } = process; const { writeFile } = fsp; const progress = (...args) => console.warn(...args); // stderr const bundleCache = await makeNodeBundleCache(bundleDir, {}, s => import(s)); - const { flags: given, args } = getopts(argv.slice(2)); + const { flags: given, args } = getopts(argv.slice(2), { evals: [] }); /** @type {typeof given} */ const flags = { ...opt0, ...given }; if (given.help) { @@ -109,23 +115,22 @@ const main = async (bundleDir = 'bundles') => { bundleDir, }); - const [entry] = args; - if (!entry) throw Error(Usage); + const stem = path => basename(path).replace(/\..*/, ''); - const name = - flags.name || - basename(entry) - .replace(/\.js$/, '') - .replace(/\.contract$/, ''); + if (flags.install) { + const name = stem(flags.install); - await tools.installBundles({ [name]: entry }, progress); + await tools.installBundles({ [name]: flags.install }, progress); + } - if (flags.core) { - const result = await tools.runCoreEval({ - name, - entryFile: flags.core, - }); - progress(result); + if (flags.evals) { + for await (const entryFile of args) { + const result = await tools.runCoreEval({ + name: stem(entryFile), + entryFile, + }); + progress(result); + } } }; From e2e1306ec15546c0dce337b0748375f9df19b703 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:45:39 -0600 Subject: [PATCH 105/152] WIP(start-contract): rename board-aux.core --- contract/src/platform-goals/start-contract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/src/platform-goals/start-contract.js b/contract/src/platform-goals/start-contract.js index 6317565c..0e7d3294 100644 --- a/contract/src/platform-goals/start-contract.js +++ b/contract/src/platform-goals/start-contract.js @@ -55,7 +55,7 @@ export const startContract = async ( console.log(name, 'started'); if (issuerNames) { - /** @type {BootstrapPowers & import('./boardAux').BoardAuxPowers} */ + /** @type {BootstrapPowers & import('./board-aux.core').BoardAuxPowers} */ // @ts-expect-error cast const auxPowers = powers; From 43b085a0a83103780d6d5eced7890fc9a08dcf9b Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:46:19 -0600 Subject: [PATCH 106/152] WIP(test-sell): rename endo1, board-aux.core --- contract/test/test-sell-concert-tickets-contract.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index 75df7742..fcb33cac 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -7,8 +7,7 @@ import { test as anyTest } from './prepare-test-env-ava.js'; import { createRequire } from 'module'; -import { E, Far } from '@endo/far'; -import { makePromiseKit } from '@endo/promise-kit'; +import { E } from '@endo/far'; import { makeCopyBag } from '@endo/patterns'; import { makeNodeBundleCache } from '@endo/bundle-source/cache.js'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; @@ -23,8 +22,8 @@ import { import { bagPrice } from '../src/sell-concert-tickets.contract.js'; import { getBundleId } from '../tools/bundle-tools.js'; import { mockBootstrapPowers } from './boot-tools.js'; -import { produceEndoModules } from '../src/platform-goals/marshal-produce.js'; -import { produceBoardAuxManager } from '../src/platform-goals/boardAux.js'; +import { produceEndoModules } from '../src/platform-goals/endo1.core.js'; +import { produceBoardAuxManager } from '../src/platform-goals/board-aux.core.js'; /** @typedef {typeof import('../src/sell-concert-tickets.contract.js').start} AssetContractFn */ From c24dc3f3ddef92634c586babb51ad25a95a8791a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Mar 2024 23:46:49 -0600 Subject: [PATCH 107/152] build(contract): never mind build:postal-service-deployer --- contract/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/contract/package.json b/contract/package.json index 2863695e..491365aa 100644 --- a/contract/package.json +++ b/contract/package.json @@ -13,7 +13,6 @@ "start": "yarn docker:make clean start-contract print-key", "build": "agoric run scripts/build-contract-deployer.js", "build:deployer": "rollup -c rollup.config.mjs", - "build:postal-service-deployer": "yarn run build:deployer src/postal-service.proposal.js", "test": "ava --verbose", "lint": "eslint '**/*.js'", "lint:types": "tsc -p jsconfig.json", From 7099e346b9aabcafc3421f3e9c0ff3a3dae45d37 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 00:54:36 -0600 Subject: [PATCH 108/152] WIP(contract/package): build-contract-deployer script is no more --- contract/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/package.json b/contract/package.json index 491365aa..0181447d 100644 --- a/contract/package.json +++ b/contract/package.json @@ -11,7 +11,7 @@ "docker:make": "docker compose exec agd make -C /workspace/contract", "make:help": "make list", "start": "yarn docker:make clean start-contract print-key", - "build": "agoric run scripts/build-contract-deployer.js", + "build": "yarn build:deployer", "build:deployer": "rollup -c rollup.config.mjs", "test": "ava --verbose", "lint": "eslint '**/*.js'", From 02b38d774a2e3db767954c88245c54e779022532 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 00:56:27 -0600 Subject: [PATCH 109/152] chore(board-aux.core): no endo1, so no tofu --- contract/src/platform-goals/board-aux.core.js | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index bca7b6ff..e4e4752e 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -77,34 +77,38 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { * }>} BoardAuxPowers */ +// XXX works for DisplayInfo, i.e. plain JSON struff. +const marshalData = harden({ + toCapData: d => harden({ body: `#${JSON.stringify(d)}`, slots: [] }), + fromCapData: () => Fail`not implemented`, + serialize: () => Fail`not implemented`, + unserialize: () => Fail`not implemented`, +}); + /** * @param {import('./core-types').BootstrapPowers - * & import('./endo1.core').Endo1Space * & BoardAuxPowers * } powers */ export const produceBoardAuxManager = async powers => { const { zone } = powers; - const { board, chainStorage, endo1 } = powers.consume; - const { marshal } = await endo1; - const { makeMarshal } = marshal; - const marshalData = makeMarshal(_val => Fail`data only`); + const { board, chainStorage } = powers.consume; const mgr = makeBoardAuxManager(zone, marshalData, { board, chainStorage }); powers.produce.brandAuxPublisher.reset(); - powers.produce.boardAuxTOFU.reset(); + // TODO: powers.produce.boardAuxTOFU.reset(); powers.produce.boardAuxAdmin.reset(); powers.produce.brandAuxPublisher.resolve(mgr.brandAuxPublisher); - powers.produce.boardAuxTOFU.resolve(mgr.boardAuxTOFU); + // TODO: powers.produce.boardAuxTOFU.resolve(mgr.boardAuxTOFU); powers.produce.boardAuxAdmin.resolve(mgr.boardAuxAdmin); }; export const permit = { zone: true, - consume: { board: true, chainStorage: true, endo1: true }, + consume: { board: true, chainStorage: true }, produce: { brandAuxPublisher: true, - boardAuxTOFU: true, + // TODO: boardAuxTOFU: true, boardAuxAdmin: true, }, }; From d42d13a076f077c1f56fc1e283b58383f2690319 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 00:57:02 -0600 Subject: [PATCH 110/152] WIP(rollup.config): punt on endo1 / marshal --- contract/rollup.config.mjs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index bcc8b3c0..f6907360 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -10,7 +10,6 @@ * - `permit` export is emitted as JSON */ // @ts-check -import { nodeResolve } from '@rollup/plugin-node-resolve'; import { coreEvalGlobals, moduleToScript, @@ -19,7 +18,6 @@ import { } from './tools/rollup-plugin-core-eval.js'; import { permit as postalServicePermit } from './src/postal-service.proposal.js'; import { permit as sellPermit } from './src/sell-concert-tickets-proposal.js'; -import { permit as endo1Permit } from './src/platform-goals/endo1.core.js'; import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js'; /** @@ -43,7 +41,6 @@ const config1 = ({ }, external: ['@endo/far'], plugins: [ - nodeResolve(), ...(contractEntry ? [ configureBundleID({ @@ -60,12 +57,6 @@ const config1 = ({ /** @type {import('rollup').RollupOptions[]} */ const config = [ - config1({ - name: 'endo1', - permit: endo1Permit, - coreEntry: `./src/platform-goals/endo1.core.js`, - contractEntry: null, - }), config1({ name: 'board-aux', permit: boardAuxPermit, From fbffa62ee780b4ebf2118129b475ced8253f87ca Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 14:14:10 -0600 Subject: [PATCH 111/152] build(contract): upgrade @agoric deps to upgrade-14 --- contract/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contract/package.json b/contract/package.json index 0181447d..cf759f89 100644 --- a/contract/package.json +++ b/contract/package.json @@ -19,11 +19,11 @@ "lint:fix": "eslint --fix '**/*.js'" }, "devDependencies": { - "@agoric/deploy-script-support": "^0.10.4-u12.0", + "@agoric/deploy-script-support": "^0.10.4-u14.0", "@agoric/eslint-config": "dev", - "@agoric/smart-wallet": "0.5.3", - "@agoric/vats": "0.15.2-u12.0", - "@agoric/xsnap": "0.14.3-u12.0", + "@agoric/smart-wallet": "0.5.4-u14.0", + "@agoric/vats": "0.15.2-u14.0", + "@agoric/xsnap": "0.14.3-u14.0", "@endo/eslint-plugin": "^0.5.2", "@endo/init": "^0.5.60", "@endo/nat": "^4.1.27", @@ -50,8 +50,8 @@ "typescript": "~5.2.2" }, "dependencies": { - "@agoric/ertp": "^0.16.3-u12.0", - "@agoric/zoe": "^0.26.3-u12.0", + "@agoric/ertp": "^0.16.3-u14.0", + "@agoric/zoe": "^0.26.3-u14.0", "@endo/bundle-source": "^2.8.0", "@endo/far": "^0.2.22", "@endo/marshal": "^0.8.9", From 817bc8a2ad118155e4c151dfd59384fecccbebe8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 14:14:49 -0600 Subject: [PATCH 112/152] build: match resolutions to agoric-upgrade-14 ... to avoid duplicate modules in mint (sell...) contract --- package.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ad0d868f..27ce668f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,12 @@ ], "resolutions-note": "work-around for https://github.com/Agoric/agoric-sdk/issues/8621", "resolutions": { - "ses": "1.3.0", + "ses": "0.18.4", + "@agoric/assert": "0.6.1-u11wf.0", + "@agoric/ertp": "0.16.3-u14.0", + "@agoric/store": "0.9.3-u14.0", + "@agoric/xsnap": "0.14.3-u14.0", + "@agoric/vat-data": "0.5.3-u14.0", "@endo/bundle-source": "2.5.2-upstream-rollup", "@endo/captp": "3.1.1", "@endo/compartment-mapper": "0.8.4", @@ -31,10 +36,7 @@ "@endo/check-bundle": "0.2.18", "@endo/ses-ava": "0.2.40", "@endo/netstring": "0.3.26", - "@endo/stream-node": "0.2.26", - "@agoric/xsnap": "0.14.3-u12.0", - "@babel/code-frame": "7.18.6", - "@babel/highlight": "7.22.5" + "@endo/stream-node": "0.2.26" }, "scripts": { "postinstall": "patch-package", From 3155b7a936c70ca9b5a1ccfcaa39c7e33913fdd2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 14:18:48 -0600 Subject: [PATCH 113/152] chore(sell-concert-tickets.proposal): follow .proposal.js pattern --- ...ncert-tickets-proposal.js => sell-concert-tickets.proposal.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contract/src/{sell-concert-tickets-proposal.js => sell-concert-tickets.proposal.js} (100%) diff --git a/contract/src/sell-concert-tickets-proposal.js b/contract/src/sell-concert-tickets.proposal.js similarity index 100% rename from contract/src/sell-concert-tickets-proposal.js rename to contract/src/sell-concert-tickets.proposal.js From ed165fce8ab1e624b11940fa02cdc94837995cfb Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 14:19:54 -0600 Subject: [PATCH 114/152] chore(rollup.config): .proposal.js pattern for sell-concert-tickets --- contract/rollup.config.mjs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index f6907360..bcf851c6 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -17,7 +17,7 @@ import { emitPermit, } from './tools/rollup-plugin-core-eval.js'; import { permit as postalServicePermit } from './src/postal-service.proposal.js'; -import { permit as sellPermit } from './src/sell-concert-tickets-proposal.js'; +import { permit as sellPermit } from './src/sell-concert-tickets.proposal.js'; import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js'; /** @@ -26,7 +26,7 @@ import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js */ const config1 = ({ name, - coreEntry, + coreEntry = `./src/${name}.proposal.js`, contractEntry = `./src/${name}.contract.js`, coreScript = `bundles/deploy-${name}.js`, permitFile = `deploy-${name}-permit.json`, @@ -65,12 +65,10 @@ const config = [ }), config1({ name: 'sell-concert-tickets', - coreEntry: `./src/sell-concert-tickets-proposal.js`, permit: sellPermit, }), config1({ name: 'postal-service', - coreEntry: `./src/postal-service.proposal.js`, permit: postalServicePermit, }), ]; From d53955a4071c392e77a269b67e60b3b065aaa6a3 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 14:20:27 -0600 Subject: [PATCH 115/152] chore(test-sell): .proposal.js convention --- contract/test/test-sell-concert-tickets-contract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index fcb33cac..ada23307 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -18,7 +18,7 @@ import { startSellConcertTicketsContract, makeInventory, makeTerms, -} from '../src/sell-concert-tickets-proposal.js'; +} from '../src/sell-concert-tickets.proposal.js'; import { bagPrice } from '../src/sell-concert-tickets.contract.js'; import { getBundleId } from '../tools/bundle-tools.js'; import { mockBootstrapPowers } from './boot-tools.js'; From ffa615aa1b74258dbeb67b99e6daefa8e69305b3 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 10 Mar 2024 16:00:49 -0500 Subject: [PATCH 116/152] docs(sell-tickets.proposal) --- contract/src/sell-concert-tickets.proposal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/src/sell-concert-tickets.proposal.js b/contract/src/sell-concert-tickets.proposal.js index 28faa1c8..36060539 100644 --- a/contract/src/sell-concert-tickets.proposal.js +++ b/contract/src/sell-concert-tickets.proposal.js @@ -56,7 +56,7 @@ export const startSellConcertTicketsContract = async ( ) => { console.log('core eval for', contractName); const { - // separate line for bundling + // must be supplied by caller or template-replaced bundleID = Fail`no bundleID`, } = config?.options?.[contractName] ?? {}; From f17cb82243c7c0cab3a019a2d1ec4c8a8155e85a Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 02:19:38 -0600 Subject: [PATCH 117/152] test(test-sell): test permits - allow Promise - never mind endo1 --- .../test-sell-concert-tickets-contract.js | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/contract/test/test-sell-concert-tickets-contract.js b/contract/test/test-sell-concert-tickets-contract.js index ada23307..05e21d23 100644 --- a/contract/test/test-sell-concert-tickets-contract.js +++ b/contract/test/test-sell-concert-tickets-contract.js @@ -18,12 +18,16 @@ import { startSellConcertTicketsContract, makeInventory, makeTerms, + permit, } from '../src/sell-concert-tickets.proposal.js'; import { bagPrice } from '../src/sell-concert-tickets.contract.js'; import { getBundleId } from '../tools/bundle-tools.js'; import { mockBootstrapPowers } from './boot-tools.js'; -import { produceEndoModules } from '../src/platform-goals/endo1.core.js'; -import { produceBoardAuxManager } from '../src/platform-goals/board-aux.core.js'; +import { + produceBoardAuxManager, + permit as boardAuxPermit, +} from '../src/platform-goals/board-aux.core.js'; +import { extract } from '@agoric/vats/src/core/utils.js'; /** @typedef {typeof import('../src/sell-concert-tickets.contract.js').start} AssetContractFn */ @@ -103,7 +107,7 @@ test('Start the contract', async t => { * Alice trades by paying the price from the contract's terms. * * @param {import('ava').ExecutionContext} t - * @param {ZoeService} zoe + * @param {ERef} zoe * @param {ERef>} instance * @param {Purse} purse * @param {[string, NatValue][]} choices @@ -229,14 +233,18 @@ test('use the code that will go on chain to start the contract', async t => { // When the BLD staker governance proposal passes, // the startup function gets called. vatAdminState.installBundle(bundleID, bundle); + const sellPowers = extract(permit, powers); + const boardAuxPowers = extract(boardAuxPermit, powers); await Promise.all([ - produceEndoModules(powers), - produceBoardAuxManager(powers), - startSellConcertTicketsContract(powers, { + produceBoardAuxManager(boardAuxPowers), + startSellConcertTicketsContract(sellPowers, { options: { sellConcertTickets: { bundleID } }, }), ]); - const instance = await powers.instance.consume.sellConcertTickets; + /** @type {import('../src/sell-concert-tickets.proposal.js').SellTicketsSpace} */ + // @ts-expect-error cast + const sellSpace = powers; + const instance = await sellSpace.instance.consume.sellConcertTickets; // Now that we have the instance, resume testing as above. const { bundleCache } = t.context; From f20e2596b6a6a8290a20440fbc1bf08b38544f64 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 00:48:04 -0600 Subject: [PATCH 118/152] docs(objectTools): describe functions - refactor: add NonNullish - refactor: use E.when --- contract/src/objectTools.js | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/contract/src/objectTools.js b/contract/src/objectTools.js index 25215842..91203ef3 100644 --- a/contract/src/objectTools.js +++ b/contract/src/objectTools.js @@ -3,7 +3,11 @@ import { E } from '@endo/far'; const { entries, fromEntries } = Object; -/** @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } */ +/** + * Given a record whose values may be promise, return a promise for a record with all the values resolved. + * + * @type { >>(obj: T) => Promise<{ [K in keyof T]: Awaited}> } + */ export const allValues = async obj => { const es = await Promise.all( entries(obj).map(([k, vp]) => E.when(vp, v => [k, v])), @@ -11,7 +15,11 @@ export const allValues = async obj => { return fromEntries(es); }; -/** @type { >(obj: T, f: (v: V) => U) => { [K in keyof T]: U }} */ +/** + * Map a function over the values of a record. + * + * @type { >(obj: T, f: (v: V) => U) => { [K in keyof T]: U }} + */ export const mapValues = (obj, f) => fromEntries( entries(obj).map(([p, v]) => { @@ -20,5 +28,21 @@ export const mapValues = (obj, f) => }), ); -/** @type {(xs: X[], ys: Y[]) => [X, Y][]} */ +/** + * Given 2 arrays that form columns of a table, return an array of the rows. + * + * @type {(xs: X[], ys: Y[]) => [X, Y][]} + */ export const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]); + +/** + * Dynamic check for non-nullish + * + * @template T + * @param {T | null | undefined } x + * @returns {T} + */ +export const NonNullish = x => { + if (x === undefined || x === null) throw assert.error('NonNullish'); + return x; +}; From 42f484f38db835ea757aafd229da9d6cceba163d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 9 Mar 2024 10:17:21 -0600 Subject: [PATCH 119/152] refactor(sell-tickets-proposal): move AmountMath.make --- contract/src/sell-concert-tickets.proposal.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/contract/src/sell-concert-tickets.proposal.js b/contract/src/sell-concert-tickets.proposal.js index 36060539..64733ea2 100644 --- a/contract/src/sell-concert-tickets.proposal.js +++ b/contract/src/sell-concert-tickets.proposal.js @@ -1,7 +1,7 @@ // @ts-check -// import { AmountMath } from '@agoric/ertp/src/amountMath.js'; import { allValues } from './objectTools.js'; import { + AmountMath, installContract, startContract, } from './platform-goals/start-contract.js'; @@ -11,11 +11,6 @@ const { Fail } = assert; const contractName = 'sellConcertTickets'; const IST_UNIT = 1_000_000n; -// avoid bundling from other packages -const AmountMath = { - make: (brand, value) => harden({ brand, value }), -}; - export const makeInventory = (brand, baseUnit) => { return { frontRow: { From 8660ef1ae3ebb912ddf192337ac437ea030d1fad Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 9 Mar 2024 07:51:37 -0600 Subject: [PATCH 120/152] fix(swaparoo.proposal): export permit - add docs to prevent line-wrapping error - get AmountMath from local module - refactor: use installContract(), startContract() helpers --- contract/src/swaparoo.proposal.js | 106 ++++++++++-------------------- 1 file changed, 34 insertions(+), 72 deletions(-) diff --git a/contract/src/swaparoo.proposal.js b/contract/src/swaparoo.proposal.js index 99fa888c..43e4438c 100644 --- a/contract/src/swaparoo.proposal.js +++ b/contract/src/swaparoo.proposal.js @@ -1,8 +1,9 @@ // @ts-check -import { E } from '@endo/far'; -import { AmountMath } from '@agoric/ertp/src/amountMath.js'; - -console.warn('swaparoo.proposal.js module evaluating'); +import { + AmountMath, + installContract, + startContract, +} from './platform-goals/start-contract.js'; const { Fail } = assert; @@ -21,100 +22,61 @@ const contractName = 'swaparoo'; * @param {BootstrapPowers} powers * @param {*} config */ -export const installContract = async (powers, config) => { - console.log('installContract() ...', contractName); - /** @type { BootstrapPowers & SwaparooSpace} */ - // @ts-expect-error cast - const swapPowers = powers; - const { bundleID = Fail`missing bundleID` } = - config.options?.[contractName] || {}; +export const installSwapContract = async (powers, config) => { const { - consume: { zoe }, - installation: { - produce: { [contractName]: produceInstallation }, - }, - } = swapPowers; + // must be supplied at runtime or replaced in template fashion + bundleID = Fail`missing bundleID`, + } = config.options?.[contractName] || {}; - const installation = await E(zoe).installBundleID(bundleID); - produceInstallation.reset(); - produceInstallation.resolve(installation); - console.log(contractName, '(re)installed'); + await installContract(powers, { name: contractName, bundleID }); }; /** * Core eval script to start contract * - * @param {BootstrapPowers} permittedPowers + * @param {BootstrapPowers} powers */ -export const startContract = async permittedPowers => { +export const startSwapContract = async powers => { console.error('startContract()...'); /** @type { BootstrapPowers & SwaparooSpace} */ // @ts-expect-error bootstrap powers evolve with BLD staker governance - const swapPowers = permittedPowers; + const swapPowers = powers; const { - consume: { startUpgradable, namesByAddressAdmin: namesByAddressAdminP }, + consume: { namesByAddressAdmin: namesByAddressAdminP }, brand: { consume: { IST: istBrandP }, }, - installation: { - consume: { [contractName]: installationP }, - }, - instance: { - produce: { [contractName]: produceInstance }, - }, } = swapPowers; const istBrand = await istBrandP; - // NOTE: TODO all terms for the contract go here const oneIST = AmountMath.make(istBrand, 1n); const namesByAddressAdmin = await namesByAddressAdminP; const terms = { feeAmount: oneIST, namesByAddressAdmin }; - const installation = await installationP; - - const { instance } = await E(startUpgradable)({ - installation, - label: contractName, - terms, - }); - console.log('CoreEval script: started game contract', instance); - // const {} = await E(zoe).getTerms(instance); - - console.log('CoreEval script: share via agoricNames: none'); - - produceInstance.reset(); - produceInstance.resolve(instance); + return startContract(powers, { name: contractName, startArgs: { terms } }); +}; - console.log(`${contractName} (re)started`); +export const main = async (powers, config = {}) => { + await installSwapContract(powers, config); + await startSwapContract(powers); }; -/** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifest } */ -const contractManifest = { - [startContract.name]: { +/** @type { import("@agoric/vats/src/core/lib-boot").BootstrapManifestPermit } */ +export const permit = { + consume: { + startUpgradable: true, + namesByAddressAdmin: true, // to convert string addresses to depositFacets + zoe: true, // to install the contract + }, + installation: { + produce: { [contractName]: true }, + consume: { [contractName]: true }, + }, + instance: { produce: { [contractName]: true } }, + brand: { consume: { - startUpgradable: true, - namesByAddressAdmin: true, // to convert string addresses to depositFacets - }, - installation: { consume: { [contractName]: true } }, - instance: { produce: { [contractName]: true } }, - brand: { - consume: { - IST: true, // for use in contract terms - }, + IST: true, // for use in contract terms }, }, }; -harden(contractManifest); - -export const getManifestForContract = ( - { restoreRef }, - { [`${contractName}Ref`]: contractRef }, -) => { - console.log('manifest ref', contractName, contractRef); - return harden({ - manifest: contractManifest, - installations: { - [contractName]: restoreRef(contractRef), - }, - }); -}; +harden(permit); From bd192a117bf1236c61b5d9b8b66713aaf3b5c38c Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 9 Mar 2024 07:44:39 -0600 Subject: [PATCH 121/152] feat(rollup.config): include swaparoo --- contract/rollup.config.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contract/rollup.config.mjs b/contract/rollup.config.mjs index bcf851c6..7c13208e 100644 --- a/contract/rollup.config.mjs +++ b/contract/rollup.config.mjs @@ -17,6 +17,7 @@ import { emitPermit, } from './tools/rollup-plugin-core-eval.js'; import { permit as postalServicePermit } from './src/postal-service.proposal.js'; +import { permit as swapPermit } from './src/swaparoo.proposal.js'; import { permit as sellPermit } from './src/sell-concert-tickets.proposal.js'; import { permit as boardAuxPermit } from './src/platform-goals/board-aux.core.js'; @@ -67,6 +68,7 @@ const config = [ name: 'sell-concert-tickets', permit: sellPermit, }), + config1({ name: 'swaparoo', permit: swapPermit }), config1({ name: 'postal-service', permit: postalServicePermit, From fd3495b602be4f84da2ede9b9c21c80bc36feca2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 10 Mar 2024 16:00:29 -0500 Subject: [PATCH 122/152] fix(postal-service.proposal): permit consume installation too --- contract/src/postal-service.proposal.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contract/src/postal-service.proposal.js b/contract/src/postal-service.proposal.js index 3d9d3574..45187a03 100644 --- a/contract/src/postal-service.proposal.js +++ b/contract/src/postal-service.proposal.js @@ -31,7 +31,7 @@ export const startPostalService = async (powers, config) => { consume: { namesByAddressAdmin, agoricNames }, } = powers; const { - // separate line for bundling + // must be supplied by caller or template-replaced bundleID = Fail`no bundleID`, issuerNames = ['IST', 'Invitation', 'BLD', 'ATOM'], } = config?.options?.[contractName] ?? {}; @@ -62,10 +62,12 @@ export const manifest = /** @type {const} */ ({ agoricNames: true, namesByAddress: true, namesByAddressAdmin: true, + startUpgradable: true, zoe: true, }, installation: { produce: { postalService: true }, + consume: { postalService: true }, }, instance: { produce: { postalService: true }, From e7f9c977ad3daca40e14e6bce9c40bc0f516b98d Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 17:31:00 -0600 Subject: [PATCH 123/152] refactor(types): move NonNullChainStorage from test/ to src/ --- contract/src/types.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 contract/src/types.js diff --git a/contract/src/types.js b/contract/src/types.js new file mode 100644 index 00000000..86064bf1 --- /dev/null +++ b/contract/src/types.js @@ -0,0 +1,10 @@ +import '@agoric/vats/src/core/types'; + +/** + * In agoric-sdk, the BootstrapPowers.consume['chainStorage'] type includes undefined because + * of some historical testing practices. It's tedious and unnecessary + * to check for undefined, so here we override the type to say that it's + * never undefined. + * + * @typedef {PromiseSpaceOf<{ chainStorage: StorageNode }>} NonNullChainStorage + */ From 1e689d4f094c1cbdd41f3e0a50d931f4f321859e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sun, 10 Mar 2024 14:51:40 -0500 Subject: [PATCH 124/152] feat(lib-agd): show agd tx commands --- contract/tools/agd-lib.js | 1 + 1 file changed, 1 insertion(+) diff --git a/contract/tools/agd-lib.js b/contract/tools/agd-lib.js index 060677b2..440f9429 100644 --- a/contract/tools/agd-lib.js +++ b/contract/tools/agd-lib.js @@ -119,6 +119,7 @@ export const makeAgd = ({ execFileSync }) => { ...(yes ? ['--yes'] : []), ...outJson, ]; + console.log('$$$', agdBinary, ...args); const out = exec(args); try { const detail = JSON.parse(out); From 169fe128ecdad207e25ffd57be491133e182c1c8 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 00:48:30 -0600 Subject: [PATCH 125/152] refactor(deploy-contract): NonNullish moved --- contract/scripts/deploy-contract.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/contract/scripts/deploy-contract.js b/contract/scripts/deploy-contract.js index 439b4b90..774ad818 100755 --- a/contract/scripts/deploy-contract.js +++ b/contract/scripts/deploy-contract.js @@ -27,16 +27,6 @@ Options: --workdir DIR workdir for docker service (default: ${opt0.workdir}) `; -/** - * @template T - * @param {T | null | undefined } x - * @returns {T} - */ -const NonNullish = x => { - if (x === undefined || x === null) throw assert.error('NonNullish'); - return x; -}; - /** * @param {string[]} argv * @param {{ [k: string]: boolean | [] | undefined }} [style] @@ -70,7 +60,7 @@ const getopts = (argv, style = {}) => { const mockExecutionContext = () => { const withSkip = o => Object.assign(o, { - skip: (...xs) => {}, + skip: (..._xs) => {}, }); return { log: withSkip((...args) => console.log(...args)), From 0df4a882ef81af6d5870a0c08f4ba9ad190405a0 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 01:35:21 -0600 Subject: [PATCH 126/152] refactor(boot-tools): NonNullChainStorage moved to src/ --- contract/test/boot-tools.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index 95a15d8b..b077fc1a 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -18,15 +18,6 @@ import { getBundleId } from '../tools/bundle-tools.js'; const { entries } = Object; -/** - * In agoric-sdk, the BootstrapPowers.consume['chainStorage'] type includes undefined because - * of some historical testing practices. It's tedious and unnecessary - * to check for undefined, so here we override the type to say that it's - * never undefined. - * - * @typedef {PromiseSpaceOf<{ chainStorage: StorageNode }>} NonNullChainStorage - */ - /** * Make powers (zoe, timer and name services, etc.) sufficient to test * deploying and using contracts. priceAuthority is a dummy. @@ -103,7 +94,7 @@ export const mockBootstrapPowers = async ( produce.priceAuthority.resolve(Far('NullPriceAuthority', {})); /** - * @type {BootstrapPowers & NonNullChainStorage} + * @type {BootstrapPowers & import('../src/types').NonNullChainStorage} */ // @ts-expect-error mock const powers = { produce, consume, ...spaces, zone }; From 46d44336abada81b4473f00425094e27e12be8fa Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 02:39:14 -0600 Subject: [PATCH 127/152] docs(endo1.core): punt core-types --- contract/src/platform-goals/endo1.core.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contract/src/platform-goals/endo1.core.js b/contract/src/platform-goals/endo1.core.js index f17e04f0..e72a454b 100644 --- a/contract/src/platform-goals/endo1.core.js +++ b/contract/src/platform-goals/endo1.core.js @@ -9,13 +9,13 @@ import * as patterns from '@endo/patterns'; * patterns: typeof import('@endo/patterns'); * } * }} Endo1Modules - * @typedef {import('./core-types').PromiseSpaceOf} Endo1Space + * @typedef {PromiseSpaceOf} Endo1Space */ /** * Make @endo/marshal, @endo/patterns available to CoreEval scripts. * - * @param {import('./core-types').BootstrapPowers & Endo1Space} permittedPowers + * @param {BootstrapPowers & Endo1Space} permittedPowers */ export const produceEndoModules = permittedPowers => { const { produce } = permittedPowers; @@ -23,7 +23,7 @@ export const produceEndoModules = permittedPowers => { produce.endo1.resolve(endo); }; -/** @type {import('./core-types').BootstrapManifestPermit} */ +/** @type {import('@agoric/vats/src/core/lib-boot').BootstrapManifestPermit} */ export const permit = { /** @type {Record} */ produce: { endo1: true }, From 1420256921529e8ee089d6dd26e2cc0229c579b1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 02:39:50 -0600 Subject: [PATCH 128/152] docs(board-aux.core): move refine type to callee; punt core-types - refactor: export marshalData for testing --- contract/src/platform-goals/board-aux.core.js | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index e4e4752e..bcb1d953 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -4,19 +4,20 @@ import { E, Far } from '@endo/far'; const { Fail } = assert; // vstorage paths under published.* -const BOARD_AUX = 'boardAux'; +// and zone store key +export const BOARD_AUX = 'boardAux'; /** * @param {import('@agoric/zone').Zone} zone * @param {Marshaller} marshalData * @param {{ - * board: ERef; + * board: ERef; * chainStorage: ERef; * }} powers */ export const makeBoardAuxManager = (zone, marshalData, powers) => { const { board, chainStorage } = powers; - const store = zone.mapStore('boardAux'); + const store = zone.mapStore(BOARD_AUX); const boardAux = E(chainStorage).makeChildNode(BOARD_AUX); const formatValue = value => { @@ -70,37 +71,40 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { /** @typedef {BoardAuxManager['boardAuxAdmin']} BoardAuxAdmin */ /** - * @typedef {import('./core-types').PromiseSpaceOf<{ + * @typedef {PromiseSpaceOf<{ * brandAuxPublisher: BrandAuxPublisher; * boardAuxTOFU: BoardAuxTOFU; * boardAuxAdmin: BoardAuxAdmin; * }>} BoardAuxPowers */ -// XXX works for DisplayInfo, i.e. plain JSON struff. -const marshalData = harden({ +// works for DisplayInfo, i.e. plain JSON struff. +export const marshalData = harden({ toCapData: d => harden({ body: `#${JSON.stringify(d)}`, slots: [] }), fromCapData: () => Fail`not implemented`, serialize: () => Fail`not implemented`, unserialize: () => Fail`not implemented`, }); -/** - * @param {import('./core-types').BootstrapPowers - * & BoardAuxPowers - * } powers - */ +/** @param {BootstrapPowers} powers */ export const produceBoardAuxManager = async powers => { const { zone } = powers; - const { board, chainStorage } = powers.consume; + const { board } = powers.consume; + /** @type {import('../types').NonNullChainStorage['consume']} */ + // @ts-expect-error cast + const { chainStorage } = powers.consume; + + /** @type {BoardAuxPowers['produce']} */ + // @ts-expect-error cast + const produce = powers.produce; const mgr = makeBoardAuxManager(zone, marshalData, { board, chainStorage }); - powers.produce.brandAuxPublisher.reset(); + produce.brandAuxPublisher.reset(); // TODO: powers.produce.boardAuxTOFU.reset(); - powers.produce.boardAuxAdmin.reset(); - powers.produce.brandAuxPublisher.resolve(mgr.brandAuxPublisher); + produce.boardAuxAdmin.reset(); + produce.brandAuxPublisher.resolve(mgr.brandAuxPublisher); // TODO: powers.produce.boardAuxTOFU.resolve(mgr.boardAuxTOFU); - powers.produce.boardAuxAdmin.resolve(mgr.boardAuxAdmin); + produce.boardAuxAdmin.resolve(mgr.boardAuxAdmin); }; export const permit = { From 331f210803417312280bfbfc1a5609071c4b0808 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 8 Mar 2024 02:37:51 -0600 Subject: [PATCH 129/152] chore(sell-concert-tickets-proposal): powers types --- contract/src/platform-goals/core-types.d.ts | 58 ------------------- contract/src/sell-concert-tickets.proposal.js | 1 + 2 files changed, 1 insertion(+), 58 deletions(-) delete mode 100644 contract/src/platform-goals/core-types.d.ts diff --git a/contract/src/platform-goals/core-types.d.ts b/contract/src/platform-goals/core-types.d.ts deleted file mode 100644 index 162b5df6..00000000 --- a/contract/src/platform-goals/core-types.d.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { Zone } from '@agoric/zone'; - -// XXX how to import types from @agoric/vats? -// cf. https://github.com/Agoric/agoric-sdk/blob/master/packages/vats/src/core/types-ambient.d.ts -type Board = { getId: (key: unknown) => string }; - -type WellKnown = { - asset: 'BLD' | 'IST'; - contract: 'VaultFactory' | 'FeeDistributor'; -}; - -// TODO: include AssetKind { IST: 'nat', ... } -type AssetsSpace = { - brand: PromiseSpaceOf>; - issuer: PromiseSpaceOf>; -}; - -// TODO: include contract start function types -type ContractSpace = { - installation: PromiseSpaceOf>; - instance: PromiseSpaceOf>; -}; - -type WellKnownSpaces = AssetsSpace & - ContractSpace; - -type BootstrapSpace = PromiseSpaceOf<{ - chainStorage: StorageNode; - board: Board; - startUpgradable: (...args: unknown[]) => any; - zoe: ZoeService; -}>; - -type BootstrapPowers = BootstrapSpace & - WellKnownSpaces & { - zone: Zone; - }; - -type Producer = { - resolve: (v: ERef) => void; - reject: (r: unknown) => void; - reset: (reason?: unknown) => void; -}; - -/** - * @template B - Bidirectional - * @template C - Consume only - * @template P - Produce only - */ -type PromiseSpaceOf = { - consume: { [K in keyof (B & C)]: Promise<(B & C)[K]> }; - produce: { [K in keyof (B & P)]: Producer<(B & P)[K]> }; -}; - -type BootstrapManifestPermit = - | true - | string - | { [key: string]: BootstrapManifestPermit }; diff --git a/contract/src/sell-concert-tickets.proposal.js b/contract/src/sell-concert-tickets.proposal.js index 64733ea2..56f4c06b 100644 --- a/contract/src/sell-concert-tickets.proposal.js +++ b/contract/src/sell-concert-tickets.proposal.js @@ -43,6 +43,7 @@ export const makeTerms = (brand, baseUnit) => { * @typedef {{ * brand: PromiseSpaceOf<{ Ticket: Brand }>; * issuer: PromiseSpaceOf<{ Ticket: Issuer }>; + * instance: PromiseSpaceOf<{ sellConcertTickets: Instance }> * }} SellTicketsSpace */ export const startSellConcertTicketsContract = async ( From 77c4b3690925f5e8323011e983bf5ac4d216286f Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Sat, 9 Mar 2024 07:46:45 -0600 Subject: [PATCH 130/152] feat(start-contract): sanitizePathSegment (for gov) - docs: describe functions - refactor: move AmountMath.make --- contract/src/platform-goals/start-contract.js | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/contract/src/platform-goals/start-contract.js b/contract/src/platform-goals/start-contract.js index 0e7d3294..f72bb25f 100644 --- a/contract/src/platform-goals/start-contract.js +++ b/contract/src/platform-goals/start-contract.js @@ -1,12 +1,15 @@ -/** - * @file core eval script* to start typical contracts. - */ +/** @file utilities to start typical contracts in core eval scripts. */ // @ts-check import { E } from '@endo/far'; +const { Fail } = assert; + /** - * @param {BootstrapPowers} powers + * Given a bundleID and a permitted name, install a bundle and "produce" + * the installation, which also publishes it via agoricNames. + * + * @param {BootstrapPowers} powers - zoe, installation.produce[name] * @param {{ name: string, bundleID: string }} opts */ export const installContract = async ( @@ -16,12 +19,17 @@ export const installContract = async ( const installation = await E(zoe).installBundleID(bundleID); produceInstallation[name].reset(); produceInstallation[name].resolve(installation); - console.log(name, 'installed as', bundleID.slice(0, 8)); + console.log(name, '(re-)installed as', bundleID.slice(0, 8)); return installation; }; /** - * @param {BootstrapPowers} powers + * Given a permitted name, start a contract instance; save upgrade info; publish instance. + * Optionally: publish issuers/brands. + * + * Note: publishing brands requires brandAuxPublisher from board-aux.core.js. + * + * @param {BootstrapPowers} powers - consume.startUpgradable, installation.consume[name], instance.produce[name] * @param {{ * name: string; * startArgs?: StartArgs; @@ -82,3 +90,34 @@ export const startContract = async ( return started; }; + +/** + * In order to avoid linking from other packages, we + * provide a work-alike for AmountMath.make and use tests to check equivalence. + * + * Note that this version doesn't do as much input validation. + */ +export const AmountMath = { + /** + * @template {AssetKind} K + * @param {Brand} brand + * @param {*} value + */ + make: (brand, value) => harden({ brand, value }), +}; + +const pathSegmentPattern = /^[a-zA-Z0-9_-]{1,100}$/; + +/** @type {(name: string) => void} */ +export const assertPathSegment = name => { + pathSegmentPattern.test(name) || + Fail`Path segment names must consist of 1 to 100 characters limited to ASCII alphanumerics, underscores, and/or dashes: ${name}`; +}; +harden(assertPathSegment); + +/** @type {(name: string) => string} */ +export const sanitizePathSegment = name => { + const candidate = name.replace(/[ ,]/g, '_'); + assertPathSegment(candidate); + return candidate; +}; From eb6b21d57aed3fb47bbdc89e7d789bf4c14ff218 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 12 Mar 2024 15:12:26 -0500 Subject: [PATCH 131/152] test(test-swap-wallet): test permit - bundle-tools moved from test/ to tools/ --- contract/test/test-swap-wallet.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index 89d3cb6a..0d4bb9ee 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -4,11 +4,16 @@ import { createRequire } from 'node:module'; import { E } from '@endo/far'; import { AmountMath } from '@agoric/ertp'; +import { extract } from '@agoric/vats/src/core/utils.js'; import { mockBootstrapPowers } from './boot-tools.js'; -import { installContract, startContract } from '../src/swaparoo.proposal.js'; +import { + installSwapContract, + permit, + startSwapContract, +} from '../src/swaparoo.proposal.js'; import { makeStableFaucet } from './mintStable.js'; import { mockWalletFactory, seatLike } from './wallet-tools.js'; -import { getBundleId, makeBundleCacheContext } from './bundle-tools.js'; +import { getBundleId, makeBundleCacheContext } from '../tools/bundle-tools.js'; /** @typedef {import('./wallet-tools.js').MockWallet} MockWallet */ @@ -36,9 +41,10 @@ test.serial('bootstrap and start contract', async t => { t.log('install contract'); const config = { options: { [contractName]: { bundleID } } }; - await installContract(powers, config); // `agoric run` style proposal does this for us + const swapPowers = extract(permit, powers); + await installSwapContract(swapPowers, config); // `agoric run` style proposal does this for us t.log('start contract'); - await startContract(powers); + await startSwapContract(swapPowers); const instance = await powers.instance.consume[contractName]; t.log(instance); From 738371ce54bd02950f17e0b101e3eb0bbdf96ca1 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 12 Mar 2024 15:13:11 -0500 Subject: [PATCH 132/152] build: lock packages with agoric-upgrade-14 resolutions --- yarn.lock | 3080 +++++++++++++++++++++++++---------------------------- 1 file changed, 1461 insertions(+), 1619 deletions(-) diff --git a/yarn.lock b/yarn.lock index 97653820..113d1d32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,12 +25,7 @@ n-readlines "^1.0.0" tmp "^0.2.1" -"@agoric/assert@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@agoric/assert/-/assert-0.6.0.tgz#43ede53cf0943f3e9038f597f776e52500446e41" - integrity sha512-bpY9ul5egbVlmdf9RtDfxh1WQaDSOCzqcAxyqE771rbkv+QYs46oZc4oUVHi7wt3g5LVXj/JsKgLkJEKpEl1BA== - -"@agoric/assert@^0.6.1-u11wf.0": +"@agoric/assert@0.6.1-u11wf.0", "@agoric/assert@^0.6.0", "@agoric/assert@^0.6.1-u11wf.0": version "0.6.1-u11wf.0" resolved "https://registry.yarnpkg.com/@agoric/assert/-/assert-0.6.1-u11wf.0.tgz#742ae27103547b41cdbb3f17c4f09922a2d639e2" integrity sha512-z/uq9ZkWWsBwMYLWg/X4AxEWwKv7HYU+0dCM98SZW8REK5BPhF/Vy9u0AuFLP8kwPdpp7WroYOSIVZ6xhLz0TQ== @@ -57,14 +52,14 @@ "@endo/marshal" "^0.8.5" "@agoric/cache@^0.3.3-u12.0": - version "0.3.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/cache/-/cache-0.3.3-u12.0.tgz#b319cf7d195fcc702b317c521efbbd01261db1d5" - integrity sha512-kqTT03478gf8OL8kNow7H2YGejotSzA7P+ompjV0Cfk4DNqRE6vyL2VdS7Skcykg+PDpRCiGspUzGEmyEkeAFQ== - dependencies: - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" + version "0.3.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/cache/-/cache-0.3.3-u14.0.tgz#12b344dcdb2c0006682686cb10b5dcb5e27f4926" + integrity sha512-ZbEQxKVRGOz+JKBMjdeewhpDHY3FloRk8JFEhnJgKON35UlSkEZXvj7UwH+UHguno/TnhBZkkxcII28+8BNUrQ== + dependencies: + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" @@ -88,35 +83,15 @@ "@endo/promise-kit" "^0.2.56" node-fetch "^2.6.0" -"@agoric/casting@^0.4.3-u12.0": - version "0.4.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/casting/-/casting-0.4.3-u12.0.tgz#c1e8e0db4ebffecea31cf73aa298ba038140ad95" - integrity sha512-3MUzd378UIx5TPLgAcUV4BSRcFU4/KsBqYUur8qK1eMY3eAqpg/gPOu9PoQzQVrZqEELWYu18W0PQXAIcMviyQ== +"@agoric/casting@^0.4.3-u12.0", "@agoric/casting@^0.4.3-u13.0", "@agoric/casting@^0.4.3-u14.0": + version "0.4.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/casting/-/casting-0.4.3-u14.0.tgz#77206ca6aad3f62acbdc48ab913f65ec3b30e70a" + integrity sha512-LzbtDYIBowClaib/rwjoMZQXa0s2V9MSOC/fa7XDjVRva2CXcUoYGNJn5DoyfIcWq/D8KFMKRRl0r8CBO45b2g== dependencies: - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/spawner" "^0.6.9-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@cosmjs/encoding" "^0.30.1" - "@cosmjs/proto-signing" "^0.30.1" - "@cosmjs/stargate" "^0.30.1" - "@cosmjs/tendermint-rpc" "^0.30.1" - "@endo/far" "0.2.18" - "@endo/init" "0.5.56" - "@endo/lockdown" "0.1.28" - "@endo/marshal" "0.8.5" - "@endo/promise-kit" "0.2.56" - node-fetch "^2.6.0" - -"@agoric/casting@^0.4.3-u13.0": - version "0.4.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/casting/-/casting-0.4.3-u13.0.tgz#34c3df62e2455e139f548915190616771e57c9e1" - integrity sha512-c9Y9jaJ3w6oEl/6FUCA8TZnrLZEV6Lv9tn1g4of6H09EN0CBgSTqLqON+WV8Tobs3pxglYLGNJnT8DefOu0lBA== - dependencies: - "@agoric/internal" "^0.4.0-u13.0" - "@agoric/notifier" "^0.6.3-u13.0" - "@agoric/spawner" "^0.6.9-u13.0" - "@agoric/store" "^0.9.3-u13.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/spawner" "^0.6.9-u14.0" + "@agoric/store" "^0.9.3-u14.0" "@cosmjs/encoding" "^0.30.1" "@cosmjs/proto-signing" "^0.30.1" "@cosmjs/stargate" "^0.30.1" @@ -135,18 +110,18 @@ dependencies: protobufjs "^7.0.0" -"@agoric/deploy-script-support@^0.10.4-u12.0": - version "0.10.4-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/deploy-script-support/-/deploy-script-support-0.10.4-u12.0.tgz#6f92da96b9689d11957864eb84180fadab704b2b" - integrity sha512-d6E9Uqd/yEKY5fmKCBF0LPZGcWjeCjIofA6uDfcNw72BLerj/wjkXTZDAz4cIOFYjYkDdXD40sTIHaaRiMLGLg== +"@agoric/deploy-script-support@^0.10.4-u14.0", "@agoric/deploy-script-support@^0.10.4-u14.1": + version "0.10.4-u14.1" + resolved "https://registry.yarnpkg.com/@agoric/deploy-script-support/-/deploy-script-support-0.10.4-u14.1.tgz#ca536d53a4a970866c632e03271f253756daea65" + integrity sha512-57LgqwuYRSv5wBvqFjcnQUUs5DE9rSFVXPWHYcOMgPedvq8JSb2ZdNkShXs3N2dO0EeVZiyRNdIpIe8eEx2oUg== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/import-manager" "^0.3.12-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/zoe" "^0.26.3-u12.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/import-manager" "^0.3.12-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/zoe" "^0.26.3-u14.0" "@endo/base64" "0.2.31" "@endo/bundle-source" "2.5.2-upstream-rollup" "@endo/far" "0.2.18" @@ -155,32 +130,16 @@ "@endo/promise-kit" "0.2.56" "@endo/zip" "0.2.31" -"@agoric/ertp@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@agoric/ertp/-/ertp-0.16.2.tgz#0e41ffb80a635af9729c65cbcd6158abbf16b83e" - integrity sha512-4+CbrkWw2dCYlVAYH+31jFMlwWqw29bak+Rg6qkMuCAp5BpxyBc4DthdovOjwwOBqkBd3QBKrnvkoD9Ltc3YHQ== - dependencies: - "@agoric/assert" "^0.6.0" - "@agoric/notifier" "^0.6.2" - "@agoric/store" "^0.9.2" - "@agoric/swingset-vat" "^0.32.2" - "@agoric/vat-data" "^0.5.2" - "@endo/eventual-send" "^0.17.2" - "@endo/far" "^0.2.18" - "@endo/marshal" "^0.8.5" - "@endo/nat" "^4.1.27" - "@endo/promise-kit" "^0.2.56" - -"@agoric/ertp@^0.16.3-u12.0": - version "0.16.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/ertp/-/ertp-0.16.3-u12.0.tgz#276efde19131d1f3a339e7d98efee064d9d4ebec" - integrity sha512-g9dzcY94SuOdMi+RGYAffOVA/BmSzTv/t4KzKwZlAUZrgZ2E88z6REnpkvdzT5fK9M+D5PHejjbfwQnyx6upPA== +"@agoric/ertp@0.16.3-u14.0", "@agoric/ertp@^0.16.2", "@agoric/ertp@^0.16.3-u12.0", "@agoric/ertp@^0.16.3-u14.0": + version "0.16.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/ertp/-/ertp-0.16.3-u14.0.tgz#842470a82a5c34b984059f46efaa915e527beee0" + integrity sha512-/63GDygaB2ble+0xwPk50uMnMU6oSH56aCnWTKz4T4sjtfmHs8aTCeHe/p3wM4IvHKFBACfuDg1QTYYV4em8hA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/eventual-send" "0.17.2" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" @@ -188,9 +147,9 @@ "@endo/promise-kit" "0.2.56" "@agoric/eslint-config@dev": - version "0.4.1-dev-92855b2.0" - resolved "https://registry.yarnpkg.com/@agoric/eslint-config/-/eslint-config-0.4.1-dev-92855b2.0.tgz#785047361da1af5956c0555d94867dc2caf837b8" - integrity sha512-tBJnlh4Td/VtMlSzMCRRimwFY7OIIWKmBorjuhDlVbApnoLZGGqQVe6FkbjE+b8S3kJnfoGShAO/jzUxXekjJw== + version "0.4.1-dev-6793c14.0" + resolved "https://registry.yarnpkg.com/@agoric/eslint-config/-/eslint-config-0.4.1-dev-6793c14.0.tgz#f9567fff50ac73be20f3ff32c68a1d638ab509db" + integrity sha512-EmywDT0a5sL4KXKq5F6mhgutp+sbPFVjfnJBDlXR++6pVZ99RXFiFKiKrtf3l0fB5y8SWWuYhuzopxL74klCEQ== "@agoric/eventual-send@^0.14.1": version "0.14.1" @@ -219,21 +178,21 @@ "@endo/nat" "^4.1.27" "@endo/promise-kit" "^0.2.56" -"@agoric/governance@^0.10.4-u12.0": - version "0.10.4-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/governance/-/governance-0.10.4-u12.0.tgz#a78ca768d06e4a450a333353e989ff911d181cc1" - integrity sha512-DRaUUoWG9fyd6itLygExCnj9V6gL64VCjRYalv77hi+GDiyZ7gDnm/CJ4upfLHG5Pi/G8TuV7BKa1LWprtxqAg== +"@agoric/governance@^0.10.4-u14.0", "@agoric/governance@^0.10.4-u14.1": + version "0.10.4-u14.1" + resolved "https://registry.yarnpkg.com/@agoric/governance/-/governance-0.10.4-u14.1.tgz#b98877a7622a62a66cd87fc0196c3eaae4b294c7" + integrity sha512-OJX1Sj7wCiyPYkDQuYil3NbmgH0TkP3XypcajwKFzS0F3nqR8TRYBM2jtxNWDenSLGvxXIuE65Zp04YVMEv+Bw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/time" "^0.3.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@agoric/vats" "^0.15.2-u12.0" - "@agoric/zoe" "^0.26.3-u12.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/vats" "^0.15.2-u14.1" + "@agoric/zoe" "^0.26.3-u14.0" "@endo/captp" "3.1.1" "@endo/eventual-send" "0.17.2" "@endo/far" "0.2.18" @@ -241,10 +200,10 @@ "@endo/nat" "4.1.27" "@endo/promise-kit" "0.2.56" -"@agoric/import-manager@^0.3.12-u12.0": - version "0.3.12-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/import-manager/-/import-manager-0.3.12-u12.0.tgz#0c3e5144ce35c64e2208c2373eafff72ba512f9d" - integrity sha512-p5Cyf8uEpUwsHlRCUSQUnM7rVdn/VBk0vMceo2A4ESKT127HmhYhbggx/4KzmcweU1miFvONglIRcdCyN52EHQ== +"@agoric/import-manager@^0.3.12-u14.0": + version "0.3.12-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/import-manager/-/import-manager-0.3.12-u14.0.tgz#6d3368e3a373692d1e632c71d7228f2260089d4e" + integrity sha512-x/YeuweYncYLVUkDaydbaejqLSzGP1+yaeeKPsz4ioHIp+0T4ARNAzJInvUGyomlwUSXZlE5VQdr3ODZ8gc65w== "@agoric/inter-protocol@^0.16.1": version "0.16.1" @@ -269,27 +228,26 @@ agoric "^0.21.1" jessie.js "^0.3.2" -"@agoric/inter-protocol@^0.16.2-u12.0": - version "0.16.2-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/inter-protocol/-/inter-protocol-0.16.2-u12.0.tgz#7ebcf5e9d8d5d0aa08306ef44413e6e0a5f2704e" - integrity sha512-1MI1FScafG0tzvkLa3HoxlToq7LiQMvw+u4//+Ufbix0e3vwjRvLT2M8vt44Q0+/+23nSV9DjaCUGGL4nzIYeQ== +"@agoric/inter-protocol@^0.16.2-u12.0", "@agoric/inter-protocol@^0.16.2-u14.0", "@agoric/inter-protocol@^0.16.2-u14.1": + version "0.16.2-u14.1" + resolved "https://registry.yarnpkg.com/@agoric/inter-protocol/-/inter-protocol-0.16.2-u14.1.tgz#30b55cf6ff79e1025eb9be3ed649904b42047800" + integrity sha512-eSZnzIF0K+3YoFdBm0J/XYHkTQOBGjEAHVbAEAxEluMXC6p7c7sL3n16zt34Qu1bEd734a1w3S+UOIJ/1UJBpw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/governance" "^0.10.4-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/time" "^0.3.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@agoric/vats" "^0.15.2-u12.0" - "@agoric/zoe" "^0.26.3-u12.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/governance" "^0.10.4-u14.1" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/vats" "^0.15.2-u14.1" + "@agoric/zoe" "^0.26.3-u14.0" "@endo/captp" "3.1.1" "@endo/eventual-send" "0.17.2" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" "@endo/nat" "4.1.27" - agoric "^0.21.2-u12.0" jessie.js "^0.3.2" "@agoric/internal@^0.3.2": @@ -306,26 +264,12 @@ anylogger "^0.21.0" jessie.js "^0.3.2" -"@agoric/internal@^0.4.0-u12.0": - version "0.4.0-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/internal/-/internal-0.4.0-u12.0.tgz#023e2db5397e057f2845aaf4f03a0a72de1399c3" - integrity sha512-cYc18i8w26KYXCDx3EguZKS/QSVC06hu0wDMf/60vQ9YHTDKERYV6iQWg1tbO4+lbinSseTzQH7krkq/WK7cKw== - dependencies: - "@agoric/zone" "^0.2.3-u12.0" - "@endo/far" "0.2.18" - "@endo/marshal" "0.8.5" - "@endo/patterns" "0.2.2" - "@endo/promise-kit" "0.2.56" - "@endo/stream" "0.3.25" - anylogger "^0.21.0" - jessie.js "^0.3.2" - -"@agoric/internal@^0.4.0-u13.0": - version "0.4.0-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/internal/-/internal-0.4.0-u13.0.tgz#ae20303d3e06206debab23f3ce6010bc939a39cb" - integrity sha512-gMl89J2DPorGfsVudaSh5UG7ddWvOA8Y6BUoB1CKOv4ronMFZmjoJwgDQCm24n5FW60T7g31U6xpHHBAklRpWQ== +"@agoric/internal@^0.4.0-u12.0", "@agoric/internal@^0.4.0-u14.0": + version "0.4.0-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/internal/-/internal-0.4.0-u14.0.tgz#72040108fa3af5865e4b67d999a4249650f43979" + integrity sha512-i71iWb2n4PbzteKqZlCGrwC565HWhlRBDxkvWX3iAwDlV6SDj4r70p0BAeeE/YBe653/L0Cuhub7+nNyCZZTSg== dependencies: - "@agoric/zone" "^0.2.3-u13.0" + "@agoric/zone" "^0.2.3-u14.0" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" "@endo/patterns" "0.2.2" @@ -349,32 +293,17 @@ "@endo/marshal" "^0.8.5" "@endo/promise-kit" "^0.2.56" -"@agoric/notifier@^0.6.3-dev-8c14632.0", "@agoric/notifier@^0.6.3-u12.0": - version "0.6.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/notifier/-/notifier-0.6.3-u12.0.tgz#521393a073ca7f5c900af3dd818061a928d26089" - integrity sha512-9axwVeBHTZhvkSeK73+xDaEQAYk75tIH71/Diw98rohWiaJ2ZcHZgiwlgn4CLC+++bY312cxAGKDiuLtU6CedA== +"@agoric/notifier@^0.6.3-dev-8c14632.0", "@agoric/notifier@^0.6.3-u14.0": + version "0.6.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/notifier/-/notifier-0.6.3-u14.0.tgz#a0ba91815bf96b524d12e95340f294d2f4d55a38" + integrity sha512-lYGO/Bq6VjTBJAyPrjljC0BOmD78+v0LX+9iQbbIuy8F8LtK/YZHse9o+R0ub49QihCBOqDAPoJ+xGoLl2Ursw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swing-store" "^0.9.2-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@endo/far" "0.2.18" - "@endo/marshal" "0.8.5" - "@endo/promise-kit" "0.2.56" - -"@agoric/notifier@^0.6.3-u13.0": - version "0.6.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/notifier/-/notifier-0.6.3-u13.0.tgz#fe9bfd05dd3bb2af459ef44e231ddacc995c4cf8" - integrity sha512-H/DOZ6KY/c+k+aWAT0vOnlO+vtSJlO7XKK8TMDImxExzRNZ0AXyTHVfLgPBmoUaqCxx6d9tupN7Do25PBvvPHg== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" - "@agoric/store" "^0.9.3-u13.0" - "@agoric/swing-store" "^0.9.2-u13.0" - "@agoric/swingset-vat" "^0.32.3-u13.0" - "@agoric/vat-data" "^0.5.3-u13.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swing-store" "^0.9.2-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" "@endo/promise-kit" "0.2.56" @@ -398,14 +327,36 @@ "@agoric/assert" "^0.6.0" "@endo/marshal" "^0.8.5" -"@agoric/sharing-service@^0.2.12-u12.0": - version "0.2.12-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/sharing-service/-/sharing-service-0.2.12-u12.0.tgz#f4aeeda64906641f7136b3a2d3245a07961ba588" - integrity sha512-bK8HMO2aEdHJAkuPk6EabFXTC1XeohVllPabAB/NxaviFBNHxb83iQAy0/6tDDakSTIcgKY8n+k9NvsQi0eyOg== +"@agoric/sharing-service@^0.2.12-u14.0": + version "0.2.12-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/sharing-service/-/sharing-service-0.2.12-u14.0.tgz#4256c6b2945941f80b62ea5e1e2e3a73fb5beac6" + integrity sha512-kOwIkNbKtv93EDZOh5hf2Lr+vi7JnaN3gvkCLuccuR0vD0/OgzRb3UdWwklIoNnmLrGCMhj9pp7KnOJuKdPilw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" "@endo/marshal" "0.8.5" +"@agoric/smart-wallet@0.5.4-u14.0": + version "0.5.4-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/smart-wallet/-/smart-wallet-0.5.4-u14.0.tgz#4848f3a246ee17a4f0413f51ade22c39c475d34c" + integrity sha512-b6+usMizPv3s1bl1XfkM9e+tY0p6dn01t6c2xOuSOUjIo5S7ojy56i45svGaj4LbcdZb8kxDzCzUwPZi98DTWQ== + dependencies: + "@agoric/assert" "^0.6.1-u11wf.0" + "@agoric/casting" "^0.4.3-u14.0" + "@agoric/deploy-script-support" "^0.10.4-u14.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/vats" "^0.15.2-u14.0" + "@agoric/zoe" "^0.26.3-u14.0" + "@endo/eventual-send" "0.17.2" + "@endo/far" "0.2.18" + "@endo/marshal" "0.8.5" + "@endo/nat" "4.1.27" + "@endo/promise-kit" "0.2.56" + "@agoric/smart-wallet@^0.5.3": version "0.5.3" resolved "https://registry.yarnpkg.com/@agoric/smart-wallet/-/smart-wallet-0.5.3.tgz#a58f31d71e547bdb6d8944162d455f5ce6b16b1e" @@ -428,20 +379,21 @@ "@endo/promise-kit" "^0.2.56" "@agoric/smart-wallet@^0.5.4-u12.0": - version "0.5.4-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/smart-wallet/-/smart-wallet-0.5.4-u12.0.tgz#b1a65d85f08d974cafcafafccee9fcf59a0f02ec" - integrity sha512-FR0XPiHWHV1YXnn4okPDjQL5OzjQG5OwoRx6+PZ1rpIHAB8GBSK+OjtvkVSafg/Tl7hzlUN6/wWtwiW0kl3PCg== + version "0.5.4-u14.1" + resolved "https://registry.yarnpkg.com/@agoric/smart-wallet/-/smart-wallet-0.5.4-u14.1.tgz#d11b27423c0a03a6cb6c4dee4474443204d1033e" + integrity sha512-0VGtUD4kBBpAlZawYyEyJa/IbI5E93mbKesbH6otHIgjhKrQlXqEY4Yes8bduISTS8X2yN1bN0urq0ngrobxBw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/casting" "^0.4.3-u12.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@agoric/vats" "^0.15.2-u12.0" - "@agoric/zoe" "^0.26.3-u12.0" + "@agoric/casting" "^0.4.3-u14.0" + "@agoric/deploy-script-support" "^0.10.4-u14.1" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/vats" "^0.15.2-u14.1" + "@agoric/zoe" "^0.26.3-u14.0" "@endo/eventual-send" "0.17.2" "@endo/far" "0.2.18" "@endo/marshal" "0.8.5" @@ -458,57 +410,20 @@ "@endo/import-bundle" "^0.3.4" "@endo/marshal" "^0.8.5" -"@agoric/spawner@^0.6.9-u12.0": - version "0.6.9-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/spawner/-/spawner-0.6.9-u12.0.tgz#2bd62b1769ecec59f016cc309500746b3a3270af" - integrity sha512-2/N7RyuO/LmazjXaOxSifuk48Asqo9y4AHTDMMcK+dA/JbPDexi4tDk2w82IuvMG5A/l+eiKio1umRqShRUJwQ== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@endo/eventual-send" "0.17.2" - "@endo/import-bundle" "0.3.4" - "@endo/marshal" "0.8.5" - -"@agoric/spawner@^0.6.9-u13.0": - version "0.6.9-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/spawner/-/spawner-0.6.9-u13.0.tgz#d1754c9abe392458b5050bd178c1a6d8163d08b5" - integrity sha512-gVlb5S3tEfHe9KByrrbhDipUjYaeGq7W1VQQWMSf6pNHTbnXLGHX3My9QyYvetcHreMA8AJpXqqi29eq9YoiWw== +"@agoric/spawner@^0.6.9-u14.0": + version "0.6.9-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/spawner/-/spawner-0.6.9-u14.0.tgz#5446a0583483da4220be39f0154f98a53ce452e3" + integrity sha512-U4bzpKQjSV9jeoUC6K+jDQFVXCVkp5BjhbdBab5FhW3eQz+Hq1JL+fqNKY929ckWYloQRW/mefPzUfL3INQZFA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" "@endo/eventual-send" "0.17.2" "@endo/import-bundle" "0.3.4" "@endo/marshal" "0.8.5" -"@agoric/store@^0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@agoric/store/-/store-0.9.2.tgz#0973e57b8811a70923c141fccfb002bbad8fed4b" - integrity sha512-9YtBlQG1cO7COfprPqBUYDW1Jg805Ick1RHm8Etj5VyfkhF8emhv/OqJKi4FMlA3XDVL3Yvbptrjvdo1WjCvjg== - dependencies: - "@agoric/assert" "^0.6.0" - "@agoric/internal" "^0.3.2" - "@endo/eventual-send" "^0.17.2" - "@endo/exo" "^0.2.2" - "@endo/far" "^0.2.18" - "@endo/marshal" "^0.8.5" - "@endo/pass-style" "^0.1.3" - "@endo/patterns" "^0.2.2" - "@endo/promise-kit" "^0.2.56" - "@fast-check/ava" "^1.1.3" - -"@agoric/store@^0.9.3-u12.0": - version "0.9.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/store/-/store-0.9.3-u12.0.tgz#978a103a40db94e657c53a7ae41a58aa7c3f5845" - integrity sha512-sfeBee4BqZ1SEpI7h4uCCKeHHLa8AQzXvWyUhAEsPdLFdDGzF0hl0YzblNbjq095C1vs6rt9jFehVGco1eltZQ== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@endo/exo" "0.2.2" - "@endo/marshal" "0.8.5" - "@endo/pass-style" "0.1.3" - "@endo/patterns" "0.2.2" - -"@agoric/store@^0.9.3-u13.0": - version "0.9.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/store/-/store-0.9.3-u13.0.tgz#74cb56021aaa7ab137400dfe2652e2f278f421e2" - integrity sha512-ec7dCFWdhrEOSIolrGCzb6E/Pqd1q6trNkl16v/TLR0xt7FS903TfexX4kDJqYIgw0KrFS0QgXu+odcB2kpQCw== +"@agoric/store@0.9.3-u14.0", "@agoric/store@^0.9.2", "@agoric/store@^0.9.3-u12.0", "@agoric/store@^0.9.3-u14.0": + version "0.9.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/store/-/store-0.9.3-u14.0.tgz#01038f78e371f69cf0d4a8876edfd084111c8896" + integrity sha512-wCGh1VJcCF+s7IYCWnbeINtvzyV0e/8FgDdxEyjAvLx+uXC5hrPBgWrcZ80eIT0Sl00gpJQTUE3XiXLj+27bxA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" "@endo/exo" "0.2.2" @@ -529,26 +444,13 @@ "@endo/nat" "^4.1.27" better-sqlite3 "^8.2.0" -"@agoric/swing-store@^0.9.2-u12.0": - version "0.9.2-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/swing-store/-/swing-store-0.9.2-u12.0.tgz#704175ea0035c31a2f1e3fa54d905c3e88863c7d" - integrity sha512-N48OiDcxaraf8PqOADc/+xBB7EH0DDo+FpI/OrOkn9RuJDw5rHv0MmjRy9Y4rsCBP48vcPdiiuD1bpr9oVp2RA== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u12.0" - "@endo/base64" "0.2.31" - "@endo/bundle-source" "2.5.2-upstream-rollup" - "@endo/check-bundle" "0.2.18" - "@endo/nat" "4.1.27" - better-sqlite3 "^8.2.0" - -"@agoric/swing-store@^0.9.2-u13.0": - version "0.9.2-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/swing-store/-/swing-store-0.9.2-u13.0.tgz#f3150afc7de49488a98ccd23456a804ddbdb6e09" - integrity sha512-sJJlQ3HdGwZOFjIQBXW+LWDnFURzo5EYh0F9td7AYmQEZ1ZmlooH2pj0/ypGuC0r4O8eupmAQLqKQsXPSiDdeA== +"@agoric/swing-store@^0.9.2-u14.0": + version "0.9.2-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/swing-store/-/swing-store-0.9.2-u14.0.tgz#0b0eb9eb5216241b95cf72111c710faeeded1f79" + integrity sha512-PUtkWk5QxopX9RoJeLq53sZn9lzzeN+uCkhXrbytxmzDS/v1cGRXt0Mp2vWhs4oKJ5U7D2X1ei8P6d+SDgNBJQ== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" + "@agoric/internal" "^0.4.0-u14.0" "@endo/base64" "0.2.31" "@endo/bundle-source" "2.5.2-upstream-rollup" "@endo/check-bundle" "0.2.18" @@ -573,34 +475,15 @@ "@endo/patterns" "^0.2.2" "@endo/promise-kit" "^0.2.56" -"@agoric/swingset-liveslots@^0.10.3-u12.0": - version "0.10.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-liveslots/-/swingset-liveslots-0.10.3-u12.0.tgz#f2e7a8eb7c8e8b16bdfef67c335ff41eb4b4cff4" - integrity sha512-BM7tJn2ZfHB+3xe8WFrOUn/MlwvekxuOn0Qkyt5gtEavC7EI1iM41UyIlRp9nkxYSNsaXhTUMSePc0gP22k0Xw== +"@agoric/swingset-liveslots@^0.10.3-u14.0": + version "0.10.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/swingset-liveslots/-/swingset-liveslots-0.10.3-u14.0.tgz#a0fcb0c14c6bbf4de7614363c2bf213c08e54a36" + integrity sha512-URukf41FuQD07AcvRugY9pL6pV9GtWeqoXDyeTgg7zHmmJ19E6sEFguiqxPDLsrkZ/EqF9xoAb9RHm3FkR41QA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@endo/eventual-send" "0.17.2" - "@endo/exo" "0.2.2" - "@endo/far" "0.2.18" - "@endo/init" "0.5.56" - "@endo/marshal" "0.8.5" - "@endo/nat" "4.1.27" - "@endo/pass-style" "0.1.3" - "@endo/patterns" "0.2.2" - "@endo/promise-kit" "0.2.56" - -"@agoric/swingset-liveslots@^0.10.3-u13.0": - version "0.10.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-liveslots/-/swingset-liveslots-0.10.3-u13.0.tgz#55f0e02e1cdc214068bd948fb421c980b38804bd" - integrity sha512-csSD/nPwfOC5tgqN+e4TKFidFI3pHRQjo3WRMgeduU5+NIHEMcIyXHFLyQvuLTRhfb/5b81T8imubr5hN6itzw== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" - "@agoric/store" "^0.9.3-u13.0" - "@agoric/vat-data" "^0.5.3-u13.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/eventual-send" "0.17.2" "@endo/exo" "0.2.2" "@endo/far" "0.2.18" @@ -646,56 +529,20 @@ semver "^6.3.0" tmp "^0.2.1" -"@agoric/swingset-vat@^0.32.3-u12.0": - version "0.32.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-vat/-/swingset-vat-0.32.3-u12.0.tgz#c7aa82dbfe307240b8afcc9167c5a129ae3cdb5e" - integrity sha512-L84WacN/j8bRc6SpJHyKuAPChpZqdAxrG4BNhdWbs/6FnWUceRXzLcc0FMUcn9clOcgn1ioohTesYWa3cRlovw== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swing-store" "^0.9.2-u12.0" - "@agoric/swingset-liveslots" "^0.10.3-u12.0" - "@agoric/swingset-xsnap-supervisor" "^0.10.3-u12.0" - "@agoric/time" "^0.3.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@agoric/xsnap" "^0.14.3-u12.0" - "@agoric/xsnap-lockdown" "^0.14.1-u11wf.0" - "@endo/base64" "0.2.31" - "@endo/bundle-source" "2.5.2-upstream-rollup" - "@endo/captp" "3.1.1" - "@endo/check-bundle" "0.2.18" - "@endo/compartment-mapper" "0.8.4" - "@endo/eventual-send" "0.17.2" - "@endo/far" "0.2.18" - "@endo/import-bundle" "0.3.4" - "@endo/init" "0.5.56" - "@endo/marshal" "0.8.5" - "@endo/nat" "4.1.27" - "@endo/promise-kit" "0.2.56" - "@endo/ses-ava" "0.2.40" - "@endo/zip" "0.2.31" - ansi-styles "^6.2.1" - anylogger "^0.21.0" - import-meta-resolve "^2.2.1" - microtime "^3.1.0" - semver "^6.3.0" - tmp "^0.2.1" - -"@agoric/swingset-vat@^0.32.3-u13.0": - version "0.32.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-vat/-/swingset-vat-0.32.3-u13.0.tgz#224c02d744009a550e6162307b8adc11a4b23a9c" - integrity sha512-UY/N9QcJO3VRNC3xKoWxl81TQKbtcuXLmY+A1DgoHqdCBWxzmgSZXAVfRhAloWZUzkTIrYHV4sFpx2ewijdj9A== +"@agoric/swingset-vat@^0.32.3-u12.0", "@agoric/swingset-vat@^0.32.3-u14.0": + version "0.32.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/swingset-vat/-/swingset-vat-0.32.3-u14.0.tgz#f730772a5ff115468c9bc7c47a8c402e33f2df13" + integrity sha512-bWouy+7vffOeBxfBdhWwbcTLdKhGS+PkmIasrPV6QsMvMY6wzk5FDz4LELX3kHN4rQu72VOy3q3xUo4YqnQ2BQ== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" - "@agoric/store" "^0.9.3-u13.0" - "@agoric/swing-store" "^0.9.2-u13.0" - "@agoric/swingset-liveslots" "^0.10.3-u13.0" - "@agoric/swingset-xsnap-supervisor" "^0.10.3-u13.0" - "@agoric/time" "^0.3.3-u13.0" - "@agoric/vat-data" "^0.5.3-u13.0" - "@agoric/xsnap" "^0.14.3-u13.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swing-store" "^0.9.2-u14.0" + "@agoric/swingset-liveslots" "^0.10.3-u14.0" + "@agoric/swingset-xsnap-supervisor" "^0.10.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/xsnap" "^0.14.3-u14.0" "@agoric/xsnap-lockdown" "^0.14.1-u13.0" "@endo/base64" "0.2.31" "@endo/bundle-source" "2.5.2-upstream-rollup" @@ -723,15 +570,10 @@ resolved "https://registry.yarnpkg.com/@agoric/swingset-xsnap-supervisor/-/swingset-xsnap-supervisor-0.10.2.tgz#09f067695b0ea6ebfeb6ea200cc7f1675f0f8939" integrity sha512-3PB15aiNHfjTYmtUz9Rxmm6qSHnoO5w5dygRzjx2ytk8yoNn/ZOpxlIOLonhD8kwOaEli5D7btY9OA3jf+Sm6w== -"@agoric/swingset-xsnap-supervisor@^0.10.3-u12.0": - version "0.10.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-xsnap-supervisor/-/swingset-xsnap-supervisor-0.10.3-u12.0.tgz#f5c0100ab077174803f78c7cbaeb03d885cbcb8c" - integrity sha512-nhY8EFtueGzKccs5VWESYcKn9Eh6KPUdpHsF+RWI0cm2ixUQ49AReLv6g2h4yiBwk7tZx0f5y/amUHYYJJ2DwQ== - -"@agoric/swingset-xsnap-supervisor@^0.10.3-u13.0": - version "0.10.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/swingset-xsnap-supervisor/-/swingset-xsnap-supervisor-0.10.3-u13.0.tgz#83c7744c28b0093a93ef1dbdf3e3c7244dbf5265" - integrity sha512-gEIOlyLd34JZkVRPWq9982Eu7G4ggE6H3I3RueO9JbbhOXwU+irYL922t0Ztdjc9aJW2H5f78ukcn9j1SZmtHQ== +"@agoric/swingset-xsnap-supervisor@^0.10.3-u14.0": + version "0.10.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/swingset-xsnap-supervisor/-/swingset-xsnap-supervisor-0.10.3-u14.0.tgz#14dd5c471544f6703940b4b7c77ec37cb8056f93" + integrity sha512-vrZwHUphBxceQ7gTDoDIDHGcbXSm7gJpoabzmQQ++dRAktspjK7AccIZnMCBM52KZioJgRLsHwwSh/mXUdHZ7g== "@agoric/time@^0.3.2": version "0.3.2" @@ -742,22 +584,13 @@ "@agoric/store" "^0.9.2" "@endo/nat" "^4.1.27" -"@agoric/time@^0.3.3-u12.0": - version "0.3.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/time/-/time-0.3.3-u12.0.tgz#e0f5ddece7b3b4ea65a94f01cfc4de8d71fbf976" - integrity sha512-haMoQb3UFOUJUbIbRwePqp2G5p1E01QZ54Kqi+IB0tRLqrNY+V/X/GqV4XcnsDuv7UX/CvuY0vvVFG1w/U+lDg== +"@agoric/time@^0.3.3-u14.0": + version "0.3.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/time/-/time-0.3.3-u14.0.tgz#1e6b69b0a8bb8a991c70e67df5fa7996663c8b94" + integrity sha512-Sk0I3UPrWOdCny7KJ4/FejC9NHJkbXsyEmmD2lyGbcwNB4o9wetFkaL7g1v0yEPAjhyCxMTxkzTzcCST8XWktA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/store" "^0.9.3-u12.0" - "@endo/nat" "4.1.27" - -"@agoric/time@^0.3.3-u13.0": - version "0.3.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/time/-/time-0.3.3-u13.0.tgz#41a412c69c5cbc64cb7b47908266fbbad42c600f" - integrity sha512-quMGP2E/hiO9GYSBcr5jeKccbg4K8Ya6320B/pennPTC7/UT8YoHZkdVd5OwZNXR+MEL7Z56KajcjCSacPbT6A== - dependencies: - "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/store" "^0.9.3-u13.0" + "@agoric/store" "^0.9.3-u14.0" "@endo/nat" "4.1.27" "@agoric/ui-components@^0.9.0": @@ -772,32 +605,43 @@ "@endo/nat" "^4.1.27" clsx "^1.1.1" -"@agoric/vat-data@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@agoric/vat-data/-/vat-data-0.5.2.tgz#abafab83279552466cf4ca946faa175a0a1423dc" - integrity sha512-j71bSl7oPcWikR4bP15KMu67D3BLGLhEOcqgewC1cArcE99rhxDU19ALN0OITD0F0KkNCahRNifoIr73n/fBng== - dependencies: - "@agoric/assert" "^0.6.0" - "@agoric/internal" "^0.3.2" - "@agoric/store" "^0.9.2" - -"@agoric/vat-data@^0.5.3-u12.0": - version "0.5.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/vat-data/-/vat-data-0.5.3-u12.0.tgz#cb397e4898bf08f565fac391bbcbf9e037174e4c" - integrity sha512-hQvjtqUtCnYNBwLiUVdciXza2IlUoN3B6KxwRmV+gtvLJXqGoXJ9r/VxcYZvncm0ocawBH7KGmuMRK7cvrM3cg== +"@agoric/vat-data@0.5.3-u14.0", "@agoric/vat-data@^0.5.2", "@agoric/vat-data@^0.5.3-u14.0": + version "0.5.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/vat-data/-/vat-data-0.5.3-u14.0.tgz#3548a01353b2c1b21c7e550f44370c72a781a88b" + integrity sha512-3uiSwLuoLgsFAZD1aaK4Gf5Z0dEf3tz9bL+CH73OEsspAoGfK0EME8XyewthudcMLv4FiwOeHEDC2Xb8GU+Ofg== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/store" "^0.9.3-u12.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/store" "^0.9.3-u14.0" -"@agoric/vat-data@^0.5.3-u13.0": - version "0.5.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/vat-data/-/vat-data-0.5.3-u13.0.tgz#a784c4624b8cb10d153bdd137e0f3886af2760f8" - integrity sha512-snvf48nRaqZqSR/jyYPk4Lc4dW+b2mSIwtQA1tevx4rQtY2u6vlbAPSKBwJsA2gbRyUaGvo2Wc8oBGOFlww2Xg== +"@agoric/vats@0.15.2-u14.0": + version "0.15.2-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/vats/-/vats-0.15.2-u14.0.tgz#80a7542e03ce44cf0a32819f7347179e0ca19924" + integrity sha512-S4J0z5s1s5OQtz5/ld9IThMYGxOjRTLOjXIx4STb2Pjr0SHc8TgV91GbBQx0IHtU/2yGgEL+sbUGqUr5Cm4yHA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" - "@agoric/store" "^0.9.3-u13.0" + "@agoric/deploy-script-support" "^0.10.4-u14.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/governance" "^0.10.4-u14.0" + "@agoric/inter-protocol" "^0.16.2-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/sharing-service" "^0.2.12-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/zoe" "^0.26.3-u14.0" + "@agoric/zone" "^0.2.3-u14.0" + "@endo/far" "0.2.18" + "@endo/import-bundle" "0.3.4" + "@endo/init" "0.5.56" + "@endo/marshal" "0.8.5" + "@endo/nat" "4.1.27" + "@endo/patterns" "^0.2.2" + "@endo/promise-kit" "0.2.56" + import-meta-resolve "^2.2.1" + jessie.js "^0.3.2" "@agoric/vats@^0.15.1": version "0.15.1" @@ -825,30 +669,33 @@ "@endo/promise-kit" "^0.2.56" jessie.js "^0.3.2" -"@agoric/vats@^0.15.2-u12.0": - version "0.15.2-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/vats/-/vats-0.15.2-u12.0.tgz#15ff7fe8606ea841487c0b1688658153e6b6d911" - integrity sha512-VEi2Pt5njCSR/eRVufeVaSZKzFLdtytgJkVW5SyZhfzZLsdy9h31by++vNV3/q6FSg7Fs+mxjH/usJ9IxTJ+hA== +"@agoric/vats@^0.15.2-u12.0", "@agoric/vats@^0.15.2-u14.0", "@agoric/vats@^0.15.2-u14.1": + version "0.15.2-u14.1" + resolved "https://registry.yarnpkg.com/@agoric/vats/-/vats-0.15.2-u14.1.tgz#02278cb8d9998a9e04de0237f680845573d9b58d" + integrity sha512-6io1BnMQm1bkfgKySJVV6saN8847lx9cFCuP7CcK9M9nvWol1g4oaKgetcgrM6YP28rdifJqKwNPECEx92UMBw== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/governance" "^0.10.4-u12.0" - "@agoric/inter-protocol" "^0.16.2-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/sharing-service" "^0.2.12-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/time" "^0.3.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@agoric/zoe" "^0.26.3-u12.0" - "@agoric/zone" "^0.2.3-u12.0" + "@agoric/deploy-script-support" "^0.10.4-u14.1" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/governance" "^0.10.4-u14.1" + "@agoric/inter-protocol" "^0.16.2-u14.1" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/sharing-service" "^0.2.12-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" + "@agoric/zoe" "^0.26.3-u14.0" + "@agoric/zone" "^0.2.3-u14.0" "@endo/far" "0.2.18" "@endo/import-bundle" "0.3.4" "@endo/init" "0.5.56" "@endo/marshal" "0.8.5" "@endo/nat" "4.1.27" + "@endo/patterns" "^0.2.2" "@endo/promise-kit" "0.2.56" + import-meta-resolve "^2.2.1" jessie.js "^0.3.2" "@agoric/wallet-ui@0.1.3-solo.0": @@ -891,41 +738,18 @@ resolved "https://registry.yarnpkg.com/@agoric/xsnap-lockdown/-/xsnap-lockdown-0.14.0.tgz#0c605bbd08e6ccf1954a615dbce7d4c0fe578a32" integrity sha512-T8kYrW1baTDQTkQJ9mDp1ME2Ive3RNNRFU7PXuu60Pu9A/tWliYKiJWwqcGhYAQOkHxxFz0BVwk9Jf8HErzgRA== -"@agoric/xsnap-lockdown@^0.14.1-u11wf.0": - version "0.14.1-u11wf.0" - resolved "https://registry.yarnpkg.com/@agoric/xsnap-lockdown/-/xsnap-lockdown-0.14.1-u11wf.0.tgz#9701e93edc5e17dcaf76ff35b920db16ef607fe7" - integrity sha512-UWXoAvq8NzF8L9Mjg8SclvdAiZkc2skP/Q4CR4MOKatu1cO8KdES7VDXNuetnejlSJV7ybXdPyvGIUrpvo9SBg== - "@agoric/xsnap-lockdown@^0.14.1-u13.0": version "0.14.1-u13.0" resolved "https://registry.yarnpkg.com/@agoric/xsnap-lockdown/-/xsnap-lockdown-0.14.1-u13.0.tgz#0bc11a4d19d02a77cd9158dda3877c2ddc1ef8d4" integrity sha512-CUd4u1vyqSJfxj2+krNMBmDXlR7yN87RJsmB03ISPs8GuhjIrbdgkU+UfoKIJFLYco2ZSX7vR9j8l6azyVan1Q== -"@agoric/xsnap@^0.14.2": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@agoric/xsnap/-/xsnap-0.14.2.tgz#0685b1c85af986edc3e5f226fd4e96c44df32bf0" - integrity sha512-bA4IZJixw8uCcDBqA9KUKEnxjB65pdkWb5xL0a4XM//QvIzYmB6EGJ80U+pbMOrjGtomUqo0Oxdc5X/PhAniSg== - dependencies: - "@agoric/assert" "^0.6.0" - "@agoric/internal" "^0.3.2" - "@agoric/xsnap-lockdown" "^0.14.0" - "@endo/bundle-source" "^2.5.1" - "@endo/eventual-send" "^0.17.2" - "@endo/init" "^0.5.56" - "@endo/netstring" "^0.3.26" - "@endo/promise-kit" "^0.2.56" - "@endo/stream" "^0.3.25" - "@endo/stream-node" "^0.2.26" - glob "^7.1.6" - tmp "^0.2.1" - -"@agoric/xsnap@^0.14.3-u12.0", "@agoric/xsnap@^0.14.3-u13.0": - version "0.14.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/xsnap/-/xsnap-0.14.3-u13.0.tgz#fbff403c3df5d4f349d67bed62edb9cc39b20304" - integrity sha512-E9NP2Q4cPHesIeZNPnMmA+eWFZcDqNBue0VP0GiI4qUbHjz8uJS7YV/thZjDxJvnfXgT4wmIx8v11pkMp/+EKw== +"@agoric/xsnap@0.14.3-u14.0", "@agoric/xsnap@^0.14.2", "@agoric/xsnap@^0.14.3-u14.0": + version "0.14.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/xsnap/-/xsnap-0.14.3-u14.0.tgz#9b70e149deff85836a309311b8e2e6ab8c42d60a" + integrity sha512-V6m99MfCWeVkW+UqyyBpPTDpg0nSdrF3gp9N8zG+3WGtcs/tiWjAUMGJO8ccizuRyQMM41q7rOkBY+DBYWtnKA== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/internal" "^0.4.0-u13.0" + "@agoric/internal" "^0.4.0-u14.0" "@agoric/xsnap-lockdown" "^0.14.1-u13.0" "@endo/bundle-source" "2.5.2-upstream-rollup" "@endo/eventual-send" "0.17.2" @@ -960,19 +784,19 @@ "@endo/patterns" "^0.2.2" "@endo/promise-kit" "^0.2.56" -"@agoric/zoe@^0.26.3-u12.0": - version "0.26.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/zoe/-/zoe-0.26.3-u12.0.tgz#ca478b7f5219ae2c8ec20f9a85aca1facd8e6ec0" - integrity sha512-OznJJxbzRvOy4E8NJc3/zqasCleTJ8in/7ebrw7DyQAYaHg4e4wsV7a/Uuy1BUbB0h061saqVlhOM9xg1r0zhg== +"@agoric/zoe@^0.26.3-u12.0", "@agoric/zoe@^0.26.3-u14.0": + version "0.26.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/zoe/-/zoe-0.26.3-u14.0.tgz#69e121b4c1dace7fb32d692d8512e80848c0077f" + integrity sha512-zqUNmBKndNDEfoVHEvzAaB0aZLcYugYcEPMoJjhaYVbM5Lc2PmRDZN6gssYHnD0dzF8oDC4SDeq4CC/G4sEdTg== dependencies: "@agoric/assert" "^0.6.1-u11wf.0" - "@agoric/ertp" "^0.16.3-u12.0" - "@agoric/internal" "^0.4.0-u12.0" - "@agoric/notifier" "^0.6.3-u12.0" - "@agoric/store" "^0.9.3-u12.0" - "@agoric/swingset-vat" "^0.32.3-u12.0" - "@agoric/time" "^0.3.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" + "@agoric/ertp" "^0.16.3-u14.0" + "@agoric/internal" "^0.4.0-u14.0" + "@agoric/notifier" "^0.6.3-u14.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/swingset-vat" "^0.32.3-u14.0" + "@agoric/time" "^0.3.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/bundle-source" "2.5.2-upstream-rollup" "@endo/captp" "3.1.1" "@endo/eventual-send" "0.17.2" @@ -992,83 +816,75 @@ "@agoric/vat-data" "^0.5.2" "@endo/far" "^0.2.18" -"@agoric/zone@^0.2.3-u12.0": - version "0.2.3-u12.0" - resolved "https://registry.yarnpkg.com/@agoric/zone/-/zone-0.2.3-u12.0.tgz#e98e4fc0bb7015261124338f951e8639ceec5112" - integrity sha512-1fcqkIanIPbClhNrzQZPa3XoGnmHoaP9KrSxZkdjokpB/opRmhcQqIxyzE3ZMLjPISlxQSxSrBRE8by5Gq37+A== +"@agoric/zone@^0.2.3-u12.0", "@agoric/zone@^0.2.3-u14.0": + version "0.2.3-u14.0" + resolved "https://registry.yarnpkg.com/@agoric/zone/-/zone-0.2.3-u14.0.tgz#d83adefec94734a62271d6155b68b0ba05362bfa" + integrity sha512-+2c8NhNkm5XwJKyiooQ78N9qlVPMJ5K/kYOysC+BRz+vtWPInocehlFJsVuqisOmPajvnykr8QC+lPN1xHBsmg== dependencies: - "@agoric/store" "^0.9.3-u12.0" - "@agoric/vat-data" "^0.5.3-u12.0" - "@endo/far" "0.2.18" - -"@agoric/zone@^0.2.3-u13.0": - version "0.2.3-u13.0" - resolved "https://registry.yarnpkg.com/@agoric/zone/-/zone-0.2.3-u13.0.tgz#218e6372bfd44122ca0a0524649f1b3acbd40c52" - integrity sha512-NfH7fCrSI7wQ8wun8fhRBXEQdqkmjf4OdPXLwProYoxBIEJ4eML/CiGBDpE6DBeGDyS0YfJExcp7HV9nFsYi7g== - dependencies: - "@agoric/store" "^0.9.3-u13.0" - "@agoric/vat-data" "^0.5.3-u13.0" + "@agoric/store" "^0.9.3-u14.0" + "@agoric/vat-data" "^0.5.3-u14.0" "@endo/far" "0.2.18" "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@7.18.6", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" -"@babel/compat-data@^7.22.9": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" - integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.23.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" - integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== +"@babel/core@^7.23.5": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.3" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.3" - "@babel/types" "^7.23.3" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" - integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== +"@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.3" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" @@ -1111,9 +927,9 @@ "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-simple-access@^7.22.5": version "7.22.5" @@ -1129,103 +945,96 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/highlight@7.22.5", "@babel/highlight@^7.18.6": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.17.3", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.7.0": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" - integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== +"@babel/parser@^7.1.0", "@babel/parser@^7.17.3", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.7.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== -"@babel/plugin-transform-react-jsx-self@^7.22.5": +"@babel/plugin-transform-react-jsx-self@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-source@^7.22.5": +"@babel/plugin-transform-react-jsx-source@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/runtime@^7.12.5": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" - integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.23.2": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.17.3", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3", "@babel/traverse@^7.7.0": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" - integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== +"@babel/traverse@^7.17.3", "@babel/traverse@^7.24.0", "@babel/traverse@^7.7.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.3" - "@babel/types" "^7.23.3" - debug "^4.1.0" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.7.0": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" - integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== +"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.7.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1419,25 +1228,25 @@ enabled "2.0.x" kuler "^2.0.0" -"@datadog/native-appsec@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-4.0.0.tgz#ee08138b987dec557eac3650a43a972dac85b6a6" - integrity sha512-myTguXJ3VQHS2E1ylNsSF1avNpDmq5t+K4Q47wdzeakGc3sDIDDyEbvuFTujl9c9wBIkup94O1mZj5DR37ajzA== +"@datadog/native-appsec@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-7.1.0.tgz#e8e6254236ac6fd7d4fb8b1156b34de64ec3e174" + integrity sha512-5FATunIxmvuSGDwPmbXfOi21wC7rjfbdLX4QiT5LR+iRLjRLT5iETqwdTsqy0WOQIHmxdWuddRvuakAg3921aA== dependencies: node-gyp-build "^3.9.0" -"@datadog/native-iast-rewriter@2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.2.1.tgz#3c74c5a8caa0b876e091e9c5a95256add0d73e1c" - integrity sha512-DyZlE8gNa5AoOFNKGRJU4RYF/Y/tJzv4bIAMuVBbEnMA0xhiIYqpYQG8T3OKkALl3VSEeBMjYwuOR2fCrJ6gzA== +"@datadog/native-iast-rewriter@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.2.3.tgz#7d512abdb03dcc238825e8d6c90cebf782686db3" + integrity sha512-RCbflf8BJ++h99I7iA4NxTA1lx7YqB+sPQkJNSZKxXyEXtWl9J4XsDV9C/sB9iGbf1PVY77tFvoGm5/WpUV4IA== dependencies: lru-cache "^7.14.0" node-gyp-build "^4.5.0" -"@datadog/native-iast-taint-tracking@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-1.6.3.tgz#cb2125f7bf18806da6f326c3a6b7210da3e05d8b" - integrity sha512-u/bBPNx0w8Bq+I+30enI99Ua2WPbVLkANGNyQNjW4tz2PHyeGI++HyzZV+fGm0YSy41FuHZq9EWP3SSDz/eSVw== +"@datadog/native-iast-taint-tracking@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-1.7.0.tgz#0bcd4f287c25403d2a965939b33c35ae8544b363" + integrity sha512-p3qnYJrUr9TQ38tuOFoutDAQWOobLdaaWpTl0SHu126JH3ANBxWL/QirtJy6czfzLpm5eXwYHwHidD1Y0mNPdg== dependencies: node-gyp-build "^3.9.0" @@ -1449,10 +1258,10 @@ node-addon-api "^6.1.0" node-gyp-build "^3.9.0" -"@datadog/pprof@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-4.0.1.tgz#f8629ecb62646d90ed49b6252dd0583d8d5001d3" - integrity sha512-TavqyiyQZOaUM9eQB07r8+K/T1CqKyOdsUGxpN79+BF+eOQBpTj/Cte6KdlhcUSKL3h5hSjC+vlgA7uW2qtVhA== +"@datadog/pprof@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-5.1.0.tgz#8ceec2569db9c62428ff073efc122ce038d9fb4d" + integrity sha512-2fDNHG9eMSiCMlnTodDdnEgZueQyXwQTR2IxhJx43x9CQz0zSjvzZH6W++N1CRwikmd6wPdqBv5KlzsWuEsOPg== dependencies: delay "^5.0.0" node-gyp-build "<4.0" @@ -1522,11 +1331,6 @@ "@endo/zip" "^0.2.31" ses "^0.18.4" -"@endo/env-options@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@endo/env-options/-/env-options-1.1.1.tgz#eee630f8eff01580ec49e0dedcb1b6cef05d89a4" - integrity sha512-uCwlJ8Vkndx/VBBo36BdYHdxSoQPy7ZZpwyJNfv86Rh4B1IZfqzCRPf0u0mPgJdzOr7lShQey60SuYwoMSZ9Xg== - "@endo/eslint-plugin@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@endo/eslint-plugin/-/eslint-plugin-0.5.2.tgz#835d22e9ff17d9935f7f565e50a21ef07aa92ca2" @@ -1598,7 +1402,7 @@ resolved "https://registry.yarnpkg.com/@endo/nat/-/nat-4.1.27.tgz#8f1a398b39f994b0769070a3fb36d3397bf86794" integrity sha512-mKRdIc4NvrxZ1qPBcYZH6zaj0RsRwADaCcfPNRnGWcHC9dY8DmZDDcgqNdSBFLiEto1RnXeoKAEGxk6hn253Ow== -"@endo/netstring@0.3.26", "@endo/netstring@^0.3.26": +"@endo/netstring@0.3.26": version "0.3.26" resolved "https://registry.yarnpkg.com/@endo/netstring/-/netstring-0.3.26.tgz#7da8338cb372772894e1ebcc0728b23666fa2c89" integrity sha512-IT3epH32/jLiNBwKhM+7BRjm0OwFjRooeQyymfGZUKGN95fm+hKHEbm8pDmWT8bnwSzHB++wsaQJTpi39U+obg== @@ -1649,7 +1453,7 @@ "@babel/types" "^7.17.0" ses "^0.18.5" -"@endo/stream-node@0.2.26", "@endo/stream-node@^0.2.26": +"@endo/stream-node@0.2.26": version "0.2.26" resolved "https://registry.yarnpkg.com/@endo/stream-node/-/stream-node-0.2.26.tgz#bf3c6ce6c506cde4468a64d220b8df4224638e16" integrity sha512-+UUr1/wZZIWz3KhuAwQr9HPsZv5P8zykw+z1aVFDckTMcdKRyK8yxSg35iEcntvyZoP40LEdnArCXuuEWjm0qw== @@ -1918,10 +1722,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" - integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1933,15 +1737,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.53.0": - version "8.53.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" - integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== +"@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== "@fast-check/ava@^1.1.3": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@fast-check/ava/-/ava-1.1.6.tgz#fb7d1b7f84c26f892c09937e62200ea2f3ccd9eb" - integrity sha512-xshsWNumcefyXFyfxREFcz/mrOay3ITRJh8My7bpEPK3YEJ7Rg/QHExVCUMRqeMjxj5ChQz6ngZxNCnxkOWq+w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@fast-check/ava/-/ava-1.2.1.tgz#4f6621d039e855cbd3ee40512f442f82913c5a31" + integrity sha512-d7O8CjYV2e+JFnN67Yofw+tt16fJI7kuX1K7OZCNxqQL5XNrkipWBmAmW9sPxYVjaItPBPvTPp7nORsO9KuBgg== dependencies: fast-check "^3.0.0" @@ -1950,13 +1754,13 @@ 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.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@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== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1964,10 +1768,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@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== "@iarna/toml@^2.2.3": version "2.2.5" @@ -1988,34 +1792,34 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2026,9 +1830,9 @@ integrity sha512-DiZdJYFU0tBbdQkfwwRSwYyI/mcWkg3sWesKRsHUd4G+NekTmmeq9fzsurvcKTNVa0comNljwtg4Hvi1ds3V+A== "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz#d693d972974a354034454ec1317eb6afd0b00312" - integrity sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" + integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== "@lit/reactive-element@^1.0.0", "@lit/reactive-element@^1.3.0": version "1.6.3" @@ -2038,9 +1842,9 @@ "@lit-labs/ssr-dom-shim" "^1.0.0" "@noble/hashes@^1", "@noble/hashes@^1.0.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2064,39 +1868,27 @@ fastq "^1.6.0" "@opentelemetry/api@^1.0.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40" - integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.8.0.tgz#5aa7abb48f23f693068ed2999ae627d2f7d902ec" + integrity sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w== "@opentelemetry/core@^1.14.0": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9" - integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg== + version "1.22.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.22.0.tgz#a9f33689acd4703ac780c6595497374e2113c7e5" + integrity sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA== dependencies: - "@opentelemetry/semantic-conventions" "1.18.1" + "@opentelemetry/semantic-conventions" "1.22.0" -"@opentelemetry/semantic-conventions@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4" - integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA== +"@opentelemetry/semantic-conventions@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz#d7502533a7c96e25baab86bac965468e0703a8b4" + integrity sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw== "@pkgr/core@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2197,70 +1989,70 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/rollup-android-arm-eabi@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" - integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== - -"@rollup/rollup-android-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" - integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== - -"@rollup/rollup-darwin-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90" - integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== - -"@rollup/rollup-darwin-x64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" - integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" - integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" - integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== - -"@rollup/rollup-linux-arm64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" - integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== - -"@rollup/rollup-linux-riscv64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" - integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== - -"@rollup/rollup-linux-x64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" - integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== - -"@rollup/rollup-linux-x64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" - integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== - -"@rollup/rollup-win32-arm64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" - integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== - -"@rollup/rollup-win32-ia32-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" - integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== - -"@rollup/rollup-win32-x64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" - integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== +"@rollup/rollup-android-arm-eabi@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" + integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== + +"@rollup/rollup-android-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" + integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== + +"@rollup/rollup-darwin-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" + integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== + +"@rollup/rollup-darwin-x64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" + integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" + integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== + +"@rollup/rollup-linux-arm64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" + integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== + +"@rollup/rollup-linux-arm64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" + integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== + +"@rollup/rollup-linux-riscv64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" + integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== + +"@rollup/rollup-linux-x64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" + integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== + +"@rollup/rollup-linux-x64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" + integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== + +"@rollup/rollup-win32-arm64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" + integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== + +"@rollup/rollup-win32-ia32-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" + integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== + +"@rollup/rollup-win32-x64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" + integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2282,9 +2074,9 @@ pretty-format "^27.0.2" "@testing-library/react@^14.1.2": - version "14.1.2" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.1.2.tgz#a2b9e9ee87721ec9ed2d7cfc51cc04e474537c32" - integrity sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg== + version "14.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.2.1.tgz#bf69aa3f71c36133349976a4a2da3687561d8310" + integrity sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^9.0.0" @@ -2300,10 +2092,10 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/babel__core@^7.20.3": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" - integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2312,9 +2104,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.7" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" - integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" @@ -2327,9 +2119,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" @@ -2378,35 +2170,28 @@ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*", "@types/node@>=13.7.0": - version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== + version "20.11.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.26.tgz#3fbda536e51d5c79281e1d9657dcb0131baabd2d" + integrity sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ== dependencies: undici-types "~5.26.4" "@types/prop-types@*": - version "15.7.10" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" - integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== -"@types/react-dom@^18.0.0": - version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" - integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== - dependencies: - "@types/react" "*" - -"@types/react-dom@^18.2.7": - version "18.2.15" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.15.tgz#921af67f9ee023ac37ea84b1bc0cc40b898ea522" - integrity sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7": + version "18.2.21" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.21.tgz#b8c81715cebdebb2994378616a8d54ace54f043a" + integrity sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.2.15": - version "18.2.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" - integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== + version "18.2.65" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.65.tgz#54eb311fa9aba173c9e163d42ec188d5a42878b8" + integrity sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2420,14 +2205,14 @@ "@types/node" "*" "@types/scheduler@*": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" - integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/semver@^7.5.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" - integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/triple-beam@^1.3.2": version "1.3.5" @@ -2435,9 +2220,9 @@ integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== "@types/trusted-types@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.6.tgz#d12451beaeb9c3838f12024580dc500b7e88b0ad" - integrity sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" @@ -2452,15 +2237,32 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^6.0.0", "@typescript-eslint/eslint-plugin@^6.7.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz#cfe2bd34e26d2289212946b96ab19dcad64b661a" - integrity sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg== + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/type-utils" "6.10.0" - "@typescript-eslint/utils" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/eslint-plugin@^7.0.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz#5a5fcad1a7baed85c10080d71ad901f98c38d5b7" + integrity sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/type-utils" "7.2.0" + "@typescript-eslint/utils" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -2469,71 +2271,141 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.7.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.10.0.tgz#578af79ae7273193b0b6b61a742a2bc8e02f875a" - integrity sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog== - dependencies: - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^7.0.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== + dependencies: + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz#b0276118b13d16f72809e3cecc86a72c93708540" - integrity sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" - integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== +"@typescript-eslint/type-utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz#7be5c30e9b4d49971b79095a1181324ef6089a19" + integrity sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA== dependencies: - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/utils" "6.10.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/utils" "7.2.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" - integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== -"@typescript-eslint/typescript-estree@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz#667381eed6f723a1a8ad7590a31f312e31e07697" - integrity sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.10.0", "@typescript-eslint/utils@^6.6.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" - integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== + dependencies: + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0", "@typescript-eslint/utils@^6.6.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz#b9eaf855a1ac7e95633ae1073af43d451e8f84e3" - integrity sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg== +"@typescript-eslint/utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.2.0.tgz#fc8164be2f2a7068debb4556881acddbf0b7ce2a" + integrity sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA== dependencies: - "@typescript-eslint/types" "6.10.0" + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== + dependencies: + "@typescript-eslint/types" "7.2.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -2542,60 +2414,65 @@ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@vitejs/plugin-react@^4.0.3": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz#a10254dc76778027407d01b6ddbca53b23852a72" - integrity sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag== + version "4.2.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== dependencies: - "@babel/core" "^7.23.2" - "@babel/plugin-transform-react-jsx-self" "^7.22.5" - "@babel/plugin-transform-react-jsx-source" "^7.22.5" - "@types/babel__core" "^7.20.3" + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" react-refresh "^0.14.0" -"@vitest/expect@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.2.1.tgz#574c0ac138a9e34522da202ea4c48a3adfe7240e" - integrity sha512-/bqGXcHfyKgFWYwIgFr1QYDaR9e64pRKxgBNWNXPefPFRhgm+K3+a/dS0cUGEreWngets3dlr8w8SBRw2fCfFQ== +"@vitest/expect@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.3.1.tgz#d4c14b89c43a25fd400a6b941f51ba27fe0cb918" + integrity sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw== dependencies: - "@vitest/spy" "1.2.1" - "@vitest/utils" "1.2.1" + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" chai "^4.3.10" -"@vitest/runner@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.2.1.tgz#13e65b47eb04e572b99757e55f063f8f025822b2" - integrity sha512-zc2dP5LQpzNzbpaBt7OeYAvmIsRS1KpZQw4G3WM/yqSV1cQKNKwLGmnm79GyZZjMhQGlRcSFMImLjZaUQvNVZQ== +"@vitest/runner@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.3.1.tgz#e7f96cdf74842934782bfd310eef4b8695bbfa30" + integrity sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg== dependencies: - "@vitest/utils" "1.2.1" + "@vitest/utils" "1.3.1" p-limit "^5.0.0" pathe "^1.1.1" -"@vitest/snapshot@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.2.1.tgz#bd2dcae2322b90bab1660421ff9dae73fc84ecc0" - integrity sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q== +"@vitest/snapshot@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.3.1.tgz#193a5d7febf6ec5d22b3f8c5a093f9e4322e7a88" + integrity sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ== dependencies: magic-string "^0.30.5" pathe "^1.1.1" pretty-format "^29.7.0" -"@vitest/spy@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.2.1.tgz#2777444890de9d32e55e600e34a13b2074cabc18" - integrity sha512-vG3a/b7INKH7L49Lbp0IWrG6sw9j4waWAucwnksPB1r1FTJgV7nkBByd9ufzu6VWya/QTvQW4V9FShZbZIB2UQ== +"@vitest/spy@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.3.1.tgz#814245d46d011b99edd1c7528f5725c64e85a88b" + integrity sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig== dependencies: tinyspy "^2.2.0" -"@vitest/utils@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.2.1.tgz#ad798cb13ec9e9e97b13be65d135e9e8e3c586aa" - integrity sha512-bsH6WVZYe/J2v3+81M5LDU8kW76xWObKIURpPrOXm2pjBniBu2MERI/XP60GpS4PHU3jyK50LUutOwrx4CyHUg== +"@vitest/utils@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.3.1.tgz#7b05838654557544f694a372de767fcc9594d61a" + integrity sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ== dependencies: diff-sequences "^29.6.3" estree-walker "^3.0.3" loupe "^2.3.7" pretty-format "^29.7.0" +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" @@ -2606,26 +2483,16 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.2.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" - integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== - -acorn-walk@^8.3.2: +acorn-walk@^8.2.0, acorn-walk@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.10.0, acorn@^8.11.3: +acorn@^8.11.3, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" @@ -2846,13 +2713,13 @@ aria-query@^5.3.0: dependencies: dequal "^2.0.3" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-find-index@^1.0.1: version "1.0.2" @@ -2875,16 +2742,27 @@ 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.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== +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-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.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== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" @@ -2906,17 +2784,18 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrgv@^1.0.2: @@ -2968,6 +2847,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + ava@^5.3.0: version "5.3.1" resolved "https://registry.yarnpkg.com/ava/-/ava-5.3.1.tgz#335737dd963b7941b90214836cea2e8de1f4d5f4" @@ -3017,10 +2901,12 @@ ava@^5.3.0: write-file-atomic "^5.0.1" yargs "^17.7.2" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +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.7.0: version "4.7.0" @@ -3042,9 +2928,9 @@ axios@0.21.4, axios@^0.21.2: follow-redirects "^1.14.0" axios@^1.6.2: - version "1.6.6" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.6.tgz#878db45401d91fe9e53aed8ac962ed93bde8dd1c" - integrity sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q== + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== dependencies: follow-redirects "^1.15.4" form-data "^4.0.0" @@ -3058,9 +2944,9 @@ axobject-query@^3.2.1: dequal "^2.0.3" b4a@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" - integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== babel-eslint@^10.0.3: version "10.1.0" @@ -3079,15 +2965,20 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.1.tgz#7b6d421f26a7a755e20bf580b727c84b807964c1" + integrity sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A== + base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== basic-ftp@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.4.tgz#28aeab7bfbbde5f5d0159cd8bb3b8e633bbb091d" - integrity sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA== + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bech32@^1.1.4: version "1.1.4" @@ -3102,11 +2993,6 @@ better-sqlite3@^8.2.0: bindings "^1.5.0" prebuild-install "^7.1.1" -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3153,13 +3039,6 @@ bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3187,14 +3066,14 @@ 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.21.9: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.21.0, browserslist@^4.22.2: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" buffer-crc32@~0.2.3: @@ -3215,26 +3094,21 @@ builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -3246,10 +3120,10 @@ callsites@^4.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== -caniuse-lite@^1.0.30001541: - version "1.0.30001561" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" - integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== +caniuse-lite@^1.0.30001587: + version "1.0.30001597" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz#8be94a8c1d679de23b22fbd944232aa1321639e6" + integrity sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w== cbor@^8.1.0: version "8.1.0" @@ -3271,7 +3145,7 @@ chai@^4.3.10: pathval "^1.1.1" type-detect "^4.0.8" -chalk@^2.0.0: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3280,7 +3154,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3311,9 +3185,9 @@ check-error@^1.0.3: get-func-name "^2.0.2" chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -3330,20 +3204,20 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chromium-bidi@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.4.tgz#dcf60bbc510a0a1d19b35012d7bb53f82bb5f2ba" - integrity sha512-p9CdiHl0xNh4P7oVa44zXgJJw+pvnHXFDB+tVdo25xaPLgQDVf2kQO+TDxD2fp2Evqi7vs/vGRINMzl1qJrWiw== +chromium-bidi@0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.8.tgz#5053038425c062ed34b9bc973e84e79de0a5cef0" + integrity sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw== dependencies: mitt "3.0.1" - urlpattern-polyfill "9.0.0" + urlpattern-polyfill "10.0.0" chunkd@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== -ci-info@^3.8.0: +ci-info@^3.7.0, ci-info@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -3378,9 +3252,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-truncate@^3.1.0: version "3.1.0" @@ -3575,9 +3449,9 @@ crypto-randomuuid@^1.0.0: integrity sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA== csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== currently-unhandled@^0.4.1: version "0.4.1" @@ -3591,10 +3465,10 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-uri-to-buffer@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" - integrity sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg== +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== date-time@^3.1.0: version "3.1.0" @@ -3603,33 +3477,35 @@ date-time@^3.1.0: dependencies: time-zone "^1.0.0" +dc-polyfill@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.4.tgz#4118cec81a8fab9a5729c41c285c715ffa42495a" + integrity sha512-8iwEduR2jR9wWYggeaYtYZWRiUe3XZPyAQtMTL1otv8X3kfR8xUIVb4l5awHEeyDrH6Je7N324lKzMKlMMN6Yw== + dd-trace@^3.3.0: - version "3.39.0" - resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-3.39.0.tgz#d833347c0cd30d5ca8324140c7612693b3dca404" - integrity sha512-6L9p5F22b5qZuvlQhUuSZ/GPY1Stge+gQbX7njSLRMs+P/BYOVVbPO10eymW7qOELfra4kAxnV6DDDqtR/2jfQ== + version "3.51.0" + resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-3.51.0.tgz#62f55ee3c93b126df22c398d3954d816ffbed8bc" + integrity sha512-IEKeVFrpRwDAnhhnoSh1+OlyS14YLsiEaRESkfRCfUys8ghyDEC2WjKDVGqtANsOQXaeP8Nch9sTGbqhfSS6Bg== dependencies: - "@datadog/native-appsec" "^4.0.0" - "@datadog/native-iast-rewriter" "2.2.1" - "@datadog/native-iast-taint-tracking" "1.6.3" + "@datadog/native-appsec" "7.1.0" + "@datadog/native-iast-rewriter" "2.2.3" + "@datadog/native-iast-taint-tracking" "1.7.0" "@datadog/native-metrics" "^2.0.0" - "@datadog/pprof" "4.0.1" + "@datadog/pprof" "5.1.0" "@datadog/sketches-js" "^2.1.0" "@opentelemetry/api" "^1.0.0" "@opentelemetry/core" "^1.14.0" crypto-randomuuid "^1.0.0" - diagnostics_channel "^1.1.0" + dc-polyfill "^0.1.4" ignore "^5.2.4" - import-in-the-middle "^1.4.2" + import-in-the-middle "^1.7.3" int64-buffer "^0.1.9" ipaddr.js "^2.1.0" istanbul-lib-coverage "3.2.0" jest-docblock "^29.7.0" koalas "^1.0.2" - limiter "^1.1.4" - lodash.kebabcase "^4.1.1" - lodash.pick "^4.4.0" + limiter "1.1.5" lodash.sortby "^4.7.0" - lodash.uniq "^4.5.0" lru-cache "^7.14.0" methods "^1.1.2" module-details-from-path "^1.0.3" @@ -3637,11 +3513,14 @@ dd-trace@^3.3.0: node-abort-controller "^3.1.1" opentracing ">=0.12.1" path-to-regexp "^0.1.2" - protobufjs "^7.2.4" + pprof-format "^2.0.7" + protobufjs "^7.2.5" retry "^0.13.1" semver "^7.5.4" + shell-quote "^1.8.1" + tlhunter-sorted-set "^0.1.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3715,24 +3594,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -3740,21 +3601,16 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, 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== @@ -3816,11 +3672,6 @@ devtools-protocol@0.0.1232444: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz#406345a90a871ba852c530d73482275234936eed" integrity sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg== -diagnostics_channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/diagnostics_channel/-/diagnostics_channel-1.1.0.tgz#bd66c49124ce3bac697dff57466464487f57cea5" - integrity sha512-OE1ngLDjSBPG6Tx0YATELzYzy3RKHC+7veQ8gLa8yS7AAgw65mFbVdcsu3501abqOZCEZqZyAIemB0zXlqDSuw== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -3857,15 +3708,15 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-to-chromium@^1.4.535: - version "1.4.581" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz#23b684c67bf56d4284e95598c05a5d266653b6d8" - integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw== +electron-to-chromium@^1.4.668: + version "1.4.702" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.702.tgz#a05803c5a1a54f5eb727ce6a922a5923ef436261" + integrity sha512-LYLXyEUsZ3nNSwiOWjI88N1PJUAMU2QphQSgGLVkFnb3FxZxNui2Vzi2PaKPgPWbsWbZstZnh6BMf/VQJamjiQ== elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -3876,9 +3727,9 @@ elliptic@^6.5.4: minimalistic-crypto-utils "^1.0.1" emittery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.1.tgz#e0cf36e2d7eef94dbd025969f642d57ae50a56cd" - integrity sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-1.0.3.tgz#c9d2a9c689870f15251bb13b31c67715c26d69ac" + integrity sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA== emoji-regex@^8.0.0: version "8.0.0" @@ -3926,50 +3777,69 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: + version "1.22.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + 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.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + 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.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + 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.5" unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + 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== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.0.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== es-get-iterator@^1.1.3: version "1.1.3" @@ -3987,35 +3857,36 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-iterator-helpers@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + version "1.0.17" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8" + integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== dependencies: asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" + es-abstract "^1.22.4" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" globalthis "^1.0.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.5" + internal-slot "^1.0.7" iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" + safe-array-concat "^1.1.0" -es-set-tostringtag@^2.0.1: - 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-set-tostringtag@^2.0.2, 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.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + 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.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -4089,9 +3960,9 @@ esbuild@^0.19.3: "@esbuild/win32-x64" "0.19.12" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: version "5.0.0" @@ -4139,12 +4010,7 @@ eslint-config-jessie@^0.0.6: resolved "https://registry.yarnpkg.com/eslint-config-jessie/-/eslint-config-jessie-0.0.6.tgz#429de65983cdfcb161c62a5169605ded6130487b" integrity sha512-L19U3+qWJdhdUjxW7NkkB9X+343MwUB81dplbxwcbBCvrWA8WwmiWYww0g23j4Oz/Vy8KmdW1cyW5Ii6s5IJzQ== -eslint-config-prettier@>=8.0.0, eslint-config-prettier@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" - integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== - -eslint-config-prettier@^9.1.0: +eslint-config-prettier@>=8.0.0, eslint-config-prettier@^9.0.0, eslint-config-prettier@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== @@ -4159,9 +4025,9 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + 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== dependencies: debug "^3.2.7" @@ -4205,13 +4071,13 @@ eslint-plugin-filenames@^1.3.2: lodash.upperfirst "4.3.1" eslint-plugin-github@^4.10.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-github/-/eslint-plugin-github-4.10.1.tgz#b315660ec3734dc01a7a4ddb54490c4d6b37a07c" - integrity sha512-1AqQBockOM+m0ZUpwfjWtX0lWdX5cRi/hwJnSNvXoOmz/Hh+ULH6QFz6ENWueTWjoWpgPv0af3bj+snps6o4og== + 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== dependencies: "@github/browserslist-config" "^1.0.0" - "@typescript-eslint/eslint-plugin" "^6.0.0" - "@typescript-eslint/parser" "^6.0.0" + "@typescript-eslint/eslint-plugin" "^7.0.1" + "@typescript-eslint/parser" "^7.0.1" aria-query "^5.3.0" eslint-config-prettier ">=8.0.0" eslint-plugin-escompat "^3.3.3" @@ -4233,9 +4099,9 @@ eslint-plugin-i18n-text@^1.0.1: integrity sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA== eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3: - version "2.29.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" - integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" array.prototype.findlastindex "^1.2.3" @@ -4253,12 +4119,12 @@ eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3: object.groupby "^1.0.1" object.values "^1.1.7" semver "^6.3.1" - tsconfig-paths "^3.14.2" + tsconfig-paths "^3.15.0" eslint-plugin-jsdoc@^46.4.3: - version "46.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.9.0.tgz#9887569dbeef0a008a2770bfc5d0f7fc39f21f2b" - integrity sha512-UQuEtbqLNkPf5Nr/6PPRCtr9xypXY+g8y/Q7gPa0YK7eDhh0y2lWprXRnaYbW7ACgIUvpDKy9X2bZqxtGzBG9Q== + version "46.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz#77c871309c4ed93758a3b2fdf384dc6189cf8605" + integrity sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag== dependencies: "@es-joy/jsdoccomment" "~0.41.0" are-docs-informative "^0.0.2" @@ -4268,7 +4134,7 @@ eslint-plugin-jsdoc@^46.4.3: esquery "^1.5.0" is-builtin-module "^3.2.1" semver "^7.5.4" - spdx-expression-parse "^3.0.1" + spdx-expression-parse "^4.0.0" eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" @@ -4297,15 +4163,7 @@ 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: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515" - integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.8.5" - -eslint-plugin-prettier@^5.1.3: +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== @@ -4319,9 +4177,9 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react-refresh@^0.4.3: - version "0.4.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz#b74ed2a06ee998e4126cdf92f638a66f2cc82ecc" - integrity sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA== + version "0.4.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz#6b9b307bad3feba2244ef64a1a15485ac70a2d0f" + integrity sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w== eslint-rule-documentation@>=1.0.0: version "1.0.23" @@ -4359,15 +4217,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.45.0, eslint@^8.47.0: - version "8.53.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" - integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.3" - "@eslint/js" "8.53.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4402,7 +4260,7 @@ eslint@^8.45.0, eslint@^8.47.0: strip-ansi "^6.0.1" text-table "^0.2.0" -esm@agoric-labs/esm#Agoric-built: +"esm@github:agoric-labs/esm#Agoric-built": version "3.2.25" resolved "https://codeload.github.com/agoric-labs/esm/tar.gz/3603726ad4636b2f865f463188fcaade6375638e" @@ -4461,46 +4319,16 @@ estree-walker@^3.0.3: dependencies: "@types/estree" "^1.0.0" -esutils@^2.0.2, esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-lite@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d" - integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - +esutils@^2.0.2, esutils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-lite@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d" + integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw== + execa@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -4542,9 +4370,9 @@ extract-zip@2.0.1: "@types/yauzl" "^2.9.1" fast-check@^3.0.0: - version "3.13.2" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.13.2.tgz#1bea3b167f689b271535dde7569c2d56caa7e4ea" - integrity sha512-ouTiFyeMoqmNg253xqy4NSacr5sHxH6pZpLOaHgaAdgZxFWdtsfxExwolpveoAE9CJdV+WYjqErNGef6SqA5Mg== + version "3.16.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.16.0.tgz#798fa85212dbfb9e4fdc65b12d872225a8f1c907" + integrity sha512-k8GtQHi4pJoRQ1gVDFQno+/FVkowo/ehiz/aCj9O/D7HRWb1sSFzNrw+iPVU8QlWtH+jNwbuN+dDVg3QkS56DQ== dependencies: pure-rand "^6.0.0" @@ -4590,9 +4418,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" @@ -4658,31 +4486,33 @@ find-up@^6.0.0: locate-path "^7.1.0" path-exists "^5.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + 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.2.9" keyv "^4.5.3" rimraf "^3.0.2" flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== - -follow-redirects@^1.15.4: +follow-redirects@^1.14.0, follow-redirects@^1.15.4: version "1.15.5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== @@ -4708,14 +4538,24 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: + at-least-node "^1.0.0" graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs.realpath@^1.0.0: version "1.0.0" @@ -4727,7 +4567,7 @@ fsevents@~2.3.2, fsevents@~2.3.3: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -4762,11 +4602,12 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +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: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -4779,33 +4620,29 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0, get-stream@^6.0.1: - version "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@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +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" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-uri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.2.tgz#e019521646f4a8ff6d291fbaea2c46da204bb75b" - integrity sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" + integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== dependencies: basic-ftp "^5.0.2" - data-uri-to-buffer "^6.0.0" + data-uri-to-buffer "^6.0.2" debug "^4.3.4" - fs-extra "^8.1.0" + fs-extra "^11.2.0" github-from-package@0.0.0: version "0.0.0" @@ -4844,9 +4681,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + 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" @@ -4892,7 +4729,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4903,9 +4740,9 @@ graphemer@^1.4.0: integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== happy-dom@^13.3.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-13.3.1.tgz#5098bb8f2db3e7ef5e7d023c7ddc7e956dff0d78" - integrity sha512-KIlztn+nRWstprUyI3Wzy1UJrg72uOaoo4SaBLNrV6xrn2Rq86eQruKOL7ZyDhkfou3nEZX6rgRYtvsqwMInvQ== + version "13.8.2" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-13.8.2.tgz#ab6d74cd0f712403d07d3b88dac6baa32659c346" + integrity sha512-u9KxyeQNIzkJDR2iCitKeS5Uy0YUv5eOntpO8e7ZzbDVv4kP5Y77Zo2LnZitwMrss/1pY2Uc2e5qOVGkiKE5Gg== dependencies: entities "^4.5.0" webidl-conversions "^7.0.0" @@ -4926,29 +4763,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + 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-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: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +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== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -4958,10 +4795,10 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -4975,31 +4812,21 @@ hmac-drbg@^1.0.1: minimalistic-crypto-utils "^1.0.1" http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" debug "^4.3.4" https-proxy-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== 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" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - human-signals@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" @@ -5023,9 +4850,9 @@ ignore-by-default@^2.1.0: integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw== ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" @@ -5035,10 +4862,10 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-in-the-middle@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" - integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw== +import-in-the-middle@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.7.3.tgz#ffa784cdd57a47d2b68d2e7dd33070ff06baee43" + integrity sha512-R2I11NRi0lI3jD2+qjqyVlVEahsejw7LDnYEbGb47QEFjczE3bZYsmWheCTQA+LFs2DzOQxR7Pms7naHW1V4bQ== dependencies: acorn "^8.8.2" acorn-import-assertions "^1.9.0" @@ -5109,24 +4936,22 @@ int64-buffer@^0.1.9: resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.10.tgz#277b228a87d95ad777d07c13832022406a473423" integrity sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA== -internal-slot@^1.0.4, internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.2" + es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" -ip@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" ipaddr.js@^2.1.0: version "2.1.0" @@ -5146,14 +4971,13 @@ is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -5225,11 +5049,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-error@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" @@ -5271,32 +5090,25 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.2, 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 sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -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" @@ -5345,17 +5157,17 @@ is-retry-allowed@^2.2.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.2, 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: - 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-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-stream@^2.0.0: version "2.0.1" @@ -5381,12 +5193,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +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== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-unicode-supported@^0.1.0: version "0.1.0" @@ -5398,10 +5210,10 @@ 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-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +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" @@ -5410,15 +5222,15 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +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.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" -is-wsl@^2.2.0: +is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -5485,6 +5297,11 @@ js-string-escape@^1.0.1: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" + integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== + js-yaml@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" @@ -5507,6 +5324,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" @@ -5542,12 +5364,15 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== +json-stable-stringify@^1.0.1, json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" jsonify "^0.0.1" + object-keys "^1.1.1" json5@^1.0.2: version "1.0.2" @@ -5566,10 +5391,12 @@ jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" @@ -5595,6 +5422,13 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + koalas@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/koalas/-/koalas-1.0.2.tgz#318433f074235db78fae5661a02a8ca53ee295cd" @@ -5637,7 +5471,7 @@ libsodium@^0.7.13: resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== -limiter@^1.1.4: +limiter@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== @@ -5704,7 +5538,7 @@ lodash.camelcase@4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== -lodash.kebabcase@4.1.1, lodash.kebabcase@^4.1.1: +lodash.kebabcase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== @@ -5714,11 +5548,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== - lodash.snakecase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -5734,11 +5563,6 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - lodash.upperfirst@4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" @@ -5825,9 +5649,9 @@ magic-string@^0.25.7: sourcemap-codec "^1.4.8" magic-string@^0.30.5: - version "0.30.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" - integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -5975,9 +5799,9 @@ micromark-factory-whitespace@^2.0.0: micromark-util-types "^2.0.0" micromark-util-character@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" - integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" + integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== dependencies: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" @@ -6099,7 +5923,7 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -6152,7 +5976,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@6 || 7 || 8 || 9": +"minimatch@6 || 7 || 8 || 9", minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== @@ -6182,9 +6006,9 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mlly@^1.2.0, mlly@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.5.0.tgz#8428a4617d54cc083d3009030ac79739a0e5447a" - integrity sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ== + version "1.6.1" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.6.1.tgz#0983067dc3366d6314fc5e12712884e6978d028f" + integrity sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA== dependencies: acorn "^8.11.3" pathe "^1.1.2" @@ -6226,7 +6050,7 @@ n-readlines@^1.0.0: resolved "https://registry.yarnpkg.com/n-readlines/-/n-readlines-1.0.1.tgz#bbb7364d38bc31a170a199f986fcacfa76b95f6e" integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -6247,9 +6071,9 @@ netmask@^2.0.2: integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== node-abi@^3.3.0: - version "3.51.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d" - integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA== + version "3.56.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.56.0.tgz#ca807d5ff735ac6bbbd684ae3ff2debc1c2a40a7" + integrity sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q== dependencies: semver "^7.3.5" @@ -6281,14 +6105,14 @@ node-gyp-build@<4.0, node-gyp-build@^3.9.0: integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== node-gyp-build@^4.4.0, node-gyp-build@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +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== nofilter@^3.1.0: version "3.1.0" @@ -6300,45 +6124,38 @@ normalize-path@3, normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + 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== dependencies: path-key "^4.0.0" -object-inspect@^1.13.1, object-inspect@^1.9.0: +object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" @@ -6361,14 +6178,15 @@ object.fromentries@^2.0.7: es-abstract "^1.22.1" object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + 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== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + array.prototype.filter "^1.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" @@ -6393,7 +6211,7 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -6407,15 +6225,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" + is-docker "^2.0.0" + is-wsl "^2.1.1" opener@^1.5.2: version "1.5.2" @@ -6533,12 +6349,11 @@ pac-proxy-agent@^7.0.1: socks-proxy-agent "^8.0.2" pac-resolver@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" - integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" - ip "^1.1.8" netmask "^2.0.2" pako@^2.0.2: @@ -6568,6 +6383,27 @@ parse-ms@^3.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -6583,7 +6419,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -6664,19 +6500,15 @@ plur@^5.1.0: dependencies: irregular-plurals "^3.3.0" -postcss@^8.4.27: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" +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== -postcss@^8.4.32: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== +postcss@^8.4.27, postcss@^8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -6688,9 +6520,9 @@ pprof-format@^2.0.7: integrity sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA== prebuild-install@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" @@ -6718,23 +6550,18 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier-plugin-jsdoc@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.1.1.tgz#37cc5e8e4634de338d9a62dcd80c2b78591e1d11" - integrity sha512-yA13k0StQ+g0RJBrmo2IldVSp3ANXlJdsNzQNhGtQ0LY7JFC+u01No/1Z9xp0ZhT4u98BXlPAc4SC0iambqy5A== + version "1.3.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.0.tgz#98e9cbecc5b8725801cc8a4233a16748500e867b" + integrity sha512-cQm8xIa0fN9ieJFMXACQd6JPycl+8ouOijAqUqu44EF/s4fXL3Wi9sKXuEaodsEWgCN42Xby/bNhqgM1iWx4uw== dependencies: binary-searching "^2.0.5" comment-parser "^1.4.0" mdast-util-from-markdown "^2.0.0" -prettier@^3.0.0, prettier@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== - -prettier@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" - integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== +prettier@^3.0.0, prettier@^3.0.3, prettier@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-format@^27.0.2: version "27.5.1" @@ -6792,10 +6619,10 @@ protobufjs@^6.10.3, protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: "@types/node" ">=13.7.0" long "^4.0.0" -protobufjs@^7.0.0, protobufjs@^7.2.4: - version "7.2.5" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" - integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== +protobufjs@^7.0.0, protobufjs@^7.2.5: + version "7.2.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" + integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -6842,26 +6669,26 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -puppeteer-core@21.9.0: - version "21.9.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.9.0.tgz#7462d5dd0571cd1e0580cc3729d7951cc6fe2505" - integrity sha512-QgowcczLAoLWlV38s3y3VuEvjJGfKU5rR6Q23GUbiGOaiQi+QpaWQ+aXdzP9LHVSUPmHdAaWhcvMztYSw3f8gQ== +puppeteer-core@21.11.0: + version "21.11.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.11.0.tgz#6c60ec350f1a3a2152179c68166da6edfce18a23" + integrity sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q== dependencies: "@puppeteer/browsers" "1.9.1" - chromium-bidi "0.5.4" + chromium-bidi "0.5.8" cross-fetch "4.0.0" debug "4.3.4" devtools-protocol "0.0.1232444" ws "8.16.0" puppeteer@^21.9.0: - version "21.9.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-21.9.0.tgz#ff6cb321f6d43c1f39ba74bbdfccf2b5ef0121af" - integrity sha512-vcLR81Rp+MBrgqhiXZfpwEBbyKTa88Hd+8Al3+emWzcJb9evLLSfUYli0QUqhofPFrXsO2A/dAF9OunyOivL6w== + version "21.11.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-21.11.0.tgz#46e64067b742b0e17a3b8dc668bc437f45cdd9f1" + integrity sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg== dependencies: "@puppeteer/browsers" "1.9.1" cosmiconfig "9.0.0" - puppeteer-core "21.9.0" + puppeteer-core "21.11.0" pure-rand@^6.0.0: version "6.0.4" @@ -6940,30 +6767,32 @@ readonly-date@^1.0.0: integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz#e0bd28b597518f16edaf9c0e292c631eb13e0674" + integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ== 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.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + get-intrinsic "^1.2.3" globalthis "^1.0.3" which-builtin-type "^1.1.3" regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.1, 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== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" require-directory@^2.1.1: version "2.1.1" @@ -7024,7 +6853,14 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -7046,34 +6882,27 @@ rollup@^3.27.1: fsevents "~2.3.2" rollup@^4.2.0: - version "4.9.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0" - integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== + version "4.13.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" + integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.6" - "@rollup/rollup-android-arm64" "4.9.6" - "@rollup/rollup-darwin-arm64" "4.9.6" - "@rollup/rollup-darwin-x64" "4.9.6" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" - "@rollup/rollup-linux-arm64-gnu" "4.9.6" - "@rollup/rollup-linux-arm64-musl" "4.9.6" - "@rollup/rollup-linux-riscv64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-musl" "4.9.6" - "@rollup/rollup-win32-arm64-msvc" "4.9.6" - "@rollup/rollup-win32-ia32-msvc" "4.9.6" - "@rollup/rollup-win32-x64-msvc" "4.9.6" + "@rollup/rollup-android-arm-eabi" "4.13.0" + "@rollup/rollup-android-arm64" "4.13.0" + "@rollup/rollup-darwin-arm64" "4.13.0" + "@rollup/rollup-darwin-x64" "4.13.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" + "@rollup/rollup-linux-arm64-gnu" "4.13.0" + "@rollup/rollup-linux-arm64-musl" "4.13.0" + "@rollup/rollup-linux-riscv64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-musl" "4.13.0" + "@rollup/rollup-win32-arm64-msvc" "4.13.0" + "@rollup/rollup-win32-ia32-msvc" "4.13.0" + "@rollup/rollup-win32-x64-msvc" "4.13.0" fsevents "~2.3.2" -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -7093,13 +6922,13 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.0: + 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.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -7108,13 +6937,13 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-stable-stringify@^2.3.1: @@ -7139,10 +6968,10 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@^7.3.2, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -7153,31 +6982,32 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" -ses@1.3.0, ses@^0.18.4, ses@^0.18.5, ses@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ses/-/ses-1.3.0.tgz#4de8a2e740e5ff9e3cdbc4fd4a3574075c493f40" - integrity sha512-TURVgXm/fs38N4iJfhU9NjUiNvnU7Z/G7gVjM17jD+nrChRzMmR57fbvAzbQeGCS8Cm0m1fBs0jYCqmU6GZ7Tg== - dependencies: - "@endo/env-options" "^1.1.1" +ses@0.18.4, ses@^0.18.4, ses@^0.18.5, ses@^1.3.0: + version "0.18.4" + resolved "https://registry.yarnpkg.com/ses/-/ses-0.18.4.tgz#28781719870262afc6928b7d6d94dc16318dbd86" + integrity sha512-Ph0PC38Q7uutHmMM9XPqA7rp/2taiRwW6pIZJwTr4gz90DtrBvy/x7AmNPH2uqNPhKriZpYKvPi1xKWjM9xJuQ== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0, 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.1: + 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" shebang-command@^2.0.0: version "2.0.0" @@ -7191,21 +7021,27 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -7236,6 +7072,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -7278,11 +7119,11 @@ socks-proxy-agent@^8.0.2: socks "^2.7.1" socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" + integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" source-map-js@^1.0.2: @@ -7311,22 +7152,27 @@ sourcemap-codec@^1.4.8: integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== -spdx-expression-parse@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" @@ -7363,12 +7209,14 @@ stop-iteration-iterator@^1.0.0: internal-slot "^1.0.4" streamx@^2.15.0: - version "2.15.6" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.6.tgz#28bf36997ebc7bf6c08f9eba958735231b833887" - integrity sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw== + version "2.16.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== dependencies: fast-fifo "^1.1.0" queue-tick "^1.0.1" + optionalDependencies: + bare-events "^2.2.0" string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" @@ -7441,11 +7289,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-final-newline@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" @@ -7461,12 +7304,12 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== +strip-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.0.0.tgz#5d063580933e4e03ebb669b12db64d2200687527" + integrity sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA== dependencies: - acorn "^8.10.0" + js-tokens "^8.0.2" supertap@^3.0.1: version "3.0.1" @@ -7507,14 +7350,6 @@ 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.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - synckit@^0.8.6: version "0.8.8" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" @@ -7610,20 +7445,20 @@ tinybench@^2.5.1: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b" integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== -tinypool@^0.8.1: +tinypool@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.2.tgz#84013b03dc69dacb322563a475d4c0a9be00f82a" integrity sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ== tinyspy@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" - integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" + integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== +tlhunter-sorted-set@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz#1c3eae28c0fa4dff97e9501d2e3c204b86406f4b" + integrity sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw== tmp@^0.0.33: version "0.0.33" @@ -7633,11 +7468,9 @@ tmp@^0.0.33: os-tmpdir "~1.0.2" tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-fast-properties@^2.0.0: version "2.0.0" @@ -7667,26 +7500,26 @@ triple-beam@^1.3.0: integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + version "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== -tsconfck@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-2.1.2.tgz#f667035874fa41d908c1fe4d765345fcb1df6e35" - integrity sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg== +tsconfck@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.3.tgz#d9bda0e87d05b1c360e996c9050473c7e6f8084f" + integrity sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA== -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -"tslib@1 || 2", tslib@^2.0.1, tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: +"tslib@1 || 2", tslib@^2.0.1, tslib@^2.1.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== @@ -7717,10 +7550,10 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-coverage-core@^2.26.3: - version "2.26.3" - resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.26.3.tgz#47e2c8225f582d1ca9551c2bace20836b295c944" - integrity sha512-rzNdW/tClHJvsUiy787b/UX53bNh1Dn7A5KqZDQjkL3j7iKFv/KnTolxDBBgTPcK4Zn9Ab7WLrik7cXw2oZZqw== +type-coverage-core@^2.27.1: + version "2.27.1" + resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.27.1.tgz#f552cdabfcbe71408a4cd3886a2c9e4e50cbdbc7" + integrity sha512-W+PMYbhUsq+UWkrb7UkmyO7zF3zt4qZuQukyDM6eaiCIkMJclcVmR3O02clDk4FKpKPbzHictOmoIu3fYp+53g== dependencies: fast-glob "3" minimatch "6 || 7 || 8 || 9" @@ -7729,12 +7562,12 @@ type-coverage-core@^2.26.3: tsutils "3" type-coverage@^2.26.3: - version "2.27.0" - resolved "https://registry.yarnpkg.com/type-coverage/-/type-coverage-2.27.0.tgz#682de585b8814d0772100cd99b31df8f3eb75f7b" - integrity sha512-Gs4HcUPrZ+Z7De/eqZfw60SOEjzN30CI94p/2luye0IUI1y9TsWVOkchrqArR3khpN+ACXXQyxsiqH0FdoN48Q== + version "2.27.1" + resolved "https://registry.yarnpkg.com/type-coverage/-/type-coverage-2.27.1.tgz#e583751b0aa9ebc3471f7d71a2f9c0a46578b813" + integrity sha512-KAL2BRRvEACnyh830WoazZ5YJTmFBHEk/mCrJlVxNqjbAPrusJN0c4u3IzRrFMq/yRKsVEvwMp/awQDF4RgLSQ== dependencies: minimist "1" - type-coverage-core "^2.26.3" + type-coverage-core "^2.27.1" type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" @@ -7756,54 +7589,64 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +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.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + 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.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== 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" -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.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== 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" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" -typescript@^5.0.2, typescript@~5.2.2: +typescript@^5.0.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== + +typescript@~5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== ufo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" - integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.4.0.tgz#39845b31be81b4f319ab1d99fd20c56cac528d32" + integrity sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -7835,15 +7678,10 @@ unist-util-stringify-position@^4.0.0: dependencies: "@types/unist" "^3.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== update-browserslist-db@^1.0.13: version "1.0.13" @@ -7860,10 +7698,10 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urlpattern-polyfill@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz#bc7e386bb12fd7898b58d1509df21d3c29ab3460" - integrity sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g== +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== use-sync-external-store@1.2.0: version "1.2.0" @@ -7875,10 +7713,10 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite-node@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.2.1.tgz#bca96ae91b2b1ee9a7aa73685908362d70ce26a8" - integrity sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg== +vite-node@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.3.1.tgz#a93f7372212f5d5df38e945046b945ac3f4855d2" + integrity sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng== dependencies: cac "^6.7.14" debug "^4.3.4" @@ -7887,18 +7725,18 @@ vite-node@1.2.1: vite "^5.0.0" vite-tsconfig-paths@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz#e53b89096b91d31a6d1e26f75999ea8c336a89ed" - integrity sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz#28762938151e7c80aec9d70c57e65ddce43a576f" + integrity sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw== dependencies: debug "^4.1.1" globrex "^0.1.2" - tsconfck "^2.1.0" + tsconfck "^3.0.1" vite@^4.3.2, vite@^4.4.5: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" - integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== + version "4.5.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" + integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -7907,28 +7745,27 @@ vite@^4.3.2, vite@^4.4.5: fsevents "~2.3.2" vite@^5.0.0: - version "5.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" - integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w== + version "5.1.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.6.tgz#706dae5fab9e97f57578469eef1405fc483943e4" + integrity sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA== dependencies: esbuild "^0.19.3" - postcss "^8.4.32" + postcss "^8.4.35" rollup "^4.2.0" optionalDependencies: fsevents "~2.3.3" vitest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.2.1.tgz#9afb705826a2c6260a71b625d28b49117833dce6" - integrity sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA== - dependencies: - "@vitest/expect" "1.2.1" - "@vitest/runner" "1.2.1" - "@vitest/snapshot" "1.2.1" - "@vitest/spy" "1.2.1" - "@vitest/utils" "1.2.1" + version "1.3.1" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.3.1.tgz#2d7e9861f030d88a4669392a4aecb40569d90937" + integrity sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ== + dependencies: + "@vitest/expect" "1.3.1" + "@vitest/runner" "1.3.1" + "@vitest/snapshot" "1.3.1" + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" acorn-walk "^8.3.2" - cac "^6.7.14" chai "^4.3.10" debug "^4.3.4" execa "^8.0.1" @@ -7937,11 +7774,11 @@ vitest@^1.2.1: pathe "^1.1.1" picocolors "^1.0.0" std-env "^3.5.0" - strip-literal "^1.3.0" + strip-literal "^2.0.0" tinybench "^2.5.1" - tinypool "^0.8.1" + tinypool "^0.8.2" vite "^5.0.0" - vite-node "1.2.1" + vite-node "1.3.1" why-is-node-running "^2.2.2" wcwidth@^1.0.1: @@ -8009,25 +7846,25 @@ which-builtin-type@^1.1.3: which-typed-array "^1.1.9" which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + 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.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + 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.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^2.0.1: version "2.0.2" @@ -8045,9 +7882,9 @@ why-is-node-running@^2.2.2: stackback "0.0.2" winston-transport@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" - integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== + version "4.7.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== dependencies: logform "^2.3.2" readable-stream "^3.6.0" @@ -8132,6 +7969,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^2.2.2: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -8169,8 +8011,8 @@ yocto-queue@^1.0.0: integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== zustand@^4.4.1: - version "4.4.6" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.6.tgz#03c78e3e2686c47095c93714c0c600b72a6512bd" - integrity sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg== + version "4.5.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" + integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== dependencies: use-sync-external-store "1.2.0" From 7466e382c488e4026d27e39b09725c1ec6564dec Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Thu, 7 Mar 2024 17:30:09 -0600 Subject: [PATCH 133/152] build: governance dep; @endo/init etc. for deploy-script --- contract/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contract/package.json b/contract/package.json index cf759f89..75c925be 100644 --- a/contract/package.json +++ b/contract/package.json @@ -22,10 +22,10 @@ "@agoric/deploy-script-support": "^0.10.4-u14.0", "@agoric/eslint-config": "dev", "@agoric/smart-wallet": "0.5.4-u14.0", - "@agoric/vats": "0.15.2-u14.0", + "@agoric/store": "0.9.3-u14.0", "@agoric/xsnap": "0.14.3-u14.0", + "@agoric/zone": "0.2.3-u14.0", "@endo/eslint-plugin": "^0.5.2", - "@endo/init": "^0.5.60", "@endo/nat": "^4.1.27", "@endo/promise-kit": "0.2.56", "@endo/ses-ava": "^0.2.44", @@ -51,9 +51,12 @@ }, "dependencies": { "@agoric/ertp": "^0.16.3-u14.0", + "@agoric/governance": "^0.10.4-u14.0", + "@agoric/vats": "0.15.2-u14.0", "@agoric/zoe": "^0.26.3-u14.0", "@endo/bundle-source": "^2.8.0", "@endo/far": "^0.2.22", + "@endo/init": "^0.5.60", "@endo/marshal": "^0.8.9", "@endo/patterns": "^0.2.5" }, From 343c8db831d5b24ede3af511de786149e58af234 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 12 Mar 2024 15:57:17 -0500 Subject: [PATCH 134/152] chore: prune bash scripts obsoleted by deploy-contract.js --- contract/scripts/build-proposal.sh | 11 ------ contract/scripts/install-bundles.sh | 24 ------------- contract/scripts/parseProposals.mjs | 41 ---------------------- contract/scripts/propose-start-contract.sh | 22 ------------ 4 files changed, 98 deletions(-) delete mode 100755 contract/scripts/build-proposal.sh delete mode 100755 contract/scripts/install-bundles.sh delete mode 100755 contract/scripts/parseProposals.mjs delete mode 100755 contract/scripts/propose-start-contract.sh diff --git a/contract/scripts/build-proposal.sh b/contract/scripts/build-proposal.sh deleted file mode 100755 index 68bdcadb..00000000 --- a/contract/scripts/build-proposal.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# NOTE: intended to run _inside_ the agd container - -cd /workspace/contract - -mkdir -p bundles -(agoric run ./scripts/build-contract-deployer.js )>/tmp/,run.log -./scripts/parseProposals.mjs bundles/bundle-list - - diff --git a/contract/scripts/install-bundles.sh b/contract/scripts/install-bundles.sh deleted file mode 100755 index 717257bb..00000000 --- a/contract/scripts/install-bundles.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# NOTE: intended to run _inside_ the agd container - -set -xueo pipefail - -cd /workspace/contract - -# TODO: try `agoric publish` to better track outcome -install_bundle() { - ls -sh "$1" - agd tx swingset install-bundle --compress "@$1" \ - --from user1 --keyring-backend=test --gas=auto --gas-adjustment=1.2 \ - --chain-id=agoriclocal -bblock --yes -o json -} - -# exit fail if bundle-list is emtpy -[ -s bundles/bundle-list ] || exit 1 - -make balance-q # do we have enough IST? - -for b in $(cat bundles/bundle-list); do - echo installing $b - install_bundle $b -done diff --git a/contract/scripts/parseProposals.mjs b/contract/scripts/parseProposals.mjs deleted file mode 100755 index daab1be3..00000000 --- a/contract/scripts/parseProposals.mjs +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node - -import fs from 'fs'; - -const Fail = (template, ...args) => { - throw Error(String.raw(template, ...args.map(val => String(val)))); -}; - -/** - * Parse output of `agoric run proposal-builder.js` - * - * @param {string} txt - * - * adapted from packages/boot/test/bootstrapTests/supports.js - */ -const parseProposalParts = txt => { - const evals = [ - ...txt.matchAll(/swingset-core-eval (?\S+) (?