Files
2026-05-27 23:29:53 +01:00

5.4 KiB
Raw Permalink Blame History

Tasks: enterprise-cryptocurrency

Change ID: enterprise-cryptocurrency Package: @suaveplan/cryptocurrency Target path: finance/crypto/cryptocurrency Prerequisites on Verdaccio: zod, tslib


0. Pre-flight (non-negotiable)

  • 0.1 Confirm clean working tree (git status reports nothing) and no in-flight worktrees with uncommitted work (git worktree list then git status in each)
  • 0.2 If any worktrees exist under .claude/worktrees/, account for each one: still-active agent, work-pending-merge, or stale-and-prune. Stale worktrees MUST be removed (git worktree remove) before opening a new one — code that has been lost twice on main is the failure mode this guards against.
  • 0.3 Confirm the package set in MANIFEST.md matches find packages -maxdepth 3 -name package.json count. Drift here means a prior change archived without regenerating the manifest.

1. Scaffold

  • Create full directory tree per proposal.md.
  • package.json at 0.1.0, "sideEffects": false, exports "." + per-feature subpaths + "./chains/testnet-data".
  • Deps: zod catalog:forms, tslib catalog:build. No workspace runtime deps.
  • DevDeps: vitest catalog:testing, @vitest/coverage-istanbul catalog:testing, fast-check catalog:testing, mitata catalog:testing, @suaveplan/testing workspace:^.
  • tsconfig.json extending library.json; vitest.config.ts with createTestConfig().
  • Scripts: lint, typecheck, test, test:coverage, build, bench, docs:check.

2. Error hierarchy

  • Implement CryptoError, UnknownChainError, InvalidAddressError, InvalidTxHashError, UnsupportedUnitError in src/errors/crypto-error/crypto-error.ts.
  • Mirror @suaveplan/error shape (.code, .message, .cause) without importing it.
  • Write crypto-error.test.ts: instanceof chain, code discrimination.

3. Address validator

  • Implement validateAddress and validateAddressForChain in src/address/validator/validator.ts:
    • EVM: EIP-55 checksum; hex + 0x prefix + 40 chars.
    • Bitcoin: Base58Check (P2PKH/P2SH) + Bech32 (P2WPKH/P2WSH) + Bech32m (P2TR).
    • Solana: Base58, 32–44 chars.
    • Cardano: Bech32 addr1 prefix.
    • Others: per-chain regex patterns from CHAINS data.
    • Auto-detect chain when not specified.
  • Write validator.test.ts (≤500 lines): valid + invalid per chain; EIP-55 case sensitivity; auto-detect.

4. Chain data + testnet data

  • Implement src/chains/chain-data/chain-data.ts with 15+ mainnet chain entries.
  • Implement src/chains/testnet-data/testnet-data.ts with Sepolia, Holesky, Base Sepolia, Arbitrum Sepolia, OP Sepolia.
  • src/chains/chain-registry/chain-registry.ts: MemoryChainRegistry with add/remove/list.
  • src/chains/registry/registry.ts: pure getter helpers using global registry.
  • Write tests for all chain registry operations.

5. Gas estimators

  • Implement EIP-1559 helpers in src/gas/gas-estimator/gas-estimator.ts.
  • Implement EIP-4844 blob-gas helpers in src/gas/blob-gas-estimator/blob-gas-estimator.ts:
    • calculateBlobGasPrice(excessBlobGas): MIN_BLOB_GWEI_PER_GAS * e^(excessBlobGas / BLOB_GAS_UPDATE_FRACTION).
    • estimateBlobTxCost(params): include blob-fee component.
  • Write tests against known EIP-4844 spec test vectors.

6. Tokens

  • src/tokens/token-data/token-data.ts: common ERC-20 + native tokens.
  • src/tokens/token-registry/token-registry.ts: TokenRegistry with get/register/list.
  • formatTokenBalance with locale option.
  • Write tests.

7. Transaction decode

  • Implement ABI-aware decodeCalldata in src/transaction/tx-decoder/tx-decoder.ts:
    • Accept FunctionSignature with typed parameters; decode fixed types (uint, int, bool, address, bytes, bytesN) and dynamic types (string, bytes, array).
    • Keep decodeTxHash / extractSelector / lookupSelector / KNOWN_SELECTORS from main.
  • src/transaction/selector-resolver/selector-resolver.ts: SelectorResolver interface with injectable async lookup.
  • Write tx-decoder.test.ts: each ABI type decoded correctly against known calldata fixtures.

8. Unit converter

  • Implement all unit helpers in src/units/converter/converter.ts.
  • Ensure no float-precision loss for large values; use BigInt throughout for integer types.
  • Write converter.test.ts.

9. Property-based + benchmarks

  • tests/property.test.ts (fast-check, { timeout: 30000 }):
    • etherToWei / weiToEther round-trip for arbitrary ether values (string decimal).
    • bitcoinToSatoshi / satoshiToBitcoin round-trip.
    • validateAddress(addr).chain is consistent with validateAddressForChain(addr, detected).
    • EIP-55 checksum is idempotent.
  • src/__benchmarks__/hot-paths.bench.ts: EIP-55 checksum throughput, bech32 decode, address validation throughput.

10. Docs + verify + publish

  • All .md files per layout; root README.md with chain table, quick-start validation + unit conversion + ABI decode, API table.
  • bunx turbo lint --filter=@suaveplan/cryptocurrency — zero errors.
  • bunx turbo typecheck --filter=@suaveplan/cryptocurrency — zero errors.
  • bunx turbo test --filter=@suaveplan/cryptocurrency — all pass.
  • bunx turbo test:coverage --filter=@suaveplan/cryptocurrency — 100%.
  • bun scripts/publish.ts --package @suaveplan/cryptocurrency.
  • Update CLAUDE.md; archive to openspec/archive/2026-04-24-enterprise-cryptocurrency/.