From 61e2c571c13cbf193c14536bdba28019b7216552 Mon Sep 17 00:00:00 2001 From: Lisandro Corbalan Date: Tue, 8 Sep 2026 20:49:15 +0000 Subject: [PATCH 1/4] feat(dapp): reserve only the granted amount when a grant is created --- dapp/frontend/architecture.md | 74 +++--- .../src/backend/LedgerBackend.test.ts | 221 ++++++++++++++---- dapp/frontend/src/backend/LedgerBackend.ts | 150 ++++++------ .../src/backend/VestingBackend.test.ts | 18 +- dapp/frontend/src/backend/VestingBackend.ts | 18 +- dapp/frontend/src/backend/commands.test.ts | 2 + dapp/frontend/src/backend/commands.ts | 6 +- .../src/components/CreateGrant/index.tsx | 4 +- vendor/PROVENANCE.md | 21 +- vendor/vesting.dar | Bin 677236 -> 688686 bytes 10 files changed, 348 insertions(+), 166 deletions(-) diff --git a/dapp/frontend/architecture.md b/dapp/frontend/architecture.md index 30de334d..651c0ee1 100644 --- a/dapp/frontend/architecture.md +++ b/dapp/frontend/architecture.md @@ -88,47 +88,55 @@ scoped away from `/api/` so it cannot answer the route with `index.html`. ## Creating a grant takes one approval -A pending grant records the contract ids of the holdings its Accept will lock, and that Accept -consumes exactly those. So two grants may never name the same holding: accepting one archives it and -leaves the other permanently unacceptable, `CONTRACT_NOT_FOUND` at the `fetch` before the transfer -even runs. Whatever an outstanding grant already pledged is therefore kept out of the next -selection, read off the funder's own pending-grant rows rather than remembered locally. - -What it does not need is a pre-split. `executeTokenTransfer` returns the sender's leftover input as -change, so `VestingProposal_Accept` can be handed a set of holdings that over-covers the grant and -splits them itself. The Amulet version could not: `AmuletRules_Transfer` consumes everything it is -given, which is why creating a grant used to be two submissions and two wallet prompts. - -`createVesting` picks unpledged holdings largest first until they cover the total. Largest rather -than smallest, so a grant names the fewest inputs: every named holding is a disclosure blob the -receiver has to carry to Accept. +`VestingFactory_CreateVesting` splits the funder's inputs itself: it transfers them into one +unlocked holding of exactly the grant, hands the change straight back, and the proposal names that +holding alone. So a grant reserves its own amount and nothing more, and the rest of the funder's +balance stays spendable while the proposal is outstanding. That split is why the choice takes the +`InstrumentConfig`, and it is still one submission and one wallet approval, because an unlocked +self-transfer's controllers are the sender alone. The Amulet version could not do this in one: +`AmuletRules_Transfer` consumes everything it is given, which is why creating a grant used to be two +submissions and two wallet prompts. + +The reserved holding is still kept out of the next selection, read off the funder's own +pending-grant rows rather than remembered locally: an Accept consumes exactly that contract, so +spending it would leave the grant permanently unacceptable, `CONTRACT_NOT_FOUND` at the `fetch` +before the transfer even runs. A selection built against a stale read now fails its own submission +rather than creating a second grant on a holding that is already gone. + +`createVesting` picks unreserved holdings largest first until they cover the total. Largest rather +than smallest so the factory splits the fewest inputs, no longer for the receiver's sake: the split +leaves one holding to disclose whichever inputs went into it. A holding is worth its `amount` field and nothing is computed: a token-forge `Token` does not decay, so unlike an Amulet there is no decayed value to reason about and no headroom to guess at. Accept is still the one write disclosing something the connected party cannot read for itself: the -funder's holdings. `Token` is `signatory admin, owner` with no observers, so the receiver is no -stakeholder. Their blobs are read with `includeCreatedEventBlob` while the funder is connected and -kept in `localStorage`, written only once the grant is on the ledger, since a declined prompt must -not leave blobs behind for holdings no grant is waiting on. Appended rather than replacing, because -every outstanding grant's own holdings have to stay disclosable. - -Which of those blobs a given Accept sends is read off the ledger, not guessed: the receiver is an -observer of the grant, so `accept` fetches it and discloses exactly the `tokenCids` it names, then -drops them, since that submission archived them. Sending the whole store instead would re-disclose -holdings earlier accepts already consumed, grow without bound, and leave the guard unable to tell a -missing blob from an unrelated one. It is a browser-local hand-off between two wallet accounts, -which is what the demo is; a receiver on another machine has no way to disclose it and `accept` says -so rather than submitting a rejection. +holding the grant reserves. `Token` is `signatory admin, owner` with no observers, so the receiver is +no stakeholder. That holding is created by the funder's own create submission, so its blob cannot be +read before it exists: `createVesting` re-reads the funder's holdings with `includeCreatedEventBlob` +once the grant is on the ledger, and keeps in `localStorage` the blob of every holding an +outstanding grant of theirs reserves. Reconciling the whole set rather than only the grant just made +is what lets a read that failed once be picked up by the next grant, instead of leaving a grant +nobody can accept; and reading after the write rather than before is what keeps a declined prompt +from leaving a blob behind for a holding no grant is waiting on. A failure there leaves the grant +alone, since it is already on the ledger and reporting one would invite a second. + +Which blob a given Accept sends is read off the ledger, not guessed: the receiver is an observer of +the grant, so `accept` fetches it and discloses exactly the `tokenCid` it names, then drops it, since +that submission archived it. Sending the whole store instead would re-disclose holdings earlier +accepts already consumed, which the participant rejects, and grow without bound. It is a +browser-local hand-off between two wallet accounts, which is what the demo +is; a receiver on another machine has no way to disclose it and `accept` says so rather than +submitting a rejection. The escrow needs no such hand-off. A `LockedToken` is `signatory admin, owner, holders` and the escrow's holders are the provider and the receiver, so both ends of a grant can read it. Only the config is disclosed on withdraw, cancel and residual claim. -A grant and a residual claim each carry `admin` and `instrumentId` as template fields, so a row from -another instrument on a shared participant is dropped before it is mapped. A pending grant carries -neither: `VestingProposal_Accept` derives both by fetching the first holding it names, which the -receiver cannot read. So a pending grant in a foreign instrument does render, and fails at Accept. +A grant, a pending grant and a residual claim each carry `admin` and `instrumentId` as template +fields, so a row from another instrument on a shared participant is dropped before it is mapped. The +proposal stores its pair rather than deriving it, which is what lets the receiver see what a grant is +denominated in: the funder's holdings, which the factory read the pair off, are unreadable to them. A filter always names a template by package name (`#vesting:Vesting:…`) and a command always by the resolved id the deployment carries. The participant rejects each in the other's position, the filter @@ -287,8 +295,8 @@ the `balance` it was given. A Canton balance is a set of holding contracts rather than a scalar, so the read is party-scoped and summed. It reports what a grant could actually spend rather than what the party owns, over the same set `selectHoldings` will draw from: a holding already escrowed is a `LockedToken` and so out by -template, and one an outstanding grant pledged is out because spending it would leave that grant -unacceptable. The two agreeing is the point: a `Max` that offered more would put an amount in the +template, and the one an outstanding grant reserves is out because spending it would leave that +grant unacceptable. The two agreeing is the point: a `Max` that offered more would put an amount in the field that the next step always refuses. The read runs once, on mount: nothing the form does moves the funder's holdings. diff --git a/dapp/frontend/src/backend/LedgerBackend.test.ts b/dapp/frontend/src/backend/LedgerBackend.test.ts index c6b470f3..fdaa24bf 100644 --- a/dapp/frontend/src/backend/LedgerBackend.test.ts +++ b/dapp/frontend/src/backend/LedgerBackend.test.ts @@ -3,6 +3,7 @@ import { encodeSchedule } from '@/backend/commands' import type { Deployment } from '@/backend/config' import { LedgerBackend } from '@/backend/LedgerBackend' import type { DisclosedContract, LedgerCommand, WalletFns } from '@/backend/wallet' +import { addAmounts, isZero, subtractAmounts } from '@/utils/amount' const deployment: Deployment = { admin: 'instrument-admin::1', @@ -32,7 +33,11 @@ type Submission = { // As much of the ACS query LedgerBackend builds as these tests read back, named once so the two // accessors below share it rather than each casting the body to its own shape. type PartyFilter = { - cumulative?: { identifierFilter?: { TemplateFilter?: { value?: { templateId?: string } } } }[] + cumulative?: { + identifierFilter?: { + TemplateFilter?: { value?: { includeCreatedEventBlob?: boolean; templateId?: string } } + } + }[] } type AcsQuery = { @@ -40,7 +45,11 @@ type AcsQuery = { filter?: { filtersByParty?: Record } } -type Read = { requestMethod: string; resource: string; body?: AcsQuery } +type Read = { + requestMethod: string + resource: string + body?: AcsQuery & { updateId?: string } +} const byParty = (read: Read): Record => read.body?.filter?.filtersByParty ?? {} @@ -51,6 +60,10 @@ const filteredTemplate = (read: Read): string | undefined => const filteredParty = (read: Read): string | undefined => Object.keys(byParty(read))[0] +const readsBlobs = (read: Read): boolean => + byParty(read)[filteredParty(read) ?? '']?.cumulative?.[0]?.identifierFilter?.TemplateFilter?.value + ?.includeCreatedEventBlob === true + const row = (contractId: string, arg: Record): unknown => ({ contractEntry: { JsActiveContract: { createdEvent: { contractId, createArgument: arg } } }, }) @@ -90,16 +103,59 @@ vi.mock('@/backend/registry', () => ({ }), })) -// The harness behaves like the ledger for the one submission a grant now takes: the factory choice -// leaves a pending grant behind pledging exactly the holdings it was given. Without that, a later -// selection would happily spend a holding an outstanding grant is waiting on. +type Created = { + contractId?: string + createArgument?: { amount?: string } + createdEventBlob?: string + templateId?: string +} + +const createdEvent = (contract: unknown): Created => + (contract as { contractEntry?: { JsActiveContract?: { createdEvent?: Created } } }).contractEntry + ?.JsActiveContract?.createdEvent ?? {} + +const cidOf = (contract: unknown): string => createdEvent(contract).contractId ?? '' + +// The harness behaves like the ledger for the one submission a grant takes: the factory splits the +// holdings it is given, so those are consumed and replaced by one holding of exactly the grant plus +// the funder's change, and the pending grant names the first of the two. Without that, a later +// selection would happily spend the holding an outstanding grant is waiting on, and no holding +// would exist for the funder to disclose to the receiver. const settle = (acs: Record, submission: Submission): void => { const exercise = submission.commands?.[0]?.ExerciseCommand if (exercise?.choice !== 'VestingFactory_CreateVesting') { return } - const { tokenCids } = exercise.choiceArgument as { tokenCids: string[] } - acs[PENDING] = [...(acs[PENDING] ?? []), row(`pending-for-${tokenCids[0]}`, { tokenCids })] + const { note, receiver, tokenCids, totalAmount } = exercise.choiceArgument as { + note: string | null + receiver: string + tokenCids: string[] + totalAmount: string + } + const held = acs[TOKEN] ?? [] + const spent = held.filter((contract) => tokenCids.includes(cidOf(contract))) + const change = subtractAmounts( + addAmounts(...spent.map((contract) => createdEvent(contract).createArgument?.amount ?? '0')), + totalAmount, + ) + const funding = tokenRow(`funding-${tokenCids[0]}`, totalAmount) + const returned = isZero(change) ? [] : [tokenRow(`change-${tokenCids[0]}`, change)] + const pending = row(`pending-for-${tokenCids[0]}`, { + admin: 'instrument-admin::1', + instrumentId: 'DBT', + provider: 'operator::1', + proposer: submission.actAs?.[0], + receiver, + totalAmount, + tokenCid: cidOf(funding), + note, + }) + acs[TOKEN] = [ + ...held.filter((contract) => !tokenCids.includes(cidOf(contract))), + funding, + ...returned, + ] + acs[PENDING] = [...(acs[PENDING] ?? []), pending] } // The submission carries the synchronizer, so everything disclosed on one arrives stamped with it. @@ -112,6 +168,7 @@ const harness = ( declines?: boolean deployment?: Deployment ledgerEnd?: unknown + readsFailAfterSubmit?: boolean } = {}, ): { backend: LedgerBackend; submissions: Submission[]; reads: Read[] } => { const { @@ -119,6 +176,7 @@ const harness = ( declines = false, ledgerEnd = { offset: 42 }, deployment: config = deployment, + readsFailAfterSubmit = false, } = options const submissions: Submission[] = [] const reads: Read[] = [] @@ -130,11 +188,16 @@ const harness = ( const submission = params as Submission submissions.push(submission) settle(acs, submission) - return {} + // The wallet answers with the transaction's own ids, none of which name a contract it + // created. + return { tx: { payload: { updateId: `update-${submissions.length}` } } } }, ledgerApi: async (params) => { const read = params as Read reads.push(read) + if (readsFailAfterSubmit && submissions.length > 0) { + throw new Error('the participant is not answering') + } if (read.resource === '/v2/state/ledger-end') { return ledgerEnd } @@ -158,8 +221,8 @@ describe('LedgerBackend.createVesting', () => { note: 'linear', } - // One submission, not two: the token-forge transfer returns the funder's leftover input as - // change, so Accept splits and the funder never has to pre-split. + // One submission, not two: the factory splits the funder's inputs itself, so the funder never has + // to pre-split and the change comes back in the same transaction. it('funds the grant in a single submission', async () => { const { backend, submissions } = harness({ acs: { [TOKEN]: [tokenRow('t1', '600'), tokenRow('t2', '900')] }, @@ -186,11 +249,11 @@ describe('LedgerBackend.createVesting', () => { ]) }) - it('leaves out a holding an outstanding grant has already pledged', async () => { + it('leaves out the holding an outstanding grant has already reserved', async () => { const { backend, submissions } = harness({ acs: { [TOKEN]: [tokenRow('pledged', '1000'), tokenRow('free', '1000')], - [PENDING]: [row('p1', { tokenCids: ['pledged'] })], + [PENDING]: [row('p1', { tokenCid: 'pledged' })], }, }) @@ -201,11 +264,11 @@ describe('LedgerBackend.createVesting', () => { ]) }) - it('refuses when what is left unpledged cannot cover the grant', async () => { + it('refuses when what is left unreserved cannot cover the grant', async () => { const { backend } = harness({ acs: { [TOKEN]: [tokenRow('pledged', '1000'), tokenRow('free', '400')], - [PENDING]: [row('p1', { tokenCids: ['pledged'] })], + [PENDING]: [row('p1', { tokenCid: 'pledged' })], }, }) @@ -228,7 +291,7 @@ describe('LedgerBackend.createVesting', () => { await expect(backend.createVesting(grant)).rejects.toThrow(/only 0 DBT is free/) }) - it('exercises the factory choice with the composed note and schedule, disclosing only it', async () => { + it('exercises the factory choice with the composed note, schedule and config', async () => { const { backend, submissions } = harness({ acs: { [TOKEN]: [tokenRow('t1', '1000')] } }) const result = await backend.createVesting(grant) @@ -245,22 +308,28 @@ describe('LedgerBackend.createVesting', () => { totalAmount: '1000', schedule: encodeSchedule(schedule), tokenCids: ['t1'], + configCid: '00cfg', note: 'Advisor grant\nlinear', }, }, }, ]) - // The funder is not a stakeholder of the observer-less factory, so its disclosure is the - // deployment's rather than something read back here. - expect(submissions[0]?.disclosedContracts).toEqual([ - { - templateId: 'pkg1:Vesting:VestingFactory', - contractId: 'factory-cid', - createdEventBlob: 'YmxvYg==', - synchronizerId: 'sync::1', - }, - ]) - expect(result.disclosedBytes).toBe(deployment.factoryBlob.length) + // The config because the split runs against it, the factory because the funder is not a + // stakeholder of the observer-less factory and so cannot read it. The inputs are the funder's + // own, so they need no disclosure. + expect(submissions[0]?.disclosedContracts).toEqual( + onSync([ + CONFIG, + { + templateId: 'pkg1:Vesting:VestingFactory', + contractId: 'factory-cid', + createdEventBlob: 'YmxvYg==', + }, + ]), + ) + expect(result.disclosedBytes).toBe( + CONFIG.createdEventBlob.length + deployment.factoryBlob.length, + ) }) it('omits the synchronizer id when the config carries none', async () => { @@ -271,19 +340,56 @@ describe('LedgerBackend.createVesting', () => { expect(submissions[0]?.disclosedContracts?.[0]).not.toHaveProperty('synchronizerId') }) + + // The acceptance criterion this issue exists for: the funder keeps everything the grant did not + // take, rather than the whole holding it was funded from. + it('leaves the funder everything the grant did not reserve', async () => { + const { backend } = harness({ acs: { [TOKEN]: [tokenRow('t1', '1500')] } }) + + await backend.createVesting(grant) + + await expect(backend.balanceOf('funder::1')).resolves.toBe('500') + }) + + // The holding the receiver will have to disclose is created by this very submission, so the read + // that carries its blob runs after the write and not with the selection before it. + it('reads the split holding back only once the grant is on the ledger', async () => { + const { backend, reads } = harness({ acs: { [TOKEN]: [tokenRow('t1', '1500')] } }) + + await backend.createVesting(grant) + + const withBlobs = reads.filter( + (read) => + read.body?.filter !== undefined && readsBlobs(read) && filteredTemplate(read) === TOKEN, + ) + expect(withBlobs).toHaveLength(1) + }) + + // The grant is on the ledger by then, so reporting a failure would invite the funder to make a + // second one; the Accept is what says the blob is missing. + it('reports a grant whose funding holding could not be read back as created', async () => { + const { backend } = harness({ + acs: { [TOKEN]: [tokenRow('t1', '1500')] }, + readsFailAfterSubmit: true, + }) + + await expect(backend.createVesting(grant)).resolves.toEqual({ + disclosedBytes: CONFIG.createdEventBlob.length + deployment.factoryBlob.length, + }) + }) }) describe('LedgerBackend.balanceOf', () => { - it('sums the unpledged holdings of this deployment’s instrument', async () => { + it('sums the unreserved holdings of this deployment’s instrument', async () => { const { backend } = harness({ acs: { [TOKEN]: [ tokenRow('a', '600'), tokenRow('b', '400'), - tokenRow('pledged', '900'), + tokenRow('reserved', '900'), tokenRow('foreign', '5000', { instrumentId: 'OTHER' }), ], - [PENDING]: [row('p1', { tokenCids: ['pledged'] })], + [PENDING]: [row('p1', { tokenCid: 'reserved' })], }, }) @@ -408,7 +514,11 @@ describe('LedgerBackend.accept', () => { await backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }) - expect(submissions[0]?.disclosedContracts).toEqual(onSync([CONFIG, disclosedToken('t1')])) + // The split output, never the input it came out of: that one is archived, and re-disclosing it + // would only fail the transfer's own fetch. + expect(submissions[0]?.disclosedContracts).toEqual( + onSync([CONFIG, disclosedToken('funding-t1')]), + ) expect(submissions[0]?.commands?.[0]?.ExerciseCommand.choice).toBe('VestingProposal_Accept') }) @@ -420,21 +530,26 @@ describe('LedgerBackend.accept', () => { ).rejects.toThrow(/not disclosable/) }) - // Two grants name the same holding whenever the second selection reads the ACS before the first - // grant is indexed, and the funder is left unable to accept either if that is counted as an error. - it('accepts a grant whose holding was stored by two of them', async () => { - const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } - await harness({ acs }).backend.createVesting(grant('First grant')) - const unindexed = harness({ acs: { [TOKEN]: [tokenRow('t1', '1500')] } }) - await unindexed.backend.createVesting(grant('Second grant')) + // Why every outstanding grant is reconciled and not only the one just made: a read that failed + // once would otherwise leave a grant nobody can ever accept. + it('picks up a blob a failed read left behind when the next grant is created', async () => { + const acs: Record = { + [TOKEN]: [tokenRow('t1', '1500'), tokenRow('t2', '1500')], + } + const flaky = harness({ acs, readsFailAfterSubmit: true }) + await flaky.backend.createVesting(grant('First grant')) + const funder = harness({ acs }) + await funder.backend.createVesting(grant('Second grant')) const { backend, submissions } = harness({ acs }) await backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }) - expect(submissions[0]?.disclosedContracts).toEqual(onSync([CONFIG, disclosedToken('t1')])) + expect(submissions[0]?.disclosedContracts).toEqual( + onSync([CONFIG, disclosedToken('funding-t1')]), + ) }) - it('keeps the blobs of a live grant when a later one is declined in the wallet', async () => { + it('keeps the blob of a live grant when a later one is declined in the wallet', async () => { const acs: Record = { [TOKEN]: [tokenRow('t1', '2500')] } const first = harness({ acs }) await first.backend.createVesting(grant('First grant')) @@ -444,7 +559,9 @@ describe('LedgerBackend.accept', () => { await backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }) - expect(submissions[0]?.disclosedContracts).toEqual(onSync([CONFIG, disclosedToken('t1')])) + expect(submissions[0]?.disclosedContracts).toEqual( + onSync([CONFIG, disclosedToken('funding-t1')]), + ) }) }) @@ -494,6 +611,30 @@ describe('LedgerBackend.viewAs', () => { await expect(backend.viewAs('receiver::1')).rejects.toThrow(/did not return an offset/) }) + // The proposal now stores the admin and the instrument it is denominated in, so a pending grant + // is filtered like the other two rather than taken on trust. + it('drops pending grants of another instrument', async () => { + const pending = (contractId: string, admin: string): unknown => + row(contractId, { + admin, + instrumentId: 'DBT', + provider: 'operator::1', + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + tokenCid: 'funding', + schedule: encodeSchedule(schedule), + note: 'Advisor grant', + }) + const { backend } = harness({ + acs: { [PENDING]: [pending('mine', 'instrument-admin::1'), pending('theirs', 'other::1')] }, + }) + + const view = await backend.viewAs('receiver::1') + + expect(view.pendingGrants.map((one) => one.id)).toEqual(['mine']) + }) + // A shared participant can carry another admin's grants under the same package, and rendering one // under this deployment's symbol would be a lie about what it holds. it('drops grants and claims of another instrument', async () => { diff --git a/dapp/frontend/src/backend/LedgerBackend.ts b/dapp/frontend/src/backend/LedgerBackend.ts index 12c2d1af..7f54d631 100644 --- a/dapp/frontend/src/backend/LedgerBackend.ts +++ b/dapp/frontend/src/backend/LedgerBackend.ts @@ -23,7 +23,7 @@ import { composeNote, lastUpdateOffset, matchesInstrument, - pledgedTokens, + reservedToken, rowToClaim, rowToGrant, rowToPendingGrant, @@ -71,23 +71,15 @@ const STREAM_IDLE_MS = 1000 // Bounded so an offset that fails to advance cannot spin. const CLAIM_HISTORY_PAGES = 20 -// Accept locks the funder's holdings, which the receiver is no stakeholder of and so cannot read the -// disclosure blobs for. They are kept here as the funder submits the pending grant. Persisted, +// Accept locks the holding a grant reserves, which the receiver is no stakeholder of and so cannot +// read the disclosure blob for. It is kept here as the funder submits the pending grant. Persisted, // because the two parties are two wallet accounts and switching between them reloads the app. const TOKEN_STORE_KEY = 'vesting.tokenDisclosures' -// Deduplicated here rather than on write, so a store already holding a holding twice recovers: two -// grants pledge the same one whenever the second ACS read lands before the first grant is indexed, -// and a duplicate would fail `accept`'s count guard for a grant whose blobs are all present. const storedTokens = (): DisclosedContract[] => { try { const stored = JSON.parse(localStorage.getItem(TOKEN_STORE_KEY) ?? '[]') - const tokens: DisclosedContract[] = Array.isArray(stored) ? stored : [] - return [ - ...new Map( - tokens.map((token) => [token.contractId, token]), - ).values(), - ] + return Array.isArray(stored) ? (stored as DisclosedContract[]) : [] } catch { return [] } @@ -176,8 +168,8 @@ export class LedgerBackend implements VestingBackend { }) } - // What is free to fund a grant, and not simply what the party holds: a holding already escrowed - // is a LockedToken and so out by template, and a holding an outstanding grant pledged is out + // What is free to fund a grant, and not simply what the party holds: a holding already escrowed is + // a LockedToken and so out by template, and the holding an outstanding grant reserves is out // because spending it would leave that grant unacceptable. Offering more than this would put an // amount in the field that the next step always refuses. async balanceOf(partyId: string): Promise { @@ -194,47 +186,72 @@ export class LedgerBackend implements VestingBackend { this.readAcs(partyId, vesting('VestedClaim'), offset), ]) return { - pendingGrants: mapRows(pendingGrantRows, rowToPendingGrant), + pendingGrants: mapRows(this.ofInstrument(pendingGrantRows), rowToPendingGrant), grants: mapRows(this.ofInstrument(contractRows), rowToGrant), claims: mapRows(this.ofInstrument(claimRows), rowToClaim), } } - // One submission, so one wallet approval. `executeTokenTransfer` returns the sender's leftover - // input as change, so Accept splits the named holdings itself and the funder never pre-splits the - // way the Amulet version had to. The factory is the operator's and observer-less, so the funder - // cannot read it and its disclosure comes from the deployment; the blob size is what lets the UI + // One submission, so one wallet approval: the factory splits the funder's inputs down to the grant + // and hands the change back in the same transaction, so the funder never pre-splits the way the + // Amulet version had to. The factory is the operator's and observer-less, so the funder cannot + // read it and its disclosure comes from the deployment; the disclosed size is what lets the UI // surface that mechanic. async createVesting(args: CreateVestInput): Promise<{ disclosedBytes: number }> { - const free = await this.freeTokens(args.proposer, true) + const free = await this.freeTokens(args.proposer) const picked = selectHoldings(free, args.totalAmount) if (picked === undefined) { throw new Error( `only ${addAmounts(...free.map(tokenValue))} ${this.instrument.instrumentId} is free to fund this grant`, ) } - const disclosures: DisclosedContract[] = [] - for (const row of picked) { - const disclosure = rowToDisclosed(row) - if (disclosure === undefined) { - throw new Error('a holding funding this grant came back without its disclosure blob') - } - disclosures.push(disclosure) + const disclosed = await this.submitWithConfig( + args.proposer, + ({ configCid }) => + buildCreateVestingCommand(this.factory.templateId, this.factory.contractId, { + configCid, + proposer: args.proposer, + receiver: args.receiver, + totalAmount: args.totalAmount, + schedule: args.schedule, + tokenCids: picked.map(cidOf), + note: composeNote(args.title, args.note), + }), + [this.factory], + ) + // The grant is on the ledger by now, so a failure to record the blob must not report one: it + // would invite the funder to make a second grant, and `accept` is where a missing blob is felt + // and said. + await this.storeFunding(args.proposer).catch(() => undefined) + return { + disclosedBytes: disclosed.reduce((total, one) => total + one.createdEventBlob.length, 0), + } + } + + // The receiver has to disclose the holding a grant reserves, and only the funder can read it: a + // `Token` has no observers. Read after the submit, never before, because the factory creates that + // holding in this very submission and a grant the wallet declined must leave no blob behind. + // Every outstanding grant of this funder is reconciled rather than just the one just made, so a + // read that failed once is picked up by the next grant instead of leaving a grant nobody can + // accept. + private async storeFunding(party: string): Promise { + const offset = await this.ledgerEnd() + const [pendingRows, held] = await Promise.all([ + this.readAcs(party, vesting('VestingProposal'), offset), + this.readAcs(party, TOKEN, offset, true), + ]) + const reserved = new Set(pendingRows.map(reservedToken)) + const stored = storedTokens() + const known = new Set(stored.map((one) => one.contractId)) + const missing = held + .filter((row) => reserved.has(cidOf(row)) && !known.has(cidOf(row))) + .flatMap((row) => { + const disclosure = rowToDisclosed(row) + return disclosure === undefined ? [] : [disclosure] + }) + if (missing.length > 0) { + localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...stored, ...missing])) } - const command = buildCreateVestingCommand(this.factory.templateId, this.factory.contractId, { - proposer: args.proposer, - receiver: args.receiver, - totalAmount: args.totalAmount, - schedule: args.schedule, - tokenCids: picked.map(cidOf), - note: composeNote(args.title, args.note), - }) - await this.submit(args.proposer, command, [this.factory]) - // After the submit, not before: a grant the wallet declined must not leave blobs behind for - // holdings no grant is waiting on. Appended rather than replacing, because every outstanding - // grant's own holdings have to stay disclosable. - localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...storedTokens(), ...disclosures])) - return { disclosedBytes: this.factory.createdEventBlob.length } } async tap(args: { amount: string; party: string }): Promise { @@ -243,34 +260,36 @@ export class LedgerBackend implements VestingBackend { ) } - // A transfer consumes every holding it is given, so one an outstanding grant pledged has to stay - // out: consuming it is exactly what leaves that grant unacceptable. Blobs are read only where a - // caller will disclose them, since each is several hundred bytes the balance read has no use for. - private async freeTokens(owner: string, includeBlobs = false): Promise { + // A transfer consumes every holding it is given, so the one an outstanding grant reserves has to + // stay out: consuming it is exactly what leaves that grant unacceptable. + private async freeTokens(owner: string): Promise { const offset = await this.ledgerEnd() const [held, pendingRows] = await Promise.all([ - this.readAcs(owner, TOKEN, offset, includeBlobs), + this.readAcs(owner, TOKEN, offset), this.readAcs(owner, vesting('VestingProposal'), offset), ]) - const pledged = new Set(pendingRows.flatMap(pledgedTokens)) - return held.filter((row) => matchesInstrument(row, this.instrument) && !pledged.has(cidOf(row))) + const reserved = new Set(pendingRows.map(reservedToken)) + return held.filter( + (row) => matchesInstrument(row, this.instrument) && !reserved.has(cidOf(row)), + ) } - // A pending grant is deliberately not filtered: VestingProposal carries no admin or instrumentId, - // deriving both at Accept from a holding the receiver cannot read. private ofInstrument(rows: AcsRow[]): AcsRow[] { return rows.filter((row) => matchesInstrument(row, this.instrument)) } // Every choice that moves a holding takes the same config and the same one disclosure, so the - // invariant is held here rather than re-spelled per choice; `extra` is what only Accept adds. + // invariant is held here rather than re-spelled per choice; `extra` is what only create and + // Accept add. It answers with what it disclosed, which only create has a use for. private async submitWithConfig( actAs: string, build: (config: InstrumentConfigRef) => LedgerCommand, extra: DisclosedContract[] = [], - ): Promise { + ): Promise { const { disclosed, ...config } = await fetchInstrumentConfig(actAs, this.instrument) - await this.submit(actAs, build(config), [...disclosed, ...extra]) + const sent = [...disclosed, ...extra] + await this.submit(actAs, build(config), sent) + return sent } // `TRANSACTION_SHAPE_LEDGER_EFFECTS` is what carries the exercise; the default ACS-delta shape @@ -320,30 +339,29 @@ export class LedgerBackend implements VestingBackend { return claimChain(records, contractCid) } - // The grant names the holdings its Accept locks, and the receiver is an observer of the grant, so - // which blobs to send is read off the ledger rather than guessed at. Sending the whole store - // instead would re-disclose holdings earlier accepts already consumed, and would leave the guard - // below unable to tell a missing blob from an unrelated one. + // The grant names the holding its Accept locks, and the receiver is an observer of the grant, so + // which blob to send is read off the ledger rather than guessed at. Sending the whole store + // instead would re-disclose holdings earlier accepts already consumed, which the participant + // rejects. async accept(args: { receiver: string; pendingCid: string }): Promise { const offset = await this.ledgerEnd() const rows = await this.readAcs(args.receiver, vesting('VestingProposal'), offset) - const wanted = new Set( - rows.filter((row) => cidOf(row) === args.pendingCid).flatMap(pledgedTokens), - ) - const tokens = storedTokens().filter((token) => wanted.has(token.contractId)) - if (wanted.size === 0 || tokens.length !== wanted.size) { - throw new Error('the funder holdings this grant locks are not disclosable from this browser') + const proposal = rows.find((row) => cidOf(row) === args.pendingCid) + const wanted = proposal === undefined ? undefined : reservedToken(proposal) + const token = storedTokens().find((one) => one.contractId === wanted) + if (wanted === undefined || token === undefined) { + throw new Error('the funder holding this grant locks is not disclosable from this browser') } await this.submitWithConfig( args.receiver, ({ configCid }) => buildAcceptCommand(this.tid('VestingProposal'), args.pendingCid, configCid), - tokens, + [token], ) - // The submission archived them, so their blobs can only mislead a later Accept from here on. + // The submission archived it, so its blob can only mislead a later Accept from here on. localStorage.setItem( TOKEN_STORE_KEY, - JSON.stringify(storedTokens().filter((token) => !wanted.has(token.contractId))), + JSON.stringify(storedTokens().filter((one) => one.contractId !== wanted)), ) } diff --git a/dapp/frontend/src/backend/VestingBackend.test.ts b/dapp/frontend/src/backend/VestingBackend.test.ts index 6cfeaec9..d0c198c9 100644 --- a/dapp/frontend/src/backend/VestingBackend.test.ts +++ b/dapp/frontend/src/backend/VestingBackend.test.ts @@ -6,7 +6,7 @@ import { composeNote, lastUpdateOffset, matchesInstrument, - pledgedTokens, + reservedToken, rowToClaim, rowToGrant, rowToPendingGrant, @@ -314,29 +314,29 @@ describe('matchesInstrument', () => { }) }) -describe('pledgedTokens', () => { - it('reads the holdings a pending grant’s Accept will consume', () => { +describe('reservedToken', () => { + it('reads the holding a pending grant’s Accept will consume', () => { const pending = { contractEntry: { JsActiveContract: { createdEvent: { contractId: 'p1', - createArgument: { tokenCids: ['t1', 't2'] }, + createArgument: { tokenCid: 't1' }, }, }, }, } as AcsRow - expect(pledgedTokens(pending)).toEqual(['t1', 't2']) + expect(reservedToken(pending)).toBe('t1') }) - it('reads a row naming none as an empty list', () => { - expect(pledgedTokens({} as AcsRow)).toEqual([]) + it('reads a row naming none as undefined', () => { + expect(reservedToken({} as AcsRow)).toBeUndefined() }) }) describe('selectHoldings', () => { - // Largest first, so a grant names the fewest inputs: every named holding is a disclosure blob the - // receiver has to carry to Accept. + // Largest first, so the factory splits the fewest inputs: the receiver carries one disclosure + // whatever is picked, since the split leaves a single holding behind. it('takes the largest holdings first and stops once they cover the total', () => { const rows = [tokenRow('small', '100'), tokenRow('big', '900'), tokenRow('mid', '400')] expect(selectHoldings(rows, '1000')?.map((row) => tokenValue(row))).toEqual(['900', '400']) diff --git a/dapp/frontend/src/backend/VestingBackend.ts b/dapp/frontend/src/backend/VestingBackend.ts index a63c01ec..d7cac2d8 100644 --- a/dapp/frontend/src/backend/VestingBackend.ts +++ b/dapp/frontend/src/backend/VestingBackend.ts @@ -252,22 +252,22 @@ export const tokenValue = (row: AcsRow): string => { } // A shared participant can hold another admin's instrument under the same id, so both halves of the -// pair are compared. `VestingProposal` carries neither field and so is never passed here. +// pair are compared. export const matchesInstrument = (row: AcsRow, instrument: RegistryInstrument): boolean => { const { admin, instrumentId } = argOf(row) as TokenArg return admin === instrument.admin && instrumentId === instrument.instrumentId } -// The holdings a pending grant has already pledged: its Accept consumes exactly these, so nothing -// else may spend them while it is outstanding. -export const pledgedTokens = (row: AcsRow): string[] => { - const cids = argOf(row).tokenCids - return Array.isArray(cids) ? cids.map(String) : [] +// The holding a pending grant reserves: the factory split it off at exactly the grant, and its +// Accept consumes that one contract, so nothing else may spend it while the grant is outstanding. +export const reservedToken = (row: AcsRow): string | undefined => { + const cid = argOf(row).tokenCid + return typeof cid === 'string' ? cid : undefined } -// Largest first, so a grant names the fewest inputs: every named holding is a disclosure blob the -// receiver has to carry to Accept. Undefined rather than a partial set, so the caller can report by -// how much the funder is short. +// Largest first, so the factory splits the fewest inputs. Not for the receiver's sake any more: the +// split leaves one holding whatever is picked. Undefined rather than a partial set, so the caller +// can report by how much the funder is short. export const selectHoldings = (rows: AcsRow[], total: string): AcsRow[] | undefined => { // The empty set covers a non-positive total, and a grant submitted with no inputs aborts at // Accept while `VestingProposal` offers the receiver no way to clear it. diff --git a/dapp/frontend/src/backend/commands.test.ts b/dapp/frontend/src/backend/commands.test.ts index 5169f1a1..410796d7 100644 --- a/dapp/frontend/src/backend/commands.test.ts +++ b/dapp/frontend/src/backend/commands.test.ts @@ -77,6 +77,7 @@ describe('command builders', () => { it('builds the factory choice with the canonical amount, encoded schedule and token ids', () => { expect( buildCreateVestingCommand('pkg:Vesting:VestingFactory', 'factory-cid', { + configCid: CONFIG_CID, proposer: 'funder::1', receiver: 'receiver::1', totalAmount: '1000.00', @@ -94,6 +95,7 @@ describe('command builders', () => { totalAmount: '1000', schedule: encodeSchedule(linear), tokenCids: ['t1', 't2'], + configCid: CONFIG_CID, note: null, }, }, diff --git a/dapp/frontend/src/backend/commands.ts b/dapp/frontend/src/backend/commands.ts index 54daba1b..eb5df816 100644 --- a/dapp/frontend/src/backend/commands.ts +++ b/dapp/frontend/src/backend/commands.ts @@ -68,6 +68,7 @@ export const decodeSchedule = (raw: unknown): VestingSchedule => { // ── Command builders ──────────────────────────────────────────────────────── type CreateVestingArgs = { + configCid: string note?: string proposer: string receiver: string @@ -83,8 +84,8 @@ const exercise = ( choiceArgument: Record, ) => ({ ExerciseCommand: { templateId, contractId, choice, choiceArgument } }) -// The only choice taking no config: it moves no token, it only records which of the funder's -// holdings the eventual Accept will lock. +// `tokenCids` are the funder's inputs, which the choice splits down to the grant; the holding the +// proposal ends up naming is the exact-size output that split leaves behind. export const buildCreateVestingCommand = ( templateId: string, factoryCid: string, @@ -96,6 +97,7 @@ export const buildCreateVestingCommand = ( totalAmount: canonicalAmount(args.totalAmount), schedule: encodeSchedule(args.schedule), tokenCids: args.tokenCids, + configCid: args.configCid, note: args.note ?? null, }) diff --git a/dapp/frontend/src/components/CreateGrant/index.tsx b/dapp/frontend/src/components/CreateGrant/index.tsx index 218465fb..ff6e3e37 100644 --- a/dapp/frontend/src/components/CreateGrant/index.tsx +++ b/dapp/frontend/src/components/CreateGrant/index.tsx @@ -333,8 +333,8 @@ export const CreateGrant = ({ onClose }: { onClose: () => void }): React.JSX.Ele value={amount} />

- An outstanding grant reserves the whole holdings it names; they return as change - once the receiver accepts. + An outstanding grant reserves exactly this amount; the rest of your balance stays + spendable until the receiver accepts.

diff --git a/vendor/PROVENANCE.md b/vendor/PROVENANCE.md index ce9ce841..1516bc09 100644 --- a/vendor/PROVENANCE.md +++ b/vendor/PROVENANCE.md @@ -32,11 +32,11 @@ its own. | | | |---|---| | Source | https://github.com/BootNodeDev/canton-vesting-forge | -| Release | `v0.1.0` | -| Asset | `vesting-0.0.1.dar` | -| Size | 677236 bytes | -| sha256 | `0aafd73375f82679a575e4ea87efa3ea96b4b98da4e71251db793460a9ce801b` | -| package-id | `64ed80c9a4bd847b2aa9621c02510a1feddb9a0e7e47a48b890a5fa800eeae30` | +| Release | `v0.2.0` | +| Asset | `vesting-0.0.2.dar` | +| Size | 688686 bytes | +| sha256 | `b78439bafdfb4c2e38666d3d99ac73e8c27722dada41d52876d997f16858d5b3` | +| package-id | `e96e3b9b70a12538cc3bba264480dca9e88e87593706cc3f2e638e877ff99f67` | | Bundled canton-token-forge | 0.0.1, package-id `20d54824dc4d76694c70ac51dd5f0b9e063ab789ffa02d07432abb848c8360cc` | | Daml SDK | 3.4.11 | | LF target | 2.1 | @@ -53,3 +53,14 @@ that order. There is no automated update path. To move to a later release of either: replace the binary, re-run the checksum, and update every row above by hand. + +A participant that already vetted an earlier version of the same package refuses +the new one outright when the two are not a valid smart-contract upgrade: +`vesting` 0.0.2 changed `VestingFactory_CreateVesting`'s return type, so a +LocalNet carrying 0.0.1 answers the upload with +`NOT_VALID_UPGRADE_PACKAGE`. Nothing can be uploaded past that; drop the ledger +first and let the stack redeploy both DARs onto it: + + ./scripts/dev-stack.sh down + ( cd .canton-localnet && ../node_modules/.bin/canton-barebones reset ) + ./scripts/dev-stack.sh up diff --git a/vendor/vesting.dar b/vendor/vesting.dar index 6d83022dd766c2ab8ed690cdb2145b428e3e2cfe..a87ba0861b3c3ce6ce6bf0c2a667b6ab8caaeb45 100644 GIT binary patch delta 109959 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 W{5kHV{LS#{*ihuO|=zrxt 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 delta 98520 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 U`}ZiWBN>Cir1<9oVC Date: Tue, 8 Sep 2026 21:29:25 +0000 Subject: [PATCH 2/4] fix(dapp): repair a missing funding blob on the funder's next view --- dapp/frontend/architecture.md | 19 ++-- .../src/backend/LedgerBackend.test.ts | 85 +++++++++++++++++- dapp/frontend/src/backend/LedgerBackend.ts | 86 +++++++++++++------ dapp/frontend/src/backend/VestingBackend.ts | 5 ++ 4 files changed, 163 insertions(+), 32 deletions(-) diff --git a/dapp/frontend/architecture.md b/dapp/frontend/architecture.md index 651c0ee1..8f814ba1 100644 --- a/dapp/frontend/architecture.md +++ b/dapp/frontend/architecture.md @@ -116,10 +116,17 @@ no stakeholder. That holding is created by the funder's own create submission, s read before it exists: `createVesting` re-reads the funder's holdings with `includeCreatedEventBlob` once the grant is on the ledger, and keeps in `localStorage` the blob of every holding an outstanding grant of theirs reserves. Reconciling the whole set rather than only the grant just made -is what lets a read that failed once be picked up by the next grant, instead of leaving a grant -nobody can accept; and reading after the write rather than before is what keeps a declined prompt -from leaving a blob behind for a holding no grant is waiting on. A failure there leaves the grant -alone, since it is already on the ledger and reporting one would invite a second. +is what lets a read that failed once be repaired later, instead of leaving a grant nobody can +accept; and reading after the write rather than before is what keeps a declined prompt from leaving +a blob behind for a holding no grant is waiting on. A failure there leaves the grant alone, since it +is already on the ledger and reporting one would invite a second, so it is logged and left to the +next reconcile. + +`viewAs` runs that same reconcile, which is what makes the repair reachable: a funder who creates +one grant and stops never triggers a second create, and their own dashboard is the only other place +the grant is seen. It costs nothing on the settled path, since the holdings are read only once a +grant of this party's is found to be missing its blob, and it is skipped outright for the grants a +party received rather than funded, whose holdings they could not read anyway. Which blob a given Accept sends is read off the ledger, not guessed: the receiver is an observer of the grant, so `accept` fetches it and discloses exactly the `tokenCid` it names, then drops it, since @@ -127,7 +134,9 @@ that submission archived it. Sending the whole store instead would re-disclose h accepts already consumed, which the participant rejects, and grow without bound. It is a browser-local hand-off between two wallet accounts, which is what the demo is; a receiver on another machine has no way to disclose it and `accept` says so rather than -submitting a rejection. +submitting a rejection. A grant that has left the receiver's view says something else, because a +stale dashboard and a missing blob are different problems and pointing the first at the blob store +sends the reader to a browser that was never involved. The escrow needs no such hand-off. A `LockedToken` is `signatory admin, owner, holders` and the escrow's holders are the provider and the receiver, so both ends of a grant can read it. Only the diff --git a/dapp/frontend/src/backend/LedgerBackend.test.ts b/dapp/frontend/src/backend/LedgerBackend.test.ts index fdaa24bf..a908d3c0 100644 --- a/dapp/frontend/src/backend/LedgerBackend.test.ts +++ b/dapp/frontend/src/backend/LedgerBackend.test.ts @@ -169,6 +169,7 @@ const harness = ( deployment?: Deployment ledgerEnd?: unknown readsFailAfterSubmit?: boolean + readsFailOnBlobs?: boolean } = {}, ): { backend: LedgerBackend; submissions: Submission[]; reads: Read[] } => { const { @@ -177,6 +178,7 @@ const harness = ( ledgerEnd = { offset: 42 }, deployment: config = deployment, readsFailAfterSubmit = false, + readsFailOnBlobs = false, } = options const submissions: Submission[] = [] const reads: Read[] = [] @@ -198,6 +200,9 @@ const harness = ( if (readsFailAfterSubmit && submissions.length > 0) { throw new Error('the participant is not answering') } + if (readsFailOnBlobs && read.body?.filter !== undefined && readsBlobs(read)) { + throw new Error('the participant is not answering') + } if (read.resource === '/v2/state/ledger-end') { return ledgerEnd } @@ -522,12 +527,29 @@ describe('LedgerBackend.accept', () => { expect(submissions[0]?.commands?.[0]?.ExerciseCommand.choice).toBe('VestingProposal_Accept') }) - it('refuses rather than submitting an Accept the participant would reject', async () => { - const { backend } = harness() + // A blob the funder never handed over and a grant that is simply gone are two different things, + // and telling a stale dashboard about the blob store sends the receiver looking in the wrong + // place entirely. + it('refuses an Accept whose blob this browser never kept', async () => { + const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } + const funder = harness({ acs }) + await funder.backend.createVesting(grant('First grant')) + localStorage.clear() + const { backend, submissions } = harness({ acs }) await expect( backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }), ).rejects.toThrow(/not disclosable/) + expect(submissions).toHaveLength(0) + }) + + it('refuses an Accept for a grant no longer in the receiver’s view', async () => { + const { backend, submissions } = harness() + + await expect( + backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }), + ).rejects.toThrow(/no longer outstanding/) + expect(submissions).toHaveLength(0) }) // Why every outstanding grant is reconciled and not only the one just made: a read that failed @@ -549,6 +571,23 @@ describe('LedgerBackend.accept', () => { ) }) + // The funder may never create a second grant, so the next grant cannot be the only repair: their + // own dashboard is where an unacceptable grant would otherwise sit unnoticed forever. + it('picks up a blob a failed read left behind on the funder’s next view', async () => { + const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } + const flaky = harness({ acs, readsFailAfterSubmit: true }) + await flaky.backend.createVesting(grant('First grant')) + const funder = harness({ acs }) + await funder.backend.viewAs('funder::1') + const { backend, submissions } = harness({ acs }) + + await backend.accept({ receiver: 'receiver::1', pendingCid: 'pending-for-t1' }) + + expect(submissions[0]?.disclosedContracts).toEqual( + onSync([CONFIG, disclosedToken('funding-t1')]), + ) + }) + it('keeps the blob of a live grant when a later one is declined in the wallet', async () => { const acs: Record = { [TOKEN]: [tokenRow('t1', '2500')] } const first = harness({ acs }) @@ -611,6 +650,48 @@ describe('LedgerBackend.viewAs', () => { await expect(backend.viewAs('receiver::1')).rejects.toThrow(/did not return an offset/) }) + // The reconcile is the funder's alone: only they can read the holding a grant reserves, so + // reading the holdings on a receiver's every poll would buy nothing. + it('leaves the holdings unread for a party whose pending grants are all incoming', async () => { + const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } + const funder = harness({ acs }) + await funder.backend.createVesting({ + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + schedule, + title: 'Advisor grant', + }) + // Cleared, so the blob being absent is not what keeps the read away: the receiver could never + // supply it, and it is whose grant this is that decides. + localStorage.clear() + const { backend, reads } = harness({ acs }) + + await backend.viewAs('receiver::1') + + expect(reads.filter((read) => filteredTemplate(read) === TOKEN)).toEqual([]) + }) + + // A dashboard that goes blank because a background repair failed would be a worse bug than the + // one the repair is there for. + it('returns the view even when the holdings cannot be read back', async () => { + const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } + const funder = harness({ acs }) + await funder.backend.createVesting({ + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + schedule, + title: 'Advisor grant', + }) + localStorage.clear() + const { backend } = harness({ acs, readsFailOnBlobs: true }) + + const view = await backend.viewAs('funder::1') + + expect(view.pendingGrants.map((one) => one.title)).toEqual(['Advisor grant']) + }) + // The proposal now stores the admin and the instrument it is denominated in, so a pending grant // is filtered like the other two rather than taken on trust. it('drops pending grants of another instrument', async () => { diff --git a/dapp/frontend/src/backend/LedgerBackend.ts b/dapp/frontend/src/backend/LedgerBackend.ts index 7f54d631..9ee1e9eb 100644 --- a/dapp/frontend/src/backend/LedgerBackend.ts +++ b/dapp/frontend/src/backend/LedgerBackend.ts @@ -21,6 +21,7 @@ import { type CreateVestInput, claimChain, composeNote, + fundedBy, lastUpdateOffset, matchesInstrument, reservedToken, @@ -96,6 +97,27 @@ const rowToDisclosed = (row: AcsRow): DisclosedContract | undefined => { : { templateId, contractId, createdEventBlob } } +// The holdings this party's own outstanding grants reserve and this browser has no blob for. Empty +// is the common answer, which is what lets the caller skip reading the holdings at all. +const unstoredReservations = (party: string, pendingRows: AcsRow[]): Set => { + const known = new Set(storedTokens().map((one) => one.contractId)) + const reserved = mapRows( + pendingRows.filter((row) => fundedBy(row, party)), + reservedToken, + ) + return new Set(reserved.filter((contractId) => !known.has(contractId))) +} + +const storeTokens = (held: AcsRow[], wanted: Set): void => { + const missing = mapRows( + held.filter((row) => wanted.has(cidOf(row))), + rowToDisclosed, + ) + if (missing.length > 0) { + localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...storedTokens(), ...missing])) + } +} + export class LedgerBackend implements VestingBackend { private readonly wallet: WalletFns private readonly factory: DisclosedContract @@ -185,6 +207,12 @@ export class LedgerBackend implements VestingBackend { this.readAcs(partyId, vesting('VestingContract'), offset), this.readAcs(partyId, vesting('VestedClaim'), offset), ]) + // The funder's own view is the one place a grant whose blob never got recorded is seen again, + // so it is also where that is repaired: without it a funder who makes one grant and stops has + // an unacceptable grant and no way to notice. A failure here must not blank the dashboard. + await this.storeFunding(partyId, offset, pendingGrantRows).catch((cause: unknown) => { + console.warn('could not read back the holdings this party’s grants reserve', cause) + }) return { pendingGrants: mapRows(this.ofInstrument(pendingGrantRows), rowToPendingGrant), grants: mapRows(this.ofInstrument(contractRows), rowToGrant), @@ -221,37 +249,40 @@ export class LedgerBackend implements VestingBackend { ) // The grant is on the ledger by now, so a failure to record the blob must not report one: it // would invite the funder to make a second grant, and `accept` is where a missing blob is felt - // and said. - await this.storeFunding(args.proposer).catch(() => undefined) + // and said. Logged rather than swallowed outright, because the next reconcile is what repairs + // it and nothing else would say one was needed. + await this.reconcileFunding(args.proposer).catch((cause: unknown) => { + console.warn('could not read back the holding this grant reserves', cause) + }) return { disclosedBytes: disclosed.reduce((total, one) => total + one.createdEventBlob.length, 0), } } // The receiver has to disclose the holding a grant reserves, and only the funder can read it: a - // `Token` has no observers. Read after the submit, never before, because the factory creates that - // holding in this very submission and a grant the wallet declined must leave no blob behind. - // Every outstanding grant of this funder is reconciled rather than just the one just made, so a - // read that failed once is picked up by the next grant instead of leaving a grant nobody can - // accept. - private async storeFunding(party: string): Promise { - const offset = await this.ledgerEnd() - const [pendingRows, held] = await Promise.all([ - this.readAcs(party, vesting('VestingProposal'), offset), - this.readAcs(party, TOKEN, offset, true), - ]) - const reserved = new Set(pendingRows.map(reservedToken)) - const stored = storedTokens() - const known = new Set(stored.map((one) => one.contractId)) - const missing = held - .filter((row) => reserved.has(cidOf(row)) && !known.has(cidOf(row))) - .flatMap((row) => { - const disclosure = rowToDisclosed(row) - return disclosure === undefined ? [] : [disclosure] - }) - if (missing.length > 0) { - localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...stored, ...missing])) + // `Token` has no observers. Every outstanding grant of this funder is reconciled rather than just + // the one just made, so a read that failed once is repaired by their next grant or their next + // dashboard load instead of leaving a grant nobody can accept. The holdings are read only when + // something is actually missing, since this runs on every view. + private async storeFunding( + party: string, + offset: string | number, + pendingRows: AcsRow[], + ): Promise { + const wanted = unstoredReservations(party, pendingRows) + if (wanted.size === 0) { + return } + storeTokens(await this.readAcs(party, TOKEN, offset, true), wanted) + } + + // Reconciles against a snapshot of its own, for a caller that has read no rows to hand over. + // Taken after the submit, never before, because the factory creates the holding in that very + // submission and a grant the wallet declined must leave no blob behind. + private async reconcileFunding(party: string): Promise { + const offset = await this.ledgerEnd() + const pendingRows = await this.readAcs(party, vesting('VestingProposal'), offset) + await this.storeFunding(party, offset, pendingRows) } async tap(args: { amount: string; party: string }): Promise { @@ -347,7 +378,12 @@ export class LedgerBackend implements VestingBackend { const offset = await this.ledgerEnd() const rows = await this.readAcs(args.receiver, vesting('VestingProposal'), offset) const proposal = rows.find((row) => cidOf(row) === args.pendingCid) - const wanted = proposal === undefined ? undefined : reservedToken(proposal) + // Two different failures, and pointing a stale view at the blob store would send the receiver + // hunting for a browser that never had anything to do with it. + if (proposal === undefined) { + throw new Error('this grant is no longer outstanding: reload to see where it went') + } + const wanted = reservedToken(proposal) const token = storedTokens().find((one) => one.contractId === wanted) if (wanted === undefined || token === undefined) { throw new Error('the funder holding this grant locks is not disclosable from this browser') diff --git a/dapp/frontend/src/backend/VestingBackend.ts b/dapp/frontend/src/backend/VestingBackend.ts index d7cac2d8..3ebe2a56 100644 --- a/dapp/frontend/src/backend/VestingBackend.ts +++ b/dapp/frontend/src/backend/VestingBackend.ts @@ -265,6 +265,11 @@ export const reservedToken = (row: AcsRow): string | undefined => { return typeof cid === 'string' ? cid : undefined } +// Whether a pending grant is one this party funded. A `Token` has no observers, so only the funder +// can read the holding their own grant reserves, and the grants they received are nobody's to +// reconcile from here. +export const fundedBy = (row: AcsRow, party: string): boolean => argOf(row).proposer === party + // Largest first, so the factory splits the fewest inputs. Not for the receiver's sake any more: the // split leaves one holding whatever is picked. Undefined rather than a partial set, so the caller // can report by how much the funder is short. From e69083f5b4ea2dc66b3429011dcd19cf4169e15f Mon Sep 17 00:00:00 2001 From: Lisandro Corbalan Date: Tue, 8 Sep 2026 22:04:48 +0000 Subject: [PATCH 3/4] fix(dapp): bound the reconcile read and keep one blob per reserved holding --- .../src/backend/LedgerBackend.test.ts | 93 +++++++++++++++++-- dapp/frontend/src/backend/LedgerBackend.ts | 67 +++++++++++-- 2 files changed, 145 insertions(+), 15 deletions(-) diff --git a/dapp/frontend/src/backend/LedgerBackend.test.ts b/dapp/frontend/src/backend/LedgerBackend.test.ts index a908d3c0..87b517ec 100644 --- a/dapp/frontend/src/backend/LedgerBackend.test.ts +++ b/dapp/frontend/src/backend/LedgerBackend.test.ts @@ -48,7 +48,7 @@ type AcsQuery = { type Read = { requestMethod: string resource: string - body?: AcsQuery & { updateId?: string } + body?: AcsQuery } const byParty = (read: Read): Record => read.body?.filter?.filtersByParty ?? {} @@ -87,6 +87,11 @@ const disclosedToken = (contractId: string): DisclosedContract => ({ createdEventBlob: `blob-${contractId}`, }) +// What the funder kept for the receiver, read the way the backend keys it: `accept` picks one blob +// out of this, so only a direct look says whether the store itself is growing. +const storedTokens = (): DisclosedContract[] => + JSON.parse(localStorage.getItem('vesting.tokenDisclosures') ?? '[]') + const CONFIG = { templateId: '20d54824:Canton.TokenForge.Registry:InstrumentConfig', contractId: '00cfg', @@ -105,9 +110,7 @@ vi.mock('@/backend/registry', () => ({ type Created = { contractId?: string - createArgument?: { amount?: string } - createdEventBlob?: string - templateId?: string + createArgument?: { admin?: string; amount?: string; instrumentId?: string } } const createdEvent = (contract: unknown): Created => @@ -138,11 +141,14 @@ const settle = (acs: Record, submission: Submission): void => addAmounts(...spent.map((contract) => createdEvent(contract).createArgument?.amount ?? '0')), totalAmount, ) - const funding = tokenRow(`funding-${tokenCids[0]}`, totalAmount) - const returned = isZero(change) ? [] : [tokenRow(`change-${tokenCids[0]}`, change)] + // The choice takes no instrument of its own: what comes out is the instrument of what went in, so + // a test that funds from another admin's holdings gets a proposal of that admin here too. + const { admin, instrumentId } = createdEvent(spent[0]).createArgument ?? {} + const instrument = { admin, instrumentId } + const funding = tokenRow(`funding-${tokenCids[0]}`, totalAmount, instrument) + const returned = isZero(change) ? [] : [tokenRow(`change-${tokenCids[0]}`, change, instrument)] const pending = row(`pending-for-${tokenCids[0]}`, { - admin: 'instrument-admin::1', - instrumentId: 'DBT', + ...instrument, provider: 'operator::1', proposer: submission.actAs?.[0], receiver, @@ -692,6 +698,56 @@ describe('LedgerBackend.viewAs', () => { expect(view.pendingGrants.map((one) => one.title)).toEqual(['Advisor grant']) }) + // Nothing on-ledger stops a funder spending the reserved holding through their wallet, which + // leaves a grant nobody can accept. The read that would find it carries a blob per holding, so it + // is given up on rather than paid for on every view from then on. + it('stops reading the holdings for a reservation that never turns up', async () => { + const { backend, reads } = harness({ + acs: { + [PENDING]: [ + row('p1', { + admin: 'instrument-admin::1', + instrumentId: 'DBT', + provider: 'operator::1', + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + tokenCid: 'archived-elsewhere', + schedule: encodeSchedule(schedule), + note: 'Advisor grant', + }), + ], + }, + }) + + for (let view = 0; view < 5; view++) { + await backend.viewAs('funder::1') + } + + expect(reads.filter((read) => filteredTemplate(read) === TOKEN)).toHaveLength(3) + }) + + // Two reconciles can be in flight at once, a dashboard refresh alongside a fresh grant, and each + // decides what it is missing before either has written. Appending what it found would store the + // same blob twice, and nothing else bounds the store. + it('keeps one blob per holding when two reconciles overlap', async () => { + const acs: Record = { [TOKEN]: [tokenRow('t1', '1500')] } + const funder = harness({ acs }) + await funder.backend.createVesting({ + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + schedule, + title: 'Advisor grant', + }) + localStorage.clear() + const { backend } = harness({ acs }) + + await Promise.all([backend.viewAs('funder::1'), backend.viewAs('funder::1')]) + + expect(storedTokens().map((one) => one.contractId)).toEqual(['funding-t1']) + }) + // The proposal now stores the admin and the instrument it is denominated in, so a pending grant // is filtered like the other two rather than taken on trust. it('drops pending grants of another instrument', async () => { @@ -716,6 +772,27 @@ describe('LedgerBackend.viewAs', () => { expect(view.pendingGrants.map((one) => one.id)).toEqual(['mine']) }) + // The instrument a grant is denominated in comes from the holdings it was funded from, so a + // deployment pointed at another one sees its own grants and not an empty dashboard. + it('keeps a grant funded under the deployment’s own instrument', async () => { + const instrument = { admin: 'other::1', instrumentId: 'XYZ' } + const { backend } = harness({ + acs: { [TOKEN]: [tokenRow('t1', '1500', instrument)] }, + deployment: { ...deployment, ...instrument }, + }) + await backend.createVesting({ + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + schedule, + title: 'Advisor grant', + }) + + const view = await backend.viewAs('funder::1') + + expect(view.pendingGrants.map((one) => one.title)).toEqual(['Advisor grant']) + }) + // A shared participant can carry another admin's grants under the same package, and rendering one // under this deployment's symbol would be a lie about what it holds. it('drops grants and claims of another instrument', async () => { diff --git a/dapp/frontend/src/backend/LedgerBackend.ts b/dapp/frontend/src/backend/LedgerBackend.ts index 9ee1e9eb..54c74338 100644 --- a/dapp/frontend/src/backend/LedgerBackend.ts +++ b/dapp/frontend/src/backend/LedgerBackend.ts @@ -76,6 +76,13 @@ const CLAIM_HISTORY_PAGES = 20 // read the disclosure blob for. It is kept here as the funder submits the pending grant. Persisted, // because the two parties are two wallet accounts and switching between them reloads the app. const TOKEN_STORE_KEY = 'vesting.tokenDisclosures' +// How often a reservation this browser cannot find is looked for again, counted across reloads. The +// read that answers it carries a blob per holding and runs on the funder's dashboard, so a holding +// archived outside this dApp would otherwise cost that read on every view forever, for a grant +// nobody can accept any more. Counted rather than given up on the first miss, because a read that +// fails soft answers with no rows and must not stand as proof the holding is gone. +const MISS_STORE_KEY = 'vesting.tokenReadMisses' +const MISS_LIMIT = 3 const storedTokens = (): DisclosedContract[] => { try { @@ -86,6 +93,17 @@ const storedTokens = (): DisclosedContract[] => { } } +const readMisses = (): Record => { + try { + const stored: unknown = JSON.parse(localStorage.getItem(MISS_STORE_KEY) ?? '{}') + return typeof stored === 'object' && stored !== null && !Array.isArray(stored) + ? (stored as Record) + : {} + } catch { + return {} + } +} + const cidOf = (row: AcsRow): string => row.contractEntry?.JsActiveContract?.createdEvent?.contractId ?? '' @@ -97,25 +115,57 @@ const rowToDisclosed = (row: AcsRow): DisclosedContract | undefined => { : { templateId, contractId, createdEventBlob } } -// The holdings this party's own outstanding grants reserve and this browser has no blob for. Empty -// is the common answer, which is what lets the caller skip reading the holdings at all. +// The holdings this party's own outstanding grants reserve that this browser has neither a blob for +// nor given up on. Empty is the common answer, which is what lets the caller skip reading the +// holdings at all. const unstoredReservations = (party: string, pendingRows: AcsRow[]): Set => { const known = new Set(storedTokens().map((one) => one.contractId)) + const misses = readMisses() const reserved = mapRows( pendingRows.filter((row) => fundedBy(row, party)), reservedToken, ) - return new Set(reserved.filter((contractId) => !known.has(contractId))) + return new Set( + reserved.filter( + (contractId) => !known.has(contractId) && (misses[contractId] ?? 0) < MISS_LIMIT, + ), + ) } +// Merged by contract id rather than appended, because two reconciles can overlap, a dashboard +// refresh racing a fresh grant, and each computes what it is missing from a store snapshot taken +// before its own read. const storeTokens = (held: AcsRow[], wanted: Set): void => { const missing = mapRows( held.filter((row) => wanted.has(cidOf(row))), rowToDisclosed, ) - if (missing.length > 0) { - localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...storedTokens(), ...missing])) + if (missing.length === 0) { + return + } + const merged = new Map(storedTokens().map((one) => [one.contractId, one])) + for (const one of missing) { + merged.set(one.contractId, one) + } + localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...merged.values()])) +} + +const recordMisses = (held: AcsRow[], wanted: Set): void => { + const found = new Set(held.map(cidOf)) + const missed = [...wanted].filter((contractId) => !found.has(contractId)) + if (missed.length === 0) { + return + } + const misses = readMisses() + const bumped = Object.fromEntries(missed.map((one) => [one, (misses[one] ?? 0) + 1])) + const abandoned = Object.entries(bumped).filter(([, count]) => count === MISS_LIMIT) + if (abandoned.length > 0) { + console.warn( + 'giving up on the holdings these grants reserve: they cannot be accepted from this browser', + abandoned.map(([contractId]) => contractId), + ) } + localStorage.setItem(MISS_STORE_KEY, JSON.stringify({ ...misses, ...bumped })) } export class LedgerBackend implements VestingBackend { @@ -263,7 +313,8 @@ export class LedgerBackend implements VestingBackend { // `Token` has no observers. Every outstanding grant of this funder is reconciled rather than just // the one just made, so a read that failed once is repaired by their next grant or their next // dashboard load instead of leaving a grant nobody can accept. The holdings are read only when - // something is actually missing, since this runs on every view. + // something is actually missing, since this runs on every view, and a reservation the read keeps + // not answering is given up on so that this cannot become a read on every view for good. private async storeFunding( party: string, offset: string | number, @@ -273,7 +324,9 @@ export class LedgerBackend implements VestingBackend { if (wanted.size === 0) { return } - storeTokens(await this.readAcs(party, TOKEN, offset, true), wanted) + const held = await this.readAcs(party, TOKEN, offset, true) + storeTokens(held, wanted) + recordMisses(held, wanted) } // Reconciles against a snapshot of its own, for a caller that has read no rows to hand over. From 4aeafa42c22a1d05c28e80b4cc791aa559860b41 Mon Sep 17 00:00:00 2001 From: Lisandro Corbalan Date: Wed, 9 Sep 2026 12:57:45 +0000 Subject: [PATCH 4/4] fix(dapp): count a blobless holding as a miss and spend no budget on an empty read --- .../src/backend/LedgerBackend.test.ts | 67 +++++++++++++++---- dapp/frontend/src/backend/LedgerBackend.ts | 25 ++++--- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/dapp/frontend/src/backend/LedgerBackend.test.ts b/dapp/frontend/src/backend/LedgerBackend.test.ts index 87b517ec..a44c0675 100644 --- a/dapp/frontend/src/backend/LedgerBackend.test.ts +++ b/dapp/frontend/src/backend/LedgerBackend.test.ts @@ -87,6 +87,20 @@ const disclosedToken = (contractId: string): DisclosedContract => ({ createdEventBlob: `blob-${contractId}`, }) +// An outstanding grant of this deployment's instrument, reserving the named holding. +const reserving = (tokenCid: string): unknown => + row(`pending-${tokenCid}`, { + admin: 'instrument-admin::1', + instrumentId: 'DBT', + provider: 'operator::1', + proposer: 'funder::1', + receiver: 'receiver::1', + totalAmount: '1000', + tokenCid, + schedule: encodeSchedule(schedule), + note: 'Advisor grant', + }) + // What the funder kept for the receiver, read the way the backend keys it: `accept` picks one blob // out of this, so only a direct look says whether the store itself is growing. const storedTokens = (): DisclosedContract[] => @@ -703,21 +717,46 @@ describe('LedgerBackend.viewAs', () => { // is given up on rather than paid for on every view from then on. it('stops reading the holdings for a reservation that never turns up', async () => { const { backend, reads } = harness({ - acs: { - [PENDING]: [ - row('p1', { - admin: 'instrument-admin::1', - instrumentId: 'DBT', - provider: 'operator::1', - proposer: 'funder::1', - receiver: 'receiver::1', - totalAmount: '1000', - tokenCid: 'archived-elsewhere', - schedule: encodeSchedule(schedule), - note: 'Advisor grant', - }), - ], + acs: { [TOKEN]: [tokenRow('t1', '500')], [PENDING]: [reserving('archived-elsewhere')] }, + }) + + for (let view = 0; view < 5; view++) { + await backend.viewAs('funder::1') + } + + expect(reads.filter((read) => filteredTemplate(read) === TOKEN)).toHaveLength(3) + }) + + // `readAcs` answers an unparseable response with no rows, so an empty read is indistinguishable + // from a funder who holds nothing. Spending the budget on it would let one participant hiccup + // abandon every outstanding grant in the browser, with nothing short of wiping site data to undo + // it. + it('spends no part of that budget on a read that came back empty', async () => { + const { backend, reads } = harness({ acs: { [PENDING]: [reserving('archived-elsewhere')] } }) + + for (let view = 0; view < 5; view++) { + await backend.viewAs('funder::1') + } + + expect(reads.filter((read) => filteredTemplate(read) === TOKEN)).toHaveLength(5) + }) + + // A holding whose blob the read did not carry is as unusable as one that never came back: nothing + // can be stored for it, so treating it as found would leave it wanted for good and never reach + // the limit that stops the read. + it('counts a holding that comes back without its blob as a miss', async () => { + const blobless = { + contractEntry: { + JsActiveContract: { + createdEvent: { + contractId: 'reserved', + createArgument: { admin: 'instrument-admin::1', instrumentId: 'DBT', amount: '1000' }, + }, + }, }, + } + const { backend, reads } = harness({ + acs: { [TOKEN]: [blobless], [PENDING]: [reserving('reserved')] }, }) for (let view = 0; view < 5; view++) { diff --git a/dapp/frontend/src/backend/LedgerBackend.ts b/dapp/frontend/src/backend/LedgerBackend.ts index 54c74338..970ea46b 100644 --- a/dapp/frontend/src/backend/LedgerBackend.ts +++ b/dapp/frontend/src/backend/LedgerBackend.ts @@ -80,7 +80,7 @@ const TOKEN_STORE_KEY = 'vesting.tokenDisclosures' // read that answers it carries a blob per holding and runs on the funder's dashboard, so a holding // archived outside this dApp would otherwise cost that read on every view forever, for a grant // nobody can accept any more. Counted rather than given up on the first miss, because a read that -// fails soft answers with no rows and must not stand as proof the holding is gone. +// answers short is indistinguishable from one that answers in full. const MISS_STORE_KEY = 'vesting.tokenReadMisses' const MISS_LIMIT = 3 @@ -134,25 +134,28 @@ const unstoredReservations = (party: string, pendingRows: AcsRow[]): Set // Merged by contract id rather than appended, because two reconciles can overlap, a dashboard // refresh racing a fresh grant, and each computes what it is missing from a store snapshot taken -// before its own read. -const storeTokens = (held: AcsRow[], wanted: Set): void => { +// before its own read. Answers with what it stored, which is what a miss is counted against. +const storeTokens = (held: AcsRow[], wanted: Set): Set => { const missing = mapRows( held.filter((row) => wanted.has(cidOf(row))), rowToDisclosed, ) if (missing.length === 0) { - return + return new Set() } const merged = new Map(storedTokens().map((one) => [one.contractId, one])) for (const one of missing) { merged.set(one.contractId, one) } localStorage.setItem(TOKEN_STORE_KEY, JSON.stringify([...merged.values()])) + return new Set(missing.map((one) => one.contractId)) } -const recordMisses = (held: AcsRow[], wanted: Set): void => { - const found = new Set(held.map(cidOf)) - const missed = [...wanted].filter((contractId) => !found.has(contractId)) +// Counted against what was stored rather than against what came back, because a holding that +// arrives without its blob is as unusable as one that never arrived: calling it found would leave +// it wanted with no miss ever recorded, and so no bound on the read it costs. +const recordMisses = (wanted: Set, stored: Set): void => { + const missed = [...wanted].filter((contractId) => !stored.has(contractId)) if (missed.length === 0) { return } @@ -325,8 +328,12 @@ export class LedgerBackend implements VestingBackend { return } const held = await this.readAcs(party, TOKEN, offset, true) - storeTokens(held, wanted) - recordMisses(held, wanted) + // A read that fails soft answers with no rows, so an empty one says nothing about whether the + // reservation is still there and must not spend the budget that gives up on it. + if (held.length === 0) { + return + } + recordMisses(wanted, storeTokens(held, wanted)) } // Reconciles against a snapshot of its own, for a caller that has read no rows to hand over.