From 56efc0da57d55e3f055d5e42c273be2d5dfed12c Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 14 Aug 2020 16:11:37 -0700 Subject: [PATCH] refactor: add Zoe methods for getting assured invitation values The type declarations seem to work. --- packages/zoe/src/types.js | 12 +++++ packages/zoe/src/zoeService/zoe.js | 12 +++++ .../zoe/test/swingsetTests/zoe/vat-bob.js | 48 ++++++------------- .../zoe/test/swingsetTests/zoe/vat-carol.js | 7 +-- .../zoe/test/swingsetTests/zoe/vat-dave.js | 13 ++--- .../unitTests/contracts/test-atomicSwap.js | 14 ++---- .../test/unitTests/contracts/test-autoswap.js | 18 ++----- .../test/unitTests/contracts/test-barter.js | 12 ++--- .../unitTests/contracts/test-coveredCall.js | 20 ++------ .../unitTests/contracts/test-publicAuction.js | 22 ++++----- .../contracts/test-simpleExchange.js | 18 ++----- packages/zoe/test/zoeTestHelpers.js | 7 --- 12 files changed, 75 insertions(+), 128 deletions(-) diff --git a/packages/zoe/src/types.js b/packages/zoe/src/types.js index 6ab2e587838..7d843c4a6a7 100644 --- a/packages/zoe/src/types.js +++ b/packages/zoe/src/types.js @@ -56,6 +56,18 @@ * @property {(instance: Instance) => IssuerKeywordRecord} getIssuers * @property {(instance: Instance) => BrandKeywordRecord} getBrands * @property {(instance: Instance) => Object} getTerms + * @property {(invitation: invitation) => Promise} getInstance + * @property {(invitation: invitation) => Promise} getInstallation + * @property {(invitation: invitation) => Promise} + * getInvitationDetails - return an object with the instance, + * installation, description, invitation handle, and any custom properties + * specific to the contract. + * + * @typedef {Object} InvitationDetails + * @property {Installation} installation + * @property {Instance} instance + * @property {InvitationHandle} handle + * @property {string} description */ /** diff --git a/packages/zoe/src/zoeService/zoe.js b/packages/zoe/src/zoeService/zoe.js index 9510f9c6f0b..ea6e0e34630 100644 --- a/packages/zoe/src/zoeService/zoe.js +++ b/packages/zoe/src/zoeService/zoe.js @@ -66,6 +66,18 @@ function makeZoe(vatAdminSvc) { getBrands: instance => instanceToInstanceAdmin.get(instance).getBrands(), getIssuers: instance => instanceToInstanceAdmin.get(instance).getIssuers(), getTerms: instance => instanceToInstanceAdmin.get(instance).getTerms(), + getInstance: invitation => + E(invitationKit.issuer) + .getAmountOf(invitation) + .then(amount => amount.value[0].instance), + getInstallation: invitation => + E(invitationKit.issuer) + .getAmountOf(invitation) + .then(amount => amount.value[0].installation), + getInvitationDetails: invitation => + E(invitationKit.issuer) + .getAmountOf(invitation) + .then(amount => amount.value[0]), startInstance: async ( installation, uncleanIssuerKeywordRecord = harden({}), diff --git a/packages/zoe/test/swingsetTests/zoe/vat-bob.js b/packages/zoe/test/swingsetTests/zoe/vat-bob.js index 3e2e7574639..60939777e7b 100644 --- a/packages/zoe/test/swingsetTests/zoe/vat-bob.js +++ b/packages/zoe/test/swingsetTests/zoe/vat-bob.js @@ -3,7 +3,6 @@ import { assert, details } from '@agoric/assert'; import { sameStructure } from '@agoric/same-structure'; import { makeLocalAmountMath } from '@agoric/ertp'; import { showPurseBalance, setupIssuers } from '../helpers'; -import { getInvitationFields } from '../../zoeTestHelpers'; const build = async (log, zoe, issuers, payments, installations, timer) => { const { @@ -22,10 +21,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { return harden({ doAutomaticRefund: async inviteP => { const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const exclInvite = await E(inviteIssuer).claim(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); @@ -72,10 +69,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { doCoveredCall: async inviteP => { // Bob claims all with the Zoe inviteIssuer const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const exclInvite = await E(inviteIssuer).claim(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); @@ -139,10 +134,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { doSwapForOption: async (inviteP, daveP) => { // Bob claims all with the Zoe inviteIssuer const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const exclInvite = await E(inviteIssuer).claim(invite); const { UnderlyingAsset, StrikePrice } = await E(zoe).getIssuers( @@ -226,10 +219,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { }, doPublicAuction: async inviteP => { const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const terms = await E(zoe).getTerms(instance); const issuerKeywordRecord = await E(zoe).getIssuers(instance); const exclInvite = await E(inviteIssuer).claim(invite); @@ -277,10 +268,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { }, doAtomicSwap: async inviteP => { const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); const exclInvite = await E(inviteIssuer).claim(invite); const { value: inviteValue } = await E(inviteIssuer).getAmountOf( @@ -334,10 +323,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { doSimpleExchange: async inviteP => { const invite = await inviteP; - const { installation, instance } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const exclInvite = await E(inviteIssuer).claim(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); @@ -380,10 +367,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { }, doSimpleExchangeUpdates: async (inviteP, m, s) => { const invite = await E(inviteIssuer).claim(inviteP); - const { installation, instance } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); assert( @@ -433,10 +418,7 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { doAutoswap: async instance => { const publicFacet = await E(zoe).getPublicFacet(instance); const buyBInvite = await E(publicFacet).makeSwapInvite(); - const { installation } = await getInvitationFields( - inviteIssuer, - buyBInvite, - ); + const installation = await E(zoe).getInstallation(buyBInvite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); assert( installation === installations.autoswap, diff --git a/packages/zoe/test/swingsetTests/zoe/vat-carol.js b/packages/zoe/test/swingsetTests/zoe/vat-carol.js index 4a9dd0df07d..58530409f88 100644 --- a/packages/zoe/test/swingsetTests/zoe/vat-carol.js +++ b/packages/zoe/test/swingsetTests/zoe/vat-carol.js @@ -2,7 +2,6 @@ import { E } from '@agoric/eventual-send'; import { assert, details } from '@agoric/assert'; import { sameStructure } from '@agoric/same-structure'; import { showPurseBalance, setupIssuers } from '../helpers'; -import { getInvitationFields } from '../../zoeTestHelpers'; const build = async (log, zoe, issuers, payments, installations) => { const { moola, simoleans, purses } = await setupIssuers(zoe, issuers); @@ -14,10 +13,8 @@ const build = async (log, zoe, issuers, payments, installations) => { return harden({ doPublicAuction: async inviteP => { const invite = await E(inviteIssuer).claim(inviteP); - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const terms = await E(zoe).getTerms(instance); const issuerKeywordRecord = await E(zoe).getIssuers(instance); const { value: inviteValue } = await E(inviteIssuer).getAmountOf(invite); diff --git a/packages/zoe/test/swingsetTests/zoe/vat-dave.js b/packages/zoe/test/swingsetTests/zoe/vat-dave.js index 0dcaf8cfe9f..604b2176000 100644 --- a/packages/zoe/test/swingsetTests/zoe/vat-dave.js +++ b/packages/zoe/test/swingsetTests/zoe/vat-dave.js @@ -2,7 +2,6 @@ import { E } from '@agoric/eventual-send'; import { assert, details } from '@agoric/assert'; import { sameStructure } from '@agoric/same-structure'; import { showPurseBalance, setupIssuers } from '../helpers'; -import { getInvitationFields } from '../../zoeTestHelpers'; const build = async (log, zoe, issuers, payments, installations, timer) => { const { @@ -21,10 +20,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { return harden({ doPublicAuction: async inviteP => { const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); const exclInvite = await E(inviteIssuer).claim(invite); const { value: inviteValue } = await E(inviteIssuer).getAmountOf( @@ -76,10 +73,8 @@ const build = async (log, zoe, issuers, payments, installations, timer) => { // Dave is looking to buy the option to trade his 7 simoleans for // 3 moola, and is willing to pay 1 buck for the option. const invite = await inviteP; - const { instance, installation } = await getInvitationFields( - inviteIssuer, - invite, - ); + const instance = await E(zoe).getInstance(invite); + const installation = await E(zoe).getInstallation(invite); const issuerKeywordRecord = await E(zoe).getIssuers(instance); const exclInvite = await E(inviteIssuer).claim(invite); const { value: inviteValue } = await E(inviteIssuer).getAmountOf( diff --git a/packages/zoe/test/unitTests/contracts/test-atomicSwap.js b/packages/zoe/test/unitTests/contracts/test-atomicSwap.js index 8e100bf809b..e9e9a786d81 100644 --- a/packages/zoe/test/unitTests/contracts/test-atomicSwap.js +++ b/packages/zoe/test/unitTests/contracts/test-atomicSwap.js @@ -85,10 +85,7 @@ test('zoe - atomicSwap', async t => { // transform an untrusted invitation that Alice also has access to, to // an const invitation = await invitationIssuer.claim(untrustedInvitation); - - const { - value: [invitationValue], - } = await invitationIssuer.getAmountOf(invitation); + const invitationValue = await E(zoe).getInvitationDetails(invitation); t.equals( invitationValue.installation, @@ -248,10 +245,7 @@ test('zoe - non-fungible atomicSwap', async t => { // transform an untrusted invitation that Alice also has access to, to // an const invitation = await invitationIssuer.claim(untrustedInvitation); - - const { - value: [invitationValue], - } = await invitationIssuer.getAmountOf(invitation); + const invitationValue = await E(zoe).getInvitationDetails(invitation); t.equals( invitationValue.installation, @@ -383,9 +377,7 @@ test('zoe - atomicSwap like-for-like', async t => { const bobInviteP = E(aliceSeat).getOfferResult(); const bobExclusiveInvite = await invitationIssuer.claim(bobInviteP); - const { - value: [bobInviteValue], - } = await invitationIssuer.getAmountOf(bobExclusiveInvite); + const bobInviteValue = await E(zoe).getInvitationDetails(bobExclusiveInvite); const bobIssuers = zoe.getIssuers(bobInviteValue.instance); diff --git a/packages/zoe/test/unitTests/contracts/test-autoswap.js b/packages/zoe/test/unitTests/contracts/test-autoswap.js index 2bb66d343b8..2f9a5efa80f 100644 --- a/packages/zoe/test/unitTests/contracts/test-autoswap.js +++ b/packages/zoe/test/unitTests/contracts/test-autoswap.js @@ -6,11 +6,7 @@ import { makeLocalAmountMath } from '@agoric/ertp'; import { setup } from '../setupBasicMints'; import { installationPFromSource } from '../installFromSource'; -import { - assertOfferResult, - assertPayoutAmount, - getInvitationFields, -} from '../../zoeTestHelpers'; +import { assertOfferResult, assertPayoutAmount } from '../../zoeTestHelpers'; const autoswap = `${__dirname}/../../../src/contracts/autoswap`; @@ -86,10 +82,8 @@ test('autoSwap with valid offers', async t => { // Bob claims it const bobExclInvite = await inviteIssuer.claim(bobInvite); - const { - installation: bobInstallation, - instance: bobInstance, - } = await getInvitationFields(inviteIssuer, bobExclInvite); + const bobInstance = await E(zoe).getInstance(bobExclInvite); + const bobInstallation = await E(zoe).getInstallation(bobExclInvite); t.equals(bobInstallation, installation, `installation`); const bobAutoswap = E(zoe).getPublicFacet(bobInstance); @@ -283,10 +277,8 @@ test('autoSwap - test fee', async t => { // Bob claims it const bobExclInvite = await inviteIssuer.claim(bobInvite); - const { - installation: bobInstallation, - instance: bobInstance, - } = await getInvitationFields(inviteIssuer, bobExclInvite); + const bobInstance = await E(zoe).getInstance(bobExclInvite); + const bobInstallation = await E(zoe).getInstallation(bobExclInvite); t.equals(bobInstallation, bobInstallation); const bobAutoswap = E(zoe).getPublicFacet(bobInstance); diff --git a/packages/zoe/test/unitTests/contracts/test-barter.js b/packages/zoe/test/unitTests/contracts/test-barter.js index 454bdf4b1b1..885be7392de 100644 --- a/packages/zoe/test/unitTests/contracts/test-barter.js +++ b/packages/zoe/test/unitTests/contracts/test-barter.js @@ -6,11 +6,7 @@ import { E } from '@agoric/eventual-send'; import { setup } from '../setupBasicMints'; import { installationPFromSource } from '../installFromSource'; -import { - assertPayoutAmount, - assertOfferResult, - getInvitationFields, -} from '../../zoeTestHelpers'; +import { assertPayoutAmount, assertOfferResult } from '../../zoeTestHelpers'; const barter = `${__dirname}/../../../src/contracts/barterExchange`; @@ -67,10 +63,8 @@ test('barter with valid offers', async t => { const bobInvitation = await E( E(zoe).getPublicFacet(instance), ).makeInvitation(); - const { - installation: bobInstallation, - instance: bobInstance, - } = await getInvitationFields(invitationIssuer, bobInvitation); + const bobInstance = await E(zoe).getInstance(bobInvitation); + const bobInstallation = await E(zoe).getInstallation(bobInvitation); // 4: Bob decides to join. const bobExclusiveInvitation = await invitationIssuer.claim(bobInvitation); diff --git a/packages/zoe/test/unitTests/contracts/test-coveredCall.js b/packages/zoe/test/unitTests/contracts/test-coveredCall.js index 5ed7a293a40..3fa3f64c81d 100644 --- a/packages/zoe/test/unitTests/contracts/test-coveredCall.js +++ b/packages/zoe/test/unitTests/contracts/test-coveredCall.js @@ -97,9 +97,7 @@ test('zoe - coveredCall', async t => { untrustedInvitation, ); - const { - value: [invitationValue], - } = await invitationIssuer.getAmountOf(invitation); + const invitationValue = await E(zoe).getInvitationDetails(invitation); t.equals( invitationValue.installation, @@ -246,9 +244,7 @@ test(`zoe - coveredCall - alice's deadline expires, cancelling alice and bob`, a const invitationIssuer = zoe.getInvitationIssuer(); const bobExclOption = await invitationIssuer.claim(optionP); - const { - value: [optionValue], - } = await invitationIssuer.getAmountOf(bobExclOption); + const optionValue = await E(zoe).getInvitationDetails(bobExclOption); t.equal(optionValue.installation, coveredCallInstallation); t.equal(optionValue.description, 'exerciseOption'); t.ok(moolaR.amountMath.isEqual(optionValue.underlyingAsset, moola(3))); @@ -648,9 +644,7 @@ test('zoe - coveredCall with coveredCall for invitation', async t => { const invitationIssuer = zoe.getInvitationIssuer(); const invitationAmountMath = await makeLocalAmountMath(invitationIssuer); const bobExclOption = await invitationIssuer.claim(optionP); - const { - value: [optionValue], - } = await invitationIssuer.getAmountOf(bobExclOption); + const optionValue = await E(zoe).getInvitationDetails(bobExclOption); t.equal(optionValue.installation, coveredCallInstallation); t.equal(optionValue.description, 'exerciseOption'); t.ok(moolaR.amountMath.isEqual(optionValue.underlyingAsset, moola(3))); @@ -701,9 +695,7 @@ test('zoe - coveredCall with coveredCall for invitation', async t => { // 3 moola, and is willing to pay 1 buck for the option. He // checks that this invitation matches what he wants const daveExclOption = await invitationIssuer.claim(invitationForDaveP); - const { - value: [daveOptionValue], - } = await invitationIssuer.getAmountOf(daveExclOption); + const daveOptionValue = await E(zoe).getInvitationDetails(daveExclOption); t.equal(daveOptionValue.installation, coveredCallInstallation); t.equal(daveOptionValue.description, 'exerciseOption'); t.ok(bucksR.amountMath.isEqual(daveOptionValue.strikePrice, bucks(1))); @@ -908,9 +900,7 @@ test('zoe - coveredCall non-fungible', async t => { const invitationIssuer = zoe.getInvitationIssuer(); const bobExclOption = await invitationIssuer.claim(optionP); - const { - value: [optionValue], - } = await invitationIssuer.getAmountOf(bobExclOption); + const optionValue = await E(zoe).getInvitationDetails(bobExclOption); t.equal(optionValue.installation, coveredCallInstallation); t.equal(optionValue.description, 'exerciseOption'); t.ok( diff --git a/packages/zoe/test/unitTests/contracts/test-publicAuction.js b/packages/zoe/test/unitTests/contracts/test-publicAuction.js index 9a1716ff92d..4be8b209798 100644 --- a/packages/zoe/test/unitTests/contracts/test-publicAuction.js +++ b/packages/zoe/test/unitTests/contracts/test-publicAuction.js @@ -92,9 +92,7 @@ test('zoe - secondPriceAuction w/ 3 bids', async t => { // an const invitation = await invitationIssuer.claim(untrustedInvitation); - const { - value: [invitationValue], - } = await invitationIssuer.getAmountOf(invitation); + const invitationValue = await E(zoe).getInvitationDetails(invitation); t.equals( invitationValue.installation, @@ -422,9 +420,9 @@ test('zoe - secondPriceAuction non-fungible asset', async t => { // Alice spreads the invitations far and wide and Bob decides he // wants to participate in the auction. const bobExclusiveInvitation = await invitationIssuer.claim(bobInvitation); - const { - value: [bobInvitationValue], - } = await invitationIssuer.getAmountOf(bobExclusiveInvitation); + const bobInvitationValue = await E(zoe).getInvitationDetails( + bobExclusiveInvitation, + ); const bobTerms = zoe.getTerms(bobInvitationValue.instance); const bobIssuers = zoe.getIssuers(bobInvitationValue.instance); @@ -464,9 +462,9 @@ test('zoe - secondPriceAuction non-fungible asset', async t => { const carolExclusiveInvitation = await invitationIssuer.claim( carolInvitation, ); - const { - value: [carolInvitationValue], - } = await invitationIssuer.getAmountOf(carolExclusiveInvitation); + const carolInvitationValue = await E(zoe).getInvitationDetails( + carolExclusiveInvitation, + ); const carolTerms = zoe.getTerms(carolInvitationValue.instance); const carolIssuers = zoe.getIssuers(carolInvitationValue.instance); @@ -511,9 +509,9 @@ test('zoe - secondPriceAuction non-fungible asset', async t => { // Dave decides to bid for the one moola const daveExclusiveInvitation = await invitationIssuer.claim(daveInvitation); - const { - value: [daveInvitationValue], - } = await invitationIssuer.getAmountOf(daveExclusiveInvitation); + const daveInvitationValue = await E(zoe).getInvitationDetails( + daveExclusiveInvitation, + ); const daveTerms = zoe.getTerms(daveInvitationValue.instance); const daveIssuers = zoe.getIssuers(daveInvitationValue.instance); diff --git a/packages/zoe/test/unitTests/contracts/test-simpleExchange.js b/packages/zoe/test/unitTests/contracts/test-simpleExchange.js index e164b0c7bbb..da9f7cbb3e7 100644 --- a/packages/zoe/test/unitTests/contracts/test-simpleExchange.js +++ b/packages/zoe/test/unitTests/contracts/test-simpleExchange.js @@ -10,11 +10,7 @@ import { assert, details } from '@agoric/assert'; import { setup } from '../setupBasicMints'; import { setupNonFungible } from '../setupNonFungibleMints'; import { installationPFromSource } from '../installFromSource'; -import { - assertPayoutAmount, - assertOfferResult, - getInvitationFields, -} from '../../zoeTestHelpers'; +import { assertPayoutAmount, assertOfferResult } from '../../zoeTestHelpers'; const simpleExchange = `${__dirname}/../../../src/contracts/simpleExchange`; @@ -115,11 +111,7 @@ test('simpleExchange with valid offers', async t => { }); const bobInvite = await E(publicFacet).makeInvitation(); - const { installation: bobInstallation } = await getInvitationFields( - inviteIssuer, - bobInvite, - ); - + const bobInstallation = await E(zoe).getInstallation(bobInvite); // 5: Bob decides to join. const bobExclusiveInvite = await inviteIssuer.claim(bobInvite); @@ -361,10 +353,8 @@ test('simpleExchange with non-fungible assets', async t => { const bobInvite = await E(publicFacet).makeInvitation(); // 5: Bob decides to join. - const { - installation: bobInstallation, - instance: bobInstance, - } = await getInvitationFields(inviteIssuer, bobInvite); + const bobInstance = await E(zoe).getInstance(bobInvite); + const bobInstallation = await E(zoe).getInstallation(bobInvite); const bobExclusiveInvite = await inviteIssuer.claim(bobInvite); t.equals(bobInstallation, installation); diff --git a/packages/zoe/test/zoeTestHelpers.js b/packages/zoe/test/zoeTestHelpers.js index 110271c343b..9c319d9bc77 100644 --- a/packages/zoe/test/zoeTestHelpers.js +++ b/packages/zoe/test/zoeTestHelpers.js @@ -1,5 +1,3 @@ -import { E } from '@agoric/eventual-send'; - export const assertPayoutAmount = (t, issuer, payout, expectedAmount) => { issuer.getAmountOf(payout).then(amount => { t.deepEquals(amount, expectedAmount, `payout was ${amount.value}`); @@ -30,8 +28,3 @@ export const assertRejectedOfferResult = (t, seat, expected) => { e => t.equals(e, expected, 'Expected offer to be rejected'), ); }; - -export const getInvitationFields = (invitationIssuer, invitationP) => - E(invitationIssuer) - .getAmountOf(invitationP) - .then(amount => amount.value[0]);