diff --git a/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh b/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh deleted file mode 100755 index 89b175b7340..00000000000 --- a/a3p-integration/proposals/z:acceptance/create-kread-item-test.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -euo pipefail - -source /usr/src/upgrade-test-scripts/env_setup.sh - -OFFER=$(mktemp -t agops.XXX) -agops vaults open --wantMinted 6.00 --giveCollateral 9.0 >| "$OFFER" -agoric wallet send --offer "$OFFER" --from $GOV1ADDR --keyring-backend="test" - -govamount="200000000ubld" -provisionSmartWallet $GOV1ADDR $govamount - -KREAD_ITEM_OFFER=$(mktemp -t kreadItem.XXX) -node ./generate-kread-item-request.mjs > $KREAD_ITEM_OFFER -agops perf satisfaction --from $GOV1ADDR --executeOffer $KREAD_ITEM_OFFER --keyring-backend=test - -agd query vstorage data published.wallet.$GOV1ADDR.current -o json >&gov1.out -name=$(jq '.value | fromjson | .values[2] | fromjson | .body[1:] | fromjson | .purses[1].balance.value.payload[0][0].name ' gov1.out) -test_val $name \"ephemeral_Ace\" "found KREAd character" diff --git a/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs b/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs deleted file mode 100644 index 55feaf5f067..00000000000 --- a/a3p-integration/proposals/z:acceptance/generate-kread-item-request.mjs +++ /dev/null @@ -1,77 +0,0 @@ -/* global process */ -import assert from 'assert'; -import { execFile } from 'child_process'; - -const ISTunit = 1_000_000n; // aka displayInfo: { decimalPlaces: 6 } - -const id = `KREAd-test-${Date.now()}`; - -// poor-man's zx -const $ = cmd => { - const [file, ...args] = cmd.split(' '); - - return new Promise((resolve, reject) => { - execFile(file, args, { encoding: 'utf8' }, (err, out) => { - if (err) return reject(err); - resolve(out); - }); - }); -}; - -const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]); - -const fromSmallCapsEntries = txt => { - const { body, slots } = JSON.parse(txt); - const theEntries = zip(JSON.parse(body.slice(1)), slots).map( - ([[name, ref], boardID]) => { - const iface = ref.replace(/^\$\d+\./, ''); - return [name, { iface, boardID }]; - }, - ); - return Object.fromEntries(theEntries); -}; - -const brand = fromSmallCapsEntries( - await $('agoric follow -lF :published.agoricNames.brand -o text'), -); -assert(brand.IST); - -const slots = []; // XXX global mutable state - -const smallCaps = { - Nat: n => `+${n}`, - // XXX mutates obj - ref: obj => { - if (obj.ix) return obj.ix; - const ix = slots.length; - slots.push(obj.boardID); - obj.ix = `$${ix}.Alleged: ${obj.iface}`; - return obj.ix; - }, -}; - -const body = { - method: 'executeOffer', - offer: { - id, - invitationSpec: { - source: 'agoricContract', - instancePath: ['kread'], - callPipe: [['makeMintCharacterInvitation', []]], - }, - offerArgs: { name: 'ephemeral_Ace' }, - proposal: { - give: { - Price: { - brand: smallCaps.ref(brand.IST), - value: smallCaps.Nat(5n * ISTunit), - }, - }, - }, - }, -}; - -const capData = { body: `#${JSON.stringify(body)}`, slots }; -const action = JSON.stringify(capData); - -console.log(action); diff --git a/a3p-integration/proposals/z:acceptance/kread.test.js b/a3p-integration/proposals/z:acceptance/kread.test.js new file mode 100644 index 00000000000..b7ed9404f53 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/kread.test.js @@ -0,0 +1,166 @@ +import test from 'ava'; +import { + provisionSmartWallet, + USER1ADDR as Alice, + GOV1ADDR as Bob, +} from '@agoric/synthetic-chain'; +import { + buyCharacter, + buyItem, + getCharacterInventory, + getMarketCharactersChildren, + getBalanceFromPurse, + getMarketItem, + getMarketItemsChildren, + mintCharacter, + sellCharacter, + sellItem, + unequipAllItems, +} from './test-lib/kread.js'; + +test.serial('Alice mints a new Character', async t => { + await provisionSmartWallet(Alice, '200000000ubld'); + const characterBalanceBefore = await getBalanceFromPurse(Alice, 'character'); + t.is(characterBalanceBefore, null, 'A Character should not exist in purse'); + + await mintCharacter(Alice); + + const characterBalanceAfter = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceAfter.name, + 'ephemeral_Ace', + 'Minted Character name should be ephemeral_Ace', + ); +}); + +test.serial('Alice unequips all defaults Items', async t => { + const itemBalanceBefore = await getBalanceFromPurse(Alice, 'item'); + t.is(itemBalanceBefore, null, 'An Item should not exist in purse'); + + const characterId = 'ephemeral_Ace'; + const characterInventoryBefore = await getCharacterInventory(characterId); + t.is( + characterInventoryBefore.length, + 3, + 'Character should have 3 items in inventory', + ); + + await unequipAllItems(Alice); + + const characterInventoryAfter = await getCharacterInventory(characterId); + t.is( + characterInventoryAfter.length, + 0, + 'Character should have 0 items in inventory', + ); + + const itemBalanceAfter = await getBalanceFromPurse(Alice, 'item'); + t.is( + itemBalanceAfter.description, + characterInventoryBefore[0][0].description, + 'The unequipped Item should exist in purse', + ); +}); + +test.serial('Alice sells one unequipped Item', async t => { + const itemListBefore = await getMarketItemsChildren(); + const itemBefore = await getBalanceFromPurse(Alice, 'item'); + + await sellItem(Alice); + + const itemListAfter = await getMarketItemsChildren(); + t.is( + itemListAfter.length, + itemListBefore.length + 1, + 'Items market should have 1 more item', + ); + + const soldItemNode = itemListAfter.filter( + itemNode => !itemListBefore.includes(itemNode), + ); + const soldItem = await getMarketItem(soldItemNode); + + t.is( + itemBefore.description, + soldItem.asset.description, + 'Item on purse should have the same description as the one sold to market', + ); +}); + +test.serial('Bob buys an Item on marketplace', async t => { + const itemListBefore = await getMarketItemsChildren(); + const marketItemNode = itemListBefore[0]; + const marketItem = await getMarketItem(marketItemNode); + + await buyItem(Bob); + + const itemListAfter = await getMarketItemsChildren(); + t.is( + itemListAfter.length, + itemListBefore.length - 1, + 'Items market should have 1 less item', + ); + + const boughtItemNode = itemListBefore.filter( + itemNode => !itemListAfter.includes(itemNode), + ); + t.is( + marketItemNode, + boughtItemNode[0], + 'Item bought should have been removed from market', + ); + + const item = await getBalanceFromPurse(Bob, 'item'); + t.is( + item.description, + marketItem.asset.description, + 'Item on purse should have the same description as the one bought from market', + ); +}); + +test.serial('Alice sells a Character', async t => { + const characterListBefore = await getMarketCharactersChildren(); + t.false( + characterListBefore.includes('character-ephemeral_Ace'), + 'Character should not be on market before selling', + ); + + const characterBalanceBefore = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceBefore.name, + 'ephemeral_Ace', + 'Character name should be ephemeral_Ace', + ); + + await sellCharacter(Alice); + + const characterListAfter = await getMarketCharactersChildren(); + t.true( + characterListAfter.includes('character-ephemeral_Ace'), + 'Character should be on market after selling', + ); + + const characterBalanceAfter = await getBalanceFromPurse(Alice, 'character'); + t.is( + characterBalanceAfter, + null, + 'Character should not be in purse after selling', + ); +}); + +test.serial('Bob buys a Character on marketplace', async t => { + await buyCharacter(Bob); + + const characterListBefore = await getMarketCharactersChildren(); + t.false( + characterListBefore.includes('character-ephemeral_Ace'), + 'Character should not be on market after buying', + ); + + const characterBalance = await getBalanceFromPurse(Bob, 'character'); + t.is( + characterBalance.name, + 'ephemeral_Ace', + 'Character name should be ephemeral_Ace', + ); +}); diff --git a/a3p-integration/proposals/z:acceptance/package.json b/a3p-integration/proposals/z:acceptance/package.json index 9b7968892e3..7410b3c8446 100644 --- a/a3p-integration/proposals/z:acceptance/package.json +++ b/a3p-integration/proposals/z:acceptance/package.json @@ -12,6 +12,7 @@ "dependencies": { "@agoric/ertp": "dev", "@agoric/internal": "dev", + "@agoric/store": "dev", "@agoric/synthetic-chain": "^0.3.0", "@endo/errors": "^1.2.2", "@endo/far": "^1.1.5", diff --git a/a3p-integration/proposals/z:acceptance/test-lib/kread.js b/a3p-integration/proposals/z:acceptance/test-lib/kread.js new file mode 100644 index 00000000000..83ecc0c3f77 --- /dev/null +++ b/a3p-integration/proposals/z:acceptance/test-lib/kread.js @@ -0,0 +1,358 @@ +import assert from 'assert'; +import '@endo/init'; +import { + agoric, + executeOffer, + getContractInfo, + makeAgd, +} from '@agoric/synthetic-chain'; +import { execFileSync } from 'child_process'; +import { makeCopyBag } from '@agoric/store'; +import { AmountMath } from '@agoric/ertp'; +import { makeFromBoard, boardSlottingMarshaller } from './rpc.js'; + +const ISTunit = 1_000_000n; + +const showAndExec = (file, args, opts) => { + console.log('$', file, ...args); + return execFileSync(file, args, opts); +}; + +// @ts-expect-error string is not assignable to Buffer +const agd = makeAgd({ execFileSync: showAndExec }).withOpts({ + keyringBackend: 'test', +}); + +const fromBoard = makeFromBoard(); +const marshaller = boardSlottingMarshaller(fromBoard.convertSlotToVal); + +const brandsRaw = await agoric.follow( + '-lF', + ':published.agoricNames.brand', + '-o', + 'text', +); +const brands = Object.fromEntries( + marshaller.fromCapData(JSON.parse(brandsRaw)), +); + +assert(brands.IST, 'Brand IST not found'); +assert(brands.timer, 'Brand timer not found'); +assert(brands.KREAdCHARACTER, 'Brand KREAdCHARACTER not found'); +assert(brands.KREAdITEM, 'Brand KREAdITEM not found'); + +export const getMarketCharactersChildren = async () => { + const { children } = await agd.query([ + 'vstorage', + 'children', + `published.kread.market-characters`, + ]); + + return children; +}; + +export const getMarketItemsChildren = async () => { + const { children } = await agd.query([ + 'vstorage', + 'children', + `published.kread.market-items`, + ]); + + return children; +}; + +export const getMarketItem = async itemNode => { + const itemMarketPath = `:published.kread.market-items.${itemNode}`; + const rawItemData = await agoric.follow('-lF', itemMarketPath, '-o', 'text'); + const item = marshaller.fromCapData(JSON.parse(rawItemData)); + + return item; +}; + +export const getCharacterInventory = async characterName => { + const inventoryPath = `kread.character.inventory-${characterName}`; + const characterInventory = await getContractInfo(inventoryPath, { + agoric, + prefix: 'published.', + }); + + return characterInventory; +}; + +export const getMarketCharacterFromVstorage = async () => { + const charactersMarket = await getMarketCharactersChildren(); + const path = `:published.kread.market-characters.${charactersMarket[0]}`; + const rawCharacterData = await agoric.follow('-lF', path, '-o', 'text'); + const marketCharacter = marshaller.fromCapData(JSON.parse(rawCharacterData)); + + return marketCharacter; +}; + +export const getBalanceFromPurse = async (address, type) => { + const walletRaw = await agoric.follow( + '-lF', + `:published.wallet.${address}.current`, + '-o', + 'text', + ); + const purses = marshaller.fromCapData(JSON.parse(walletRaw)).purses; + + const assetBrands = { + character: brands.KREAdCHARACTER, + item: brands.KREAdITEM, + }; + const assetBrand = assetBrands[type]; + if (!assetBrand) { + throw new Error('Invalid type provided. Must be "character" or "item".'); + } + + const assetPurse = purses.find( + ({ brand }) => brand.getBoardId() === assetBrand.getBoardId(), + ); + + return assetPurse?.balance.value.payload[0]?.[0] || null; +}; + +/** @import {Brand, CopyBagAmount} from '@agoric/ertp/src/types.js'; */ + +/** + * @param {Brand} brand + * @param {any} asset + * @returns {CopyBagAmount<'item'>} + */ +export const assetAsAmount = (brand, asset) => { + const assetValue = makeCopyBag([[asset, 1n]]); + const assetAmount = AmountMath.make(brand, assetValue); + return assetAmount; +}; + +export const totalAssetPriceAmount = asset => { + const fees = AmountMath.add(asset.platformFee, asset.royalty); + const price = AmountMath.add(asset.askingPrice, fees); + return price; +}; +const mintCharacterOffer = async () => { + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-mint-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeMintCharacterInvitation', []]], + }, + offerArgs: { name: 'ephemeral_Ace' }, + proposal: { + give: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const unequipAllItemsOffer = async address => { + const kreadCharacter = await getBalanceFromPurse(address, 'character'); + if (!kreadCharacter) { + throw new Error('Character not found on user purse'); + } + + // deal with KREAd's funky parallel character representation swap + const inventoryKeyId = kreadCharacter.keyId === 1 ? 2 : 1; + const kreadCharacter2 = { ...kreadCharacter, keyId: inventoryKeyId }; + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter, + ); + + const kreadCharacter2Amount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter2, + ); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-unequip-all-items-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeUnequipAllInvitation', []]], + }, + proposal: { + give: { + CharacterKey1: kreadCharacterAmount, + }, + want: { + CharacterKey2: kreadCharacter2Amount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const buyItemOffer = async () => { + const children = await getMarketItemsChildren(); + const marketItem = await getMarketItem(children[0]); + + const itemAmount = assetAsAmount(brands.KREAdITEM, marketItem.asset); + const priceAmount = totalAssetPriceAmount(marketItem); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-buy-item-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeBuyItemInvitation', []]], + }, + offerArgs: { entryId: marketItem.id }, + proposal: { + give: { + Price: priceAmount, + }, + want: { + Item: itemAmount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const sellItemOffer = async address => { + const kreadItem = await getBalanceFromPurse(address, 'item'); + if (!kreadItem) { + throw new Error('Item not found on user purse'); + } + + const itemAmount = assetAsAmount(brands.KREAdITEM, kreadItem); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-sell-item-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeSellItemInvitation', []]], + }, + proposal: { + give: { + Item: itemAmount, + }, + want: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const buyCharacterOffer = async () => { + const marketCharacter = await getMarketCharacterFromVstorage(); + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + marketCharacter.asset, + ); + const priceAmount = totalAssetPriceAmount(marketCharacter); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-buy-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeBuyCharacterInvitation', []]], + }, + proposal: { + give: { + Price: priceAmount, + }, + want: { + Character: kreadCharacterAmount, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +const sellCharacterOffer = async address => { + const kreadCharacter = await getBalanceFromPurse(address, 'character'); + if (!kreadCharacter) { + throw new Error('Character not found on user purse'); + } + + const kreadCharacterAmount = assetAsAmount( + brands.KREAdCHARACTER, + kreadCharacter, + ); + + const body = { + method: 'executeOffer', + offer: { + id: 'KREAd-sell-character-acceptance-test', + invitationSpec: { + source: 'agoricContract', + instancePath: ['kread'], + callPipe: [['makeSellCharacterInvitation', []]], + }, + proposal: { + give: { + Character: kreadCharacterAmount, + }, + want: { + Price: { + brand: brands.IST, + value: 5n * ISTunit, + }, + }, + }, + }, + }; + + return JSON.stringify(marshaller.toCapData(harden(body))); +}; + +export const mintCharacter = async address => { + return executeOffer(address, mintCharacterOffer()); +}; + +export const unequipAllItems = async address => { + return executeOffer(address, unequipAllItemsOffer(address)); +}; + +export const buyItem = async address => { + return executeOffer(address, buyItemOffer()); +}; + +export const sellItem = async address => { + return executeOffer(address, sellItemOffer(address)); +}; + +export const sellCharacter = async address => { + return executeOffer(address, sellCharacterOffer(address)); +}; + +export const buyCharacter = async address => { + return executeOffer(address, buyCharacterOffer()); +}; diff --git a/a3p-integration/proposals/z:acceptance/test.sh b/a3p-integration/proposals/z:acceptance/test.sh index ee4e473496d..65514c76e9f 100755 --- a/a3p-integration/proposals/z:acceptance/test.sh +++ b/a3p-integration/proposals/z:acceptance/test.sh @@ -14,7 +14,7 @@ npm install -g tsx scripts/test-vaults.mts echo ACCEPTANCE TESTING kread -./create-kread-item-test.sh +yarn ava kread.test.js echo ACCEPTANCE TESTING valueVow yarn ava valueVow.test.js diff --git a/a3p-integration/proposals/z:acceptance/yarn.lock b/a3p-integration/proposals/z:acceptance/yarn.lock index 9ce83592e4c..23e915995d6 100644 --- a/a3p-integration/proposals/z:acceptance/yarn.lock +++ b/a3p-integration/proposals/z:acceptance/yarn.lock @@ -5,29 +5,29 @@ __metadata: version: 8 cacheKey: 10c0 -"@agoric/base-zone@npm:0.1.1-dev-9c73ae4.0+9c73ae4": - version: 0.1.1-dev-9c73ae4.0 - resolution: "@agoric/base-zone@npm:0.1.1-dev-9c73ae4.0" +"@agoric/base-zone@npm:0.1.1-dev-d7c994b.0+d7c994b": + version: 0.1.1-dev-d7c994b.0 + resolution: "@agoric/base-zone@npm:0.1.1-dev-d7c994b.0" dependencies: - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" + "@agoric/store": "npm:0.9.3-dev-d7c994b.0+d7c994b" "@endo/common": "npm:^1.2.7" "@endo/errors": "npm:^1.2.7" "@endo/exo": "npm:^1.5.6" "@endo/far": "npm:^1.1.8" "@endo/pass-style": "npm:^1.4.6" "@endo/patterns": "npm:^1.4.6" - checksum: 10c0/a924c8572c17d1e94a711e46a83dff409d37b8a00cd7e0899f091a64401ca981f31ce51cfa60ed00e5bee94d7b96dd5523fd88a1419f542c73d95e418a10c3b8 + checksum: 10c0/c739aaba377d0f9409561ece7f9ed94ef3cdad7ddbbf56609bc50ea9fe71446fccbd92bb5a4dcb11a40872fdf862b5a7836b8140b5639ca501717b569249a344 languageName: node linkType: hard "@agoric/ertp@npm:dev": - version: 0.16.3-dev-9c73ae4.0 - resolution: "@agoric/ertp@npm:0.16.3-dev-9c73ae4.0" + version: 0.16.3-dev-d7c994b.0 + resolution: "@agoric/ertp@npm:0.16.3-dev-d7c994b.0" dependencies: - "@agoric/notifier": "npm:0.6.3-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" - "@agoric/zone": "npm:0.2.3-dev-9c73ae4.0+9c73ae4" + "@agoric/notifier": "npm:0.6.3-dev-d7c994b.0+d7c994b" + "@agoric/store": "npm:0.9.3-dev-d7c994b.0+d7c994b" + "@agoric/vat-data": "npm:0.5.3-dev-d7c994b.0+d7c994b" + "@agoric/zone": "npm:0.2.3-dev-d7c994b.0+d7c994b" "@endo/errors": "npm:^1.2.7" "@endo/eventual-send": "npm:^1.2.7" "@endo/far": "npm:^1.1.8" @@ -35,15 +35,15 @@ __metadata: "@endo/nat": "npm:^5.0.12" "@endo/patterns": "npm:^1.4.6" "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/0012ed9cc17d6338196cfdef0198fa16bba784e535a7845758db8f0d0ecb766bbdbb22efc5cedc3971a910d65956305f3d08c77a47c79268037cc6e53a6656b8 + checksum: 10c0/050e7755fcabb1fb624b58742f02571a7b459361ef13f508002c5c64993c22200faf66df8e931caf293e35290ce42bffef3e912839d05a18d26224263e039cf3 languageName: node linkType: hard -"@agoric/internal@npm:0.3.3-dev-9c73ae4.0+9c73ae4, @agoric/internal@npm:dev": - version: 0.3.3-dev-9c73ae4.0 - resolution: "@agoric/internal@npm:0.3.3-dev-9c73ae4.0" +"@agoric/internal@npm:0.3.3-dev-d7c994b.0+d7c994b, @agoric/internal@npm:dev": + version: 0.3.3-dev-d7c994b.0 + resolution: "@agoric/internal@npm:0.3.3-dev-d7c994b.0" dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" + "@agoric/base-zone": "npm:0.1.1-dev-d7c994b.0+d7c994b" "@endo/common": "npm:^1.2.7" "@endo/errors": "npm:^1.2.7" "@endo/far": "npm:^1.1.8" @@ -55,44 +55,44 @@ __metadata: "@endo/stream": "npm:^1.2.7" anylogger: "npm:^0.21.0" jessie.js: "npm:^0.3.4" - checksum: 10c0/cebcf81f503e72cdb431e56d13af438275eaab407ea69512f94ca6ee8117ece71b291c2604e05264f61c31eac59fbd35bbced9227b14a4a37c5ee92f862044f6 + checksum: 10c0/ce8e58f77c92b4dab1f87ba708b1e189906cf66fcf846d0949ce24822eebca01c76ee5bb992fd4c98fe02add0dc95f502d2a0f7c4f08d6d320268b369e82a9b9 languageName: node linkType: hard -"@agoric/notifier@npm:0.6.3-dev-9c73ae4.0+9c73ae4": - version: 0.6.3-dev-9c73ae4.0 - resolution: "@agoric/notifier@npm:0.6.3-dev-9c73ae4.0" +"@agoric/notifier@npm:0.6.3-dev-d7c994b.0+d7c994b": + version: 0.6.3-dev-d7c994b.0 + resolution: "@agoric/notifier@npm:0.6.3-dev-d7c994b.0" dependencies: - "@agoric/internal": "npm:0.3.3-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" + "@agoric/internal": "npm:0.3.3-dev-d7c994b.0+d7c994b" + "@agoric/vat-data": "npm:0.5.3-dev-d7c994b.0+d7c994b" "@endo/errors": "npm:^1.2.7" "@endo/far": "npm:^1.1.8" "@endo/marshal": "npm:^1.6.1" "@endo/patterns": "npm:^1.4.6" "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/5c98617465aac5a32e69f18579e5650c8290cb3bb8643acb80a2c84d5d0cf4012df98de54ecc8c8c6cc09e4cae825818955fa61cd64d4ae2bbf6772f86c3c6d9 + checksum: 10c0/93951f38ea10f5eef09e0aa89db8e9bbd0579f8ed14fd0161701c2eb3070c25138b2076e7c101c53e36ecbf1da7cf477cc1c1d5e520f8107a0e5ebf02aa9796f languageName: node linkType: hard -"@agoric/store@npm:0.9.3-dev-9c73ae4.0+9c73ae4": - version: 0.9.3-dev-9c73ae4.0 - resolution: "@agoric/store@npm:0.9.3-dev-9c73ae4.0" +"@agoric/store@npm:0.9.3-dev-d7c994b.0+d7c994b, @agoric/store@npm:dev": + version: 0.9.3-dev-d7c994b.0 + resolution: "@agoric/store@npm:0.9.3-dev-d7c994b.0" dependencies: "@endo/errors": "npm:^1.2.7" "@endo/exo": "npm:^1.5.6" "@endo/marshal": "npm:^1.6.1" "@endo/pass-style": "npm:^1.4.6" "@endo/patterns": "npm:^1.4.6" - checksum: 10c0/7575dba675c9912968771aa92764fa2e7cb9118f9d8278e40096cdd266f6a035b37e5781f1ea80c41961fc820cc5f3c2174683bba5c0b56c35c98d1890192110 + checksum: 10c0/0d90e03e71dd3f9a152308b0d3ebfe9a5e31e56bf47dcd1e7c58c38dba52ecf72279aa04c44c4f4e1570428b3828419cc59b1072c3346f9fed502a8828dae0b0 languageName: node linkType: hard -"@agoric/swingset-liveslots@npm:0.10.3-dev-9c73ae4.0+9c73ae4": - version: 0.10.3-dev-9c73ae4.0 - resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-9c73ae4.0" +"@agoric/swingset-liveslots@npm:0.10.3-dev-d7c994b.0+d7c994b": + version: 0.10.3-dev-d7c994b.0 + resolution: "@agoric/swingset-liveslots@npm:0.10.3-dev-d7c994b.0" dependencies: - "@agoric/internal": "npm:0.3.3-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" + "@agoric/internal": "npm:0.3.3-dev-d7c994b.0+d7c994b" + "@agoric/store": "npm:0.9.3-dev-d7c994b.0+d7c994b" "@endo/env-options": "npm:^1.1.7" "@endo/errors": "npm:^1.2.7" "@endo/eventual-send": "npm:^1.2.7" @@ -104,7 +104,7 @@ __metadata: "@endo/pass-style": "npm:^1.4.6" "@endo/patterns": "npm:^1.4.6" "@endo/promise-kit": "npm:^1.1.7" - checksum: 10c0/93ed5fb3373a05007bc372c84344d3c714561a027ca5a835364e3755ae8bb7a4caa639ebabda78a0062bf209ece1b3d582cc403d6d42235d75d13ab9ac59e656 + checksum: 10c0/ab846647342126e6c0f16a1709c938a75c4e75f4cfffeaeeef70ec33e193ade258d18ee748cfa220e6e38239c79692b6a6ae082facaf95519b0485d711a14a7e languageName: node linkType: hard @@ -123,30 +123,30 @@ __metadata: languageName: node linkType: hard -"@agoric/vat-data@npm:0.5.3-dev-9c73ae4.0+9c73ae4": - version: 0.5.3-dev-9c73ae4.0 - resolution: "@agoric/vat-data@npm:0.5.3-dev-9c73ae4.0" +"@agoric/vat-data@npm:0.5.3-dev-d7c994b.0+d7c994b": + version: 0.5.3-dev-d7c994b.0 + resolution: "@agoric/vat-data@npm:0.5.3-dev-d7c994b.0" dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" - "@agoric/store": "npm:0.9.3-dev-9c73ae4.0+9c73ae4" - "@agoric/swingset-liveslots": "npm:0.10.3-dev-9c73ae4.0+9c73ae4" + "@agoric/base-zone": "npm:0.1.1-dev-d7c994b.0+d7c994b" + "@agoric/store": "npm:0.9.3-dev-d7c994b.0+d7c994b" + "@agoric/swingset-liveslots": "npm:0.10.3-dev-d7c994b.0+d7c994b" "@endo/errors": "npm:^1.2.7" "@endo/exo": "npm:^1.5.6" "@endo/patterns": "npm:^1.4.6" - checksum: 10c0/903940756aa8d38ca7f9aa5c35ac1e4df922f0a2efca4b7557ef96f560ac348117da16886894ef6a73ce3b9051067f6f80299c14f36c69c6c914ca0760c31305 + checksum: 10c0/860280ad7f09f499d8fea3d494c787748571a12b2e636c53762924064c9ea2e6c0e7fbe50c41f804f981f32066d82d3ff0a733c58276df180e5670b5b382a79f languageName: node linkType: hard -"@agoric/zone@npm:0.2.3-dev-9c73ae4.0+9c73ae4": - version: 0.2.3-dev-9c73ae4.0 - resolution: "@agoric/zone@npm:0.2.3-dev-9c73ae4.0" +"@agoric/zone@npm:0.2.3-dev-d7c994b.0+d7c994b": + version: 0.2.3-dev-d7c994b.0 + resolution: "@agoric/zone@npm:0.2.3-dev-d7c994b.0" dependencies: - "@agoric/base-zone": "npm:0.1.1-dev-9c73ae4.0+9c73ae4" - "@agoric/vat-data": "npm:0.5.3-dev-9c73ae4.0+9c73ae4" + "@agoric/base-zone": "npm:0.1.1-dev-d7c994b.0+d7c994b" + "@agoric/vat-data": "npm:0.5.3-dev-d7c994b.0+d7c994b" "@endo/errors": "npm:^1.2.7" "@endo/far": "npm:^1.1.8" "@endo/pass-style": "npm:^1.4.6" - checksum: 10c0/0c4da29f8422c4da27b2ee7abbc21c52f73f3f305c99ee39dcb2dfb9d62199d49aa306d60335b0f9dc3b0e8cf8b3470d95fddfa5e8152bee2ef47ffe2932a5ca + checksum: 10c0/ac5cbe949e81048cbaf08b1e5ad5a91c3693a0516d21214e7638b04a2a352e531221f8d1ae1b05b4506a34ea0de2f707a36c9147268082bada887d3df99fcc84 languageName: node linkType: hard @@ -1398,8 +1398,8 @@ __metadata: linkType: hard "execa@npm:^9.3.1": - version: 9.5.0 - resolution: "execa@npm:9.5.0" + version: 9.5.1 + resolution: "execa@npm:9.5.1" dependencies: "@sindresorhus/merge-streams": "npm:^4.0.0" cross-spawn: "npm:^7.0.3" @@ -1413,7 +1413,7 @@ __metadata: signal-exit: "npm:^4.1.0" strip-final-newline: "npm:^4.0.0" yoctocolors: "npm:^2.0.0" - checksum: 10c0/93bc077249a778accc019bce141e0ebdf85e1a19ea02eaa1ed00cb49436b0751a7983fee0c0d95434e81727808639c512eea8d1308104598859cac2f01336bb1 + checksum: 10c0/1a628d535c5a088f9e17a735bb3143efc4198095392b319ba877b2975d5c3c57724536dccb6f68f1cd9b3af331c5a9e8c1aeb338d52ab316b1e008ff453374a7 languageName: node linkType: hard @@ -2597,6 +2597,7 @@ __metadata: dependencies: "@agoric/ertp": "npm:dev" "@agoric/internal": "npm:dev" + "@agoric/store": "npm:dev" "@agoric/synthetic-chain": "npm:^0.3.0" "@endo/errors": "npm:^1.2.2" "@endo/far": "npm:^1.1.5"