diff --git a/MODELS.md b/MODELS.md index 15d9018b..07ded2a8 100644 --- a/MODELS.md +++ b/MODELS.md @@ -8,6 +8,7 @@ accounted for. [`models/registry.json`](models/registry.json) is the canonical m | Model | Lifecycle | Ethereum release | Documentation | | --- | --- | --- | --- | | Classic | **Available** | [`classic-v3`](releases/classic-v3/RELEASE.md) | [Open model](models/classic/README.md) | +| Stock-Paired | **Candidate** | Deployed candidate | [Open candidate](models/stock-paired/README.md) | | Deep | **Design** | None | [Open design](models/deep/README.md) | `Available` means the exact source, parameters, deployment, runtime hashes and security status are public. It does not @@ -34,6 +35,31 @@ buy and sell fees, direct native ETH rewards to as many as five wallets and may [Ethereum deployment](deployments/ethereum.json) · [Security properties](docs/security/CLASSIC_PROPERTIES.md) +## Stock-Paired + +

+ + A watercolor flower arch reflected in a quiet pool representing the Stock-Paired launch model + +

+ +**Production interface active. Repository release record pending.** Stock-Paired creates a fixed-supply token with one +reviewed Ondo tokenized stock or ETF asset as the quote side of a permanently locked Uniswap v4 pool. Its 1.00% swap +fee is accounted in the selected quote asset: 0.90% for the creator configuration and 0.10% for Programmable. + +The launched token is not a share and has no claim on the selected quote asset. The deployed release passed its +Mainnet lifecycle canary and production interface checks. Its public registry remains `candidate` until the +version-bound source and release records are on the default branch, the release verifier records the mixed explorer +state and the routing review is complete. Sourcify reports exact matches for all seven contracts; Etherscan shows one +Exact Match and six Similar Matches. + +[Behavior, assets and deployment state](models/stock-paired/README.md) · +[Security properties](docs/security/STOCK_PAIRED_PROPERTIES.md) + ## Deep

@@ -54,7 +80,8 @@ is reached. It has no deployed contracts and is not available for launch. ## Adding a model New models start at `design`. They become `candidate` only after source, tests, fixed parameters and security properties -exist. They become `available` only after the exact Ethereum deployment and runtime evidence are published. +exist. They become `available` only after the exact Ethereum deployment, runtime evidence and public activation checks +are published. [Read the release process](RELEASING.md) · [Create a model record](templates/model/README.md.template) · diff --git a/README.md b/README.md index 9a0eebc9..16a4b3ed 100644 --- a/README.md +++ b/README.md @@ -93,8 +93,9 @@ flowchart LR candidate --> design ``` -Only `available` models appear as production launch options. `design` and `candidate` records are public so incomplete -work cannot be mistaken for a deployed product. The complete gate is documented in [`RELEASING.md`](RELEASING.md). +`available` is the repository's final publication state. Production activation does not replace the required source, +deployment and security records. Any model activated before those records reach `available` is identified in its model +documentation. The complete gate is documented in [`RELEASING.md`](RELEASING.md). ## Build a launch model @@ -132,6 +133,7 @@ contest. | --- | --- | | Current security status | [`SECURITY.md`](SECURITY.md) | | Classic trust boundaries and invariants | [`docs/security/CLASSIC_PROPERTIES.md`](docs/security/CLASSIC_PROPERTIES.md) | +| Stock-Paired properties and publication gates | [`docs/security/STOCK_PAIRED_PROPERTIES.md`](docs/security/STOCK_PAIRED_PROPERTIES.md) | | Automated checks and incident process | [`docs/OPERATIONS.md`](docs/OPERATIONS.md) | | Independent review archive | [`audits/`](audits/) | diff --git a/SECURITY.md b/SECURITY.md index 6755fa01..c362e0ad 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,6 +6,12 @@ Classic is the only available launch model. Its current Ethereum release has uni regression and Mainnet-fork coverage. All seven release contracts are Etherscan exact matches and Sourcify matches. Classic has not received an independent smart-contract audit or public security contest. +Stock-Paired is active in the production interface, while its public model registry remains `candidate` until the +version-bound source and release records are on the default branch, the release verifier records the mixed explorer +state and the routing review is complete. Its lifecycle canary passed on Mainnet and all seven contracts have exact +Sourcify matches. Etherscan shows one Exact Match and six Similar Matches. Stock-Paired has no independent audit or +public security contest. + These records are evidence, not a safety guarantee. | Record | Scope | @@ -13,6 +19,7 @@ These records are evidence, not a safety guarantee. | [Classic security properties](docs/security/CLASSIC_PROPERTIES.md) | Trust boundaries, permissions, accounting and invariant evidence | | [Classic Slither review](docs/security/SLITHER_CLASSIC_V3.md) | Static-analysis findings and manual dispositions | | [Classic release](releases/classic-v3/RELEASE.md) | Version-bound source, tests and Mainnet lifecycle evidence | +| [Stock-Paired candidate properties](docs/security/STOCK_PAIRED_PROPERTIES.md) | Quote-asset accounting, issuer controls and remaining release gates | | [Operations](docs/OPERATIONS.md) | Automated checks, monitoring status and incident response | | [Independent reviews](audits/README.md) | Published external reports, currently none | | [Ethereum deployment](deployments/ethereum.json) | Addresses, transactions, runtime hashes and verification status | diff --git a/assets/README.md b/assets/README.md index 544e6ae6..74640d20 100644 --- a/assets/README.md +++ b/assets/README.md @@ -5,6 +5,7 @@ | `programmable-repository-cover-animated.gif` | Motion cover for GitHub surfaces that support animated images | | `programmable-repository-cover.jpg` | Static cover and reduced-motion fallback | | `programmable-model-classic.jpg` | Classic model artwork | +| `programmable-model-stock-paired.webp` | Stock-Paired candidate artwork | | `programmable-model-deep.jpg` | Deep design artwork | | `programmable-builder-ecosystem.jpg` | Hook Builder Program artwork | diff --git a/assets/programmable-model-stock-paired.webp b/assets/programmable-model-stock-paired.webp new file mode 100644 index 00000000..70af0487 Binary files /dev/null and b/assets/programmable-model-stock-paired.webp differ diff --git a/docs/README.md b/docs/README.md index 2a9d3c14..9516a6b4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,6 +7,7 @@ | [Release process](../RELEASING.md) | Candidate and Ethereum availability gates | | [Security](../SECURITY.md) | Reporting policy, trust assumptions and current status | | [Classic security properties](security/CLASSIC_PROPERTIES.md) | Permissions, accounting, invariants and MEV boundaries | +| [Stock-Paired security properties](security/STOCK_PAIRED_PROPERTIES.md) | Quote-asset accounting, issuer controls and release gates | | [Operations](OPERATIONS.md) | Automated evidence, monitoring status and incident response | | [Hook Builder Program](../BUILDER_PROGRAM.md) | External model submission and acceptance terms | | [Community conduct](../CODE_OF_CONDUCT.md) | Participation and moderation boundaries | diff --git a/docs/security/STOCK_PAIRED_PROPERTIES.md b/docs/security/STOCK_PAIRED_PROPERTIES.md new file mode 100644 index 00000000..27e8c2ed --- /dev/null +++ b/docs/security/STOCK_PAIRED_PROPERTIES.md @@ -0,0 +1,119 @@ +# Stock-Paired security properties + +This document maps the intended Stock-Paired candidate properties to its deployed contracts and evidence. It is a +review aid, not an audit report. + +## Trust boundaries + +```mermaid +flowchart LR + creator["Token creator"] -->|"ETH launch"| coordinator["ETH coordinator"] + coordinator -->|"WETH / USDC / quote route"| v3["Uniswap v3"] + coordinator --> launcher["Stock-Paired launcher"] + launcher --> manager["Uniswap v4 PoolManager"] + launcher --> position["Permanent position custody"] + manager -->|"v4 callbacks only"| hook["Quote-asset fee hook"] + hook --> vault["Creator reward vault"] + hook --> treasury["Programmable treasury"] + issuer["Quote-asset issuer"] -->|"manager and token controls"| quote["Tokenized quote asset"] + quote --> coordinator + quote --> manager +``` + +The registry, planner, factories, hook, launcher and coordinator are non-upgradeable Programmable contracts. The V2 +registry is ownerless and fixes exactly eleven accepted quote-asset addresses at construction. + +The tokenized quote assets are external contracts. Their issuer can retain pause, transfer, upgrade, eligibility, +custody or jurisdiction controls outside Programmable. Passing the registry checks does not remove those dependencies. + +## State and authorization + +| Action | Authorized caller | Effect | +| --- | --- | --- | +| Launch | Any wallet satisfying the launch parameters | Creates one token, reward vault, v4 pool and locked position | +| Register a pool | Its recorded launcher | Binds the pool to its quote asset and reward vault | +| Enter hook callbacks | Uniswap v4 `PoolManager` | Applies the fixed quote-asset fee | +| Claim creator rewards | An immutable beneficiary | Pays only that beneficiary's quote-asset entitlement | +| Change a payout address | The beneficiary for that allocation | Changes only its own claim destination | +| Claim Programmable rewards | Immutable treasury | Pays the treasury or its selected destination | +| Change quote assets or routes | No configured actor | Requires a new deployment | +| Remove or transfer launch liquidity | No configured actor | Position custody has no operator and a maximum timelock | + +Creator reward beneficiaries and shares are fixed at launch. Each beneficiary controls its own payout address. A reward +claim transfers the selected quote asset; an interface conversion to ETH is a separate transaction with a fresh quote, +deadline and minimum output. + +## Fee accounting + +For gross quote-asset amount `x`: + +```text +totalFee = floor(x × 100 / 10,000) +programmable = floor(x × 10 / 10,000) +creatorRewards = totalFee - programmable +``` + +The fixed total is 1.00%. The creator configuration receives 0.90% and Programmable receives 0.10%. The Programmable +share is deducted from the total. It is not added on top. + +The launched token has no transfer tax and the v4 pool's LP fee is zero. Unsupported partial fills revert rather than +leaving fee accounting ambiguous. + +## Quote-asset admission + +Before deployment, the candidate checked each quote asset against: + +1. acceptance by the issuer's token manager; +2. pinned token, beacon, implementation and manager runtime hashes; +3. the expected symbol and 18 decimals; +4. the exact Uniswap v3 USDC pool, fee tier and pool runtime; +5. a `0.01 ETH` WETH to USDC to quote asset and back route returning at least 90% of input; and +6. agreement between two Ethereum RPCs at one block. + +Before each new launch, the ownerless registry repeats the manager-acceptance, shared-runtime, token-runtime, decimals +and symbol checks. A failed check stops new launches for the affected asset. It cannot freeze an existing pool or +override issuer controls. + +The round-trip floor is an admission rule, not a promise of future route depth, price or execution. + +## Position and coordinator boundaries + +Token creation, pool initialization, reward-vault deployment, complete launch-position custody and the initial buy +execute as one launch flow. The ETH coordinator converts the caller's ETH through immutable v3 route definitions, +approves only the amount passed to the launcher and clears the approval after launch. It retains no user balance after +a successful call. + +A launch transaction remains exposed to normal public-mempool ordering, delay and censorship. Every conversion still +needs an unexpired deadline and explicit output floor. + +## Current evidence + +The deployed candidate passed: + +- deterministic registry, launch, fee-accounting and reward-vault tests; +- fuzz and invariant coverage for quote-asset accounting; +- pinned Mainnet-fork deployment and lifecycle tests; +- a two-RPC route audit across all eleven included assets; +- an ETH-first Mainnet canary with buy, sell, creator claim and Programmable claim; and +- permanent launch-position custody checks. + +The production interface activated the exact deployed release on 30 July 2026. Health, the public launch gate, +Explore, Profile, receipt lookup and wrong-chain preflight rejection passed production checks. + +The exact candidate source and test tree is fixed at +[`stock-paired-v2`](https://github.com/0xprogrammable/programmable/tree/stock-paired-v2/contracts). +The Mainnet evidence is linked from the [model record](../../models/stock-paired/README.md). + +## Manual review boundaries + +- The launched token is not a share and does not grant a claim on the quote asset. +- Quote-asset holders depend on the external issuer, custodian, transfer rules and eligible jurisdictions. +- A registry check can block future launches after issuer or runtime drift, but cannot repair an existing pool. +- Pinned v3 routes can become illiquid or economically unusable after deployment. +- A broken router, RPC, indexer or metadata service can affect access and visibility without changing pool state. +- Sourcify reports exact matches for all seven contracts; Etherscan shows one Exact Match and six Similar Matches. +- The Uniswap routing review is pending. +- No independent audit or public security contest has been completed. + +Stock-Paired remains a `candidate` until every release gate in +[`models/stock-paired/model.json`](../../models/stock-paired/model.json) is complete. diff --git a/models/registry.json b/models/registry.json index 641f88e0..a9167cdf 100644 --- a/models/registry.json +++ b/models/registry.json @@ -1,7 +1,7 @@ { "$schema": "./schema/registry.schema.json", "schemaVersion": 1, - "updatedAt": "2026-07-29", + "updatedAt": "2026-07-30", "statuses": [ "design", "candidate", @@ -17,6 +17,14 @@ "manifest": "models/classic/model.json", "documentation": "models/classic/README.md" }, + { + "id": "stock-paired", + "name": "Stock-Paired", + "status": "candidate", + "summary": "A fixed-supply token paired with one reviewed tokenized stock or ETF quote asset, with quote-asset rewards and permanently locked Uniswap v4 launch liquidity.", + "manifest": "models/stock-paired/model.json", + "documentation": "models/stock-paired/README.md" + }, { "id": "deep", "name": "Deep", diff --git a/models/stock-paired/README.md b/models/stock-paired/README.md new file mode 100644 index 00000000..9f75810d --- /dev/null +++ b/models/stock-paired/README.md @@ -0,0 +1,104 @@ +# Stock-Paired + +**Status:** Candidate
+**Deployment:** Ethereum Mainnet
+**Public interface:** Active since 30 July 2026 + +Stock-Paired creates a new fixed-supply token and pairs it with one reviewed Ondo tokenized stock or ETF asset in a +Uniswap v4 pool. The complete launch position is placed in permanent custody. + +The token created by Programmable is not a share, is not redeemable for the selected quote asset and carries no rights +in the underlying company, fund or security. The tokenized quote asset remains subject to its issuer's terms and +controls. + +[Model manifest](model.json) · +[Security properties](../../docs/security/STOCK_PAIRED_PROPERTIES.md) · +[Immutable deployed source](https://github.com/0xprogrammable/programmable/tree/stock-paired-v2/contracts) · +[Launch Stock-Paired](https://programmable.family/launch) + +## Fixed behavior + +- Supply is fixed at 1,000,000,000 tokens. +- The launch pool uses one approved quote asset and the Stock-Paired v4 hook. +- The total swap fee is 1.00% of the quote-asset side. +- Creator rewards receive 0.90%; Programmable receives 0.10%. +- Creator rewards may be split across up to eight immutable beneficiaries. +- Rewards accrue in the quote asset. Converting a claim to ETH is a separate routed transaction. +- The launch token has no transfer tax. The v4 pool's LP fee is zero. +- The one-sided launch position cannot be removed, transferred or approved by a configured operator. +- The ETH coordinator converts the initial ETH through pinned Uniswap v3 routes before calling the launcher. + +## Reviewed quote assets + +The current candidate fixes eleven quote assets: + +| Asset | Token | +| --- | --- | +| NVIDIA | `NVDAon` | +| S&P 500 | `SPYon` | +| Alphabet | `GOOGLon` | +| Silver | `SLVon` | +| Tesla | `TSLAon` | +| Apple | `AAPLon` | +| Alibaba | `BABAon` | +| Copper Miners | `COPXon` | +| Circle | `CRCLon` | +| 20+ Year Treasuries | `TLTon` | +| Oil | `USOon` | + +Admission checks pin the issuer manager, token runtime, implementation runtime, route pool and minimum round-trip +result on two Ethereum RPCs at the review block. These checks do not guarantee future liquidity or execution. + +`GMEon` and `RDDTon` were excluded because no reviewed ETH route was available. `SPCXon` was excluded because its +reviewed route did not satisfy the candidate's 90% round-trip floor. + +[Open the pinned asset and route configuration](https://github.com/0xprogrammable/programmable/blob/cdd102bed3d7556ab276ad381f54cbf6de8b2eab/config/stock-paired-assets.v2.json) + +## Mainnet evidence + +The candidate lifecycle was exercised against the deployed contracts on two independent Mainnet RPCs: + +- ETH-first launch through the reviewed Silver route; +- fixed-supply token and v4 pool creation; +- permanent position custody; +- buy and sell execution; +- creator claim in the quote asset; and +- Programmable claim in the quote asset. + +[Launch transaction](https://etherscan.io/tx/0xc45d348083c53afaf79f056f1ea5529e9410ac3faa954a5c8ef7272a6371ec83) · +[Canary token](https://etherscan.io/address/0x369f5fa21942560c42Ba9FDb8a156F5C962BD2eC) · +[Pinned deployment evidence](https://github.com/0xprogrammable/programmable/blob/cdd102bed3d7556ab276ad381f54cbf6de8b2eab/contracts/deployments/mainnet-stock-paired-v2.json) + +The production interface was activated on 30 July 2026 in Vercel deployment +`dpl_AiPs87jtBK71mY3obSoq8tRCQirb` at +[app commit `d384e76`](https://github.com/0xprogrammable/programmable/commit/d384e76db1b52d9ae6e4c4143f57b0c92efd7d1b). +Health, the public launch gate, Explore, Profile, receipt lookup and wrong-chain preflight rejection were checked on +`programmable.family`. The Mainnet canary above remains the onchain lifecycle evidence. + +## Verification state + +Checked on 30 July 2026: + +| Contract | Address | Etherscan | +| --- | --- | --- | +| Quote registry | [`0xd38F…9239`](https://etherscan.io/address/0xd38Fbc171C1a842dc3F6d10cf5642BAe097D9239#code) | Exact Match | +| Position planner | [`0x9372…4A3D`](https://etherscan.io/address/0x93728dF8288fC250294855F6D9dd28F8089E4A3D#code) | Similar Match | +| Reward-vault factory | [`0x52d7…52d4`](https://etherscan.io/address/0x52d70971D6653a754c29385a2a6f241A481952d4#code) | Similar Match | +| Hook factory | [`0x5C27…fBcB`](https://etherscan.io/address/0x5C2704C6eEaA2063d7a969BA7E557c87AEb1fBcB#code) | Similar Match | +| Fee hook | [`0x90c6…A0cc`](https://etherscan.io/address/0x90c67C1E866f86526F0e338459cD435E1F23A0cc#code) | Similar Match | +| Launcher | [`0x5eA6…0Daf`](https://etherscan.io/address/0x5eA6Be24838061bA45dbE8D82DE1b267DC240Daf#code) | Similar Match | +| ETH coordinator | [`0xFb9E…0fD2`](https://etherscan.io/address/0xFb9E1034df6161088E8F358502B19E7515c30fD2#code) | Similar Match | + +Sourcify reports exact source matches for all seven contracts. Etherscan shows one Exact Match and six Similar Matches. +An Uniswap routing review was submitted on 29 July 2026 and is pending. The contracts have not received an independent +audit or public security contest. + +## Remaining gates + +The production interface is active. The public registry remains `candidate` until: + +1. the exact deployed source, version-bound specification, release manifest and deployment record are on the default + branch; +2. the release evidence and validator record all seven exact Sourcify matches alongside the one Etherscan Exact Match + and six Similar Matches; and +3. the Uniswap routing review is complete and the supported routes are checked again. diff --git a/models/stock-paired/model.json b/models/stock-paired/model.json new file mode 100644 index 00000000..9e1e0e6a --- /dev/null +++ b/models/stock-paired/model.json @@ -0,0 +1,64 @@ +{ + "$schema": "../schema/model.schema.json", + "schemaVersion": 1, + "id": "stock-paired", + "name": "Stock-Paired", + "status": "candidate", + "summary": "A fixed-supply token paired with one reviewed tokenized stock or ETF quote asset, with quote-asset rewards and permanently locked Uniswap v4 launch liquidity.", + "documentation": "models/stock-paired/README.md", + "currentRelease": null, + "releaseManifest": null, + "specification": null, + "deployment": null, + "security": "docs/security/STOCK_PAIRED_PROPERTIES.md", + "network": { + "name": "Ethereum", + "chainId": 1 + }, + "contracts": [ + { + "deploymentKey": "quoteRegistry", + "name": "StockQuoteRegistryV2", + "address": "0xd38Fbc171C1a842dc3F6d10cf5642BAe097D9239" + }, + { + "deploymentKey": "positionPlanner", + "name": "StockPairedPositionPlannerV1", + "address": "0x93728dF8288fC250294855F6D9dd28F8089E4A3D" + }, + { + "deploymentKey": "feeSplitVaultFactory", + "name": "QuoteAssetFeeSplitVaultFactoryV1", + "address": "0x52d70971D6653a754c29385a2a6f241A481952d4" + }, + { + "deploymentKey": "hookFactory", + "name": "QuoteAssetCreatorFeeHookFactoryV1", + "address": "0x5C2704C6eEaA2063d7a969BA7E557c87AEb1fBcB" + }, + { + "deploymentKey": "feeHook", + "name": "QuoteAssetCreatorFeeHookV1", + "address": "0x90c67C1E866f86526F0e338459cD435E1F23A0cc" + }, + { + "deploymentKey": "launcher", + "name": "StockPairedLaunchV1", + "address": "0x5eA6Be24838061bA45dbE8D82DE1b267DC240Daf" + }, + { + "deploymentKey": "ethLaunchCoordinator", + "name": "StockPairedEthLaunchCoordinatorV1", + "address": "0xFb9E1034df6161088E8F358502B19E7515c30fD2" + } + ], + "review": { + "independentAudit": false, + "publicContest": false + }, + "releaseGates": [ + "Publish the exact deployed source, version-bound specification, deployment record and release evidence on the default branch.", + "Record all seven exact Sourcify matches and the one Etherscan Exact Match plus six Similar Matches in the available-release evidence and validator.", + "Complete the Uniswap routing review and repeat the supported-route checks." + ] +}