diff --git a/packages/boot/test/fast-usdc/fast-usdc.test.ts b/packages/boot/test/fast-usdc/fast-usdc.test.ts index b4ae4dd15a0..39791f0c077 100644 --- a/packages/boot/test/fast-usdc/fast-usdc.test.ts +++ b/packages/boot/test/fast-usdc/fast-usdc.test.ts @@ -37,7 +37,7 @@ const { } = process.env; test.before('bootstrap', async t => { - const config = '@agoric/vm-config/decentral-itest-orchestration-config.json'; + const config = '@agoric/vm-config/decentral-itest-fast-usdc-config.json'; insistManagerType(defaultManagerType); const harness = ['xs-worker', 'xsnap'].includes(defaultManagerType) ? makeSwingsetHarness() diff --git a/packages/fast-usdc/scripts/delete-completed-txs.js b/packages/fast-usdc/scripts/delete-completed-txs.js new file mode 100644 index 00000000000..f6d7dc9437c --- /dev/null +++ b/packages/fast-usdc/scripts/delete-completed-txs.js @@ -0,0 +1,21 @@ +// import { E } from '@endo/far'; +/* global E */ + +/** @import {FastUSDCCorePowers} from '../src/start-fast-usdc.core' */ + +const trace = (...args) => console.log('FUPS', ...args); +trace('script starting'); + +/** @param {BootstrapPowers & FastUSDCCorePowers} powers */ +const pruneFastUsdcStorage = async powers => { + trace('pruneFastUsdcStorage'); + const { fastUsdcKit } = powers.consume; + const { creatorFacet } = await fastUsdcKit; + trace(creatorFacet); + // @ts-expect-error core eval scripts get E as an endowment + await E(creatorFacet).deleteCompletedTxs(); + trace('done'); +}; + +trace('script finishing'); +pruneFastUsdcStorage; diff --git a/packages/fast-usdc/src/clientSupport.js b/packages/fast-usdc/src/clientSupport.js index 38e2f5548ff..e36b7a195d6 100644 --- a/packages/fast-usdc/src/clientSupport.js +++ b/packages/fast-usdc/src/clientSupport.js @@ -14,7 +14,7 @@ import { assertAllDefined } from '@agoric/internal'; * @param {string} opts.offerId * @param {bigint} opts.fastLPAmount * @param {bigint} opts.usdcAmount - * @returns {import('@agoric/smart-wallet/src/offers.js').OfferSpec} + * @returns {import('@agoric/smart-wallet/src/offers.js').OfferSpec & {proposal: USDCProposalShapes['deposit']}} */ const makeDepositOffer = ({ brand }, { offerId, fastLPAmount, usdcAmount }) => { assertAllDefined({ offerId, fastLPAmount, usdcAmount }); diff --git a/packages/fast-usdc/src/exos/advancer.js b/packages/fast-usdc/src/exos/advancer.js index 1708b0193d8..408f3997c16 100644 --- a/packages/fast-usdc/src/exos/advancer.js +++ b/packages/fast-usdc/src/exos/advancer.js @@ -223,7 +223,8 @@ export const prepareAdvancerKit = ( onFulfilled(result, ctx) { const { poolAccount, intermediateRecipient, settlementAddress } = this.state; - const { destination, advanceAmount, tmpSeat: _, ...detail } = ctx; + const { destination, advanceAmount, tmpSeat, ...detail } = ctx; + tmpSeat.exit(); const amount = harden({ denom: usdc.denom, value: advanceAmount.value, @@ -260,6 +261,7 @@ export const prepareAdvancerKit = ( const { borrower, notifier } = this.state; notifier.notifyAdvancingResult(restCtx, false); borrower.returnToPool(tmpSeat, advanceAmount); + tmpSeat.exit(); } catch (e) { log('🚨 deposit to localOrchAccount failure recovery failed', e); } diff --git a/packages/fast-usdc/src/exos/liquidity-pool.js b/packages/fast-usdc/src/exos/liquidity-pool.js index c8867fbdc4d..f71a6d6fdff 100644 --- a/packages/fast-usdc/src/exos/liquidity-pool.js +++ b/packages/fast-usdc/src/exos/liquidity-pool.js @@ -192,7 +192,9 @@ export const prepareLiquidityPoolKit = (zone, zcf, USDC, tools) => { zcf.atomicRearrange( harden([[borrowSeat, repaySeat, { USDC: amount }, returnAmounts]]), ); - return this.facets.repayer.repay(repaySeat, returnAmounts); + this.facets.repayer.repay(repaySeat, returnAmounts); + borrowSeat.exit(); + repaySeat.exit(); }, }, repayer: { diff --git a/packages/fast-usdc/src/exos/settler.js b/packages/fast-usdc/src/exos/settler.js index d9d64ea73da..1146f2be85a 100644 --- a/packages/fast-usdc/src/exos/settler.js +++ b/packages/fast-usdc/src/exos/settler.js @@ -327,6 +327,7 @@ export const prepareSettler = ( harden([[settlingSeat, settlingSeat, { In: received }, split]]), ); repayer.repay(settlingSeat, split); + settlingSeat.exit(); // update status manager, marking tx `DISBURSED` statusManager.disbursed(txHash, split); diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js index 7c24f601523..d4c9ed7bf1b 100644 --- a/packages/fast-usdc/src/fast-usdc.contract.js +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -193,6 +193,9 @@ export const contract = async (zcf, privateArgs, zone, tools) => { await publishAddresses(storageNode, addresses); return addresses; }, + deleteCompletedTxs() { + return statusManager.deleteCompletedTxs(); + }, }); const publicFacet = zone.exo('Fast USDC Public', undefined, { diff --git a/packages/fast-usdc/test/exos/advancer.test.ts b/packages/fast-usdc/test/exos/advancer.test.ts index ccb97d3c58b..34065cf1478 100644 --- a/packages/fast-usdc/test/exos/advancer.test.ts +++ b/packages/fast-usdc/test/exos/advancer.test.ts @@ -47,6 +47,8 @@ const LOCAL_DENOM = `ibc/${denomHash({ type CommonSetup = EReturn; +const theExit = harden(() => {}); // for ava comparison + const createTestExtensions = (t, common: CommonSetup) => { const { facadeServices: { chainHub }, @@ -77,7 +79,9 @@ const createTestExtensions = (t, common: CommonSetup) => { ); const mockZCF = Far('MockZCF', { - makeEmptySeatKit: () => ({ zcfSeat: Far('MockZCFSeat', {}) }), + makeEmptySeatKit: () => ({ + zcfSeat: Far('MockZCFSeat', { exit: theExit }), + }), }); const localTransferVK = vowTools.makeVowKit(); @@ -551,7 +555,7 @@ test('returns payment to LP if zoeTools.localTransfer fails', async t => { const { borrow, returnToPool } = inspectBorrowerFacetCalls(); const expectedArguments = [ - Far('MockZCFSeat', {}), + Far('MockZCFSeat', { exit: theExit }), usdc.make(146999999n), // net of fees ]; diff --git a/packages/fast-usdc/test/exos/settler.test.ts b/packages/fast-usdc/test/exos/settler.test.ts index 7a6fc11280f..871a2c843cb 100644 --- a/packages/fast-usdc/test/exos/settler.test.ts +++ b/packages/fast-usdc/test/exos/settler.test.ts @@ -33,6 +33,7 @@ const mockZcf = (zone: Zone) => { const makeSeatKit = zone.exoClassKit('MockSeatKit', undefined, () => ({}), { zcfSeat: { + exit() {}, getCurrentAllocation() { return {}; }, diff --git a/packages/vm-config/decentral-itest-fast-usdc-config.json b/packages/vm-config/decentral-itest-fast-usdc-config.json new file mode 100644 index 00000000000..f95cb62435d --- /dev/null +++ b/packages/vm-config/decentral-itest-fast-usdc-config.json @@ -0,0 +1,143 @@ +{ + "$comment": "This SwingSet config file (see loadSwingsetConfigFile) is designed to bring up vats to test Fast USDC. Compared to decentral-itest-orchestration-config.json, it lacks write-chain-info.", + "bootstrap": "bootstrap", + "defaultReapInterval": 1000, + "coreProposals": [ + "@agoric/builders/scripts/vats/init-core.js", + "@agoric/builders/scripts/vats/init-network.js", + "@agoric/builders/scripts/vats/init-localchain.js", + "@agoric/builders/scripts/vats/init-transfer.js", + "@agoric/builders/scripts/vats/init-orchestration.js", + { + "module": "@agoric/builders/scripts/inter-protocol/init-core.js", + "entrypoint": "defaultProposalBuilder", + "args": [ + { + "econCommitteeOptions": { + "committeeSize": 3 + }, + "referencedUi": "bafybeidvpbtlgefi3ptuqzr2fwfyfjqfj6onmye63ij7qkrb4yjxekdh3e", + "minInitialPoolLiquidity": "0" + } + ] + }, + { + "module": "@agoric/builders/scripts/inter-protocol/add-collateral-core.js", + "entrypoint": "defaultProposalBuilder", + "args": [ + { + "interestRateValue": 1000, + "interchainAssetOptions": { + "denom": "ibc/toyatom", + "decimalPlaces": 6, + "initialPrice": 12.34, + "keyword": "ATOM", + "oracleBrand": "ATOM", + "proposedName": "ATOM" + } + } + ] + }, + { + "module": "@agoric/builders/scripts/inter-protocol/add-collateral-core.js", + "entrypoint": "psmProposalBuilder", + "args": [ + { + "anchorOptions": { + "denom": "ibc/toyusdc", + "decimalPlaces": 6, + "keyword": "USDC_axl", + "proposedName": "USD Coin" + } + } + ] + }, + { + "module": "@agoric/builders/scripts/inter-protocol/add-collateral-core.js", + "entrypoint": "psmProposalBuilder", + "args": [ + { + "anchorOptions": { + "denom": "ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9", + "decimalPlaces": 6, + "keyword": "USDC", + "proposedName": "USDC" + } + } + ] + }, + { + "$comment": "XXX orchesration works without oracles but some test setup dependency fails to resolve without this", + "module": "@agoric/builders/scripts/inter-protocol/price-feed-core.js", + "entrypoint": "defaultProposalBuilder", + "args": [ + { + "AGORIC_INSTANCE_NAME": "ATOM-USD price feed", + "oracleAddresses": [ + "@PRIMARY_ADDRESS@", + "agoric1dy0yegdsev4xvce3dx7zrz2ad9pesf5svzud6y" + ], + "IN_BRAND_LOOKUP": [ + "agoricNames", + "oracleBrand", + "ATOM" + ], + "IN_BRAND_DECIMALS": 6, + "OUT_BRAND_LOOKUP": [ + "agoricNames", + "oracleBrand", + "USD" + ], + "OUT_BRAND_DECIMALS": 4 + } + ] + } + ], + "vats": { + "bootstrap": { + "sourceSpec": "@agoric/vats/src/core/boot-chain.js", + "creationOptions": { + "critical": true + } + } + }, + "bundles": { + "agoricNames": { + "sourceSpec": "@agoric/vats/src/vat-agoricNames.js" + }, + "bank": { + "sourceSpec": "@agoric/vats/src/vat-bank.js" + }, + "board": { + "sourceSpec": "@agoric/vats/src/vat-board.js" + }, + "bridge": { + "sourceSpec": "@agoric/vats/src/vat-bridge.js" + }, + "centralSupply": { + "sourceSpec": "@agoric/vats/src/centralSupply.js" + }, + "mintHolder": { + "sourceSpec": "@agoric/vats/src/mintHolder.js" + }, + "priceAuthority": { + "sourceSpec": "@agoric/vats/src/vat-priceAuthority.js" + }, + "provisionPool": { + "sourceSpec": "@agoric/inter-protocol/src/provisionPool.js" + }, + "provisioning": { + "sourceSpec": "@agoric/vats/src/vat-provisioning.js" + }, + "walletFactory": { + "sourceSpec": "@agoric/smart-wallet/src/walletFactory.js" + }, + "zcf": { + "sourceSpec": "@agoric/zoe/contractFacet.js" + }, + "zoe": { + "sourceSpec": "@agoric/vats/src/vat-zoe.js" + } + }, + "defaultManagerType": "xs-worker" +} \ No newline at end of file