Skip to content

Commit

Permalink
refactor: ERTP payments as virtual objects
Browse files Browse the repository at this point in the history
  • Loading branch information
katelynsills committed Mar 16, 2021
1 parent 48d4813 commit e6a0924
Show file tree
Hide file tree
Showing 82 changed files with 425 additions and 77 deletions.
2 changes: 2 additions & 0 deletions packages/ERTP/globals.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
declare var makeKind: function;
declare var makeWeakStore: function;
2 changes: 1 addition & 1 deletion packages/ERTP/jsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
"strictNullChecks": true,
"moduleResolution": "node",
},
"include": ["src/**/*.js", "exported.js"],
"include": ["src/**/*.js", "exported.js", "globals.d.ts"],
}
3 changes: 1 addition & 2 deletions packages/ERTP/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@
"test/**/test-*.js"
],
"require": [
"esm",
"@agoric/install-ses"
"esm"
]
},
"eslintConfig": {
Expand Down
22 changes: 8 additions & 14 deletions packages/ERTP/src/issuer.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright (C) 2019 Agoric, under Apache License 2.0

// @ts-check
/* global makeWeakStore */

import { assert, details as X } from '@agoric/assert';
import { makeExternalStore } from '@agoric/store';
Expand All @@ -13,6 +12,7 @@ import { amountMath, MathKind } from './amountMath';
import { makeAmountMath } from './deprecatedAmountMath';
import { makeFarName, ERTPKind } from './interfaces';
import { coerceDisplayInfo } from './displayInfo';
import { makePaymentMaker } from './payment';

import './types';

Expand Down Expand Up @@ -52,17 +52,10 @@ function makeIssuerKit(
/** @type {Amount} */
const emptyAmount = amountMath.makeEmpty(amountMathKind, brand);

const {
makeInstance: makePayment,
makeWeakStore: makePaymentWeakStore,
} = makeExternalStore('payment', () =>
Far(makeFarName(allegedName, ERTPKind.PAYMENT), {
getAllegedBrand: () => brand,
}),
);
const makePayment = makePaymentMaker(allegedName, brand);

/** @type {WeakStore<Payment, Amount>} */
const paymentLedger = makePaymentWeakStore();
const paymentLedger = makeWeakStore('payment');

function assertKnownPayment(payment) {
assert(paymentLedger.has(payment), X`payment not found for ${allegedName}`);
Expand Down Expand Up @@ -167,12 +160,13 @@ function makeIssuerKit(
// other uses.

if (payments.length > 1) {
const paymentSet = new Set();
// TODO: replace with a Set that understands virtual objects
const antiAliasingStore = makeWeakStore('payment');
payments.forEach(payment => {
if (paymentSet.has(payment)) {
if (antiAliasingStore.has(payment)) {
throw new Error('same payment seen twice');
}
paymentSet.add(payment);
antiAliasingStore.init(payment, undefined);
});
}

Expand Down
22 changes: 22 additions & 0 deletions packages/ERTP/src/payment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// @ts-check
/* global makeKind */

import { Far } from '@agoric/marshal';
import { makeFarName, ERTPKind } from './interfaces';

export const makePaymentMaker = (allegedName, brand) => {
const paymentVOFactory = state => {
return {
init: b => (state.brand = b),
self: Far(makeFarName(allegedName, ERTPKind.PAYMENT), {
getAllegedBrand: () => state.brand,
}),
};
};

const paymentMaker = makeKind(paymentVOFactory);

const makePayment = () => paymentMaker(brand);

return makePayment;
};
31 changes: 31 additions & 0 deletions packages/ERTP/test/swingsetTests/basicFunctionality/bootstrap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { E } from '@agoric/eventual-send';
import { assert, details as X } from '@agoric/assert';
import { makeIssuerKit } from '../../../src';

export function buildRootObject(vatPowers, vatParameters) {
const arg0 = vatParameters.argv[0];

function testBasicFunctionality(aliceMaker) {
vatPowers.testLog('start test basic functionality');
const { mint: moolaMint, issuer, amountMath } = makeIssuerKit('moola');
const moolaPayment = moolaMint.mintPayment(amountMath.make(1000));

const aliceP = E(aliceMaker).make(issuer, amountMath, moolaPayment);
return E(aliceP).testBasicFunctionality();
}

const obj0 = {
async bootstrap(vats) {
switch (arg0) {
case 'basicFunctionality': {
const aliceMaker = await E(vats.alice).makeAliceMaker();
return testBasicFunctionality(aliceMaker);
}
default: {
assert.fail(X`unrecognized argument value ${arg0}`);
}
}
},
};
return harden(obj0);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// @ts-check
/* global __dirname */

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
// eslint-disable-next-line import/no-extraneous-dependencies
import { loadBasedir, buildVatController } from '@agoric/swingset-vat';
import path from 'path';

async function main(basedir, argv) {
const dir = path.resolve(`${__dirname}/..`, basedir);
const config = await loadBasedir(dir);
const controller = await buildVatController(config, argv);
await controller.run();
return controller.dump();
}

const expected = [
'start test basic functionality',
'isLive: true',
'getAmountOf: {"brand":{},"value":1000}',
'newPayment amount: {"brand":{},"value":1000}',
'burned amount: {"brand":{},"value":200}',
'claimedPayment amount: {"brand":{},"value":200}',
'combinedPayment amount: {"brand":{},"value":600}',
];

test('test splitPayments', async t => {
const dump = await main('basicFunctionality', ['basicFunctionality']);
t.deepEqual(dump.log, expected);
});
69 changes: 69 additions & 0 deletions packages/ERTP/test/swingsetTests/basicFunctionality/vat-alice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { E } from '@agoric/eventual-send';

function makeAliceMaker(log) {
return harden({
make(issuer, amountMath, oldPaymentP) {
const alice = harden({
async testBasicFunctionality() {
// isLive
const alive = await E(issuer).isLive(oldPaymentP);
log('isLive: ', alive);

// getAmountOf
const amount = await E(issuer).getAmountOf(oldPaymentP);
log('getAmountOf: ', amount);

// Make Purse

const purse = E(issuer).makeEmptyPurse();

// Deposit Payment

const payment = await oldPaymentP;
await E(purse).deposit(payment);

// Withdraw Payment
const newPayment = E(purse).withdraw(amount);
const newAmount = await E(issuer).getAmountOf(newPayment);
log('newPayment amount: ', newAmount);

// splitMany
const moola200 = await E(amountMath).make(200);
const [paymentToBurn, paymentToClaim, ...payments] = await E(
issuer,
).splitMany(
newPayment,
harden([moola200, moola200, moola200, moola200, moola200]),
);

// burn
const burnedAmount = await E(issuer).burn(paymentToBurn);
log('burned amount: ', burnedAmount);

// claim
const claimedPayment = await E(issuer).claim(paymentToClaim);
const claimedPaymentAmount = await E(issuer).getAmountOf(
claimedPayment,
);
log('claimedPayment amount: ', claimedPaymentAmount);

// combine
const combinedPayment = E(issuer).combine(payments);
const combinedPaymentAmount = await E(issuer).getAmountOf(
combinedPayment,
);
log('combinedPayment amount: ', combinedPaymentAmount);
},
});
return alice;
},
});
}

export function buildRootObject(vatPowers) {
return harden({
makeAliceMaker() {
return harden(makeAliceMaker(vatPowers.testLog));
},
});
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
/* global __dirname */
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
import { Far } from '@agoric/marshal';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
import { amountMath as m, MathKind } from '../../../src';
Expand Down
3 changes: 3 additions & 0 deletions packages/ERTP/test/unitTests/test-interfaces.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
import { getInterfaceOf } from '@agoric/marshal';
Expand Down
3 changes: 3 additions & 0 deletions packages/ERTP/test/unitTests/test-issuerObj.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// @ts-check

// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
import { E } from '@agoric/eventual-send';
Expand Down
2 changes: 2 additions & 0 deletions packages/ERTP/test/unitTests/test-mintObj.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
// @ts-check
// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/swingset-vat/tools/prepare-test-env';

import { Far } from '@agoric/marshal';
// eslint-disable-next-line import/no-extraneous-dependencies
Expand Down
3 changes: 2 additions & 1 deletion packages/SwingSet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@
"files": [
"bin/vat",
"src/**/*.js",
"exported.js"
"exported.js",
"tools"
],
"repository": {
"type": "git",
Expand Down
2 changes: 2 additions & 0 deletions packages/cosmic-swingset/globals.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
declare var makeKind: function;
declare var makeWeakStore: function;
2 changes: 1 addition & 1 deletion packages/cosmic-swingset/jsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
"strictNullChecks": true,
"moduleResolution": "node",
},
"include": ["lib/**/*.js", "exported.js"],
"include": ["lib/**/*.js", "exported.js", "globals.d.ts"],
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// @ts-check
// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/install-ses'; // calls lockdown()
import '@agoric/zoe/tools/prepare-test-env'; // calls lockdown()
// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';

Expand Down
2 changes: 1 addition & 1 deletion packages/dapp-svelte-wallet/api/test/test-lib-dehydrate.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import '@agoric/install-ses'; // calls lockdown()
import '@agoric/zoe/tools/prepare-test-env'; // calls lockdown()
// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
import { Far } from '@agoric/marshal';
Expand Down
2 changes: 1 addition & 1 deletion packages/dapp-svelte-wallet/api/test/test-lib-wallet.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* global require */
// @ts-check
// eslint-disable-next-line import/no-extraneous-dependencies
import '@agoric/install-ses'; // calls lockdown()
import '@agoric/zoe/tools/prepare-test-env'; // calls lockdown()
// eslint-disable-next-line import/no-extraneous-dependencies
import test from 'ava';
// eslint-disable-next-line import/no-extraneous-dependencies
Expand Down
2 changes: 2 additions & 0 deletions packages/deploy-script-support/globals.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
declare var makeKind: function;
declare var makeWeakStore: function;
2 changes: 1 addition & 1 deletion packages/deploy-script-support/jsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
"strictNullChecks": true,
"moduleResolution": "node",
},
"include": ["src/**/*.js", "exported.js"],
"include": ["src/**/*.js", "exported.js", "globals.d.ts"],
}
4 changes: 3 additions & 1 deletion packages/zoe/src/contractFacet/contractFacet.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// @ts-check

/* global makeWeakStore */

// This is the Zoe contract facet. Each time we make a new instance of a
// contract we will start by creating a new vat and running this code in it. In
// order to install this code in a vat, Zoe needs to import a bundle containing
Expand All @@ -9,7 +11,7 @@

import { assert, details as X, q, makeAssert } from '@agoric/assert';
import { E } from '@agoric/eventual-send';
import { makeStore, makeWeakStore } from '@agoric/store';
import { makeStore } from '@agoric/store';
import { Far, Data } from '@agoric/marshal';

import { makeAmountMath, MathKind } from '@agoric/ertp';
Expand Down
4 changes: 4 additions & 0 deletions packages/zoe/src/contractFacet/evalContractCode.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// @ts-check

/* global makeKind makeWeakStore */

import { importBundle } from '@agoric/import-bundle';
import { assert } from '@agoric/assert';

Expand All @@ -13,6 +15,8 @@ const evalContractBundle = (bundle, additionalEndowments = {}) => {
const defaultEndowments = {
console: louderConsole,
assert,
makeKind,
makeWeakStore,
};

const fullEndowments = Object.create(null, {
Expand Down
Loading

0 comments on commit e6a0924

Please sign in to comment.