feat(demo): make RFQ and operator flows usable from the dashboard#48
Open
0xMuang wants to merge 6 commits into
Open
feat(demo): make RFQ and operator flows usable from the dashboard#480xMuang wants to merge 6 commits into
0xMuang wants to merge 6 commits into
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.