Strengthened the disposable reorg rehearsal
This commit is contained in:
@@ -90,7 +90,7 @@ function canonicalEvents(streamId: string, linkedTxId = '1'.repeat(64)) {
|
||||
const a = 'a'.repeat(64), b = 'b'.repeat(64), c = 'c'.repeat(64);
|
||||
add('connect', 1, a, GENESIS_HASH, [linkedTxId]);
|
||||
add('disconnect', 1, a, GENESIS_HASH, [linkedTxId]);
|
||||
add('connect', 1, b, GENESIS_HASH, ['2'.repeat(64)]);
|
||||
add('connect', 1, b, GENESIS_HASH, [linkedTxId]);
|
||||
add('connect', 2, c, b, ['3'.repeat(64)]);
|
||||
return rows;
|
||||
}
|
||||
@@ -486,7 +486,7 @@ test('sale rehearsal requires explicit disposable instance consent and exact tra
|
||||
const o = await f.execute(buyer, { type: 'reserve', listingId: l.id, priceAtomicXmr: l.priceAtomicXmr, feeBps: 250 }) as CustodyOrder;
|
||||
const t1 = saleTranscript(o, f.market.id);
|
||||
assert.throws(() => f.market.observeSaleRehearsal(o.id, t1.input), /unavailable/);
|
||||
assert.throws(() => f.market.observeCanonicalEvents({}), /unavailable/);
|
||||
await assert.rejects(f.market.observeCanonicalEvents({}), /unavailable/);
|
||||
const rehearsal = await PostgresCustody.open(f.runtime, { ...options, disposableSaleRehearsal: true });
|
||||
try {
|
||||
const wrong = structuredClone(t1.input); wrong.lock = { ...t1.input.lock, terms: { ...t1.input.lock.terms, priceAtomicXmr: '1' } } as typeof wrong.lock;
|
||||
@@ -646,13 +646,20 @@ test('disconnect of the exact posted candidate terminal transaction commits an o
|
||||
assert.equal(credited.availableAtomicXmr, '96500000000');
|
||||
const first = await observer.observeCanonicalEvents(canonicalPage(streamId, events, 0, 1));
|
||||
assert.equal(first.cursor, 1);
|
||||
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 1)), /posted-sale-terminal-disconnected/);
|
||||
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 1)), /hold|incident unresolved/);
|
||||
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'canonical-inbox:v1:event:%'")).rows[0].n, 1);
|
||||
// The same transaction reappears on the replacement branch in this page; still review, never auto-clear.
|
||||
const review = await observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 2));
|
||||
assert.equal(review.reviewRequired, true);
|
||||
assert.equal(review.cursor, 3); // Disconnect and reappearance are durably retained with the review marker.
|
||||
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 2)), /hold|incident unresolved/);
|
||||
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'canonical-inbox:v1:event:%'")).rows[0].n, 3);
|
||||
assert.equal((await f.activity(seller)).availableAtomicXmr, credited.availableAtomicXmr);
|
||||
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.journals WHERE id=$1", [`settle:${o.id}`])).rows[0].n, 1);
|
||||
const incident = await f.admin.query("SELECT value FROM wk_custody.custody_meta WHERE key='integrity_incident_v1'");
|
||||
assert.match(incident.rows[0].value, /posted-sale-terminal-disconnected/);
|
||||
await assert.rejects(observer.audit(), /unresolved-integrity-incident/);
|
||||
await assert.rejects(resolveCustodyIncident(f.admin, randomUUID()), /posted-sale-terminal-disconnected/);
|
||||
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'sale-reorg-review:%'")).rows[0].n, 1);
|
||||
await assert.rejects(PostgresCustody.open(f.runtime, options), /unresolved-integrity/);
|
||||
await assert.rejects(f.execute(other, { type: 'mock-credit' }), /incident is unresolved/);
|
||||
} finally { await observer.close(); await rehearsal.close(); }
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user