Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
278 commits
Select commit Hold shift + click to select a range
e7e6ce1
Add coverage tests for app and script harnesses
chefbc2k Apr 5, 2026
2e1856f
test: expand shared api coverage
chefbc2k Apr 5, 2026
15cdd2f
test: expand vesting helper coverage
chefbc2k Apr 7, 2026
94fb7bf
test: expand setup and diagnostics coverage
chefbc2k Apr 8, 2026
12b8712
test: expand runtime coverage proofs
chefbc2k Apr 8, 2026
9d73d61
test: expand helper runtime coverage
chefbc2k Apr 8, 2026
1876592
test: deepen api surface coverage
chefbc2k Apr 8, 2026
2631fb2
test: expand alchemy debug runtime coverage
chefbc2k Apr 8, 2026
5dafdb1
Improve setup script coverage helpers
chefbc2k Apr 8, 2026
b6fe1c5
test: expand api surface coverage
chefbc2k Apr 8, 2026
63525e5
Fix runtime env boolean parsing
chefbc2k Apr 8, 2026
fa0d664
test: cover falsey env boolean parsing
chefbc2k Apr 8, 2026
9d9ed01
test: expand provider router coverage
chefbc2k Apr 8, 2026
6836dc3
test: expand alchemy diagnostics coverage
chefbc2k Apr 8, 2026
056b233
test: expand execution-context coverage
chefbc2k Apr 8, 2026
401d4e5
Classify marketplace purchase funding blocks
chefbc2k Apr 8, 2026
efb1f0b
test: expand workflow coverage branches
chefbc2k Apr 8, 2026
9054f91
Promote marketplace purchase proof via fork verifier
chefbc2k Apr 8, 2026
d5b28f2
Fix base sepolia setup fork bootstrap
chefbc2k Apr 8, 2026
a722745
Increase setup script coverage
chefbc2k Apr 8, 2026
289dc9d
Improve coverage accounting and setup tests
chefbc2k Apr 8, 2026
68aca46
Fix governance verifier fork proof
chefbc2k Apr 8, 2026
022e6db
test: expand operator setup coverage
chefbc2k Apr 8, 2026
87de66e
test: expand workflow coverage branches
chefbc2k Apr 8, 2026
461ee1f
test: expand marketplace purchase workflow coverage
chefbc2k Apr 8, 2026
7ac237b
test: expand base sepolia setup coverage
chefbc2k Apr 8, 2026
0c466c2
Improve Base Sepolia setup coverage
chefbc2k Apr 8, 2026
349f1c7
Add coverage tests for shared helpers
chefbc2k Apr 8, 2026
04f5617
test: close indexer worker coverage gaps
chefbc2k Apr 9, 2026
5d93646
test: expand claim reward workflow coverage
chefbc2k Apr 9, 2026
d334cb5
test: expand commercialization workflow coverage
chefbc2k Apr 9, 2026
852e7c3
test: expand emergency workflow coverage
chefbc2k Apr 9, 2026
17e62c9
test: expand api and indexer coverage
chefbc2k Apr 9, 2026
ada3ed0
test: harden execution context coverage
chefbc2k Apr 9, 2026
3e3cb03
test: expand workflow coverage branches
chefbc2k Apr 9, 2026
f10e35c
docs: record green live contract suite
chefbc2k Apr 9, 2026
a8a4051
test authorization introspection fallback
chefbc2k Apr 9, 2026
2c66081
test: expand license template lifecycle coverage
chefbc2k Apr 9, 2026
83cff87
Add focused workflow coverage branches
chefbc2k Apr 9, 2026
f748352
test: cover rights licensing helpers
chefbc2k Apr 9, 2026
a61b6e5
test: close reward campaign and license template gaps
chefbc2k Apr 9, 2026
176ac83
Stabilize live contract integration polling
chefbc2k Apr 9, 2026
3062b55
test: close vesting and license template branches
chefbc2k Apr 9, 2026
738d9f1
test: expand licensing workflow coverage
chefbc2k Apr 9, 2026
4cf2803
test: cover release escrow fallbacks
chefbc2k Apr 9, 2026
79e7adb
test: cover marketplace verifier gas floor branches
chefbc2k Apr 16, 2026
a4a3dfd
Fix marketplace verifier fallback drift
chefbc2k Apr 16, 2026
3f8e81f
Improve governance workflow coverage
chefbc2k Apr 16, 2026
dff9f41
test: expand workflow coverage hotspots
chefbc2k Apr 16, 2026
50440e4
test: expand multisig protocol change coverage
chefbc2k Apr 16, 2026
ebc865f
test: expand whisperblock workflow coverage
chefbc2k Apr 16, 2026
ef49dfc
test: expand emergency recovery coverage
chefbc2k Apr 17, 2026
ddef57f
test: cover base sepolia operator setup main
chefbc2k Apr 17, 2026
898657a
test: extend alchemy debug runtime coverage
chefbc2k Apr 17, 2026
608237c
test: expand runtime helper coverage
chefbc2k Apr 17, 2026
3094ea2
test: extend governance and app coverage
chefbc2k Apr 17, 2026
7b2171e
test: expand workflow coverage null paths
chefbc2k Apr 17, 2026
be1cb19
Add targeted Base Sepolia admin proof script
chefbc2k Apr 17, 2026
b8ab14e
test: expand emergency withdrawal error coverage
chefbc2k Apr 17, 2026
f9e7bdc
test: cover blocked purchase verifier output
chefbc2k Apr 17, 2026
3e47d9e
docs: record live marketplace proof run
chefbc2k Apr 17, 2026
77260bb
test: expand inspection workflow coverage
chefbc2k Apr 17, 2026
0e35965
test: cover legacy migration and emergency receiptless paths
chefbc2k Apr 17, 2026
0a4088c
test: cover proposal and multisig workflow edges
chefbc2k Apr 17, 2026
c88a4ee
test: expand stake-and-delegate coverage
chefbc2k Apr 17, 2026
2ffc3f0
test: expand workflow coverage proofs
chefbc2k Apr 17, 2026
82ad3f2
Stabilize API server coverage harness
chefbc2k Apr 17, 2026
6e4506a
Cover whisperblock null-hash helper path
chefbc2k Apr 17, 2026
732c952
test: close governance workflow coverage gaps
chefbc2k Apr 17, 2026
7d71435
Improve workflow branch coverage proofs
chefbc2k Apr 17, 2026
a9d21bf
Add commercialization ownership live proof
chefbc2k Apr 17, 2026
4faeee8
test: cover multisig no-receipt approval path
chefbc2k Apr 17, 2026
cb545f1
docs: record live contract suite proof
chefbc2k Apr 17, 2026
e4ef953
Fix unmatched route fallback
chefbc2k Apr 17, 2026
9f50f55
test: expand workflow coverage branches
chefbc2k Apr 17, 2026
5e56cd4
test: expand legacy migration custody coverage
chefbc2k Apr 17, 2026
df359d8
test: expand reward campaign helper coverage
chefbc2k Apr 18, 2026
0085895
docs: refresh coverage metrics
chefbc2k Apr 18, 2026
0398151
test: tighten emergency and abi codec coverage
chefbc2k Apr 18, 2026
70cdfa0
test: expand verifier coverage proofs
chefbc2k Apr 18, 2026
55ceaa0
test: expand emergency recovery fallback coverage
chefbc2k Apr 18, 2026
6536002
Harden marketplace purchase verification
chefbc2k Apr 18, 2026
ece3131
Tighten marketplace setup state reporting
chefbc2k Apr 18, 2026
c4a9ec1
Resolve marketplace purchase fork proof
chefbc2k Apr 18, 2026
eeaf5b1
test: tighten onboarding and diagnostics coverage
chefbc2k Apr 18, 2026
f60552d
test: cover marketplace helper edge cases
chefbc2k Apr 18, 2026
3cbe8df
Speed up Base Sepolia setup fixture scans
chefbc2k Apr 18, 2026
84d6972
test: cover commercialization transfer guards
chefbc2k Apr 18, 2026
82a8ffa
Fix expired marketplace fixture classification
chefbc2k Apr 18, 2026
b726ace
Repair expired marketplace setup fixture
chefbc2k Apr 18, 2026
2053039
Fix setup fork-aging wiring
chefbc2k Apr 18, 2026
31eb4ef
Improve setup listing refresh diagnostics
chefbc2k Apr 18, 2026
b48ce0e
test: harden verifier setup-block coverage
chefbc2k Apr 18, 2026
d10850d
Fix coverage runner timeout path
chefbc2k May 12, 2026
93345b7
test: raise coverage on diagnostics and execution helpers
chefbc2k May 12, 2026
dcba515
Fix setup fork timestamp refresh
chefbc2k May 12, 2026
0c7f690
Tighten read fallback and coverage stability
chefbc2k May 12, 2026
f292a2f
Fix coverage tempdir reset
chefbc2k May 12, 2026
462f42e
tighten coverage runner tests
chefbc2k May 12, 2026
75ac718
test: tighten diagnostics coverage and refresh marketplace proof
chefbc2k May 12, 2026
c15cd8a
Stabilize Base Sepolia verification scripts
chefbc2k May 12, 2026
92be9dc
test: tighten coverage fallback branches
chefbc2k May 12, 2026
19637b6
test: expand multisig workflow coverage
chefbc2k May 12, 2026
13388f2
test: cover api app control-plane routes
chefbc2k May 12, 2026
a086a40
test: tighten workflow guard coverage
chefbc2k May 12, 2026
475c284
test: expand catalog listing workflow coverage
chefbc2k May 12, 2026
b612143
test: expand abi codec coverage
chefbc2k May 12, 2026
f655625
Fix workflow polling delays in tests
chefbc2k May 12, 2026
92c960c
test: cover provider router failover branches
chefbc2k May 12, 2026
6646c18
test: extend ABI and emergency coverage proofs
chefbc2k May 12, 2026
cee96bf
Stabilize coverage runner and provider
chefbc2k May 12, 2026
6a3b79f
Stabilize repo coverage runner
chefbc2k May 12, 2026
03fffc1
Stabilize coverage gate on v8
chefbc2k May 12, 2026
585192e
test: cover catalog listing maintenance cold paths
chefbc2k May 13, 2026
d7cd3e1
Fix template validation coverage gaps
chefbc2k May 13, 2026
e05dc8d
test: tighten onboarding and rpc retry coverage
chefbc2k May 13, 2026
e029d62
Stabilize package coverage runner
chefbc2k May 13, 2026
9cd8a0c
Document coverage runner verification
chefbc2k May 13, 2026
a7ddb2d
Harden transient RPC retry normalization
chefbc2k May 13, 2026
27e6e60
test: harden coverage for rate limit and whisper block
chefbc2k May 13, 2026
f7917d8
test: tighten trigger emergency coverage
chefbc2k May 13, 2026
a2e8ef2
test: cover trigger emergency null incident path
chefbc2k May 13, 2026
e12137a
Quiet coverage runner and log verification
chefbc2k May 13, 2026
4a277a4
test: expand base sepolia setup coverage
chefbc2k May 13, 2026
1addb3a
Fix coverage shard fallback and treasury mapping
chefbc2k May 13, 2026
255ba40
Harden sharded coverage runner
chefbc2k May 13, 2026
0ced11a
docs: record coverage harness stabilization
chefbc2k May 13, 2026
247fc5d
fix: harden coverage runner recovery
chefbc2k May 13, 2026
98dfc67
Fix coverage runner regression guards
chefbc2k May 13, 2026
ee97435
Fix remaining verifier dataset burn proof
chefbc2k May 15, 2026
b6d8808
Harden marketplace listing retry coverage
chefbc2k May 16, 2026
b984cf2
test: expand workflow coverage cold paths
chefbc2k May 16, 2026
7ec46b5
test: cover reward and emergency receipt fallbacks
chefbc2k May 17, 2026
bb2377c
test: lock alchemy fallback branches
chefbc2k May 17, 2026
1dbfdbb
test: lock governance and marketplace fallback branches
chefbc2k May 17, 2026
18557f0
test: harden base sepolia setup fallbacks
chefbc2k May 17, 2026
be50e25
test: raise stake workflow branch coverage
chefbc2k May 17, 2026
68c2125
test: broaden governance timelock coverage
chefbc2k May 17, 2026
1b55fcf
test: cover raw register voice asset payloads
chefbc2k May 17, 2026
515100c
test: cover license template lifecycle fallbacks
chefbc2k May 17, 2026
0965287
test: expand participant activation coverage
chefbc2k May 17, 2026
7028f1e
test: cover fork bootstrap and funding fallbacks
chefbc2k May 17, 2026
5766054
Fix onboard rights holder readback polling
chefbc2k May 17, 2026
7419588
test: expand execution-context failure coverage
chefbc2k May 17, 2026
73e6c31
Fix coverage runner completion path
chefbc2k May 17, 2026
38c3cfa
test: expand revenue workflow coverage
chefbc2k May 17, 2026
dd6c532
Fix coverage shard timeouts
chefbc2k May 17, 2026
d433641
Stabilize sharded coverage runner
chefbc2k May 17, 2026
053f8bc
Fix coverage shard attribution regression
chefbc2k May 17, 2026
5050977
test: raise workflow branch coverage
chefbc2k May 17, 2026
bff77d2
test: expand admin workflow branch coverage
chefbc2k May 17, 2026
3c80ab2
test: raise coverage on helper branches
chefbc2k May 17, 2026
b97b074
docs: correct coverage progress delta
chefbc2k May 17, 2026
c6d033e
Fix coverage shard timeout
chefbc2k May 17, 2026
b1a676d
test: harden workflow regression coverage
chefbc2k May 17, 2026
48609f7
test: expand helper coverage regressions
chefbc2k May 18, 2026
73941a6
test: expand api surface fallback coverage
chefbc2k May 18, 2026
a2a6e5b
test: expand coverage for setup and codec helpers
chefbc2k May 18, 2026
eda7fae
test: cover workflow polling fallbacks
chefbc2k May 18, 2026
159139f
test: expand alchemy runtime fallback coverage
chefbc2k May 18, 2026
a78a5f2
test: expand workflow coverage branches
chefbc2k May 18, 2026
a21f223
Improve coverage for provider routing and withdrawals
chefbc2k May 18, 2026
5b91e0c
Harden coverage guards for execution context
chefbc2k May 18, 2026
6b0c350
test: cover execution-context guard branches
chefbc2k May 18, 2026
dd147c1
test: expand coverage for verifier hotspots
chefbc2k May 18, 2026
71b9e94
test: expand coverage for collaborator licensing
chefbc2k May 18, 2026
31d3a62
test: expand workflow fallback coverage
chefbc2k May 24, 2026
070dca5
test: expand contracts api coverage guards
chefbc2k May 24, 2026
bd36d57
test: harden workflow fallback coverage
chefbc2k May 24, 2026
f45af4e
test: raise codec and debug coverage
chefbc2k May 24, 2026
1f55fe3
test: raise coverage on setup and abi codec
chefbc2k May 24, 2026
7894c8c
test: tighten hotspot coverage
chefbc2k May 24, 2026
6eb6800
test: harden base sepolia setup coverage
chefbc2k May 25, 2026
cf698f5
test: harden api surface coverage edges
chefbc2k May 25, 2026
b36cc3d
test: expand coverage fallback proofs
chefbc2k May 25, 2026
750d000
docs: record live contract proof run
chefbc2k May 25, 2026
a4bc41f
test: raise coverage for validation and vesting helpers
chefbc2k May 25, 2026
048a607
test: close helper coverage gaps
chefbc2k May 25, 2026
448270a
test: cover execution-context fallback branches
chefbc2k May 25, 2026
7c7f9d0
Improve setup coverage branches
chefbc2k May 25, 2026
bafb1f5
Tighten changelog session notes
chefbc2k May 25, 2026
eba9bbc
test: lock in setup helper edge cases
chefbc2k May 25, 2026
2267964
test: harden runtime invoke and event fallback coverage
chefbc2k May 25, 2026
3586dec
test execution-context queue and tuple fallback
chefbc2k May 29, 2026
4079b7a
Fix governance verifier test import guard
chefbc2k May 31, 2026
01c3c2d
Bootstrap baseline runtime forks
chefbc2k May 31, 2026
d075c83
Restore cold Base Sepolia baseline recovery
chefbc2k May 31, 2026
ddf981b
test: cover validated baseline cleanup
chefbc2k May 31, 2026
e827ef0
test: cover verifier report gaps
chefbc2k May 31, 2026
9907902
test: tighten shared diagnostics coverage
chefbc2k May 31, 2026
1f070c8
Harden loopback fork bootstrap
chefbc2k May 31, 2026
fd6467e
test: expand verifier fallback coverage
chefbc2k May 31, 2026
28f9c92
test: expand setup and abi codec regressions
chefbc2k May 31, 2026
c16480e
test: harden abi codec tuple edge cases
chefbc2k May 31, 2026
75586e4
test: tighten coverage hotspot regressions
chefbc2k May 31, 2026
4d8d15a
test: add fallback coverage proofs
chefbc2k May 31, 2026
7883742
test: tighten coverage around tuple and vesting fallbacks
chefbc2k May 31, 2026
fd84e06
test: expand fallback coverage proofs
chefbc2k May 31, 2026
e637675
test: raise workflow coverage floor
chefbc2k May 31, 2026
625ee36
test: cover abi codec defensive fallbacks
chefbc2k May 31, 2026
1408408
test: expand fallback coverage proofs
chefbc2k Jun 1, 2026
a99ba98
test: harden execution context helper coverage
chefbc2k Jun 1, 2026
bc35675
test: harden base sepolia setup coverage
chefbc2k Jun 1, 2026
83b99af
test: tighten coverage around api surface helpers
chefbc2k Jun 1, 2026
b1a5341
test: expand workflow coverage fallbacks
chefbc2k Jun 1, 2026
ffd80b5
test: cover nested fallback gaps
chefbc2k Jun 1, 2026
a596426
test: lock tuple and facet fallback regressions
chefbc2k Jun 1, 2026
8a6722a
test: expand rpc and event regression coverage
chefbc2k Jun 1, 2026
eab5e88
test: expand coverage for workflow stabilizers
chefbc2k Jun 1, 2026
235c27b
test: tighten abi codec validation coverage
chefbc2k Jun 1, 2026
27c526e
test: cover governance and licensing receipt gaps
chefbc2k Jun 1, 2026
5c883b9
test: expand whisperblock retry coverage
chefbc2k Jun 1, 2026
05aed35
test: close reward campaign fallback coverage
chefbc2k Jun 1, 2026
c057197
test: expand runtime helper regression coverage
chefbc2k Jun 1, 2026
9105011
Add defensive helper coverage regressions
chefbc2k Jun 1, 2026
1e55777
Add more coverage fallback regressions
chefbc2k Jun 1, 2026
2c77b3e
test: add fallback regression coverage proofs
chefbc2k Jun 1, 2026
1327013
Improve legacy posture coverage accounting
chefbc2k Jun 4, 2026
d889b87
test: cover treasury revenue actor fallback
chefbc2k Jun 4, 2026
52530bd
Tighten marketplace withdrawal coverage
chefbc2k Jun 4, 2026
a7f3539
test: expand workflow fallback coverage
chefbc2k Jun 4, 2026
bdc9725
test: expand workflow fallback regressions
chefbc2k Jun 4, 2026
cc9c9a7
test: extend workflow fallback coverage
chefbc2k Jun 4, 2026
afa4f49
test: close workflow fallback gaps
chefbc2k Jun 4, 2026
9a7bbb1
test: close workflow null-stabilization branches
chefbc2k Jun 4, 2026
ff44409
test: expand multisig and setup fallback coverage
chefbc2k Jun 4, 2026
17dfaf9
test: close governance timelock execute fallback gaps
chefbc2k Jun 4, 2026
50149f7
test: tighten coverage fallback proofs
chefbc2k Jun 4, 2026
58d3ac8
Tighten coverage fallback tests
chefbc2k Jun 4, 2026
6e513ed
test: refresh live proofs and abi tuple fallback coverage
chefbc2k Jun 4, 2026
4438d87
Add coverage proofs for loopback helpers
chefbc2k Jun 4, 2026
de844b6
Refine coverage helper control flow
chefbc2k Jun 4, 2026
2dd61a8
Improve coverage-sensitive workflow fallbacks
chefbc2k Jun 4, 2026
8cb3798
Improve participant activation coverage
chefbc2k Jun 4, 2026
209aff2
Tighten runtime fallback coverage
chefbc2k Jun 4, 2026
b913854
test: extend base sepolia setup coverage
chefbc2k Jun 4, 2026
4ee27c8
test: add abi codec fallback coverage
chefbc2k Jun 4, 2026
c59c1fc
test: close vote and validation branch gaps
chefbc2k Jun 4, 2026
d0ebf47
Tighten coverage around voice and legacy workflows
chefbc2k Jun 4, 2026
0eb365b
test: expand coverage fallbacks
chefbc2k Jun 5, 2026
7619d45
test: probe persistent coverage hotspots
chefbc2k Jun 5, 2026
55b1cdd
Harden coverage attribution hotspots
chefbc2k Jun 5, 2026
8d782ba
Normalize merged coverage artifacts
chefbc2k Jun 5, 2026
00e08b8
docs: record green live contract suite
chefbc2k Jun 5, 2026
d7d5799
Align node engine with verified Node 26 host
chefbc2k Jun 5, 2026
55e52c5
test: cover node 26 engine range
chefbc2k Jun 5, 2026
9e636b0
Persist governance proof artifact
chefbc2k Jun 5, 2026
f4a6c03
Refresh live proof artifacts
chefbc2k Jun 5, 2026
2bc9907
Refresh Base Sepolia proof artifacts
chefbc2k Jun 5, 2026
cef5e99
Refresh local fork verification artifacts
chefbc2k Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,720 changes: 3,718 additions & 2 deletions CHANGELOG.md

Large diffs are not rendered by default.

12 changes: 8 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"private": true,
"packageManager": "pnpm@10.30.0",
"engines": {
"node": ">=20 <26"
"node": ">=20 <27"
},
"scripts": {
"sync:abis": "tsx scripts/sync-abis.ts",
Expand All @@ -22,15 +22,17 @@
"coverage:check": "tsx scripts/check-wrapper-coverage.ts && tsx scripts/check-http-api-coverage.ts",
"codegen": "pnpm run sync:abis && pnpm run sync:method-policy && pnpm run build:manifest && pnpm run sync:event-projections && pnpm run build:typechain && pnpm run build:abi-registry && pnpm run build:rpc-registry && pnpm run seed:api-surface && pnpm run build:http-api && pnpm run build:wrappers && pnpm run coverage:check",
"build": "pnpm run codegen && pnpm -r build",
"test": "vitest run",
"test:coverage": "vitest run --coverage.enabled true --coverage.reporter=text --maxWorkers 1",
"test": "vitest run --maxWorkers 1",
"test:coverage": "tsx scripts/run-test-coverage.ts",
"test:contract:api:base-sepolia": "API_LAYER_RUN_CONTRACT_INTEGRATION=1 vitest run packages/api/src/app.contract-integration.test.ts --maxWorkers 1",
"baseline:show": "tsx scripts/show-validated-baseline.ts",
"baseline:verify": "tsx scripts/verify-validated-baseline.ts",
"setup:base-sepolia": "tsx scripts/base-sepolia-operator-setup.ts",
"test:contract:base-sepolia": "tsx scripts/run-base-sepolia-contract-proof.ts",
"test:contract:admin-reads:base-sepolia": "API_LAYER_RUN_CONTRACT_INTEGRATION=1 vitest run packages/api/src/app.contract-integration.test.ts -t \"proves admin, emergency, and multisig control-plane reads through HTTP on Base Sepolia\" --maxWorkers 1",
"verify:layer1:live:base-sepolia": "tsx scripts/verify-layer1-live.ts --output verify-live-output.json",
"verify:marketplace:purchase:base-sepolia": "tsx scripts/verify-marketplace-purchase-live.ts --output verify-marketplace-purchase-output.json",
"verify:governance:base-sepolia": "tsx scripts/verify-governance-workflows.ts",
"verify:governance:base-sepolia": "tsx scripts/verify-governance-workflows.ts --output verify-governance-output.json",
"debug:tx": "tsx scripts/debug-tx.ts",
"debug:simulate": "tsx scripts/debug-simulate.ts",
"debug:trace": "tsx scripts/debug-trace.ts",
Expand All @@ -46,7 +48,9 @@
"@types/express": "^5.0.3",
"@types/node": "^24.3.0",
"@types/pg": "^8.15.5",
"@vitest/coverage-istanbul": "3.2.4",
"@vitest/coverage-v8": "^3.2.4",
"c8": "^11.0.0",
"dotenv": "^16.4.7",
"ethers": "^6.15.0",
"tsx": "^4.20.5",
Expand Down
257 changes: 257 additions & 0 deletions packages/api/src/app.behavior.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";

import { HttpError } from "./shared/errors.js";

const mocks = vi.hoisted(() => {
const providerStatus = {
primary: "cbdp",
secondary: "alchemy",
active: "cbdp",
failoverActive: false,
};

const createApiExecutionContext = vi.fn(() => ({
providerRouter: {
getStatus: vi.fn(() => providerStatus),
},
}));

return {
providerStatus,
createApiExecutionContext,
getTransactionRequest: vi.fn(),
getTransactionStatus: vi.fn(),
mountDomainModules: vi.fn(),
createWorkflowRouter: vi.fn(() => (_request: unknown, _response: unknown, next: () => void) => next()),
};
});

vi.mock("./modules/index.js", () => ({
mountDomainModules: mocks.mountDomainModules,
}));

vi.mock("./shared/execution-context.js", () => ({
createApiExecutionContext: mocks.createApiExecutionContext,
getTransactionRequest: mocks.getTransactionRequest,
getTransactionStatus: mocks.getTransactionStatus,
}));

vi.mock("./workflows/index.js", () => ({
createWorkflowRouter: mocks.createWorkflowRouter,
}));

import { createApiServer } from "./app.js";

const originalEnv = { ...process.env };

async function startServer(options: Parameters<typeof createApiServer>[0] = {}) {
const server = createApiServer(options).listen();
await new Promise<void>((resolve) => {
if (server.listening) {
resolve();
return;
}
server.once("listening", () => resolve());
});
const address = server.address();
const port = typeof address === "object" && address ? address.port : 8787;
return {
server,
port,
};
}

async function closeServer(server: Awaited<ReturnType<typeof startServer>>["server"]) {
await new Promise<void>((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}

async function jsonCall(port: number, path: string) {
const response = await fetch(`http://127.0.0.1:${port}${path}`, { signal: AbortSignal.timeout(2_500) });
return {
status: response.status,
payload: await response.json(),
};
}

describe("createApiServer coverage branches", () => {
beforeEach(() => {
process.env = { ...originalEnv };
vi.clearAllMocks();
});

afterEach(() => {
process.env = { ...originalEnv };
});

it("returns the configured system health chain id and provider status", async () => {
process.env.API_LAYER_CHAIN_ID = "31337";
process.env.CHAIN_ID = "84532";

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const health = await jsonCall(port, "/v1/system/health");
const providerStatus = await jsonCall(port, "/v1/system/provider-status");

expect(health).toEqual({
status: 200,
payload: { ok: true, chainId: 31337 },
});
expect(providerStatus).toEqual({
status: 200,
payload: mocks.providerStatus,
});
expect(mocks.mountDomainModules).toHaveBeenCalledOnce();
expect(mocks.createWorkflowRouter).toHaveBeenCalledOnce();
} finally {
await closeServer(server);
}
});

it("returns transaction request payloads on success", async () => {
mocks.getTransactionRequest.mockResolvedValue({
id: "req-123",
status: "queued",
});

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/requests/req-123");

expect(result).toEqual({
status: 200,
payload: {
id: "req-123",
status: "queued",
},
});
expect(mocks.getTransactionRequest).toHaveBeenCalledWith(
expect.objectContaining({
providerRouter: expect.any(Object),
}),
"req-123",
);
} finally {
await closeServer(server);
}
});

it("omits diagnostics when a transaction request error does not include them", async () => {
mocks.getTransactionRequest.mockRejectedValue(new Error("boom"));

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/requests/req-404");

expect(result).toEqual({
status: 500,
payload: {
error: "boom",
},
});
} finally {
await closeServer(server);
}
});

it("includes diagnostics when transaction status lookup fails with them", async () => {
mocks.getTransactionStatus.mockRejectedValue(
new HttpError(429, "rate limit exceeded", { retryAfterMs: 500 }),
);

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const result = await jsonCall(port, "/v1/transactions/0xabc");

expect(result).toEqual({
status: 429,
payload: {
error: "rate limit exceeded",
diagnostics: { retryAfterMs: 500 },
},
});
} finally {
await closeServer(server);
}
});

it("uses the environment port and logs startup when quiet mode is disabled", async () => {
process.env.API_LAYER_PORT = "0";
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});

const { server, port } = await startServer();

try {
await new Promise((resolve) => setTimeout(resolve, 25));
expect(logSpy).toHaveBeenCalledWith(`USpeaks API listening on ${port}`);
} finally {
await closeServer(server);
logSpy.mockRestore();
}
});

it("prefers the explicit listen port and falls back to CHAIN_ID when API_LAYER_CHAIN_ID is unset", async () => {
process.env.CHAIN_ID = "84531";

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const health = await jsonCall(port, "/v1/system/health");

expect(health).toEqual({
status: 200,
payload: { ok: true, chainId: 84531 },
});
} finally {
await closeServer(server);
}
});

it("falls back to the default Base Sepolia chain id when chain env vars are unset", async () => {
delete process.env.API_LAYER_CHAIN_ID;
delete process.env.CHAIN_ID;

const { server, port } = await startServer({ port: 0, quiet: true });

try {
const health = await jsonCall(port, "/v1/system/health");

expect(health).toEqual({
status: 200,
payload: { ok: true, chainId: 84532 },
});
} finally {
await closeServer(server);
}
});

it("uses default server options and the hardcoded port fallback when none are provided", () => {
delete process.env.API_LAYER_PORT;

const apiServer = createApiServer();
const fakeServer = {
address: vi.fn().mockReturnValue({ port: 8787 }),
};
const listenSpy = vi.spyOn(apiServer.app, "listen").mockImplementation(((port: number) => {
expect(port).toBe(8787);
return fakeServer as never;
}) as never);

const server = apiServer.listen();

expect(server).toBe(fakeServer);
expect(listenSpy).toHaveBeenCalledOnce();
listenSpy.mockRestore();
});
});
Loading