مرجع فنی
این صفحه فقط به انگلیسی موجود است.
Traceability matrix
Each PRD requirement (product/PRD.md) → where it is implemented → what proves it. Tests named here run in
make test (Go, against PostgreSQL and local Stellar) or make web-check; the demo is make demo (82 checks);
alerts are make observability-check. Status: Done, Partial (what is missing is named) or Open.
| ID | Requirement (short) | Implementation | Evidence | Status |
|---|---|---|---|---|
| FR-01 | Generic asset definition | assets.Create, admin Assets page | TestPlatformLifecycle, demo step 1 | Done |
| FR-02 | Tradable only after on-chain identity, issuer layout, Treasury trustlines, SEP-1 verified | assets.RegisterIssuer, Activate, ChainVerifier | TestPlatformLifecycle (wrong account refused, activation order), TestClawback (stellar.toml parsed with the SDK type) | Done (SEP-1 fetch not yet run against a real domain) |
| FR-03 | Suspend / resume per asset | assets.SetTrading, emergency pause | TestHTTPSecurity (role checks), console | Done |
| FR-04 | Backing only through ReserveCapacityProvider | reserve.CapacityProvider, ManualReserveProvider | TestPlatformLifecycle | Done |
| FR-05 | Four-eyes backing with attestation | reserve.Propose/Decide | TestPlatformLifecycle, demo step 2 | Done |
| FR-06 | Issuance within backing, to COLD, human multisig | issuance, txmanager multisig | TestPlatformLifecycle, demo step 3 | Done |
| FR-07 | Burn from COLD | issuance BURN | TestPlatformLifecycle | Done |
| FR-08 | Refill four-eyes + multisig; automatic sweep | issuance REFILL / SWEEP | TestPlatformLifecycle, demo step 4 | Done |
| FR-09 | Registration, server-side sessions | identity, customers.Register | TestStaffLoginOnCustomerListenerRevealsNothing, TestHTTPSecurity | Done |
| FR-10 | KYC → sponsored account with authorized trustlines | customers.ApproveKYC, custody | demo step 6, TestIssueOnboardAndConcurrentSettlement | Done |
| FR-11 | Freeze / four-eyes unfreeze on-chain | customers.Freeze, RequestUnfreeze, DecideUnfreeze | TestPlatformLifecycle, demo step 13 | Done |
| FR-12 | Wallet balances, account, orders, history | wallet app, portfolio | demo, Chrome check (part 8 evidence) | Done |
| FR-13 | Maker-checker cash | cash | TestPlatformLifecycle, demo | Done |
| FR-14 | Manual price, second approver above max move | pricing.SetPrice/DecidePrice | TestHTTPSecurity (50% move needs approval) | Done |
| FR-15 | Firm quotes | pricing.CreateQuote | demo steps 7, 11 | Done |
| FR-16 | Quote refusals (stale price, not tradable, bounds, eligibility, gate) | pricing | TestOutageClosesTradingAndIndexerCatchesUp, stale price in the Chrome check | Done |
| FR-17 | BUY reserves cash and HOT inventory atomically | trading.PlaceOrder | TestConcurrentBuysNeverOversellTheHotFloat, demo step 7 | Done |
| FR-18 | SELL | trading | demo step 11 | Done |
| FR-19 | TRANSFER between active customers | trading.Transfer | demo step 10 | Done |
| FR-20 | COMPLETED at a closed ledger; holds released on failure | trading handlers | TestPlatformLifecycle (failure releases holds) | Done |
| FR-21 | Trading gate conditions | gate | TestOutageClosesTradingAndIndexerCatchesUp, alert tests | Done |
| FR-22 | User limits: per trade, daily buy/sell/transfer | assets bounds, trading.checkTransferLimits, daily buy/sell limits | see section below | Done (see below) |
| FR-23 | Intent + attempts lifecycle | txmanager | txmanager integration tests | Done |
| FR-24 | Sequences only from the channel pool | txmanager channels | TestForeignChannelUseIsQuarantined, concurrency test | Done |
| FR-25 | Upper time bound and MEMO_HASH on every transaction | stellar builder | TestEnvelopeGuards | Done |
| FR-26 | Routing across own nodes; identical resubmission | stellar.Gateway | TestReadFailsOverToNextNode, TestFailoverPastADeadNode, TestAllNodesDownThenRecover | Done |
| FR-27 | Startup refuses mismatched configuration | app.VerifyAccounts, config, signer guards | smoke run, TestDerivedRefusesMainnetAndProduction, TestDevsignersOnlyLocal | Done |
| FR-28 | Self-hosted indexer, CRITICAL on anything unexplained | indexer | outsider scenarios in TestPlatformLifecycle, TestBackendSourcePreparesBeforeReading | Done (data-lake backfill not yet run against a real lake) |
| FR-29 | Public scanner | scanapi, apps/scan | TestScanRoleCannotReadCoreTables, TestClawback scan checks, demo step 17 | Done |
| FR-30 | Landing site | apps/landing | content tests, RTL check | Done |
| FR-31 | Admin console incl. signing and clawback | apps/admin | part 8 Chrome check, web checks | Done |
| FR-32 | Reconciliation | reconciliation | every e2e test, demo step 15 | Done |
| FR-33 | Append-only audit | audit | TestClawback (audit trail), DB triggers | Done |
| FR-34 | Idempotency-Key | httpapi idempotency | TestHTTPSecurity (byte-exact replay) | Done |
| NFR-12 | No hosted Stellar service | config (STELLAR_RPC_NODES our nodes) | infrastructure/EXTERNAL_DEPENDENCIES.md | Done |
| INV-01…10 | Financial invariants | finance/INVARIANTS.md | as listed there | Done |
Open items that block a Mainnet launch
Decided on 2026-10-31 and implemented: one human signer, Vault Transit, ~1 order/s sizing, GOLD, our own data lake
(decisions/OWNER_DECISIONS_20261031.md).
| Item | Why it blocks | Needs |
|---|---|---|
| Home domain | Activation on Mainnet fetches the issuer's stellar.toml from it | The domain (Q-13; GOLD decided) |
| Mainnet ceremony | Creates the accounts with the signer's key and the Vault keys | The signer present, Vault and the RPC nodes deployed (deployment/MAINNET_CANARY.md) |
| Alert receivers | Nobody is paged yet | Who and which channel |