The typecheck ran with continue-on-error, so it could not fail, and it did
not see much of the code it was meant to check: shared/ resolved none of its
imports (61 TS2307), which hid every type error behind them.
- tsconfig.app.json resolves packages that shared/ imports from web's
node_modules (types first), and @pezkuwi/utils subpaths as vite does.
Unresolved imports: 61 -> 0. The real errors behind them are now visible:
353 in total, most in production code with little test cover.
- Fixing those in one change would be a large edit to that code. Instead
ops/typecheck-ratchet.py records them per file and error code in
ops/typecheck-baseline.txt and fails when any file gains one, or when
errors were fixed without lowering the baseline in the same change.
Line numbers are not part of the signature, so unrelated edits do not
trip it. Checked: a new error in App.tsx fails (exit 1); an unlowered
baseline fails (exit 1); the current tree passes.
The CI step runs the ratchet instead of the non-blocking typecheck.
- calculateMultisigAddress was completely broken (hex-decoded an SS58 string
and never hashed the preimage) - fixed via @pezkuwi/util-crypto's real
encodeMultiAddress/createKeyMulti, verified against the actual known
multisig address on-chain.
- ReservesDashboardPage had stale Noter/Berdevk addresses that don't match
the real signers - centralized as BRIDGE_MULTISIG_SPECIFIC_ADDRESSES.
- USDTBridge withdrawal called assets.burn directly as a single-signer
extrinsic (always fails - only the multisig is Admin) while only
checking status.isFinalized (a failed dispatch is still finalized, so it
silently did nothing) - replaced with the correct transfer-to-custody
flow the relayer actually watches for.
- New MultisigOperationsPage (/multisig/pending) lists pending calls from
real Multisig.Multisigs storage and lets any of the 5 signers
approve/reject with their own wallet extension.
- New standalone sign/ app (deployed separately at
pezbridge-sign.pex.mom) - a dedicated, gated signing portal for the same
operations, so signing isn't dependent on this app alone.
Restructured the project to support multiple frontend applications:
- Move web app to web/ directory
- Create pezkuwi-sdk-ui/ for Polkadot SDK clone (planned)
- Create mobile/ directory for mobile app development
- Add shared/ directory with common utilities, types, and blockchain code
- Update README.md with comprehensive documentation
- Remove obsolete DKSweb/ directory
This monorepo structure enables better code sharing and organized
development across web, mobile, and SDK UI projects.