Summary
src/ops/extendViaContract.ts throws simulation of extend_all failed: ${sim.error} in two
different places — once in simulateExtendAll, which is the free drift probe that runs every tick,
and once in extendViaContract, which is the paid path just before signing.
An operator reading a log line cannot tell which one failed, and the two mean very different things.
A failure in the first costs nothing and only loses drift reporting. A failure in the second means
maintenance did not happen.
Acceptance Criteria
Tech Stack
TypeScript 5.7 on Node 22+ (CI runs 22 and 24), ESM with moduleResolution: "NodeNext" — relative
imports need the .js extension. @stellar/stellar-sdk is pinned to an exact version; verify RPC
API shape against the installed copy, not against documentation. Tests are Vitest under test/ and
run without a network. npm run format:check, npm run lint, npm run build and npm test must
all be clean.
Summary
src/ops/extendViaContract.tsthrowssimulation of extend_all failed: ${sim.error}in twodifferent places — once in
simulateExtendAll, which is the free drift probe that runs every tick,and once in
extendViaContract, which is the paid path just before signing.An operator reading a log line cannot tell which one failed, and the two mean very different things.
A failure in the first costs nothing and only loses drift reporting. A failure in the second means
maintenance did not happen.
Acceptance Criteria
different string.
drift simulation failedlog line insrc/keeper/loop.tsstill reads correctly with thenew message.
Tech Stack
TypeScript 5.7 on Node 22+ (CI runs 22 and 24), ESM with
moduleResolution: "NodeNext"— relativeimports need the
.jsextension.@stellar/stellar-sdkis pinned to an exact version; verify RPCAPI shape against the installed copy, not against documentation. Tests are Vitest under
test/andrun without a network.
npm run format:check,npm run lint,npm run buildandnpm testmustall be clean.