@black-market/sdk 0.15.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +5 -4
  2. package/dist/lifecycle/deployments/raeto-dynamic-pool-v1-20261029.d.ts +71 -0
  3. package/dist/lifecycle/deployments/raeto-dynamic-pool-v1-20261029.d.ts.map +1 -0
  4. package/dist/lifecycle/deployments/raeto-dynamic-pool-v1-20261029.js +73 -0
  5. package/dist/lifecycle/deployments/raeto-dynamic-pool-v1-20261029.js.map +1 -0
  6. package/dist/lifecycle/deployments/raeto-fixed-pool-v1-20261029.d.ts +71 -0
  7. package/dist/lifecycle/deployments/raeto-fixed-pool-v1-20261029.d.ts.map +1 -0
  8. package/dist/lifecycle/deployments/raeto-fixed-pool-v1-20261029.js +73 -0
  9. package/dist/lifecycle/deployments/raeto-fixed-pool-v1-20261029.js.map +1 -0
  10. package/dist/lifecycle/gas-profile.d.ts +1 -1
  11. package/dist/lifecycle/gas-profile.d.ts.map +1 -1
  12. package/dist/lifecycle/gas-profile.js +17 -7
  13. package/dist/lifecycle/gas-profile.js.map +1 -1
  14. package/dist/lifecycle/index.d.ts +2 -0
  15. package/dist/lifecycle/index.d.ts.map +1 -1
  16. package/dist/lifecycle/index.js +2 -0
  17. package/dist/lifecycle/index.js.map +1 -1
  18. package/dist/lifecycle/markets.d.ts +2 -0
  19. package/dist/lifecycle/markets.d.ts.map +1 -1
  20. package/dist/lifecycle/markets.js +30 -2
  21. package/dist/lifecycle/markets.js.map +1 -1
  22. package/dist/lifecycle/opening-buys.js +3 -3
  23. package/dist/lifecycle/opening-buys.js.map +1 -1
  24. package/dist/lifecycle/planner.d.ts.map +1 -1
  25. package/dist/lifecycle/planner.js +20 -1
  26. package/dist/lifecycle/planner.js.map +1 -1
  27. package/dist/lifecycle/presets.d.ts +4 -2
  28. package/dist/lifecycle/presets.d.ts.map +1 -1
  29. package/dist/lifecycle/presets.js +8 -1
  30. package/dist/lifecycle/presets.js.map +1 -1
  31. package/dist/lifecycle/raeto-abi.d.ts +175 -0
  32. package/dist/lifecycle/raeto-abi.d.ts.map +1 -0
  33. package/dist/lifecycle/raeto-abi.js +224 -0
  34. package/dist/lifecycle/raeto-abi.js.map +1 -0
  35. package/dist/lifecycle/raeto.d.ts +21 -0
  36. package/dist/lifecycle/raeto.d.ts.map +1 -0
  37. package/dist/lifecycle/raeto.js +59 -0
  38. package/dist/lifecycle/raeto.js.map +1 -0
  39. package/dist/lifecycle/transactions.d.ts.map +1 -1
  40. package/dist/lifecycle/transactions.js +8 -1
  41. package/dist/lifecycle/transactions.js.map +1 -1
  42. package/docs/launch-lifecycle.md +75 -6
  43. package/docs/lifecycle-gas-profiles.md +141 -24
  44. package/docs/reference.md +59 -4
  45. package/examples/README.md +2 -2
  46. package/package.json +1 -1
  47. package/src/lifecycle/deployments/raeto-dynamic-pool-v1-20261029.ts +74 -0
  48. package/src/lifecycle/deployments/raeto-fixed-pool-v1-20261029.ts +74 -0
  49. package/src/lifecycle/gas-profile.ts +17 -7
  50. package/src/lifecycle/index.ts +2 -0
  51. package/src/lifecycle/markets.ts +23 -1
  52. package/src/lifecycle/opening-buys.ts +3 -3
  53. package/src/lifecycle/planner.ts +18 -1
  54. package/src/lifecycle/presets.ts +8 -1
  55. package/src/lifecycle/raeto-abi.ts +223 -0
  56. package/src/lifecycle/raeto.ts +61 -0
  57. package/src/lifecycle/transactions.ts +8 -1
@@ -1,6 +1,6 @@
1
1
  # Launch a token with the TypeScript SDK
2
2
 
3
- Use SDK **0.14.1** on Robinhood Chain mainnet (**4663**). For a first launch, run
3
+ Use SDK **0.16.0** on Robinhood Chain mainnet (**4663**). For a first launch, run
4
4
  [`launch-erc20-abyss.ts`](../examples/launch-erc20-abyss.ts): one market, one position,
5
5
  one buy. [Runner setup](../examples/README.md) covers its environment and commands.
6
6
  This guide explains the economics and the public APIs for your own integration.
@@ -19,6 +19,7 @@ staking, or dividends. A pool profile selects the admitted venue/hook implementa
19
19
  | HMM V2 | `V4HmmFixedPool`, `V4HmmDynamicPool` | Auxiliary fee-funded bids/asks; LP and developer fees 0; explicit risk guards. |
20
20
  | UFG | Abyss QUOTE/QUOTE_ORACLE or `V4UfgFixedPool`, `V4UfgDynamicPool` | Treasury route; ERC20 without rewards; quote-only fees, executor bounty 0. |
21
21
  | Auto-compounding | `V4AutoCompoundStaticPool`, `V4AutoCompoundDynamicPool` | Net hook fees fund permanently locked full-range liquidity; both fee modes; LP and developer fees 0. |
22
+ | Raeto | `V4RaetoFixedPool`, `V4RaetoDynamicPool` | QuoteOnly WETH/USDG; Raeto share 5/10/25/50/75%; LP and developer fees 0. |
22
23
 
23
24
  SDK presets are the source of supported profiles and deployment wiring. Profiles
24
25
  registered after this release appear with a subsequent SDK update.
@@ -655,6 +656,69 @@ exit fee; this is not a guaranteed USD floor. Accrued pool fees are not collecte
655
656
  backing. Inspect collection failure events as well as receipt success; a fork check
656
657
  needed at least 750k gas for `collect()`, not a universal mainnet gas limit.
657
658
 
659
+ ## Configure Raeto
660
+
661
+ Raeto is a constrained **fee-sharing offering**, not a UFG treasury or a redemption
662
+ contract. Select `V4RaetoFixedPool` (fixed maximum hook fee) or
663
+ `V4RaetoDynamicPool` (minimum/maximum/sensitivity schedule). The hook creation
664
+ bytes are identical to the ordinary zero-royalty fixed/dynamic templates; the
665
+ Raeto collector, factory, locker, adapter and frozen terms are different.
666
+
667
+ ```ts
668
+ import {
669
+ getKnownLifecycleProfile, KnownLifecycleProfile, RAETO_QUOTE_ASSETS,
670
+ RAETO_SHARE_BPS_OPTIONS, encodeRaetoLaunchTail, validateRaetoLaunchPlan,
671
+ type RaetoLaunchConfigV1,
672
+ } from "@black-market/sdk/lifecycle";
673
+
674
+ const preset = getKnownLifecycleProfile({
675
+ chainId: 4663, orchestrator: "0x91560876033d568d25CDe98C78c33ff8FC43962c",
676
+ key: KnownLifecycleProfile.V4RaetoFixedPool,
677
+ })!;
678
+ const raetoLaunchConfig: RaetoLaunchConfigV1 = { shareBps: 500 };
679
+ console.log(preset.profile.id, RAETO_QUOTE_ASSETS, RAETO_SHARE_BPS_OPTIONS,
680
+ encodeRaetoLaunchTail(raetoLaunchConfig));
681
+ // Add raetoLaunchConfig to the market's V4PoolBoundLifecycleMarketConfigV6.
682
+ // Once all markets are built: validateRaetoLaunchPlan(plan).
683
+ ```
684
+
685
+ Every Raeto-route market must use its Raeto config6 profile/adapter, **WETH or
686
+ USDG**, `feeMode: 1` (QuoteOnly), `lpFeePips: 0`, and `developerFeeBps: 0`.
687
+ One V4 market per quote means at most two Raeto markets, with at most 32 total
688
+ positions. Preserve normal token/reward choices and fee-asset policies; no UFG
689
+ proxy, treasury, special nonce, or UFG funding approvals are involved.
690
+
691
+ Set `raetoLaunchConfig.shareBps` to **500, 1000, 2500, 5000, or 7500**.
692
+ The 5% floor cannot be disabled. **1234, 8000 and 10000 are not deployed options**,
693
+ even though a newer local contract source accepts a wider range. This release
694
+ pins the deployed five-item menu, proved by read-only calls to both live factories
695
+ at block 101,180,179. The encoder appends exactly one canonical 32-byte uint16
696
+ word; missing/extra/mixed HMM/UFG/auto-compounding tails reject.
697
+
698
+ Use `validateRaetoLaunchPlan(plan)` for the exclusive Raeto route; it rejects
699
+ every non-Raeto or malformed market with `INVALID_RAETO_PLAN`. Config/tail and
700
+ market fee/quote errors use `INVALID_RAETO_CONFIG`. Then use the ordinary
701
+ `prepareAndPlanLifecycleLaunch` / `buildNextTransaction` flow. A share change
702
+ changes the full plan hash, but Raeto's hook-constructor commitment hashes only
703
+ the zero-salt V6 prefix, not the collector share. Always re-review changed plans.
704
+
705
+ At collection the collector books `floor(post-treasury quote fees × shareBps /
706
+ 10000)` as Raeto credit and forwards the remainder into the normal fee hub.
707
+ The **current fee owner** can call `setShareBps` with another menu value,
708
+ including immediately before collection; that selection applies to all
709
+ uncollected fees. Collection does not pay or consult the payout registry.
710
+ Anyone can call `claimRaeto(quoteAsset)` to pay the registry's **current** payout,
711
+ not a caller-selected recipient. Donations are not fee revenue or Raeto credit.
712
+ Use `raetoFeeCollectorV1Abi` for `shareBps`, `owed`, token/quote getters, the
713
+ share/claim methods and `RaetoShareUpdated` / `RaetoFeesBooked` /
714
+ `RaetoFeesClaimed`. [Reference and preserved deployment evidence](reference.md#raeto-profiles)
715
+ identify the payout registry and profile/adapter IDs.
716
+
717
+ Both variants use the measured v4 capacity model, with deterministic preparation
718
+ batches, exact local opening-buy quotes and the unchanged native 32M total gas
719
+ ceiling. A ready assessment is a budget/input check, **not execution proof**.
720
+ See [gas evidence](lifecycle-gas-profiles.md#raeto-and-auto-compounding-v4-evidence).
721
+
658
722
  ## Configure auto-compounding
659
723
 
660
724
  Select `V4AutoCompoundStaticPool` for a fixed hook fee or
@@ -691,11 +755,16 @@ include the recorded readback and read-only verification command.
691
755
 
692
756
  The hook owns its new full-range liquidity permanently; the non-compounding
693
757
  remainder follows the launch's normal fee-asset policies. It burns the allocated
694
- launch-token fees and uses quote fees to buy and compound. Every post-opening swap
695
- performs compounding in `afterSwap`; insufficient gas reverts with
696
- `CompoundOutOfGas()` rather than silently skipping work. Do not cap swap gas below
697
- `eth_estimateGas`. Launch transactions retain the SDK's native ceiling; these new
698
- templates require exact execution admission, not uncalibrated fixed-hook capacity bounds.
758
+ launch-token fees and uses quote fees to buy and compound. During launch,
759
+ `_attemptCompound` defers until `openingCompletedAt` is set **after all opening
760
+ buys**, so the local ordered opening-buy curve remains exact. Post-opening swaps
761
+ can compound in `afterSwap`; the hook's low-gas guard reverts `CompoundOutOfGas()`.
762
+ Do not cap swap gas below `eth_estimateGas` or treat launch bounds as swap limits.
763
+ Launch transactions now have measured static/dynamic capacity and preparation
764
+ costs in `robinhood-4663-capacity-v4`, not ordinary fixed-hook guesses. They retain
765
+ the native 32M total gas ceiling and never execute calldata during planning.
766
+ See [the fork matrix and ArbOS caveat](lifecycle-gas-profiles.md#raeto-and-auto-compounding-v4-evidence).
767
+
699
768
 
700
769
  <a id="0100-release-hmm-v2-only"></a>
701
770
  ## Configure HMM V2
@@ -1,6 +1,6 @@
1
1
  # Lifecycle gas, capacity, execution evidence and RPC budgets
2
2
 
3
- Version 0.15.0 separates the native transaction ceiling, conservative capacity bounds, exact curve quotes and actual execution proof. A local quote or submitted hash is not an execution receipt.
3
+ Version **0.16.0**, model **`robinhood-4663-capacity-v4`**, separates the native transaction ceiling, conservative capacity bounds, exact opening-curve quotes and actual transaction receipts. A ready assessment is not execution proof.
4
4
 
5
5
  ## One native ceiling, not component-sized gas
6
6
 
@@ -12,43 +12,160 @@ A reviewed launch gas differing from the ceiling is stale and refuses with `STAL
12
12
 
13
13
  ## Capacity selects the mode, not the gas limit
14
14
 
15
- `computeLifecycleLaunchGasBounds({ plan, predictedToken, ufg?, headroomBps? })` returns conservative `atomicComputeGasUpperBound` and `activationComputeGasUpperBound`, excluding poster gas, or undefined for unknown coverage. The versioned model accounts for token/reward creation, actual UFG proxy/treasury route, market/position work, ordered buys, NFT minting and HMM forwarding overhead. UFG route overhead is independent of market profile names.
15
+ `computeLifecycleLaunchGasBounds({ plan, predictedToken, ufg?, headroomBps? })` returns conservative `atomicComputeGasUpperBound` and `activationComputeGasUpperBound`, excluding poster gas, or undefined for unknown coverage. The v4 model covers Raeto fixed/dynamic and current auto-compounding static/dynamic in addition to the existing Abyss, V4, HMM and UFG templates. It accounts for token/reward creation, actual UFG proxy/treasury route, measured market/position work, ordered buys, NFT minting and HMM forwarding overhead. UFG route overhead is independent of market profile names.
16
16
 
17
- An atomic request is a preference. A conservative atomic bound plus poster allocation above the ceiling selects staged; explicit staged remains staged. An actual atomic capacity failure can also select staged with fresh full-sequence admission. Review and persist returned `planned.mode`, not the requested mode. No positions, markets or buys are dropped.
17
+ An atomic request is a preference. Multiple markets or conversion funding always select staged; one non-conversion market can remain atomic only when its conservative bound plus poster allocation fits. Explicit staged remains staged. Review and persist returned `planned.mode`, not the requested mode. No positions, markets or buys are dropped, and the gas envelope is never resized.
18
18
 
19
- A large conservative activation upper bound is uncertainty, not proof of overflow. Uncertain activation receives exact full-sequence execution before begin. An actual activation capacity failure returns `capacityConstraint: "activation"` and asks the user to reduce positions/pools; staging cannot split activation. For example, an independently observed24-position activation fit32M despite a larger conservative upper bound, while a32-position deep Abyss activation needed a47.48M minimum successful envelope. Neither observation licenses a universal count-only hard cap.
19
+ Preparation greedily packs contiguous markets using measured per-template/per-position costs, full calldata processing and padding. Activation cannot split. An activation bound plus poster allocation above 32M refuses before begin with `ACTIVATION_GAS_LIMIT`; an unknown profile refuses with `UNKNOWN_GAS_PROFILE`. A conservative refusal is not proof the actual transaction would overflow, but there is no simulation or execution fallback.
20
20
 
21
- ## Which admission path runs
21
+ ## What planning does, and does not prove
22
22
 
23
- | Command | Covered direct plan with proven-fit activation | Plan containing an aggregator conversion |
24
- | --- | --- | --- |
25
- | Approval/reset | Wallet prepares gas/fees | Wallet prepares gas/fees |
26
- | Begin | Conditional template admission | Exact native execution of the conversion |
27
- | Prepare markets/hooks | Conditional template admission | Conditional admission when isolated after begin |
28
- | Activate and opening buys | Conditional admission and exact local curve math | Exact native execution consuming conversion funding |
29
- | Atomic launch | Conditional admission and exact local curve math | Exact native execution of the complete transaction |
30
- | Cancel | Conditional admission | Conditional admission when isolated |
31
-
32
- A conversion review proves the complete staged sequence through activation in one validated `eth_simulateV1` call, with every launch call at32M. Unknown template/currency coverage, another chain/ArbOS epoch or uncertain activation also uses real execution. A refused full review cannot authorize a new begin from a successful prefix; already-started recovery and cancellation remain available. Explicit `simulateLaunchPlan` always requests execution. A generic EVM fork is not Nitro protocol proof.
33
-
34
- Unknown curve behavior retains a separate provisional, unvalidated buy-output diagnostic at the same ceiling before protecting minima. It is not gas sizing, final admission or a retry. The final protected commitment still requires its exact execution. There is no SDK-invented50M aggregate window; explicit `maxSimulationGas` policies remain enforced against complete observed work without prefix admission.
23
+ Planning and build-next read one pinned input/progress snapshot, compute exact local opening-buy outputs, check deterministic capacity and check affordability. They **never execute launch calldata**, including for conversion funding. The real router enforces its committed conversion floor/deadline when the user submits the transaction.
35
24
 
36
- ### Honest result fields
25
+ | Command | Planning/build-next behavior |
26
+ | --- | --- |
27
+ | Approval/reset | Discover allowance; wallet owns gas preparation. |
28
+ | Begin | Check inputs, complete activation capacity and full-ceiling affordability. |
29
+ | Prepare markets/hooks | Pack deterministic contiguous batches and check their budgets. |
30
+ | Activate and opening buys | Check unsplittable activation capacity and exact local ordered-buy floors. |
31
+ | Atomic launch | Require one non-conversion market with known capacity headroom. |
32
+ | Cancel | Build from canonical progress; no new profile capacity requirement. |
37
33
 
38
- - Conditional admission: `backend/confidence: "profiled"`, `executionProof: "not-run"`, `protocolFit: "profiled"`. `gasProfile` carries `version`, capacity `bounds` and local `initialBuys`, not per-step estimates or fabricated receipts.
39
- - The immediate fixed-ceiling budget is `simulation.estimate`, with `feeConfidence: "native-ceiling-and-data"` and no invented `gasUsed`. Approval budgets are absent.
40
- - Successful exact native execution reports `backend: "eth_simulateV1"`, `executionProof: "proved"`, `protocolFit: "proved"` after required postconditions.
41
- - Only an immediate launch command receives final gas/price/estimate/admission. Exact suffix steps remain `provisional: true` with no executable estimate. Build-next constructs only the canonical next command at a fresh pin; it never treats a suffix observation as an estimate.
34
+ Check `planned.assessment.ready`, `code`, `reason`, optional `capacityConstraint`,
35
+ `assessment.estimate` and `assessment.gasProfile`. The gas profile contains
36
+ `version`, capacity `bounds` and exact local `initialBuys`, never invented
37
+ `gasUsed`. Launch commands use the native ceiling; approvals omit gas/fees.
38
+ Only actual included receipts and canonical Active/public-market state establish
39
+ execution. The owned fork harness below exercises the real contracts separately;
40
+ it is never selected as a planning backend.
42
41
 
43
42
  ## Retained empirical evidence
44
43
 
45
- `robinhood-4663-arbos61-v1` covers shipped Abyss configuration-v1 and the calibrated fixed/dynamic V4 configuration-v6 templates, including HMM/UFG, on ArbOS61 with an EOA payer and known release quote implementations. Auto-compounding presets are not covered by these capacity bounds and require exact execution. This is capacity coverage, not a currency admission allowlist. Unknown currencies remain supported through exact execution; smart-account proof is not claimed.
44
+ `robinhood-4663-capacity-v4` extends the retained release-template budgets with [Raeto and auto-compounding measurements](#raeto-and-auto-compounding-v4-evidence). These are empirical capacity bounds, not gas-limit sizing, a promise about arbitrary upgrades/future ArbOS rules, or native execution proof. Currency admission is separate: only Raeto imposes its deployed WETH/USDG quote allowlist.
46
45
 
47
46
  Research retained176 lifecycle receipts, including75 successful current-template atomic/activation observations with opening buys. Isolated forks extend depth, buys and combinations; failed CREATE2 cases were not counted as successful coverage. One Abyss and one fixed-V4 historical native/fork calibration matched compute exactly (19,272,603 and18,130,251 gas), while minimum successful envelopes were higher (20,527,230 and19,356,279). These two calibrations do not establish general Anvil/Nitro equivalence. Compute and poster components remain separate. Profiles are empirical capacity bounds, never transaction gas sizing or proof about arbitrary upgrades/future ArbOS rules.
48
47
 
48
+ ## Raeto and auto-compounding v4 evidence
49
+
50
+ `test/integration/template-gas.fork.mjs` owns an explicitly supplied loopback
51
+ Anvil on **8571** and accepts only its unlocked default development account.
52
+ It never loads a key or sends to mainnet. Each case snapshots/reverts the fork
53
+ and executes real SDK-produced calldata against the admitted deployment graph.
54
+ The matrix retains full portable plans and receipts' transaction hashes,
55
+ block numbers, `gasUsed`, characterization envelopes, calldata sizes,
56
+ Anvil minimum-gas estimates and separate 32M `eth_call` fit results in
57
+ `test/fixtures/template-gas-matrix.json`. Separate read-only SDK planning/build-next
58
+ assessments, referencing those retained real executions without replaying them,
59
+ are in `test/fixtures/template-gas-smoke.json`.
60
+ The creator/token identity may repeat across **isolated, reverted** cases, and
61
+ identical CREATE2 preimages reuse the SDK's deterministic mined salt. This avoids
62
+ unnecessary new empty-slot archive queries without retaining any launch state
63
+ between experiments. Complete plans identify the exact identity used in every
64
+ observation. The harness verifies the source pin and Anvil version and always
65
+ skips any scenario already recorded. The final missing-case selection covers
66
+ boundary depths/buys/market counts rather than repeating a redundant Cartesian
67
+ interior. Earlier valid observations remain in the evidence unchanged.
68
+
69
+ The source block/hash and Anvil version are recorded per run. Public RPC pruning,
70
+ rate limits and archive backend failures are not execution failures; the final
71
+ missing cases use a configured Alchemy archive. Its credential-bearing URL is
72
+ never logged or committed; evidence identifies the provider only as `alchemy`.
73
+ The synthetic economics ($5,000 FDV, WETH $3,000 / USDG $1) are explicit test
74
+ fixtures, not a live pricing recommendation.
75
+ Single-position recipes and adjacent 8-position distributions use SDK helpers;
76
+ an explicit adjacent 32-band fixture reaches the templates' structural maximum
77
+ without changing the public distribution catalogue's 2–16-position API.
78
+ Two-market cases divide at most 32 **total** positions between WETH and USDG.
79
+ Raeto cannot have a third V4 market because those are its only allowed quotes.
80
+
81
+ Anvil does not implement ArbOS precompiles. The harness reads
82
+ `ArbGasInfo.getPricesInWei` from the real native chain through the configured
83
+ archive at the fork's source pin. For read-only LaunchLens planning snapshots,
84
+ an `eth_call`-only ArbSys override maps `arbBlockNumber()` / `arbBlockHash(uint256)`
85
+ to Anvil's actual `NUMBER` / `BLOCKHASH` environment; it does not invent balances,
86
+ progress, addresses or protocol results. No deployed launch code/storage is
87
+ overridden and no measured launch is replayed by that smoke. All launch execution
88
+ uses the ordinary fork contracts.
89
+ USDG fixture funding is an ordinary deployed-token transfer from the fork's
90
+ real PoolManager balance, using fork-only impersonation; protocol code/storage
91
+ is not replaced. Characterization uses 100M gas to measure without assuming fit,
92
+ and separately calls the exact launch at 32M. The read-only profiled smoke checks
93
+ the SDK's actual 32M next-command envelope without re-executing a retained case.
94
+ **Anvil compute and successful local 32M calls are not native ArbOS/poster proof.**
95
+
96
+ The committed run contains **84 real launches / 186 successful launch
97
+ transactions** at Robinhood block **101,180,179**
98
+ (`0xe778e5d89ca2cab5843eedeb8c27b10f5463313d4b95b8971986ac72e297933c`):
99
+ 59 retained observations plus 25 approved missing boundary cases. No retained
100
+ case was replayed. Depths are 1/8/32 total positions, one/two markets and
101
+ 0/1/4 ordered buys, with both Raeto quotes and both auto-compound fee modes.
102
+
103
+ Observed peak EVM `gasUsed`, in millions (preparation columns distinguish batch size):
104
+
105
+ | Template | Cases | Atomic max | Prepare 1 market max | Prepare 2 markets max | Activation max |
106
+ | --- | ---: | ---: | ---: | ---: | ---: |
107
+ | Raeto fixed | 42 | 41.664 | 11.222 | 17.831 | 22.228 |
108
+ | Raeto dynamic | 22 | 41.694 | 11.186 | 17.804 | 22.332 |
109
+ | Auto-compound static | 10 | 41.285 | 10.694 | 16.874 | 22.403 |
110
+ | Auto-compound dynamic | 10 | 41.369 | 10.753 | 16.992 | 22.445 |
111
+
112
+ The 32-position atomic extremes exceed 32M and select staged; their
113
+ activations fit. All measured one/eight-position atomic cases fit, including
114
+ several buys. `test/template-gas.test.mjs` requires every transaction's observed
115
+ gas **and** Anvil forwarding estimate to fit its model bound, at least 5%
116
+ observed-gas margin, and a bound below 32M whenever the observation fit that
117
+ ceiling. Begin uses the native 32M budget rather than a fabricated estimate.
118
+
119
+ V4 template coefficients below are compute basis, before at least **25%**
120
+ padding (or larger requested headroom), calldata processing and applicable
121
+ token/reward/NFT/fee-asset work. Existing offerings' coefficients are unchanged.
122
+
123
+ | Component | Raeto fixed/dynamic | Auto-compound static/dynamic |
124
+ | --- | --- | --- |
125
+ | One-market atomic base | 18,000,000 | 18,000,000 |
126
+ | Atomic extra position | 600,000 | 600,000 |
127
+ | Activation call base | 1,500,000 | 1,500,000 |
128
+ | Activation per market | 500,000 | 750,000 |
129
+ | Activation per position | 500,000 | 500,000 |
130
+ | Preparation per market | 9,300,000 | 8,900,000 |
131
+ | Preparation extra position | 70,000 | 70,000 |
132
+ | Each opening buy | 500,000 + 25,000 × that market's positions | Same |
133
+
134
+ The per-buy position term matters: at 32 positions the measured marginal
135
+ exceeds 1M gas per buy, so inheriting the ordinary flat 0.5M would understate
136
+ larger buy sequences. Full calldata contributes 24 gas/byte and fee assets
137
+ 100,000 each before padding. `computeLifecycleLaunchGasBounds` remains the
138
+ consumer API; coefficients are not transaction gas limits.
139
+
140
+ Auto-compounding's `_attemptCompound` exits for `Opening` before its 80k
141
+ low-gas guard whenever `_openingCompletedAt == 0`. The orchestrator executes all
142
+ ordered `_buy` calls before `_openMarkets`; opening completion is the terminal
143
+ market boundary. The harness checks exact quote spend/token outputs against
144
+ `InitialBuyExecuted`, every opening deferral, no `CompoundExecuted`, and
145
+ opening-completed event ordering. Therefore launch activation needs no
146
+ post-opening compounding forwarding reserve; HMM's separate reserve stays intact.
147
+ These launch constants are **not** gas limits for post-opening swaps.
148
+
149
+ ```sh
150
+ # In each terminal, source the existing credential environment without printing it:
151
+ source ~/.config/robinhood-archive-rpc.env
152
+ export ROBINHOOD_ARCHIVE_RPC_URL
153
+ # Terminal 1; stop Anvil when finished:
154
+ anvil --fork-url "$ROBINHOOD_ARCHIVE_RPC_URL" \
155
+ --fork-block-number 101180179 --chain-id 4663 --port 8571 --host 127.0.0.1 \
156
+ --hardfork cancun --gas-limit 120000000 --quiet
157
+ # Terminal 2, in the worktree (source/export the environment here too):
158
+ pnpm build
159
+ TEMPLATE_FORK_RPC_URL=http://127.0.0.1:8571 \
160
+ node test/integration/template-gas.fork.mjs
161
+ # Read-only assessment of retained executed plans; no launch replay:
162
+ TEMPLATE_FORK_RPC_URL=http://127.0.0.1:8571 \
163
+ node test/integration/template-gas.fork.mjs --smoke
164
+ ```
165
+
49
166
  ## Exact ordered opening-buy math
50
167
 
51
- `computeLifecycleOpeningBuys({ plan, predictedToken })` follows all liquidity bands, prior buys, initialized zero-net ticks, bitmap boundaries, both currency directions, LP/opening-hook fees, partial fills and integer output floors. HMM opening work occurs after initial buys. V4's zero price-limit sentinel resolves locally to the contract-defined directional limit without changing calldata; Abyss still rejects zero.
168
+ `computeLifecycleOpeningBuys({ plan, predictedToken })` follows all liquidity bands, prior buys, initialized zero-net ticks, bitmap boundaries, both currency directions, LP/opening-hook fees, partial fills and integer output floors. HMM opening work occurs after initial buys. Auto-compounding defers until opening completes, after all initial buys; Raeto reuses the ordinary fixed/dynamic fee curve. V4's zero price-limit sentinel resolves locally to the contract-defined directional limit without changing calldata; Abyss still rejects zero.
52
169
 
53
170
  Covered `buySlippageBps` protection uses `floor(tokenOut * (10000 - bps) / 10000)`. A zero floor rejects, never becomes1. Independent parity matched token output, quote spent and final square-root price across97 native/fork cases, including both directions, overlapping bands and gaps. Portable historical vectors and focused rounding/sentinel cases live under `test/fixtures/lifecycle-opening-buys.json` and `test/lifecycle-opening-buys.test.mjs`. These conditional curve quotes do not prove conversion, funding or wallet submission.
54
171
 
package/docs/reference.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Use the [launch guide](launch-lifecycle.md) for the end-to-end flow and the
4
4
  [runner reference](../examples/README.md) for environment and recovery artifacts.
5
- This page covers SDK **0.14.1** addresses, limits, wire formats, fees, and diagnostics.
5
+ This page covers SDK **0.16.0** addresses, limits, wire formats, fees, and diagnostics.
6
6
 
7
7
  ## Deployed infrastructure
8
8
 
@@ -20,6 +20,7 @@ start historical log queries there, in chunks of at most **10M blocks**.
20
20
  | `UFG_TREASURY_FACTORY_ADDRESS` | `0x26Aa5D52134c8E6c4C01E9fb53A7568c0C64901F` |
21
21
  | `UFG_UPSTREAM_FACTORY_ADDRESS` | `0xA170b5A58C111334A7237F2Ea2c428ec5022f68E` |
22
22
  | Known deployment `launchLens` | `0xcb4bb3caca71fe52eace8170cf83e901418646f8` |
23
+ | `RAETO_PAYOUT_REGISTRY_ADDRESS` | `0xBEC2C0e91612090F82df6743F31CDF18B4386b50` |
23
24
 
24
25
  `getKnownLifecycleDeployment`, `getKnownLifecycleProfile`, and
25
26
  `listKnownLifecycleProfiles` are pure selectors keyed by chain/core. Unknown
@@ -134,8 +135,8 @@ UFG adds a canonical dynamic tuple via `encodeUfgLaunchConfig`:
134
135
  `decodeUfgLaunchConfig` rejects alternate encodings and extra bytes;
135
136
  `hashUfgLaunchConfig` hashes the tuple. Config6 appends typed `ufgLaunchConfig`
136
137
  for UFG profiles only; Abyss carries no UFG tail. Full plan hashes bind every
137
- auxiliary tail. HMM/UFG constructor economics hash the zero-salt prefix; the
138
- auto-compounding profiles below hash the zero-salt prefix **and** their tail.
138
+ auxiliary tail. HMM/UFG/Raeto constructor economics hash the zero-salt prefix;
139
+ auto-compounding profiles hash the zero-salt prefix **and** their tail.
139
140
 
140
141
  ## Auto-compounding profiles
141
142
 
@@ -160,7 +161,7 @@ The disabled `0x1e41…1d68` / `0x53dd…e0d7` profiles are not supported.
160
161
  `AUTO_COMPOUND_CONFIG_VERSION = keccak256("black-market.auto-compound.config.v1")`.
161
162
  The decoder requires the exact version, length and canonical narrow-integer
162
163
  padding. Config6's typed `autoCompoundConfig` selects this tail only for these
163
- two profiles; HMM and UFG tails cannot be combined with it.
164
+ two profiles; HMM, UFG and Raeto tails cannot be combined with it.
164
165
  `validateAutoCompoundConfig`, the market codec and `validateV4LifecycleMarket`
165
166
  reject invalid shares; the market boundaries also require zero LP/developer fees.
166
167
  Both InputToken and QuoteOnly fee modes are supported.
@@ -170,6 +171,60 @@ for these profiles. Never mine against a prefix-only commitment or append a shar
170
171
  after mining. Use [the launch guide](launch-lifecycle.md#configure-auto-compounding)
171
172
  for selection and gas behavior.
172
173
 
174
+ ## Raeto profiles
175
+
176
+ All of the following are exported from `@black-market/sdk/lifecycle` (and the
177
+ root). These presets are supported on the known Robinhood 4663 deployment.
178
+
179
+ | Profile key / identity constant | Profile ID |
180
+ | --- | --- |
181
+ | `V4RaetoFixedPool` / `RAETO_FIXED_PROFILE_ID` | `0x9161833b162e7ca8160b11c64aedb307561e19a9136fd32f99cd797aab6da3ca` |
182
+ | `V4RaetoDynamicPool` / `RAETO_DYNAMIC_PROFILE_ID` | `0x08387d00ee4f75f860810cc8fb434087328592c2f39ea3321109e589039f80e1` |
183
+
184
+ `RAETO_FIXED_ADAPTER_ID` is
185
+ `0x911d7ecefe56489d329235e3484829717dc00400d4181902f0f2de45f9338615`;
186
+ `RAETO_DYNAMIC_ADAPTER_ID` is
187
+ `0x8ab9c8c9b8fd4c8bbf12b780d9474463fa0fa52e3b450f0d5f68fd067dc1674d`.
188
+ `isRaetoProfile(profileId)` compares IDs case-insensitively.
189
+ `RAETO_PAYOUT_REGISTRY_ADDRESS` identifies the controller-managed payout registry.
190
+ `RAETO_QUOTE_ASSETS` is the frozen checksummed `[WETH, USDG]` tuple:
191
+ `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73`,
192
+ `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`.
193
+
194
+ `RAETO_SHARE_BPS_OPTIONS` is readonly `[500, 1000, 2500, 5000, 7500]`.
195
+ `RaetoLaunchConfigV1 = { shareBps: number }`, `validateRaetoLaunchConfig`,
196
+ `encodeRaetoLaunchTail` and `decodeRaetoLaunchTail` enforce exactly that menu and
197
+ exactly `abi.encode(uint16 shareBps)` (one 32-byte word). Noncanonical uint16
198
+ padding, extra/missing bytes, zero and non-menu shares throw
199
+ `INVALID_RAETO_CONFIG`. V6 `raetoLaunchConfig` is mutually exclusive with all
200
+ other tails; Raeto requires QuoteOnly, zero LP/developer fees and allowed quotes.
201
+ `validateRaetoLaunchPlan(plan)` checks **every** market and throws
202
+ `INVALID_RAETO_PLAN`, including for wrong profiles/adapters, schemas or quotes.
203
+ It adds no UFG token/reward/proxy restrictions.
204
+
205
+ `raetoFeeCollectorV1Abi` is generated from verified standard-output and includes
206
+ `shareBps()`, `owed(address)`, `launchToken()`, `quoteAsset()`,
207
+ `setShareBps(uint16)`, `claimRaeto(address)` and the exact three Raeto events.
208
+ See [fee ownership and collection semantics](launch-lifecycle.md#configure-raeto).
209
+
210
+ `test/fixtures/raeto-registry-readback.json` preserves admission bytes/receipts,
211
+ runtime hashes, factory metadata, verified ABI provenance and real factory
212
+ `eth_call` share-menu results at **101,180,179**
213
+ (`0xe778e5d89ca2cab5843eedeb8c27b10f5463313d4b95b8971986ac72e297933c`).
214
+ The deployed source commit is `a39c958` (go-live record `02e5cf3`), **not** the
215
+ later local `80ea8c8` share-range change. The generator proves hook creation bytes
216
+ equal the SDK's existing fixed and zero-royalty dynamic bytecode.
217
+
218
+ ```sh
219
+ # Offline, deterministic regeneration from saved evidence (Node 24+):
220
+ node --experimental-transform-types scripts/generate-raeto-presets.mjs
221
+ # Explicit read-only refresh, checking the preserved go-live records:
222
+ node --experimental-transform-types scripts/generate-raeto-presets.mjs \
223
+ --readback /path/to/black-market
224
+ pnpm build
225
+ node --test test/integration/raeto.live.test.mjs
226
+ ```
227
+
173
228
  ## Choose a fee tier
174
229
 
175
230
  One million pips is 100%; 10,000 pips is 1%. Basis points use a 10,000 denominator.
@@ -1,6 +1,6 @@
1
1
  # Run the examples
2
2
 
3
- These commands use the checkout's built `@black-market/sdk` **0.15.1** and viem.
3
+ These commands use the checkout's built `@black-market/sdk` **0.16.0** and viem.
4
4
  Use **Node 24+** for direct TypeScript execution. Start with the one-market
5
5
  `launch-erc20-abyss.ts`; larger cases require staged preparation and a bounded activation.
6
6
  For valuation, token ordering, ranges, and buy protection, read the
@@ -20,7 +20,7 @@ chmod 600 .env
20
20
  Launch wrappers load `.env` from the working directory with `process.loadEnvFile`.
21
21
  Existing environment values take precedence. Values are literal; shell interpolation
22
22
  is not applied. Use the matching SDK version when copying wrappers into a consumer project:
23
- `pnpm add @black-market/sdk@0.14.1 viem`.
23
+ `pnpm add @black-market/sdk@0.16.0 viem`.
24
24
  Copy `launch-example.ts`, `launch-example-support.ts`, and `launch-example-kyber.ts` with the wrapper.
25
25
 
26
26
  ### Configure the environment
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@black-market/sdk",
3
- "version": "0.15.1",
3
+ "version": "0.16.0",
4
4
  "description": "TypeScript SDK for Abyss token launches, swaps, and lending.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,74 @@
1
+ import type { LaunchEnvelopeV2, AdapterRegistrationV1, ProfileRegistrationV1, ProfileTopologyV1 } from "../schema.js";
2
+
3
+ // Generated by scripts/generate-raeto-presets.mjs from admission and registry readback.
4
+ // Robinhood block 101180179, 0xe778e5d89ca2cab5843eedeb8c27b10f5463313d4b95b8971986ac72e297933c; admission 0x3148a6696c36bb1de00f8142b2aa6480681ded86203ffa6486a44c4e985c3b31.
5
+ export const raetoDynamicEnvelope = Object.freeze({
6
+ artifactDigest: "0xd448a4117b78714cc4f96824356c6a90ec666449fde5c57e2b7bbe072f5e4a7a",
7
+ reviewManifestDigest: "0x9edfb13596015293cd41cf887758bb3799b121d680fac092191afcc0d29a6194",
8
+ configBoundsDigest: "0x11ec57e16f972e0ac5f687d4078d785a51de11d421bcf97e2ba129dfd83fe7b4",
9
+ termsDigest: "0x458cf6674ee60f1e56086a12d0d981db2c1ed815109f552318b1d8fd27a80ba2",
10
+ topology: 2,
11
+ configVersion: 6,
12
+ economicVersion: 3,
13
+ capabilities: 123n,
14
+ flags: 0n,
15
+ callbackFlags: 6908,
16
+ callbackMask: 16383,
17
+ protocolTreasury: "0x961981916AB6575C3af3eeCecbf6A3b7Fad7C9e1",
18
+ protocolFeeDenominator: 6,
19
+ beneficiary: "0x7cb44b8693b3C350A2BcD4b681aF85365aa27783",
20
+ maximumDeveloperFeeBps: 0,
21
+ bounds: Object.freeze({
22
+ minimumTickSpacing: 1,
23
+ maximumTickSpacing: 32767,
24
+ maximumPositions: 32,
25
+ maximumOracleCardinality: 4096,
26
+ feeModeFlags: 2,
27
+ }),
28
+ graph: Object.freeze({
29
+ manager: "0x8366a39CC670B4001A1121B8F6A443A643e40951",
30
+ hookRoot: "0x0000000000000000000000000000000000000000",
31
+ oracleFactory: "0xe7feF2BC860B25bbdEB6F6AB96d88bAAa77ddad7",
32
+ locker: "0xBF9005094bDa89d5a119A324d6e609A2d8217C1C",
33
+ collectorFactory: "0x3E201A0d72221A9F8c0AEd06EdAE850E27226166",
34
+ collectorDeployer: "0x796E8899824999f6Da8740f712A709dBC65cbEd7",
35
+ hookDeployer: "0x788b88E46be3051633792896F3000EB2Ca57F97E",
36
+ coreCodeHash: "0x9fb8f46c3b980b9db25dfdb487a69a308a86be145860269b4036a4e74480787b",
37
+ managerCodeHash: "0xbd3881180b547f5fe817545743cfb4343e96b1bc6640dcd70c106b0066e95626",
38
+ hookRuntimeCodeHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
39
+ oracleFactoryCodeHash: "0x974fb5c72d91ccb99f1eb4679a5d4432c82bbaa0906b1c2917ec4da3499b7b98",
40
+ lockerCodeHash: "0x0990b18576da69dcf545010ddd7abc2252018a1bb0406b07a14e55a2315c6b27",
41
+ collectorFactoryCodeHash: "0xf5a1dea71122eeb3db1b925d7311a3bc89609a218ba8501038936c18fde8c892",
42
+ collectorDeployerCodeHash: "0xb2d108fe4ab95e42ca012cc8a48734a0fcf8cb65325e4874568a6d145dc9e617",
43
+ hookDeployerCodeHash: "0xb71fc43dc8000386815e3d1c5c54be6840b83281ca294db9929867d0862d118f",
44
+ hookCreationCodeHash: "0xd448a4117b78714cc4f96824356c6a90ec666449fde5c57e2b7bbe072f5e4a7a",
45
+ codeChunk0: "0x8F8756D9A50fD968a0207a09B997D4ec32525062",
46
+ codeChunk0Hash: "0x818c56bf10ae21129fe54f1b8991d6f807ce4ccef35b34c56251c1fd2d7d623f",
47
+ codeChunk1: "0xdfA2F95713d09a13d1861f09CBD4a94274b18c87",
48
+ codeChunk1Hash: "0xbc73944bfa7e74df5968907a05fe2579a17ab155d3a0db407588d1baff51b4de",
49
+ sharedHookSalt: "0x0000000000000000000000000000000000000000000000000000000000000000",
50
+ }),
51
+ }) satisfies LaunchEnvelopeV2;
52
+ export const raetoDynamicAdapter = Object.freeze({
53
+ implementation: "0xfc1502090D8326AB9b70aa93a01c93bEBb6f4910",
54
+ codeHash: "0x1ee51eb5074c356255713d5f66c9fac07e028a6d20161c623a1f409920598a16",
55
+ capabilities: 123n,
56
+ configVersion: 6,
57
+ enabled: true,
58
+ }) satisfies AdapterRegistrationV1;
59
+ export const raetoDynamicRegistration = Object.freeze({
60
+ adapterId: "0x8ab9c8c9b8fd4c8bbf12b780d9474463fa0fa52e3b450f0d5f68fd067dc1674d",
61
+ configSchema: "0x51c5ca14c40012f78425cd1afb1ea77980da3fed0490a00911a8a4ed34792045",
62
+ dependencyDigest: "0x2709d930b96f60427579a60cb9801b5ce5aadbda95e261a963fc783e4d2036de",
63
+ venue: "0x8366a39CC670B4001A1121B8F6A443A643e40951",
64
+ factory: "0x0000000000000000000000000000000000000000",
65
+ hook: "0x0000000000000000000000000000000000000000",
66
+ capabilities: 123n,
67
+ enabled: true,
68
+ }) satisfies ProfileRegistrationV1;
69
+ export const raetoDynamicTopology = Object.freeze({
70
+ hookTopology: 2,
71
+ configVersion: 6,
72
+ hookDeployer: "0x788b88E46be3051633792896F3000EB2Ca57F97E",
73
+ hookCreationCodeHash: "0xd448a4117b78714cc4f96824356c6a90ec666449fde5c57e2b7bbe072f5e4a7a",
74
+ }) satisfies ProfileTopologyV1;
@@ -0,0 +1,74 @@
1
+ import type { LaunchEnvelopeV2, AdapterRegistrationV1, ProfileRegistrationV1, ProfileTopologyV1 } from "../schema.js";
2
+
3
+ // Generated by scripts/generate-raeto-presets.mjs from admission and registry readback.
4
+ // Robinhood block 101180179, 0xe778e5d89ca2cab5843eedeb8c27b10f5463313d4b95b8971986ac72e297933c; admission 0x99089e4418bcf59fc4a2efb5dd36c95f92331a079401dcfaae36d1c94a08326a.
5
+ export const raetoFixedEnvelope = Object.freeze({
6
+ artifactDigest: "0x11c4c7b1f265ed708b7d53ab828c89d237ca821333daa808f1913986c6f8f1ab",
7
+ reviewManifestDigest: "0x684131bdefed80771e37364f9d5af4969591a31345fbe57c503a4839b4050be2",
8
+ configBoundsDigest: "0x11ec57e16f972e0ac5f687d4078d785a51de11d421bcf97e2ba129dfd83fe7b4",
9
+ termsDigest: "0x22ac34826ee23febf81eb209a7c0ab4c0a44be4744410a3e0b5b1720b93aaacc",
10
+ topology: 2,
11
+ configVersion: 6,
12
+ economicVersion: 3,
13
+ capabilities: 123n,
14
+ flags: 0n,
15
+ callbackFlags: 6908,
16
+ callbackMask: 16383,
17
+ protocolTreasury: "0x961981916AB6575C3af3eeCecbf6A3b7Fad7C9e1",
18
+ protocolFeeDenominator: 6,
19
+ beneficiary: "0x7cb44b8693b3C350A2BcD4b681aF85365aa27783",
20
+ maximumDeveloperFeeBps: 0,
21
+ bounds: Object.freeze({
22
+ minimumTickSpacing: 1,
23
+ maximumTickSpacing: 32767,
24
+ maximumPositions: 32,
25
+ maximumOracleCardinality: 4096,
26
+ feeModeFlags: 2,
27
+ }),
28
+ graph: Object.freeze({
29
+ manager: "0x8366a39CC670B4001A1121B8F6A443A643e40951",
30
+ hookRoot: "0x0000000000000000000000000000000000000000",
31
+ oracleFactory: "0xe7feF2BC860B25bbdEB6F6AB96d88bAAa77ddad7",
32
+ locker: "0x12985Fa618974b45a5de8fA40c1DE90d15E9c5c8",
33
+ collectorFactory: "0xb2f84D9f31cBCfA75E998852B1dCcF176BeaAeDC",
34
+ collectorDeployer: "0xb07558776a71C0b58779F1CAF89775d8E466c173",
35
+ hookDeployer: "0xfdB07076Cab21715244Bc9699A381b4F461157ea",
36
+ coreCodeHash: "0x9fb8f46c3b980b9db25dfdb487a69a308a86be145860269b4036a4e74480787b",
37
+ managerCodeHash: "0xbd3881180b547f5fe817545743cfb4343e96b1bc6640dcd70c106b0066e95626",
38
+ hookRuntimeCodeHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
39
+ oracleFactoryCodeHash: "0x974fb5c72d91ccb99f1eb4679a5d4432c82bbaa0906b1c2917ec4da3499b7b98",
40
+ lockerCodeHash: "0x304fff24ef51d2a583541fcdeddcc2cb256fe6911bbb737d68871195d14e6cc6",
41
+ collectorFactoryCodeHash: "0xe1ee1bfb72f9e652c121945a9ecf312d92258f937b3defd60be34d692fd1487b",
42
+ collectorDeployerCodeHash: "0xb2d108fe4ab95e42ca012cc8a48734a0fcf8cb65325e4874568a6d145dc9e617",
43
+ hookDeployerCodeHash: "0xd291bbfbbf60fb0b5eaf2569a3300408b7ac81f102a092872fd54e76b8bc766a",
44
+ hookCreationCodeHash: "0x11c4c7b1f265ed708b7d53ab828c89d237ca821333daa808f1913986c6f8f1ab",
45
+ codeChunk0: "0x46B4C3a2D205C220A20B4432e857a3254B4D051c",
46
+ codeChunk0Hash: "0xe5f56287276954b21f4211cabf2d9c251aae68836c5fa86ce68091ffccdee26b",
47
+ codeChunk1: "0x629Ab46e20f87db9ae761E75EEa733E0B396638D",
48
+ codeChunk1Hash: "0x76efd61e1a109a85140ce3473c43694a83f490eaac54d18673c17872a5262a47",
49
+ sharedHookSalt: "0x0000000000000000000000000000000000000000000000000000000000000000",
50
+ }),
51
+ }) satisfies LaunchEnvelopeV2;
52
+ export const raetoFixedAdapter = Object.freeze({
53
+ implementation: "0x995Da3cB2b643A9D986f28179F62511BE8757e58",
54
+ codeHash: "0x9b6d2c83d25a6cad137ccab7bbe17c948aa1ce27a03b53ed5a4ac7f18d06d5ec",
55
+ capabilities: 123n,
56
+ configVersion: 6,
57
+ enabled: true,
58
+ }) satisfies AdapterRegistrationV1;
59
+ export const raetoFixedRegistration = Object.freeze({
60
+ adapterId: "0x911d7ecefe56489d329235e3484829717dc00400d4181902f0f2de45f9338615",
61
+ configSchema: "0x51c5ca14c40012f78425cd1afb1ea77980da3fed0490a00911a8a4ed34792045",
62
+ dependencyDigest: "0x52beccb89ebac17f1028986ef4ee2e4646b23edc7779400b82976af7e35bc41c",
63
+ venue: "0x8366a39CC670B4001A1121B8F6A443A643e40951",
64
+ factory: "0x0000000000000000000000000000000000000000",
65
+ hook: "0x0000000000000000000000000000000000000000",
66
+ capabilities: 123n,
67
+ enabled: true,
68
+ }) satisfies ProfileRegistrationV1;
69
+ export const raetoFixedTopology = Object.freeze({
70
+ hookTopology: 2,
71
+ configVersion: 6,
72
+ hookDeployer: "0xfdB07076Cab21715244Bc9699A381b4F461157ea",
73
+ hookCreationCodeHash: "0x11c4c7b1f265ed708b7d53ab828c89d237ca821333daa808f1913986c6f8f1ab",
74
+ }) satisfies ProfileTopologyV1;