Skip to content

feat(demo): make RFQ and operator flows usable from the dashboard#48

Open
0xMuang wants to merge 6 commits into
mainfrom
feature/operator-dashboard-api-proxy
Open

feat(demo): make RFQ and operator flows usable from the dashboard#48
0xMuang wants to merge 6 commits into
mainfrom
feature/operator-dashboard-api-proxy

Conversation

@0xMuang

@0xMuang 0xMuang commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

What changed\n\n- connect the read-only Operator view through a same-origin API proxy\n- keep operator API credentials server-side\n- make RFQ demo settlement visible from dashboard clicks\n- show Router/RFQAdapter success and revoked-maker rejection\n- add canonical Uniswap v3 reference E2E coverage\n- update demo, roadmap and verification documentation\n\n## Verification\n\n- ==> Checking Solidity formatting

Diff in script/DemoScenarios.s.sol:
126 126 | ManifestCore memory stored = policyReg.manifestOf(address(rwa));
127 127 | ManifestCore memory expected = _baseManifest();
128 128 | RecipeBinding[] memory storedBindings = policyReg.recipeBindingsOf(address(rwa));
129 |- bool profileOk = keccak256(abi.encode(storedBindings)) == keccak256(abi.encode(bindings))
129 |+ bool profileOk =
130 |+ keccak256(abi.encode(storedBindings)) == keccak256(abi.encode(bindings))
130 131 | && stored.factsPacked == expected.factsPacked && stored.fullManifestHash == expected.fullManifestHash;
131 |- bool ok = stored.status == PolicyStatus.ACTIVE && stored.declaredBy == address(factory)
132 |+ bool ok =
133 |+ stored.status == PolicyStatus.ACTIVE && stored.declaredBy == address(factory)
132 134 | && stored.approvedBy == address(factory) && profileOk;
133 135 | console2.log(" evidence: ACTIVE selected asset profile, approved by factory");
134 136 | console2.log(" status(2=ACTIVE) :", uint256(stored.status));\n- RFQ-only Anvil E2E\n- RFQ backend and dashboard smoke tests\n- localhost dashboard proxy smoke test\n\n## Scope\n\nLocal reference/demo flow only. Production signer custody, hosted operation, real TA/Securitize integration and live-chain deployment remain out of scope.

0xMuang added 6 commits July 22, 2026 15:42
Constraint: Production control-plane changes must preserve immediate containment while delaying every relaxation, including deployed Factory ownership and chain-time RFQ expiry.
Rejected: Direct registry governance calls after ownership transfer | unreachable in the deployed stack
Rejected: Long demo RFQ TTL | masked wall-clock and chain-clock divergence
Confidence: high
Scope-risk: moderate
Directive: Route future Manifest governance through Factory/Safe ownership and derive live quote/deadline expiry from chain time.
Tested: scripts/check.sh (609 Foundry tests, all service smokes, deploy-v3 10/10); buidl-like and reg-d live Anvil E2E
Not-tested: production Safe provider, live RPC finality, external issuer/TA integration
Constraint: ADR-008 requires TA lot, person-group state, rejection audit, and out-of-router surveillance while official Securitize API and production WORM details remain unavailable.
Rejected: Securitize-specific undocumented integration | would create a false compatibility claim
Rejected: Earliest-lot holder snapshot | could let immature lots bypass holding-period enforcement
Confidence: high
Scope-risk: moderate
Directive: Add real providers behind TransferAgentProvider and preserve fail-closed snapshot freshness and lineage semantics.
Tested: scripts/check.sh (Foundry 618/618, all service smoke, deploy-v3 10/10); live buidl-like and reg-d E2E (7/7 each plus delayed recovery, AMM and RFQ); independent code and test review
Not-tested: real Securitize API, production WORM/retention, amount-specific lot allocation
Replace the fixed two-recipe runtime with bounded registry-backed bindings so required gates, alternative paths, and non-blocking findings remain deterministic across lifecycle updates and operator tooling.

Constraint: Preserve existing Manifest ABI mirrors temporarily while runtime evaluation and onboarding move to RecipeBinding[].
Rejected: Immediate removal of issuance/fund fields | would break hand-written CLI ABI and downstream integrations during migration.
Confidence: high
Scope-risk: moderate
Directive: Treat RecipeBinding[] as the runtime source of truth; remove legacy mirrors only in a versioned ABI change.
Tested: scripts/check.sh (634 Foundry tests, all service smoke tests, deploy-v3 10/10); buidl-like and reg-d live Anvil E2E.
Not-tested: production legal recipes, live TA provider, live mainnet venue.
Keep dashboard data access same-origin while preserving the server-side authentication boundary.\n\nConstraint: Operator API remains read-only and dashboard browser code must not receive API credentials.\nRejected: Browser-side direct API calls | would expose deployment-specific CORS and credentials.\nConfidence: high\nScope-risk: narrow\nDirective: Keep transaction-capable actions outside the Operator API proxy.\nTested: node --check services/operator-dashboard/server.js; npm test --prefix services/operator-dashboard; localhost proxy smoke; git diff --check\nNot-tested: production hosting, TLS and live multisig provider integration
The reference execution path needs a live canonical-pool proof so adapter assumptions are validated beyond the mock pool.\n\nConstraint: vendored Uniswap v3 remains isolated under tools/deploy-v3 and the protected Router remains the only execution path.\nRejected: Treating MockPool coverage as production-shaped evidence | it cannot validate callback, factory or pool-balance behavior.\nConfidence: high\nScope-risk: moderate\nDirective: Keep production pool and LP onboarding separate from this deterministic local E2E.\nTested: scripts/check.sh; RealUniswapV3 integration tests.\nNot-tested: live-chain deployment, production liquidity and external security review.
A reference SDK is easier to evaluate when the protected trade path is visible and repeatable from a local console.\n\nConstraint: the settlement facilitator is strictly opt-in and Anvil-only; production RFQ custody remains out of scope.\nRejected: Keeping quote generation and CLI handoff as the primary demo | it obscures the Router, policy and settlement behavior for operators.\nConfidence: high\nScope-risk: moderate\nDirective: Preserve artifact-driven addresses and keep browser code free of signing keys.\nTested: scripts/check.sh; RFQ-only Anvil E2E; RFQ backend and dashboard smoke tests; localhost proxy smoke; git diff --check.\nNot-tested: hosted dashboard, production signer custody, real TA/Securitize integration.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant