From 635f102169f22819978067294f2dce4484ed9490 Mon Sep 17 00:00:00 2001 From: "Mark S. Miller" Date: Mon, 25 Mar 2024 21:37:43 -0700 Subject: [PATCH 1/5] refactor: start replacing Far with makeExo --- contract/src/fixHub.js | 2 +- contract/src/platform-goals/board-aux.core.js | 6 +++--- contract/src/postal-service.contract.js | 2 +- contract/src/sell-concert-tickets.contract.js | 2 +- contract/src/swaparoo.contract.js | 4 ++-- contract/test/boot-tools.js | 4 ++-- contract/test/lib-gov-test/puppet-gov.js | 2 +- contract/test/wallet-tools.js | 6 +++--- contract/tools/e2e-tools.js | 6 +++--- contract/tools/ui-kit-goals/makeHttpClient.js | 2 +- contract/tools/ui-kit-goals/name-service-client.js | 4 ++-- contract/tools/ui-kit-goals/queryKit.js | 4 ++-- contract/tools/ui-kit-goals/test-nameProxy.js | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js index 1583c837..6b463419 100644 --- a/contract/src/fixHub.js +++ b/contract/src/fixHub.js @@ -11,7 +11,7 @@ const { Fail } = assert; export const fixHub = async namesByAddressAdmin => { assert(namesByAddressAdmin, 'no namesByAddressAdmin???'); /** @type {import('@agoric/vats').NameHub} */ - const hub = Far('Hub work-around', { + const hub = makeExo('Hub work-around', M.interface('Hub work-around', {}, { defaultGuards: 'passable' }), { lookup: async (addr, ...rest) => { await E(namesByAddressAdmin).reserve(addr); const addressAdmin = await E(namesByAddressAdmin).lookupAdmin(addr); diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index bcb1d953..268769c6 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -59,9 +59,9 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { ); return harden({ - brandAuxPublisher: Far('BrandAuxPublisher', { publishBrandInfo }), - boardAuxTOFU: Far('BoardAuxTOFU', { publishBrandInfo, init }), - boardAuxAdmin: Far('BoardAuxAdmin', { publishBrandInfo, init, update }), + brandAuxPublisher: makeExo('BrandAuxPublisher', M.interface('BrandAuxPublisher', {}, { defaultGuards: 'passable' }), { publishBrandInfo }), + boardAuxTOFU: makeExo('BoardAuxTOFU', M.interface('BoardAuxTOFU', {}, { defaultGuards: 'passable' }), { publishBrandInfo, init }), + boardAuxAdmin: makeExo('BoardAuxAdmin', M.interface('BoardAuxAdmin', {}, { defaultGuards: 'passable' }), { publishBrandInfo, init, update }), }); }; /** @typedef {ReturnType} BoardAuxManager */ diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 2bd08ff2..8067e372 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -61,7 +61,7 @@ export const start = zcf => { return zcf.makeInvitation(handleSend, 'send'); }; - const publicFacet = Far('postalSvc', { + const publicFacet = makeExo('postalSvc', M.interface('postalSvc', {}, { defaultGuards: 'passable' }), { lookup: (...path) => E(namesByAddress).lookup(...path), getDepositFacet, sendTo, diff --git a/contract/src/sell-concert-tickets.contract.js b/contract/src/sell-concert-tickets.contract.js index 7ee86439..945314df 100644 --- a/contract/src/sell-concert-tickets.contract.js +++ b/contract/src/sell-concert-tickets.contract.js @@ -209,7 +209,7 @@ export const start = async zcf => { zcf.makeInvitation(tradeHandler, 'buy tickets', undefined, proposalShape); // Mark the publicFacet Far, i.e. reachable from outside the contract - const publicFacet = Far('Tickets Public Facet', { + const publicFacet = makeExo('Tickets Public Facet', M.interface('Tickets Public Facet', {}, { defaultGuards: 'passable' }), { makeTradeInvitation, }); return harden({ publicFacet }); diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index cf393b2e..05d791cb 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -198,11 +198,11 @@ export const start = async (zcf, privateArgs, baggage) => { return firstInvitation; }; - const publicFacet = Far('Public', { + const publicFacet = makeExo('Public', M.interface('Public', {}, { defaultGuards: 'passable' }), { makeFirstInvitation, ...publicMixin, }); - const limitedCreatorFacet = Far('Creator', { + const limitedCreatorFacet = makeExo('Creator', M.interface('Creator', {}, { defaultGuards: 'passable' }), { makeCollectFeesInvitation() { return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee'); }, diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index ed8973b5..f0d9241d 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -95,7 +95,7 @@ export const mockBootstrapPowers = async ( spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); spaces.issuer.produce.IST.resolve(feeIssuer); spaces.issuer.produce.Invitation.resolve(invitationIssuer); - produce.priceAuthority.resolve(Far('NullPriceAuthority', {})); + produce.priceAuthority.resolve(makeExo('NullPriceAuthority', M.interface('NullPriceAuthority', {}, { defaultGuards: 'passable' }), {})); /** * @type {BootstrapPowers & import('../src/types').NonNullChainStorage} @@ -212,7 +212,7 @@ export const makeMockTools = async (t, bundleCache) => { // XXX marshal context is not fresh. hm. const makeQueryTool = () => { - return Far('QT', { + return makeExo('QT', M.interface('QT', {}, { defaultGuards: 'passable' }), { toCapData: x => boardMarshaller.toCapData(x), // XXX remote??? fromCapData: d => boardMarshaller.fromCapData(d), queryData: async path => { diff --git a/contract/test/lib-gov-test/puppet-gov.js b/contract/test/lib-gov-test/puppet-gov.js index 5cd6b091..d09cea93 100644 --- a/contract/test/lib-gov-test/puppet-gov.js +++ b/contract/test/lib-gov-test/puppet-gov.js @@ -54,7 +54,7 @@ export const mockElectorate = async (zoe, bundleCache) => { await bundleCache.load(assets.invitationMakerContract), ); const arbInstance = await E(zoe).startInstance(installation); - const committeeCreatorFacet = Far('Electorate CF', { + const committeeCreatorFacet = makeExo('Electorate CF', M.interface('Electorate CF', {}, { defaultGuards: 'passable' }), { getPoserInvitation: async () => E(arbInstance.publicFacet).makeInvitation(), }); return { creatorFacet: committeeCreatorFacet }; diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index 6412d7fe..dd49b148 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -58,7 +58,7 @@ export const mockWalletFactory = ( const invitationPurse = purseByBrand.get(invitationBrand); assert(invitationPurse); - const depositFacet = Far('DepositFacet', { + const depositFacet = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable' }), { /** @param {Payment} pmt */ receive: async pmt => { const pBrand = await E(pmt).getAllegedBrand(); @@ -191,8 +191,8 @@ export const mockWalletFactory = ( return { deposit: depositFacet, - offers: Far('Offers', { executeOffer, tryExit }), - peek: Far('Wallet Peek', { purseUpdates }), + offers: makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable' }), { executeOffer, tryExit }), + peek: makeExo('Wallet Peek', M.interface('Wallet Peek', {}, { defaultGuards: 'passable' }), { purseUpdates }), }; }; diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index 4b5e6218..00dce598 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -228,14 +228,14 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['offers']} */ - const offers = Far('Offers', { + const offers = makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable' }), { executeOffer, /** @param {string|number} offerId */ tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), }); /** @type {import('../test/wallet-tools.js').MockWallet['deposit']} */ - const deposit = Far('DepositFacet', { + const deposit = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable' }), { receive: async payment => { const brand = await E(payment).getAllegedBrand(); const asset = vbankEntries.find(([_denom, a]) => a.brand === brand); @@ -296,7 +296,7 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['peek']} */ - const peek = Far('Peek', { purseUpdates }); + const peek = makeExo('Peek', M.interface('Peek', {}, { defaultGuards: 'passable' }), { purseUpdates }); return { offers, deposit, peek }; }; diff --git a/contract/tools/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js index 7033d83c..1953ec2f 100644 --- a/contract/tools/ui-kit-goals/makeHttpClient.js +++ b/contract/tools/ui-kit-goals/makeHttpClient.js @@ -92,7 +92,7 @@ export const makeAPI = (apiAddress, { fetch }) => { }); }; - return Far('LCD', { + return makeExo('LCD', M.interface('LCD', {}, { defaultGuards: 'passable' }), { getJSON, latestBlock: () => getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), }); diff --git a/contract/tools/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js index 2ccb6647..d99b6c9e 100644 --- a/contract/tools/ui-kit-goals/name-service-client.js +++ b/contract/tools/ui-kit-goals/name-service-client.js @@ -14,7 +14,7 @@ export const makeAgoricNames = async qt => { } const entries = await qt.queryData(`published.agoricNames.${kind}`); const record = Object.fromEntries(entries); - const hub = Far('NameHub', { + const hub = makeExo('NameHub', M.interface('NameHub', {}, { defaultGuards: 'passable' }), { lookup: name => record[name], keys: () => entries.map(e => e[0]), entries: () => entries, @@ -27,7 +27,7 @@ export const makeAgoricNames = async qt => { nameHubCache.clear(); }; - const hub0 = Far('Hub', { + const hub0 = makeExo('Hub', M.interface('Hub', {}, { defaultGuards: 'passable' }), { lookup: async (kind, ...more) => { const hub2 = lookupKind(kind); if (more.length > 0) { diff --git a/contract/tools/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js index 7559c961..8404d598 100644 --- a/contract/tools/ui-kit-goals/queryKit.js +++ b/contract/tools/ui-kit-goals/queryKit.js @@ -79,7 +79,7 @@ export async function* eachVstorageUpdate(key, { vstorage, delay }) { * @param {import('./batchQuery.js').VStorage} powers.vstorage */ export const makeWalletView = (addr, { query, vstorage }) => { - return Far('WalletQuery', { + return makeExo('WalletQuery', M.interface('WalletQuery', {}, { defaultGuards: 'passable' }), { current: () => query.queryData(`published.wallet.${addr}.current`), /** * TODO: visit in chunks by block @@ -132,7 +132,7 @@ export const makeQueryKit = (vstorage, m = makeClientMarshaller()) => { } } - const query = Far('QueryTool', { + const query = makeExo('QueryTool', M.interface('QueryTool', {}, { defaultGuards: 'passable' }), { batchQuery, queryData, follow, diff --git a/contract/tools/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js index aa6561c1..b36a9bbe 100644 --- a/contract/tools/ui-kit-goals/test-nameProxy.js +++ b/contract/tools/ui-kit-goals/test-nameProxy.js @@ -9,7 +9,7 @@ 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', {}); + const atomBrand = makeExo('Atom Brand', M.interface('Atom Brand', {}, { defaultGuards: 'passable' }), {}); kb.nameAdmin.update('Atom', atomBrand); const agoricNames = k0.nameHub; From 9f8c3a56abaa29122f55bb4e2144010a097117ed Mon Sep 17 00:00:00 2001 From: "Mark S. Miller" Date: Mon, 25 Mar 2024 21:53:01 -0700 Subject: [PATCH 2/5] fixup! next step. does not work --- contract/package.json | 2 ++ contract/src/fixHub.js | 4 +++- contract/src/platform-goals/board-aux.core.js | 4 +++- contract/src/postal-service.contract.js | 3 ++- contract/src/sell-concert-tickets.contract.js | 2 +- contract/src/swaparoo.contract.js | 3 ++- contract/test/boot-tools.js | 4 +++- contract/test/lib-gov-test/puppet-gov.js | 4 +++- contract/test/wallet-tools.js | 4 +++- contract/tools/e2e-tools.js | 4 +++- contract/tools/ui-kit-goals/makeHttpClient.js | 3 ++- contract/tools/ui-kit-goals/name-service-client.js | 4 +++- contract/tools/ui-kit-goals/queryKit.js | 4 +++- contract/tools/ui-kit-goals/test-nameProxy.js | 3 ++- 14 files changed, 35 insertions(+), 13 deletions(-) diff --git a/contract/package.json b/contract/package.json index 44373463..7ebcb075 100644 --- a/contract/package.json +++ b/contract/package.json @@ -14,6 +14,7 @@ "build": "yarn build:deployer", "build:deployer": "rollup -c rollup.config.mjs", "test": "ava --verbose", + "format": "yarn prettier --write .github golang packages", "lint": "eslint '**/*.js'", "lint:types": "tsc -p jsconfig.json", "lint:fix": "eslint --fix '**/*.js'" @@ -56,6 +57,7 @@ "@agoric/vats": "0.15.2-u14.0", "@agoric/zoe": "^0.26.3-u14.0", "@endo/bundle-source": "^2.8.0", + "@endo/exo": "^1.3.0", "@endo/far": "^0.2.22", "@endo/init": "^0.5.60", "@endo/marshal": "^0.8.9", diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js index 6b463419..569b0af5 100644 --- a/contract/src/fixHub.js +++ b/contract/src/fixHub.js @@ -1,5 +1,7 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; const { Fail } = assert; diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index 268769c6..ccc87440 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -1,5 +1,7 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; const { Fail } = assert; diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 8067e372..a2123996 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -1,6 +1,7 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; import { M, mustMatch } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { withdrawFromSeat } from '@agoric/zoe/src/contractSupport/zoeHelpers.js'; const { keys, values } = Object; diff --git a/contract/src/sell-concert-tickets.contract.js b/contract/src/sell-concert-tickets.contract.js index 945314df..3b6e13ea 100644 --- a/contract/src/sell-concert-tickets.contract.js +++ b/contract/src/sell-concert-tickets.contract.js @@ -19,8 +19,8 @@ */ // @ts-check -import { Far } from '@endo/far'; import { M, getCopyBagEntries, makeCopyBag } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { AssetKind } from '@agoric/ertp/src/amountMath.js'; import { atomicRearrange } from '@agoric/zoe/src/contractSupport/atomicTransfer.js'; import '@agoric/zoe/exported.js'; diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index 05d791cb..fd7378de 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -2,7 +2,8 @@ // @ts-check import { M, matches, mustMatch } from '@endo/patterns'; -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { makeExo } from '@endo/exo'; import '@agoric/zoe/exported.js'; import { atomicRearrange } from '@agoric/zoe/src/contractSupport/atomicTransfer.js'; import '@agoric/zoe/src/contracts/exported.js'; diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index f0d9241d..81de07e2 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -1,5 +1,7 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { makeNameHubKit, makePromiseSpace } from '@agoric/vats'; import { makeFakeBoard } from '@agoric/vats/tools/board-utils.js'; import { makeWellKnownSpaces } from '@agoric/vats/src/core/utils.js'; diff --git a/contract/test/lib-gov-test/puppet-gov.js b/contract/test/lib-gov-test/puppet-gov.js index d09cea93..26a8c779 100644 --- a/contract/test/lib-gov-test/puppet-gov.js +++ b/contract/test/lib-gov-test/puppet-gov.js @@ -1,6 +1,8 @@ // @ts-check // borrowed from https://github.com/Agoric/agoric-sdk/blob/master/packages/inter-protocol/test/supports.js -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { createRequire } from 'node:module'; const nodeRequire = createRequire(import.meta.url); diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index dd49b148..9a94d660 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -4,7 +4,9 @@ * @see {mockWalletFactory} */ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { makePromiseKit } from '@endo/promise-kit'; // eslint-disable-next-line import/no-extraneous-dependencies diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index 00dce598..c09ca84c 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -1,6 +1,8 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; // eslint-disable-next-line import/no-extraneous-dependencies import { Nat } from '@endo/nat'; import { flags, makeAgd } from './agd-lib.js'; diff --git a/contract/tools/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js index 1953ec2f..9b6e7e1f 100644 --- a/contract/tools/ui-kit-goals/makeHttpClient.js +++ b/contract/tools/ui-kit-goals/makeHttpClient.js @@ -1,5 +1,6 @@ // @ts-check -import { Far } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; const { freeze } = Object; diff --git a/contract/tools/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js index d99b6c9e..4dae832b 100644 --- a/contract/tools/ui-kit-goals/name-service-client.js +++ b/contract/tools/ui-kit-goals/name-service-client.js @@ -1,5 +1,7 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; /** @param {{ queryData: (path: string) => any }} qt */ export const makeAgoricNames = async qt => { diff --git a/contract/tools/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js index 8404d598..fad474a0 100644 --- a/contract/tools/ui-kit-goals/queryKit.js +++ b/contract/tools/ui-kit-goals/queryKit.js @@ -1,6 +1,8 @@ // @ts-check -import { E, Far } from '@endo/far'; +import { E } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { batchVstorageQuery } from './batchQuery.js'; import { makeClientMarshaller } from './marshalTables.js'; diff --git a/contract/tools/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js index b36a9bbe..397e2b9f 100644 --- a/contract/tools/ui-kit-goals/test-nameProxy.js +++ b/contract/tools/ui-kit-goals/test-nameProxy.js @@ -1,7 +1,8 @@ import '@endo/init/debug.js'; import test from 'ava'; -import { Far } from '@endo/far'; +import { M } from '@endo/patterns'; +import { makeExo } from '@endo/exo'; import { makeNameHubKit } from '@agoric/vats'; import { makeNameProxy } from './name-service-client.js'; From b0a0307d489eb75f1c7431cb3b27f7e4773cb410 Mon Sep 17 00:00:00 2001 From: "Mark S. Miller" Date: Tue, 26 Mar 2024 13:31:12 -0700 Subject: [PATCH 3/5] exo version. sloppy --- contract/package.json | 2 +- contract/src/fixHub.js | 2 +- contract/src/platform-goals/board-aux.core.js | 6 +++--- contract/src/postal-service.contract.js | 2 +- contract/src/sell-concert-tickets.contract.js | 2 +- contract/src/swaparoo.contract.js | 4 ++-- contract/test/boot-tools.js | 4 ++-- contract/test/lib-gov-test/puppet-gov.js | 2 +- contract/test/wallet-tools.js | 6 +++--- contract/tools/e2e-tools.js | 6 +++--- contract/tools/ui-kit-goals/makeHttpClient.js | 2 +- contract/tools/ui-kit-goals/name-service-client.js | 4 ++-- contract/tools/ui-kit-goals/queryKit.js | 4 ++-- contract/tools/ui-kit-goals/test-nameProxy.js | 2 +- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/contract/package.json b/contract/package.json index 7ebcb075..24cb9bce 100644 --- a/contract/package.json +++ b/contract/package.json @@ -57,7 +57,7 @@ "@agoric/vats": "0.15.2-u14.0", "@agoric/zoe": "^0.26.3-u14.0", "@endo/bundle-source": "^2.8.0", - "@endo/exo": "^1.3.0", + "@endo/exo": "^0.2.2", "@endo/far": "^0.2.22", "@endo/init": "^0.5.60", "@endo/marshal": "^0.8.9", diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js index 569b0af5..ed93a245 100644 --- a/contract/src/fixHub.js +++ b/contract/src/fixHub.js @@ -13,7 +13,7 @@ const { Fail } = assert; export const fixHub = async namesByAddressAdmin => { assert(namesByAddressAdmin, 'no namesByAddressAdmin???'); /** @type {import('@agoric/vats').NameHub} */ - const hub = makeExo('Hub work-around', M.interface('Hub work-around', {}, { defaultGuards: 'passable' }), { + const hub = makeExo('Hub work-around', M.interface('Hub work-around', {}, { defaultGuards: 'passable', sloppy: true }), { lookup: async (addr, ...rest) => { await E(namesByAddressAdmin).reserve(addr); const addressAdmin = await E(namesByAddressAdmin).lookupAdmin(addr); diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index ccc87440..58ba9f38 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -61,9 +61,9 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { ); return harden({ - brandAuxPublisher: makeExo('BrandAuxPublisher', M.interface('BrandAuxPublisher', {}, { defaultGuards: 'passable' }), { publishBrandInfo }), - boardAuxTOFU: makeExo('BoardAuxTOFU', M.interface('BoardAuxTOFU', {}, { defaultGuards: 'passable' }), { publishBrandInfo, init }), - boardAuxAdmin: makeExo('BoardAuxAdmin', M.interface('BoardAuxAdmin', {}, { defaultGuards: 'passable' }), { publishBrandInfo, init, update }), + brandAuxPublisher: makeExo('BrandAuxPublisher', M.interface('BrandAuxPublisher', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo }), + boardAuxTOFU: makeExo('BoardAuxTOFU', M.interface('BoardAuxTOFU', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo, init }), + boardAuxAdmin: makeExo('BoardAuxAdmin', M.interface('BoardAuxAdmin', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo, init, update }), }); }; /** @typedef {ReturnType} BoardAuxManager */ diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index a2123996..6a9d3ae9 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -62,7 +62,7 @@ export const start = zcf => { return zcf.makeInvitation(handleSend, 'send'); }; - const publicFacet = makeExo('postalSvc', M.interface('postalSvc', {}, { defaultGuards: 'passable' }), { + const publicFacet = makeExo('postalSvc', M.interface('postalSvc', {}, { defaultGuards: 'passable', sloppy: true }), { lookup: (...path) => E(namesByAddress).lookup(...path), getDepositFacet, sendTo, diff --git a/contract/src/sell-concert-tickets.contract.js b/contract/src/sell-concert-tickets.contract.js index 3b6e13ea..75997d2e 100644 --- a/contract/src/sell-concert-tickets.contract.js +++ b/contract/src/sell-concert-tickets.contract.js @@ -209,7 +209,7 @@ export const start = async zcf => { zcf.makeInvitation(tradeHandler, 'buy tickets', undefined, proposalShape); // Mark the publicFacet Far, i.e. reachable from outside the contract - const publicFacet = makeExo('Tickets Public Facet', M.interface('Tickets Public Facet', {}, { defaultGuards: 'passable' }), { + const publicFacet = makeExo('Tickets Public Facet', M.interface('Tickets Public Facet', {}, { defaultGuards: 'passable', sloppy: true }), { makeTradeInvitation, }); return harden({ publicFacet }); diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index fd7378de..0ae1c769 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -199,11 +199,11 @@ export const start = async (zcf, privateArgs, baggage) => { return firstInvitation; }; - const publicFacet = makeExo('Public', M.interface('Public', {}, { defaultGuards: 'passable' }), { + const publicFacet = makeExo('Public', M.interface('Public', {}, { defaultGuards: 'passable', sloppy: true }), { makeFirstInvitation, ...publicMixin, }); - const limitedCreatorFacet = makeExo('Creator', M.interface('Creator', {}, { defaultGuards: 'passable' }), { + const limitedCreatorFacet = makeExo('Creator', M.interface('Creator', {}, { defaultGuards: 'passable', sloppy: true }), { makeCollectFeesInvitation() { return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee'); }, diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index 81de07e2..b78d7389 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -97,7 +97,7 @@ export const mockBootstrapPowers = async ( spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); spaces.issuer.produce.IST.resolve(feeIssuer); spaces.issuer.produce.Invitation.resolve(invitationIssuer); - produce.priceAuthority.resolve(makeExo('NullPriceAuthority', M.interface('NullPriceAuthority', {}, { defaultGuards: 'passable' }), {})); + produce.priceAuthority.resolve(makeExo('NullPriceAuthority', M.interface('NullPriceAuthority', {}, { defaultGuards: 'passable', sloppy: true }), {})); /** * @type {BootstrapPowers & import('../src/types').NonNullChainStorage} @@ -214,7 +214,7 @@ export const makeMockTools = async (t, bundleCache) => { // XXX marshal context is not fresh. hm. const makeQueryTool = () => { - return makeExo('QT', M.interface('QT', {}, { defaultGuards: 'passable' }), { + return makeExo('QT', M.interface('QT', {}, { defaultGuards: 'passable', sloppy: true }), { toCapData: x => boardMarshaller.toCapData(x), // XXX remote??? fromCapData: d => boardMarshaller.fromCapData(d), queryData: async path => { diff --git a/contract/test/lib-gov-test/puppet-gov.js b/contract/test/lib-gov-test/puppet-gov.js index 26a8c779..1f681e17 100644 --- a/contract/test/lib-gov-test/puppet-gov.js +++ b/contract/test/lib-gov-test/puppet-gov.js @@ -56,7 +56,7 @@ export const mockElectorate = async (zoe, bundleCache) => { await bundleCache.load(assets.invitationMakerContract), ); const arbInstance = await E(zoe).startInstance(installation); - const committeeCreatorFacet = makeExo('Electorate CF', M.interface('Electorate CF', {}, { defaultGuards: 'passable' }), { + const committeeCreatorFacet = makeExo('Electorate CF', M.interface('Electorate CF', {}, { defaultGuards: 'passable', sloppy: true }), { getPoserInvitation: async () => E(arbInstance.publicFacet).makeInvitation(), }); return { creatorFacet: committeeCreatorFacet }; diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index 9a94d660..abffc8d3 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -60,7 +60,7 @@ export const mockWalletFactory = ( const invitationPurse = purseByBrand.get(invitationBrand); assert(invitationPurse); - const depositFacet = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable' }), { + const depositFacet = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable', sloppy: true }), { /** @param {Payment} pmt */ receive: async pmt => { const pBrand = await E(pmt).getAllegedBrand(); @@ -193,8 +193,8 @@ export const mockWalletFactory = ( return { deposit: depositFacet, - offers: makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable' }), { executeOffer, tryExit }), - peek: makeExo('Wallet Peek', M.interface('Wallet Peek', {}, { defaultGuards: 'passable' }), { purseUpdates }), + offers: makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), { executeOffer, tryExit }), + peek: makeExo('Wallet Peek', M.interface('Wallet Peek', {}, { defaultGuards: 'passable', sloppy: true }), { purseUpdates }), }; }; diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index c09ca84c..d4ef1f94 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -230,14 +230,14 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['offers']} */ - const offers = makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable' }), { + const offers = makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), { executeOffer, /** @param {string|number} offerId */ tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), }); /** @type {import('../test/wallet-tools.js').MockWallet['deposit']} */ - const deposit = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable' }), { + const deposit = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable', sloppy: true }), { receive: async payment => { const brand = await E(payment).getAllegedBrand(); const asset = vbankEntries.find(([_denom, a]) => a.brand === brand); @@ -298,7 +298,7 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['peek']} */ - const peek = makeExo('Peek', M.interface('Peek', {}, { defaultGuards: 'passable' }), { purseUpdates }); + const peek = makeExo('Peek', M.interface('Peek', {}, { defaultGuards: 'passable', sloppy: true }), { purseUpdates }); return { offers, deposit, peek }; }; diff --git a/contract/tools/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js index 9b6e7e1f..ca1b4bbb 100644 --- a/contract/tools/ui-kit-goals/makeHttpClient.js +++ b/contract/tools/ui-kit-goals/makeHttpClient.js @@ -93,7 +93,7 @@ export const makeAPI = (apiAddress, { fetch }) => { }); }; - return makeExo('LCD', M.interface('LCD', {}, { defaultGuards: 'passable' }), { + return makeExo('LCD', M.interface('LCD', {}, { defaultGuards: 'passable', sloppy: true }), { getJSON, latestBlock: () => getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), }); diff --git a/contract/tools/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js index 4dae832b..07672a08 100644 --- a/contract/tools/ui-kit-goals/name-service-client.js +++ b/contract/tools/ui-kit-goals/name-service-client.js @@ -16,7 +16,7 @@ export const makeAgoricNames = async qt => { } const entries = await qt.queryData(`published.agoricNames.${kind}`); const record = Object.fromEntries(entries); - const hub = makeExo('NameHub', M.interface('NameHub', {}, { defaultGuards: 'passable' }), { + const hub = makeExo('NameHub', M.interface('NameHub', {}, { defaultGuards: 'passable', sloppy: true }), { lookup: name => record[name], keys: () => entries.map(e => e[0]), entries: () => entries, @@ -29,7 +29,7 @@ export const makeAgoricNames = async qt => { nameHubCache.clear(); }; - const hub0 = makeExo('Hub', M.interface('Hub', {}, { defaultGuards: 'passable' }), { + const hub0 = makeExo('Hub', M.interface('Hub', {}, { defaultGuards: 'passable', sloppy: true }), { lookup: async (kind, ...more) => { const hub2 = lookupKind(kind); if (more.length > 0) { diff --git a/contract/tools/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js index fad474a0..37cc5b3d 100644 --- a/contract/tools/ui-kit-goals/queryKit.js +++ b/contract/tools/ui-kit-goals/queryKit.js @@ -81,7 +81,7 @@ export async function* eachVstorageUpdate(key, { vstorage, delay }) { * @param {import('./batchQuery.js').VStorage} powers.vstorage */ export const makeWalletView = (addr, { query, vstorage }) => { - return makeExo('WalletQuery', M.interface('WalletQuery', {}, { defaultGuards: 'passable' }), { + return makeExo('WalletQuery', M.interface('WalletQuery', {}, { defaultGuards: 'passable', sloppy: true }), { current: () => query.queryData(`published.wallet.${addr}.current`), /** * TODO: visit in chunks by block @@ -134,7 +134,7 @@ export const makeQueryKit = (vstorage, m = makeClientMarshaller()) => { } } - const query = makeExo('QueryTool', M.interface('QueryTool', {}, { defaultGuards: 'passable' }), { + const query = makeExo('QueryTool', M.interface('QueryTool', {}, { defaultGuards: 'passable', sloppy: true }), { batchQuery, queryData, follow, diff --git a/contract/tools/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js index 397e2b9f..6601c2e9 100644 --- a/contract/tools/ui-kit-goals/test-nameProxy.js +++ b/contract/tools/ui-kit-goals/test-nameProxy.js @@ -10,7 +10,7 @@ test('makeNameProxy makes NameHub lookup convenient', async t => { const k0 = makeNameHubKit(); const kb = makeNameHubKit(); k0.nameAdmin.update('brand', kb.nameHub, kb.nameAdmin); - const atomBrand = makeExo('Atom Brand', M.interface('Atom Brand', {}, { defaultGuards: 'passable' }), {}); + const atomBrand = makeExo('Atom Brand', M.interface('Atom Brand', {}, { defaultGuards: 'passable', sloppy: true }), {}); kb.nameAdmin.update('Atom', atomBrand); const agoricNames = k0.nameHub; From 7964f4d92ff36df3c84030a496a431b96b951818 Mon Sep 17 00:00:00 2001 From: "Mark S. Miller" Date: Tue, 26 Mar 2024 16:20:04 -0700 Subject: [PATCH 4/5] fixup! stuff --- contract/package.json | 1 - contract/test/test-postalSvc.js | 2 +- contract/test/wallet-tools.js | 4 +++- contract/tools/ui-kit-goals/name-service-client.js | 3 ++- package.json | 1 + 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contract/package.json b/contract/package.json index 24cb9bce..19210877 100644 --- a/contract/package.json +++ b/contract/package.json @@ -14,7 +14,6 @@ "build": "yarn build:deployer", "build:deployer": "rollup -c rollup.config.mjs", "test": "ava --verbose", - "format": "yarn prettier --write .github golang packages", "lint": "eslint '**/*.js'", "lint:types": "tsc -p jsconfig.json", "lint:fix": "eslint --fix '**/*.js'" diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 5b0f9c33..4f362a0d 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -79,7 +79,7 @@ const makeTestContext = async t => { }; test.before(async t => (t.context = await makeTestContext(t))); - + test.serial('well-known brand (ATOM) is available', async t => { const { makeQueryTool } = t.context; const hub0 = makeAgoricNames(makeQueryTool()); diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index abffc8d3..dea5f9b8 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -179,7 +179,7 @@ export const mockWalletFactory = ( * * @param {Brand} brand */ - async function* purseUpdates(brand) { + async function* purseUpdatesInternal(brand) { const purse = purseByBrand.get(brand) || Fail`no purse for ${q(brand)}; issuer missing? ${q( @@ -191,6 +191,8 @@ export const mockWalletFactory = ( } } + const purseUpdates = brand => purseUpdatesInternal(brand); + return { deposit: depositFacet, offers: makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), { executeOffer, tryExit }), diff --git a/contract/tools/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js index 07672a08..0f29c0cc 100644 --- a/contract/tools/ui-kit-goals/name-service-client.js +++ b/contract/tools/ui-kit-goals/name-service-client.js @@ -39,7 +39,8 @@ export const makeAgoricNames = async qt => { }, }); - return { lookup: hub0.lookup, invalidate }; + return { + lookup: (kind, ...more) => hub0.lookup(kind, ...more), invalidate }; }; const pmethods = harden(['then', 'catch', 'finally']); // See also: https://github.com/endojs/endo/tree/mfig-o/packages/o diff --git a/package.json b/package.json index 45236c52..b3693057 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "start:contract": "cd contract && yarn start", "print-key": "yarn docker:make print-acct", "start:ui": "cd ui && yarn dev", + "format": "yarn prettier --write .github api contract ui", "lint": "yarn workspaces run lint", "test": "yarn workspaces run test", "test:e2e": "yarn workspace agoric-basics-ui test:e2e", From 43354dd556a91ccda6d963d5f88ebff2419c2710 Mon Sep 17 00:00:00 2001 From: "Mark S. Miller" Date: Tue, 26 Mar 2024 16:21:06 -0700 Subject: [PATCH 5/5] . --- contract/src/fixHub.js | 36 ++++++----- contract/src/platform-goals/board-aux.core.js | 30 ++++++++- contract/src/postal-service.contract.js | 16 +++-- contract/src/sell-concert-tickets.contract.js | 14 ++++- contract/src/swaparoo.contract.js | 24 ++++--- contract/test/boot-tools.js | 43 ++++++++----- contract/test/lib-gov-test/puppet-gov.js | 15 ++++- contract/test/test-bundle-source.js | 4 +- contract/test/test-postalSvc.js | 2 +- contract/test/wallet-tools.js | 48 +++++++++----- contract/tools/e2e-tools.js | 50 ++++++++++----- contract/tools/ui-kit-goals/makeHttpClient.js | 13 ++-- .../tools/ui-kit-goals/name-service-client.js | 38 +++++++----- contract/tools/ui-kit-goals/queryKit.js | 62 +++++++++++-------- contract/tools/ui-kit-goals/test-nameProxy.js | 6 +- ui/src/App.css | 6 +- ui/tsconfig.json | 4 +- 17 files changed, 276 insertions(+), 135 deletions(-) diff --git a/contract/src/fixHub.js b/contract/src/fixHub.js index ed93a245..168a4a4c 100644 --- a/contract/src/fixHub.js +++ b/contract/src/fixHub.js @@ -13,20 +13,28 @@ const { Fail } = assert; export const fixHub = async namesByAddressAdmin => { assert(namesByAddressAdmin, 'no namesByAddressAdmin???'); /** @type {import('@agoric/vats').NameHub} */ - const hub = makeExo('Hub work-around', M.interface('Hub work-around', {}, { defaultGuards: 'passable', sloppy: true }), { - 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); + const hub = makeExo( + 'Hub work-around', + M.interface( + 'Hub work-around', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { + 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`, }, - 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; }; diff --git a/contract/src/platform-goals/board-aux.core.js b/contract/src/platform-goals/board-aux.core.js index 58ba9f38..06960961 100644 --- a/contract/src/platform-goals/board-aux.core.js +++ b/contract/src/platform-goals/board-aux.core.js @@ -61,9 +61,33 @@ export const makeBoardAuxManager = (zone, marshalData, powers) => { ); return harden({ - brandAuxPublisher: makeExo('BrandAuxPublisher', M.interface('BrandAuxPublisher', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo }), - boardAuxTOFU: makeExo('BoardAuxTOFU', M.interface('BoardAuxTOFU', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo, init }), - boardAuxAdmin: makeExo('BoardAuxAdmin', M.interface('BoardAuxAdmin', {}, { defaultGuards: 'passable', sloppy: true }), { publishBrandInfo, init, update }), + brandAuxPublisher: makeExo( + 'BrandAuxPublisher', + M.interface( + 'BrandAuxPublisher', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { publishBrandInfo }, + ), + boardAuxTOFU: makeExo( + 'BoardAuxTOFU', + M.interface( + 'BoardAuxTOFU', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { publishBrandInfo, init }, + ), + boardAuxAdmin: makeExo( + 'BoardAuxAdmin', + M.interface( + 'BoardAuxAdmin', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { publishBrandInfo, init, update }, + ), }); }; /** @typedef {ReturnType} BoardAuxManager */ diff --git a/contract/src/postal-service.contract.js b/contract/src/postal-service.contract.js index 6a9d3ae9..9439a517 100644 --- a/contract/src/postal-service.contract.js +++ b/contract/src/postal-service.contract.js @@ -62,12 +62,16 @@ export const start = zcf => { return zcf.makeInvitation(handleSend, 'send'); }; - const publicFacet = makeExo('postalSvc', M.interface('postalSvc', {}, { defaultGuards: 'passable', sloppy: true }), { - lookup: (...path) => E(namesByAddress).lookup(...path), - getDepositFacet, - sendTo, - makeSendInvitation, - }); + const publicFacet = makeExo( + 'postalSvc', + M.interface('postalSvc', {}, { defaultGuards: 'passable', sloppy: true }), + { + lookup: (...path) => E(namesByAddress).lookup(...path), + getDepositFacet, + sendTo, + makeSendInvitation, + }, + ); return { publicFacet }; }; /** @typedef { typeof start } PostalServiceFn */ diff --git a/contract/src/sell-concert-tickets.contract.js b/contract/src/sell-concert-tickets.contract.js index 75997d2e..a8505a55 100644 --- a/contract/src/sell-concert-tickets.contract.js +++ b/contract/src/sell-concert-tickets.contract.js @@ -209,9 +209,17 @@ export const start = async zcf => { zcf.makeInvitation(tradeHandler, 'buy tickets', undefined, proposalShape); // Mark the publicFacet Far, i.e. reachable from outside the contract - const publicFacet = makeExo('Tickets Public Facet', M.interface('Tickets Public Facet', {}, { defaultGuards: 'passable', sloppy: true }), { - makeTradeInvitation, - }); + const publicFacet = makeExo( + 'Tickets Public Facet', + M.interface( + 'Tickets Public Facet', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { + makeTradeInvitation, + }, + ); return harden({ publicFacet }); }; harden(start); diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index 0ae1c769..792e4f23 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -199,15 +199,23 @@ export const start = async (zcf, privateArgs, baggage) => { return firstInvitation; }; - const publicFacet = makeExo('Public', M.interface('Public', {}, { defaultGuards: 'passable', sloppy: true }), { - makeFirstInvitation, - ...publicMixin, - }); - const limitedCreatorFacet = makeExo('Creator', M.interface('Creator', {}, { defaultGuards: 'passable', sloppy: true }), { - makeCollectFeesInvitation() { - return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee'); + const publicFacet = makeExo( + 'Public', + M.interface('Public', {}, { defaultGuards: 'passable', sloppy: true }), + { + makeFirstInvitation, + ...publicMixin, + }, + ); + const limitedCreatorFacet = makeExo( + 'Creator', + M.interface('Creator', {}, { defaultGuards: 'passable', sloppy: true }), + { + makeCollectFeesInvitation() { + return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee'); + }, }, - }); + ); const { governorFacet } = makeDurableGovernorFacet( baggage, limitedCreatorFacet, diff --git a/contract/test/boot-tools.js b/contract/test/boot-tools.js index b78d7389..d1736214 100644 --- a/contract/test/boot-tools.js +++ b/contract/test/boot-tools.js @@ -97,7 +97,17 @@ export const mockBootstrapPowers = async ( spaces.issuer.produce.BLD.resolve(bldIssuerKit.issuer); spaces.issuer.produce.IST.resolve(feeIssuer); spaces.issuer.produce.Invitation.resolve(invitationIssuer); - produce.priceAuthority.resolve(makeExo('NullPriceAuthority', M.interface('NullPriceAuthority', {}, { defaultGuards: 'passable', sloppy: true }), {})); + produce.priceAuthority.resolve( + makeExo( + 'NullPriceAuthority', + M.interface( + 'NullPriceAuthority', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + {}, + ), + ); /** * @type {BootstrapPowers & import('../src/types').NonNullChainStorage} @@ -214,20 +224,25 @@ export const makeMockTools = async (t, bundleCache) => { // XXX marshal context is not fresh. hm. const makeQueryTool = () => { - return makeExo('QT', M.interface('QT', {}, { defaultGuards: 'passable', sloppy: true }), { - 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 makeExo( + 'QT', + M.interface('QT', {}, { defaultGuards: 'passable', sloppy: true }), + { + 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 { diff --git a/contract/test/lib-gov-test/puppet-gov.js b/contract/test/lib-gov-test/puppet-gov.js index 1f681e17..3ea1ab0b 100644 --- a/contract/test/lib-gov-test/puppet-gov.js +++ b/contract/test/lib-gov-test/puppet-gov.js @@ -56,9 +56,18 @@ export const mockElectorate = async (zoe, bundleCache) => { await bundleCache.load(assets.invitationMakerContract), ); const arbInstance = await E(zoe).startInstance(installation); - const committeeCreatorFacet = makeExo('Electorate CF', M.interface('Electorate CF', {}, { defaultGuards: 'passable', sloppy: true }), { - getPoserInvitation: async () => E(arbInstance.publicFacet).makeInvitation(), - }); + const committeeCreatorFacet = makeExo( + 'Electorate CF', + M.interface( + 'Electorate CF', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { + getPoserInvitation: async () => + E(arbInstance.publicFacet).makeInvitation(), + }, + ); return { creatorFacet: committeeCreatorFacet }; }; diff --git a/contract/test/test-bundle-source.js b/contract/test/test-bundle-source.js index 29e2f3f4..21323eb2 100644 --- a/contract/test/test-bundle-source.js +++ b/contract/test/test-bundle-source.js @@ -12,7 +12,9 @@ import { E, passStyleOf } from '@endo/far'; import { makeZoeKitForTest } from '@agoric/zoe/tools/setup-zoe.js'; const myRequire = createRequire(import.meta.url); -const contractPath = myRequire.resolve(`../src/sell-concert-tickets.contract.js`); +const contractPath = myRequire.resolve( + `../src/sell-concert-tickets.contract.js`, +); test('bundleSource() bundles the contract for use with zoe', async t => { const bundle = await bundleSource(contractPath); diff --git a/contract/test/test-postalSvc.js b/contract/test/test-postalSvc.js index 4f362a0d..5b0f9c33 100644 --- a/contract/test/test-postalSvc.js +++ b/contract/test/test-postalSvc.js @@ -79,7 +79,7 @@ const makeTestContext = async t => { }; test.before(async t => (t.context = await makeTestContext(t))); - + test.serial('well-known brand (ATOM) is available', async t => { const { makeQueryTool } = t.context; const hub0 = makeAgoricNames(makeQueryTool()); diff --git a/contract/test/wallet-tools.js b/contract/test/wallet-tools.js index dea5f9b8..a262fb5b 100644 --- a/contract/test/wallet-tools.js +++ b/contract/test/wallet-tools.js @@ -60,19 +60,27 @@ export const mockWalletFactory = ( const invitationPurse = purseByBrand.get(invitationBrand); assert(invitationPurse); - const depositFacet = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable', sloppy: true }), { - /** @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); - const amt = await E(purse).deposit(pmt); - console.log('receive', address, amt); - return amt; + const depositFacet = makeExo( + 'DepositFacet', + M.interface( + 'DepositFacet', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { + /** @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); + const amt = await E(purse).deposit(pmt); + console.log('receive', address, amt); + return amt; + }, }, - }); + ); await E(addressAdmin).default(DEPOSIT_FACET_KEY, depositFacet); /** @param {InvitationSpec & { source: 'contract'}} invitationSpec */ @@ -195,8 +203,20 @@ export const mockWalletFactory = ( return { deposit: depositFacet, - offers: makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), { executeOffer, tryExit }), - peek: makeExo('Wallet Peek', M.interface('Wallet Peek', {}, { defaultGuards: 'passable', sloppy: true }), { purseUpdates }), + offers: makeExo( + 'Offers', + M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), + { executeOffer, tryExit }, + ), + peek: makeExo( + 'Wallet Peek', + M.interface( + 'Wallet Peek', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { purseUpdates }, + ), }; }; diff --git a/contract/tools/e2e-tools.js b/contract/tools/e2e-tools.js index d4ef1f94..eaba36aa 100644 --- a/contract/tools/e2e-tools.js +++ b/contract/tools/e2e-tools.js @@ -230,25 +230,37 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['offers']} */ - const offers = makeExo('Offers', M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), { - executeOffer, - /** @param {string|number} offerId */ - tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), - }); + const offers = makeExo( + 'Offers', + M.interface('Offers', {}, { defaultGuards: 'passable', sloppy: true }), + { + executeOffer, + /** @param {string|number} offerId */ + tryExit: offerId => sendAction({ method: 'tryExitOffer', offerId }), + }, + ); /** @type {import('../test/wallet-tools.js').MockWallet['deposit']} */ - const deposit = makeExo('DepositFacet', M.interface('DepositFacet', {}, { defaultGuards: 'passable', sloppy: true }), { - 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 deposit = makeExo( + 'DepositFacet', + M.interface( + 'DepositFacet', + {}, + { defaultGuards: 'passable', sloppy: true }, + ), + { + 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; /** @@ -298,7 +310,11 @@ export const provisionSmartWallet = async ( } /** @type {import('../test/wallet-tools.js').MockWallet['peek']} */ - const peek = makeExo('Peek', M.interface('Peek', {}, { defaultGuards: 'passable', sloppy: true }), { purseUpdates }); + const peek = makeExo( + 'Peek', + M.interface('Peek', {}, { defaultGuards: 'passable', sloppy: true }), + { purseUpdates }, + ); return { offers, deposit, peek }; }; diff --git a/contract/tools/ui-kit-goals/makeHttpClient.js b/contract/tools/ui-kit-goals/makeHttpClient.js index ca1b4bbb..420f2e5e 100644 --- a/contract/tools/ui-kit-goals/makeHttpClient.js +++ b/contract/tools/ui-kit-goals/makeHttpClient.js @@ -93,9 +93,14 @@ export const makeAPI = (apiAddress, { fetch }) => { }); }; - return makeExo('LCD', M.interface('LCD', {}, { defaultGuards: 'passable', sloppy: true }), { - getJSON, - latestBlock: () => getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), - }); + return makeExo( + 'LCD', + M.interface('LCD', {}, { defaultGuards: 'passable', sloppy: true }), + { + getJSON, + latestBlock: () => + getJSON(`/cosmos/base/tendermint/v1beta1/blocks/latest`), + }, + ); }; /** @typedef {ReturnType} LCD */ diff --git a/contract/tools/ui-kit-goals/name-service-client.js b/contract/tools/ui-kit-goals/name-service-client.js index 0f29c0cc..589bfec6 100644 --- a/contract/tools/ui-kit-goals/name-service-client.js +++ b/contract/tools/ui-kit-goals/name-service-client.js @@ -16,11 +16,15 @@ export const makeAgoricNames = async qt => { } const entries = await qt.queryData(`published.agoricNames.${kind}`); const record = Object.fromEntries(entries); - const hub = makeExo('NameHub', M.interface('NameHub', {}, { defaultGuards: 'passable', sloppy: true }), { - lookup: name => record[name], - keys: () => entries.map(e => e[0]), - entries: () => entries, - }); + const hub = makeExo( + 'NameHub', + M.interface('NameHub', {}, { defaultGuards: 'passable', sloppy: true }), + { + lookup: name => record[name], + keys: () => entries.map(e => e[0]), + entries: () => entries, + }, + ); nameHubCache.set(kind, hub); return hub; }; @@ -29,18 +33,24 @@ export const makeAgoricNames = async qt => { nameHubCache.clear(); }; - const hub0 = makeExo('Hub', M.interface('Hub', {}, { defaultGuards: 'passable', sloppy: true }), { - lookup: async (kind, ...more) => { - const hub2 = lookupKind(kind); - if (more.length > 0) { - return E(hub2).lookup(...more); - } - return hub2; + const hub0 = makeExo( + 'Hub', + M.interface('Hub', {}, { defaultGuards: 'passable', sloppy: true }), + { + lookup: async (kind, ...more) => { + const hub2 = lookupKind(kind); + if (more.length > 0) { + return E(hub2).lookup(...more); + } + return hub2; + }, }, - }); + ); return { - lookup: (kind, ...more) => hub0.lookup(kind, ...more), invalidate }; + lookup: (kind, ...more) => hub0.lookup(kind, ...more), + invalidate, + }; }; const pmethods = harden(['then', 'catch', 'finally']); // See also: https://github.com/endojs/endo/tree/mfig-o/packages/o diff --git a/contract/tools/ui-kit-goals/queryKit.js b/contract/tools/ui-kit-goals/queryKit.js index 37cc5b3d..5d1dcdb9 100644 --- a/contract/tools/ui-kit-goals/queryKit.js +++ b/contract/tools/ui-kit-goals/queryKit.js @@ -81,24 +81,28 @@ export async function* eachVstorageUpdate(key, { vstorage, delay }) { * @param {import('./batchQuery.js').VStorage} powers.vstorage */ export const makeWalletView = (addr, { query, vstorage }) => { - return makeExo('WalletQuery', M.interface('WalletQuery', {}, { defaultGuards: 'passable', sloppy: true }), { - current: () => query.queryData(`published.wallet.${addr}.current`), - /** - * TODO: visit in chunks by block - * @param {ERef<{visit: (r: import('@agoric/smart-wallet/src/smartWallet.js').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); - } + return makeExo( + 'WalletQuery', + M.interface('WalletQuery', {}, { defaultGuards: 'passable', sloppy: true }), + { + current: () => query.queryData(`published.wallet.${addr}.current`), + /** + * TODO: visit in chunks by block + * @param {ERef<{visit: (r: import('@agoric/smart-wallet/src/smartWallet.js').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 } */ @@ -134,16 +138,20 @@ export const makeQueryKit = (vstorage, m = makeClientMarshaller()) => { } } - const query = makeExo('QueryTool', M.interface('QueryTool', {}, { defaultGuards: 'passable', sloppy: true }), { - batchQuery, - queryData, - follow, - queryChildren, - fromCapData: m.fromCapData, - toCapData: m.toCapData, - // XXX wrong layer? add makeWalletView(query) helper function instead? - walletView: addr => makeWalletView(addr, { query, vstorage }), - }); + const query = makeExo( + 'QueryTool', + M.interface('QueryTool', {}, { defaultGuards: 'passable', sloppy: true }), + { + batchQuery, + queryData, + follow, + queryChildren, + fromCapData: m.fromCapData, + toCapData: m.toCapData, + // XXX wrong layer? add makeWalletView(query) helper function instead? + walletView: addr => makeWalletView(addr, { query, vstorage }), + }, + ); return { vstorage, query }; }; diff --git a/contract/tools/ui-kit-goals/test-nameProxy.js b/contract/tools/ui-kit-goals/test-nameProxy.js index 6601c2e9..b7550a08 100644 --- a/contract/tools/ui-kit-goals/test-nameProxy.js +++ b/contract/tools/ui-kit-goals/test-nameProxy.js @@ -10,7 +10,11 @@ test('makeNameProxy makes NameHub lookup convenient', async t => { const k0 = makeNameHubKit(); const kb = makeNameHubKit(); k0.nameAdmin.update('brand', kb.nameHub, kb.nameAdmin); - const atomBrand = makeExo('Atom Brand', M.interface('Atom Brand', {}, { defaultGuards: 'passable', sloppy: true }), {}); + const atomBrand = makeExo( + 'Atom Brand', + M.interface('Atom Brand', {}, { defaultGuards: 'passable', sloppy: true }), + {}, + ); kb.nameAdmin.update('Atom', atomBrand); const agoricNames = k0.nameHub; diff --git a/ui/src/App.css b/ui/src/App.css index b4d6ec70..c7be5681 100644 --- a/ui/src/App.css +++ b/ui/src/App.css @@ -99,11 +99,11 @@ input { } .error { - background-color: #E11D48; + background-color: #e11d48; color: #fff; } /* increment/decrement arrows always visible */ -input[type=number]::-webkit-inner-spin-button { - opacity: 1 +input[type='number']::-webkit-inner-spin-button { + opacity: 1; } diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 7f545954..3579097c 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -20,8 +20,8 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "types": ["vitest/globals"], + "types": ["vitest/globals"] }, "include": ["src", "test"], - "references": [{ "path": "./tsconfig.node.json" }], + "references": [{ "path": "./tsconfig.node.json" }] }