diff --git a/packages/cosmic-swingset/lib/ag-solo/vats/bootstrap.js b/packages/cosmic-swingset/lib/ag-solo/vats/bootstrap.js index 02376082935..c76d4010b6a 100644 --- a/packages/cosmic-swingset/lib/ag-solo/vats/bootstrap.js +++ b/packages/cosmic-swingset/lib/ag-solo/vats/bootstrap.js @@ -56,26 +56,60 @@ export function buildRootObject(vatPowers, vatParameters) { ]); // Make the other demo mints - const issuerNames = ['moola', 'simolean']; + /** + * @typedef {Object} IssuerRecord + * @property {Array} [issuerArgs] + * @property {string} pursePetname + * @property {any} mintValue + */ + /** @type {Map} */ + const issuerNameToRecord = new Map( + harden([ + [ + 'Testnet.$USD', + { + issuerArgs: [undefined, { decimalPlaces: 3 }], + mintValue: 20000, + pursePetname: 'Local currency', + }, + ], + [ + 'Testnet.$LINK', + { + issuerArgs: [undefined, { decimalPlaces: 6 }], + mintValue: 7 * 10 ** 6, + pursePetname: 'Oracle fee', + }, + ], + [ + 'moola', + { + mintValue: 1900, + pursePetname: 'Fun budget', + }, + ], + [ + 'simolean', + { + mintValue: 1900, + pursePetname: 'Nest egg', + }, + ], + ]), + ); + const issuerNames = [...issuerNameToRecord.keys()]; const issuers = await Promise.all( issuerNames.map(issuerName => - E(vats.mints).makeMintAndIssuer(issuerName), + E(vats.mints).makeMintAndIssuer( + issuerName, + ...(issuerNameToRecord.get(issuerName).issuerArgs || []), + ), ), ); // TODO: Create priceAuthority pairs for moola-simolean based on the // FakePriceAuthority. - // Register the moola and simolean issuers - const issuerInfo = await Promise.all( - issuerNames.map(async (issuerName, i) => - harden({ - issuer: issuers[i], - petname: issuerName, - }), - ), - ); - return harden({ async createUserBundle(_nickname, powerFlags = []) { // Bind to some fresh ports (unspecified name) on the IBC implementation @@ -95,25 +129,19 @@ export function buildRootObject(vatPowers, vatParameters) { additionalPowers.priceAuthorityAdmin = priceAuthorityAdmin; } - const pursePetnames = { - moola: 'Fun budget', - simolean: 'Nest egg', - }; - const payments = await E(vats.mints).mintInitialPayments( issuerNames, - harden([1900, 1900]), + issuerNames.map( + issuerName => issuerNameToRecord.get(issuerName).mintValue, + ), ); - const paymentInfo = issuerInfo.map( - ({ petname: issuerPetname, issuer }, i) => ({ - issuerPetname, - issuer, - payment: payments[i], - pursePetname: - pursePetnames[issuerPetname] || `${issuerPetname} purse`, - }), - ); + const paymentInfo = issuerNames.map((issuerName, i) => ({ + issuer: issuers[i], + issuerPetname: issuerName, + payment: payments[i], + pursePetname: issuerNameToRecord.get(issuerName).pursePetname, + })); const faucet = { // A method to reap the spoils of our on-chain provisioning. diff --git a/packages/cosmic-swingset/lib/ag-solo/vats/vat-mints.js b/packages/cosmic-swingset/lib/ag-solo/vats/vat-mints.js index 02633209bd6..82e9aaac2ec 100644 --- a/packages/cosmic-swingset/lib/ag-solo/vats/vat-mints.js +++ b/packages/cosmic-swingset/lib/ag-solo/vats/vat-mints.js @@ -22,8 +22,11 @@ export function buildRootObject(_vatPowers) { getMint: name => mintsAndMath.get(name).mint, getMints: issuerNames => issuerNames.map(api.getMint), // For example, issuerNameSingular might be 'moola', or 'simolean' - makeMintAndIssuer: issuerNameSingular => { - const { mint, issuer, amountMath } = makeIssuerKit(issuerNameSingular); + makeMintAndIssuer: (issuerNameSingular, ...issuerArgs) => { + const { mint, issuer, amountMath } = makeIssuerKit( + issuerNameSingular, + ...issuerArgs, + ); mintsAndMath.init(issuerNameSingular, { mint, amountMath }); return issuer; }, diff --git a/packages/dapp-svelte-wallet/api/src/lib-wallet.js b/packages/dapp-svelte-wallet/api/src/lib-wallet.js index 89f5270ec2f..f9131cddb5b 100644 --- a/packages/dapp-svelte-wallet/api/src/lib-wallet.js +++ b/packages/dapp-svelte-wallet/api/src/lib-wallet.js @@ -150,6 +150,8 @@ export async function makeWallet({ // We have a depositId for the purse. depositBoardId = brandToDepositFacetId.get(brand); } + + const issuerRecord = brandTable.getByBrand(brand); /** * @type {PursesJSONState} */ @@ -158,11 +160,13 @@ export async function makeWallet({ ...(depositBoardId && { depositBoardId }), brandPetname, pursePetname, + displayInfo: (issuerRecord && issuerRecord.displayInfo), value, currentAmountSlots: dehydratedCurrentAmount, currentAmount: fillInSlots(dehydratedCurrentAmount), }; pursesState.set(purseKey, jstate); + pursesFullState.set( purse, harden({ @@ -170,9 +174,10 @@ export async function makeWallet({ purse, brand, actions: { - async send(receiverP, valueToSend) { + // Send a value from this purse. + async send(receiverP, sendValue) { const { amountMath } = brandTable.getByBrand(brand); - const amount = amountMath.make(valueToSend); + const amount = amountMath.make(sendValue); const payment = await E(purse).withdraw(amount); try { await E(receiverP).receive(payment); @@ -594,7 +599,11 @@ export async function makeWallet({ const purse = getPurse(pursePetname); purseKeywordRecord[keyword] = purse; const brand = purseToBrand.get(purse); - const amount = { brand, value }; + const amount = { + brand, + value, + displayInfo: brandTable.getByBrand(brand).displayInfo, + }; return [keyword, amount]; }, ), @@ -984,8 +993,10 @@ export async function makeWallet({ } else { purse = purseOrPetname; } + const brandRecord = brandTable.getByBrand(brand); paymentRecord = { ...paymentRecord, + ...brandRecord, status: 'pending', }; updatePaymentRecord(paymentRecord); @@ -995,6 +1006,7 @@ export async function makeWallet({ ...paymentRecord, status: 'deposited', depositedAmount, + ...brandRecord, }; updatePaymentRecord(paymentRecord); depositedPK.resolve(depositedAmount); diff --git a/packages/dapp-svelte-wallet/api/src/types.js b/packages/dapp-svelte-wallet/api/src/types.js index 0dd4630744a..89495494886 100644 --- a/packages/dapp-svelte-wallet/api/src/types.js +++ b/packages/dapp-svelte-wallet/api/src/types.js @@ -17,6 +17,7 @@ * @property {string=} depositBoardId * @property {Petname} brandPetname * @property {Petname} pursePetname + * @property {any} displayInfo * @property {any} value * @property {any} currentAmountSlots * @property {any} currentAmount diff --git a/packages/dapp-svelte-wallet/api/test/test-lib-dehydrate.js b/packages/dapp-svelte-wallet/api/test/test-lib-dehydrate.js index 2a3ec349e12..08bace20dfb 100644 --- a/packages/dapp-svelte-wallet/api/test/test-lib-dehydrate.js +++ b/packages/dapp-svelte-wallet/api/test/test-lib-dehydrate.js @@ -16,11 +16,9 @@ test('makeDehydrator', async t => { instanceHandleMapping.addPetname('simpleExchange', handle1); instanceHandleMapping.addPetname('atomicSwap', handle2); instanceHandleMapping.addPetname('automaticRefund', handle3); - console.log(`ERROR EXPECTED 'already has a petname' >>>>`); t.throws(() => instanceHandleMapping.addPetname('simpleExchange2', handle1), { message: /val \(an object\) already has a petname/, }); - console.log(`ERROR EXPECTED 'petname simpleExchange is already in use' >>>>`); t.throws( () => instanceHandleMapping.addPetname('simpleExchange', harden({})), { message: /petname \(a string\) is already in use/ }, @@ -38,9 +36,6 @@ test('makeDehydrator', async t => { handle1, `renaming is successful going from val to petname`, ); - console.log( - `ERROR EXPECTED 'has not been previously named, would you like to add it instead?' >>>>`, - ); t.throws( () => instanceHandleMapping.renamePetname('new value', harden({})), { @@ -75,7 +70,6 @@ test('makeDehydrator', async t => { `'to be deleted' present going from val to petname`, ); instanceHandleMapping.deletePetname('to be deleted'); - console.log(`ERROR EXPECTED '"petname" not found' >>>>`); t.throws( () => instanceHandleMapping.petnameToVal.get('to be deleted'), { message: /"petname" not found/ }, diff --git a/packages/dapp-svelte-wallet/api/test/test-lib-wallet.js b/packages/dapp-svelte-wallet/api/test/test-lib-wallet.js index 8fda0974a41..06f58db0df3 100644 --- a/packages/dapp-svelte-wallet/api/test/test-lib-wallet.js +++ b/packages/dapp-svelte-wallet/api/test/test-lib-wallet.js @@ -169,6 +169,9 @@ test('lib-wallet issuer and purse methods', async t => { { brandBoardId: '1667979430', depositBoardId: '604346717', + displayInfo: { + amountMathKind: 'set', + }, brandPetname: 'zoe invite', pursePetname: 'Default Zoe invite purse', value: [], @@ -185,6 +188,9 @@ test('lib-wallet issuer and purse methods', async t => { { brandBoardId: '727995140', brandPetname: 'moola', + displayInfo: { + amountMathKind: 'nat', + }, pursePetname: 'fun money', value: 0, currentAmountSlots: { @@ -290,6 +296,10 @@ test('lib-wallet dapp suggests issuer, instance, installation petnames', async t { brandBoardId: '1667979430', depositBoardId: '604346717', + displayInfo: { + amountMathKind: 'set', + }, + brandPetname: 'zoe invite', pursePetname: 'Default Zoe invite purse', value: [ @@ -369,6 +379,9 @@ test('lib-wallet dapp suggests issuer, instance, installation petnames', async t { brandBoardId: '1667979430', depositBoardId: '604346717', + displayInfo: { + amountMathKind: 'set', + }, brandPetname: 'zoe invite', pursePetname: 'Default Zoe invite purse', value: [ @@ -424,7 +437,6 @@ test('lib-wallet dapp suggests issuer, instance, installation petnames', async t `inboxStateChangeLog with names`, ); - console.log('EXPECTED ERROR ->>> "petname" not found'); t.throws( () => wallet.getInstallation('whatever'), { message: /"petname" not found/ }, @@ -466,6 +478,9 @@ test('lib-wallet dapp suggests issuer, instance, installation petnames', async t { brandBoardId: '1667979430', depositBoardId: '604346717', + displayInfo: { + amountMathKind: 'set', + }, brandPetname: 'zoe invite', pursePetname: 'Default Zoe invite purse', value: [ @@ -632,6 +647,9 @@ test('lib-wallet offer methods', async t => { brandBoardId: '1667979430', depositBoardId: '604346717', brandPetname: 'zoe invite', + displayInfo: { + amountMathKind: 'set', + }, pursePetname: 'Default Zoe invite purse', value: [], currentAmountSlots: { @@ -651,6 +669,9 @@ test('lib-wallet offer methods', async t => { { brandBoardId: '1532665031', brandPetname: 'moola', + displayInfo: { + amountMathKind: 'nat', + }, pursePetname: 'Fun budget', value: 100, currentAmountSlots: { diff --git a/packages/dapp-svelte-wallet/ui/package.json b/packages/dapp-svelte-wallet/ui/package.json index 6a0c81a0248..7f39e7fea05 100644 --- a/packages/dapp-svelte-wallet/ui/package.json +++ b/packages/dapp-svelte-wallet/ui/package.json @@ -16,6 +16,7 @@ "@agoric/captp": "^1.5.2-dev.0", "@rollup/plugin-commonjs": "^12.0.0", "@rollup/plugin-node-resolve": "^8.0.0", + "json5": "^2.1.3", "livereload-js": "https://github.com/agoric-labs/livereload-js", "rollup": "^2.3.4", "rollup-plugin-livereload": "^1.0.0", @@ -33,5 +34,8 @@ ], "publishConfig": { "access": "public" + }, + "dependencies": { + "@rollup/plugin-replace": "^2.3.4" } } diff --git a/packages/dapp-svelte-wallet/ui/rollup.config.js b/packages/dapp-svelte-wallet/ui/rollup.config.js index 9a8ed3ae40e..c4108848abc 100644 --- a/packages/dapp-svelte-wallet/ui/rollup.config.js +++ b/packages/dapp-svelte-wallet/ui/rollup.config.js @@ -1,6 +1,7 @@ import svelte from 'rollup-plugin-svelte'; import resolve from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; +import replace from '@rollup/plugin-replace'; import livereload from 'rollup-plugin-livereload'; import { terser } from 'rollup-plugin-terser'; import smelte from 'smelte/rollup-plugin-smelte'; @@ -37,6 +38,9 @@ export default { file: 'public/wallet/build/bundle.js' }, plugins: [ + replace({ + isProduction: production, + }), svelte({ // enable run-time checks when not in production dev: !production, diff --git a/packages/dapp-svelte-wallet/ui/src/Amount.svelte b/packages/dapp-svelte-wallet/ui/src/Amount.svelte index 95cc31e2328..db63121b792 100644 --- a/packages/dapp-svelte-wallet/ui/src/Amount.svelte +++ b/packages/dapp-svelte-wallet/ui/src/Amount.svelte @@ -1,13 +1,14 @@