@black-market/sdk 0.1.0 → 0.4.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.
- package/README.md +92 -20
- package/dist/abyss.d.ts +4 -2748
- package/dist/abyss.d.ts.map +1 -1
- package/dist/abyss.js +3 -1029
- package/dist/abyss.js.map +1 -1
- package/dist/addresses.d.ts +3 -7
- package/dist/addresses.d.ts.map +1 -1
- package/dist/addresses.js +6 -21
- package/dist/addresses.js.map +1 -1
- package/dist/auction.d.ts +2 -2
- package/dist/auction.d.ts.map +1 -1
- package/dist/auction.js +2 -2
- package/dist/auction.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/launch-api.d.ts +151 -0
- package/dist/launch-api.d.ts.map +1 -0
- package/dist/launch-api.js +117 -0
- package/dist/launch-api.js.map +1 -0
- package/dist/launch.d.ts +23 -185
- package/dist/launch.d.ts.map +1 -1
- package/dist/launch.js +35 -272
- package/dist/launch.js.map +1 -1
- package/dist/lifecycle/abi.d.ts +6391 -0
- package/dist/lifecycle/abi.d.ts.map +1 -0
- package/dist/lifecycle/abi.js +335 -0
- package/dist/lifecycle/abi.js.map +1 -0
- package/dist/lifecycle/authors.d.ts +133 -0
- package/dist/lifecycle/authors.d.ts.map +1 -0
- package/dist/lifecycle/authors.js +217 -0
- package/dist/lifecycle/authors.js.map +1 -0
- package/dist/lifecycle/fork.d.ts +15 -0
- package/dist/lifecycle/fork.d.ts.map +1 -0
- package/dist/lifecycle/fork.js +36 -0
- package/dist/lifecycle/fork.js.map +1 -0
- package/dist/lifecycle/index.d.ts +10 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +10 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/markets.d.ts +349 -0
- package/dist/lifecycle/markets.d.ts.map +1 -0
- package/dist/lifecycle/markets.js +186 -0
- package/dist/lifecycle/markets.js.map +1 -0
- package/dist/lifecycle/planner.d.ts +20 -0
- package/dist/lifecycle/planner.d.ts.map +1 -0
- package/dist/lifecycle/planner.js +481 -0
- package/dist/lifecycle/planner.js.map +1 -0
- package/dist/lifecycle/progress.d.ts +43 -0
- package/dist/lifecycle/progress.d.ts.map +1 -0
- package/dist/lifecycle/progress.js +449 -0
- package/dist/lifecycle/progress.js.map +1 -0
- package/dist/lifecycle/rpc.d.ts +17 -0
- package/dist/lifecycle/rpc.d.ts.map +1 -0
- package/dist/lifecycle/rpc.js +100 -0
- package/dist/lifecycle/rpc.js.map +1 -0
- package/dist/lifecycle/schema.d.ts +1068 -0
- package/dist/lifecycle/schema.d.ts.map +1 -0
- package/dist/lifecycle/schema.js +335 -0
- package/dist/lifecycle/schema.js.map +1 -0
- package/dist/lifecycle/simulation.d.ts +3 -0
- package/dist/lifecycle/simulation.d.ts.map +1 -0
- package/dist/lifecycle/simulation.js +393 -0
- package/dist/lifecycle/simulation.js.map +1 -0
- package/dist/lifecycle/types.d.ts +273 -0
- package/dist/lifecycle/types.d.ts.map +1 -0
- package/dist/lifecycle/types.js +11 -0
- package/dist/lifecycle/types.js.map +1 -0
- package/docs/launch-lifecycle.md +243 -0
- package/package.json +12 -3
- package/src/abyss.ts +3 -1059
- package/src/addresses.ts +9 -26
- package/src/auction.ts +2 -2
- package/src/index.ts +2 -0
- package/src/launch-api.ts +110 -0
- package/src/launch.ts +43 -411
- package/src/lifecycle/abi.ts +343 -0
- package/src/lifecycle/authors.ts +203 -0
- package/src/lifecycle/fork.ts +36 -0
- package/src/lifecycle/index.ts +9 -0
- package/src/lifecycle/markets.ts +205 -0
- package/src/lifecycle/planner.ts +396 -0
- package/src/lifecycle/progress.ts +378 -0
- package/src/lifecycle/rpc.ts +88 -0
- package/src/lifecycle/schema.ts +387 -0
- package/src/lifecycle/simulation.ts +329 -0
- package/src/lifecycle/types.ts +132 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Address, type Hex } from "viem";
|
|
2
|
+
import { type LaunchPlanV1, type MarketIdentityV1, type LaunchEnvelopeV2 } from "./schema.js";
|
|
3
|
+
import { type CanonicalLaunchProgress, type LifecycleBlock, type LifecycleProfile, type LifecycleRpcClient, type PoolBoundHookDeployment, type ReadLaunchProgressOptions } from "./types.js";
|
|
4
|
+
export declare const ABYSS_LIFECYCLE_CONFIG_SCHEMA: `0x${string}`;
|
|
5
|
+
export declare function predictLifecycleToken(options: {
|
|
6
|
+
client: LifecycleRpcClient;
|
|
7
|
+
plan: LaunchPlanV1;
|
|
8
|
+
}): Promise<Address>;
|
|
9
|
+
/** Validate the market-selected registered oracle against the certified factory at the pinned block. */
|
|
10
|
+
export declare function validateV4LifecycleOracle(options: {
|
|
11
|
+
client: LifecycleRpcClient;
|
|
12
|
+
envelope: LaunchEnvelopeV2;
|
|
13
|
+
oracleConfigId: Hex;
|
|
14
|
+
block: LifecycleBlock;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export declare function readLifecycleProfiles(options: {
|
|
17
|
+
client: LifecycleRpcClient;
|
|
18
|
+
orchestrator: Address;
|
|
19
|
+
profileIds?: readonly Hex[];
|
|
20
|
+
offset?: bigint;
|
|
21
|
+
limit?: bigint;
|
|
22
|
+
}, pinnedBlock?: LifecycleBlock): Promise<LifecycleProfile[]>;
|
|
23
|
+
/** Works with an unmined candidate salt and after preparation; never accepts a caller-selected root. */
|
|
24
|
+
export declare function readPoolBoundHookDeployment(options: {
|
|
25
|
+
client: LifecycleRpcClient;
|
|
26
|
+
plan: LaunchPlanV1;
|
|
27
|
+
marketIndex: number;
|
|
28
|
+
}, pinnedBlock?: LifecycleBlock): Promise<PoolBoundHookDeployment>;
|
|
29
|
+
/** Optional permissionless predeployment calldata; no token deployment, pool registration or wallet broadcast. */
|
|
30
|
+
export declare function buildPoolBoundHookDeploymentTransaction(options: {
|
|
31
|
+
client: LifecycleRpcClient;
|
|
32
|
+
plan: LaunchPlanV1;
|
|
33
|
+
marketIndex: number;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
to: Address;
|
|
36
|
+
data: Hex;
|
|
37
|
+
value: bigint;
|
|
38
|
+
deployment: PoolBoundHookDeployment;
|
|
39
|
+
}>;
|
|
40
|
+
export declare function validateLifecycleMarketIdentity(identity: MarketIdentityV1, plan: LaunchPlanV1, token: Address, marketIndex: number): void;
|
|
41
|
+
/** Reads confirmation-bound canonical state and receipt provenance; local step counters are never used. */
|
|
42
|
+
export declare function readLaunchProgress(options: ReadLaunchProgressOptions, pinnedBlock?: LifecycleBlock): Promise<CanonicalLaunchProgress>;
|
|
43
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lifecycle/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgI,KAAK,OAAO,EAAa,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAGvL,OAAO,EAAgT,KAAK,YAAY,EAAyB,KAAK,gBAAgB,EAAqG,KAAK,gBAAgB,EAAgC,MAAM,aAAa,CAAC;AAEpiB,OAAO,EAA0B,KAAK,uBAAuB,EAAE,KAAK,cAAc,EAAgC,KAAK,gBAAgB,EAA+D,KAAK,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEhT,eAAO,MAAM,6BAA6B,eAA2F,CAAC;AAEtI,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAKzH;AAsGD,wGAAwG;AACxG,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,MAAM,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAC;IAAC,cAAc,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;CACpG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsCnO;AAmED,wGAAwG;AACxG,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOlM;AAED,kHAAkH;AAClH,wBAAsB,uCAAuC,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAQvO;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAYzI;AAkED,2GAA2G;AAC3G,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA4C3I"}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { concatHex, decodeFunctionData, encodeAbiParameters, encodeFunctionData, keccak256, stringToHex, toHex, zeroAddress, zeroHash } from "viem";
|
|
2
|
+
import { abyssLifecycleAdapterAbi, launchLifecycleAbi, lifecycleAdapterAbi, lifecycleDirectoryAbi, lifecycleErc20Abi, lifecycleOracleFactoryAbi, lifecycleRegistryAbi, poolFeeCollectorFactoryV1Abi, lifecycleV4HookAbi, lifecycleV4LockerAbi, poolHookDeployerV1Abi, sharedHookDeployerV1Abi, poolBoundLaunchFeeHookV1Abi, poolMarketAdapterV1Abi, sharedMarketAdapterV1Abi } from "./abi.js";
|
|
3
|
+
import { decodePoolBoundV4LifecycleMarketConfig, encodePoolBoundHookParameters, hasLifecycleV4HookPermissions, hashPoolBoundV4MarketCommitment, poolBoundHookInitCodeHash, predictPoolBoundHookAddress, validateV4LifecycleMarket, V4_LIFECYCLE_CONFIG_SCHEMA, V4_POOL_BOUND_LIFECYCLE_CONFIG_SCHEMA } from "./markets.js";
|
|
4
|
+
import { hashLaunchIdentity, hashLaunchPlan, hashLaunchBounds, hashLaunchDependencies, hashLifecycleProfile, launchProgressV1Components, LifecycleMode, LifecyclePhase, LifecycleVenue, LIFECYCLE_REQUIRED_CAPABILITIES, LIFECYCLE_ERC404_CAPABILITY, LIFECYCLE_MULTI_POSITION_CAPABILITY } from "./schema.js";
|
|
5
|
+
import { assertLifecycleBlock, lifecycleRpc, readLifecycleBlock, readLifecycleContract, readLifecycleProfileTopology, rpcHex, rpcObject, rpcQuantity } from "./rpc.js";
|
|
6
|
+
import { LifecyclePlanningError } from "./types.js";
|
|
7
|
+
export const ABYSS_LIFECYCLE_CONFIG_SCHEMA = keccak256(stringToHex("(uint8,uint24,bytes32,uint160,(int24,int24,uint128,uint256)[])"));
|
|
8
|
+
export async function predictLifecycleToken(options) {
|
|
9
|
+
const block = await readLifecycleBlock(options.client);
|
|
10
|
+
const token = await readLifecycleContract(options.client, options.plan.orchestrator, launchLifecycleAbi, "predictToken", [options.plan], block);
|
|
11
|
+
await assertLifecycleBlock(options.client, block);
|
|
12
|
+
return token;
|
|
13
|
+
}
|
|
14
|
+
async function readDependencyCode(client, address, block) {
|
|
15
|
+
const code = rpcHex(await lifecycleRpc(client, "eth_getCode", [address, toHex(block.number)]), "lifecycle dependency code");
|
|
16
|
+
if (address === zeroAddress || code === "0x")
|
|
17
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", `Lifecycle dependency ${address} has no deployed code`);
|
|
18
|
+
return code;
|
|
19
|
+
}
|
|
20
|
+
async function certifyLifecycleProfile(client, orchestrator, registry, id, registration, adapter, topology, envelope, block, chainId) {
|
|
21
|
+
const shared = registration.configSchema.toLowerCase() === V4_LIFECYCLE_CONFIG_SCHEMA.toLowerCase();
|
|
22
|
+
const bound = registration.configSchema.toLowerCase() === V4_POOL_BOUND_LIFECYCLE_CONFIG_SCHEMA.toLowerCase();
|
|
23
|
+
const abyss = registration.configSchema.toLowerCase() === ABYSS_LIFECYCLE_CONFIG_SCHEMA.toLowerCase();
|
|
24
|
+
if (!shared && !bound && !abyss)
|
|
25
|
+
throw new LifecyclePlanningError("UNSUPPORTED_SCHEMA", `Unsupported lifecycle config schema ${registration.configSchema}`);
|
|
26
|
+
const version = shared ? 4 : bound ? 5 : 1;
|
|
27
|
+
if (adapter.configVersion !== version || topology.configVersion !== version || topology.hookTopology !== (shared ? 1 : bound ? 2 : 0))
|
|
28
|
+
throw new LifecyclePlanningError("UNCERTIFIED_TOPOLOGY", "Registry topology/version differs from the supported config schema");
|
|
29
|
+
const implementationCode = await readDependencyCode(client, adapter.implementation, block);
|
|
30
|
+
if (keccak256(implementationCode).toLowerCase() !== adapter.codeHash.toLowerCase())
|
|
31
|
+
throw new LifecyclePlanningError("PROFILE_CODE_HASH", "Adapter code hash differs from immutable registry approval");
|
|
32
|
+
const authority = await readLifecycleContract(client, adapter.implementation, lifecycleAdapterAbi, "core", [], block);
|
|
33
|
+
const digest = await readLifecycleContract(client, adapter.implementation, lifecycleAdapterAbi, "dependencyDigest", [], block);
|
|
34
|
+
if (authority.toLowerCase() !== orchestrator.toLowerCase() || digest.toLowerCase() !== registration.dependencyDigest.toLowerCase())
|
|
35
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Adapter authority or dependency digest differs from immutable registry approval");
|
|
36
|
+
if (abyss) {
|
|
37
|
+
if (topology.hookDeployer !== zeroAddress || topology.hookCreationCodeHash !== zeroHash)
|
|
38
|
+
throw new LifecyclePlanningError("UNCERTIFIED_TOPOLOGY", "Abyss does not admit a V4 hook deployment graph");
|
|
39
|
+
const factory = await readLifecycleContract(client, adapter.implementation, abyssLifecycleAdapterAbi, "factory", [], block);
|
|
40
|
+
const schema = await readLifecycleContract(client, adapter.implementation, abyssLifecycleAdapterAbi, "CONFIG_SCHEMA", [], block);
|
|
41
|
+
const actualVersion = await readLifecycleContract(client, adapter.implementation, abyssLifecycleAdapterAbi, "CONFIG_VERSION", [], block);
|
|
42
|
+
const domain = keccak256(stringToHex("BLACK_MARKET_ABYSS_CANONICAL_PROFILE_V1"));
|
|
43
|
+
const known = [0, 1, 2, 3].some((variant) => keccak256(encodeAbiParameters([{ type: "bytes32" }, { type: "uint256" }, { type: "address" }, { type: "uint8" }], [domain, chainId, factory, variant])).toLowerCase() === id.toLowerCase());
|
|
44
|
+
if (!known || schema.toLowerCase() !== ABYSS_LIFECYCLE_CONFIG_SCHEMA.toLowerCase() || actualVersion !== 1 || registration.factory.toLowerCase() !== factory.toLowerCase() || registration.venue.toLowerCase() !== factory.toLowerCase() || registration.hook !== zeroAddress)
|
|
45
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Abyss profile is not the exact canonical factory/variant/schema binding");
|
|
46
|
+
await readDependencyCode(client, factory, block);
|
|
47
|
+
return { topology };
|
|
48
|
+
}
|
|
49
|
+
if (envelope === undefined || envelope.topology !== topology.hookTopology || envelope.configVersion !== version || envelope.economicVersion !== 3 ||
|
|
50
|
+
envelope.flags !== 0n || envelope.callbackFlags !== 0x1afc || envelope.callbackMask !== 0x3fff ||
|
|
51
|
+
envelope.artifactDigest === zeroHash || envelope.reviewManifestDigest === zeroHash || envelope.termsDigest === zeroHash ||
|
|
52
|
+
hashLifecycleProfile(envelope).toLowerCase() !== id.toLowerCase() ||
|
|
53
|
+
hashLaunchBounds(envelope.bounds).toLowerCase() !== envelope.configBoundsDigest.toLowerCase() ||
|
|
54
|
+
envelope.capabilities !== registration.capabilities || envelope.capabilities !== adapter.capabilities ||
|
|
55
|
+
(envelope.capabilities & ~(LIFECYCLE_REQUIRED_CAPABILITIES | LIFECYCLE_ERC404_CAPABILITY | LIFECYCLE_MULTI_POSITION_CAPABILITY)) !== 0n) {
|
|
56
|
+
throw new LifecyclePlanningError("PROFILE_ENVELOPE", "Frozen reviewed profile identity, bounds, capabilities or economic version differs from registry admission");
|
|
57
|
+
}
|
|
58
|
+
const b = envelope.bounds;
|
|
59
|
+
if (b.minimumTickSpacing < 1 ||
|
|
60
|
+
b.maximumTickSpacing > 32767 || b.minimumTickSpacing > b.maximumTickSpacing || b.maximumPositions < 1 || b.maximumPositions > 32 ||
|
|
61
|
+
b.maximumOracleCardinality < 2 || b.maximumOracleCardinality > 4096 || b.feeModeFlags === 0 || (b.feeModeFlags & ~3) !== 0 ||
|
|
62
|
+
envelope.protocolTreasury === zeroAddress || (envelope.protocolFeeDenominator !== 0 && (envelope.protocolFeeDenominator < 4 || envelope.protocolFeeDenominator > 10)))
|
|
63
|
+
throw new LifecyclePlanningError("PROFILE_BOUNDS", "Registry envelope has unsupported executable bounds");
|
|
64
|
+
const abi = bound ? poolMarketAdapterV1Abi : sharedMarketAdapterV1Abi;
|
|
65
|
+
for (const [getter, expected] of [["PROFILE_ID", id], ["CONFIG_SCHEMA", registration.configSchema], ["implementationRegistry", registry]]) {
|
|
66
|
+
const actual = await readLifecycleContract(client, adapter.implementation, abi, getter, [], block);
|
|
67
|
+
if (actual.toLowerCase() !== expected.toLowerCase())
|
|
68
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed adapter metadata differs from registry certification");
|
|
69
|
+
}
|
|
70
|
+
if (await readLifecycleContract(client, adapter.implementation, abi, "CONFIG_VERSION", [], block) !== version)
|
|
71
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed adapter config version differs from certification");
|
|
72
|
+
const g = envelope.graph;
|
|
73
|
+
if (registration.factory !== zeroAddress || registration.venue.toLowerCase() !== g.manager.toLowerCase() || registration.hook.toLowerCase() !== g.hookRoot.toLowerCase() ||
|
|
74
|
+
topology.hookDeployer.toLowerCase() !== g.hookDeployer.toLowerCase() || topology.hookCreationCodeHash.toLowerCase() !== g.hookCreationCodeHash.toLowerCase())
|
|
75
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed venue/topology differs from the frozen envelope graph");
|
|
76
|
+
for (const [getter, expected] of [["poolManager", g.manager], ["hookRoot", g.hookRoot], ["oracleFactory", g.oracleFactory], ["locker", g.locker], ["collectorFactory", g.collectorFactory], ["hookDeployer", g.hookDeployer]]) {
|
|
77
|
+
const actual = await readLifecycleContract(client, adapter.implementation, abi, getter, [], block);
|
|
78
|
+
if (actual.toLowerCase() !== expected.toLowerCase())
|
|
79
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Live adapter dependency differs from the frozen reviewed graph");
|
|
80
|
+
}
|
|
81
|
+
for (const [address, expectedHash] of [[orchestrator, g.coreCodeHash], [g.manager, g.managerCodeHash], [g.oracleFactory, g.oracleFactoryCodeHash],
|
|
82
|
+
[g.locker, g.lockerCodeHash], [g.collectorFactory, g.collectorFactoryCodeHash], [g.collectorDeployer, g.collectorDeployerCodeHash],
|
|
83
|
+
[g.hookDeployer, g.hookDeployerCodeHash]]) {
|
|
84
|
+
if (keccak256(await readDependencyCode(client, address, block)).toLowerCase() !== expectedHash.toLowerCase())
|
|
85
|
+
throw new LifecyclePlanningError("PROFILE_CODE_HASH", "Live runtime differs from the frozen reviewed graph hash");
|
|
86
|
+
}
|
|
87
|
+
const collectorDeployer = await readLifecycleContract(client, g.collectorFactory, poolFeeCollectorFactoryV1Abi, "collectorDeployer", [], block);
|
|
88
|
+
const launcher = await readLifecycleContract(client, g.locker, lifecycleV4LockerAbi, "launcher", [], block);
|
|
89
|
+
const lockerManager = await readLifecycleContract(client, g.locker, lifecycleV4LockerAbi, "poolManager", [], block);
|
|
90
|
+
if (collectorDeployer.toLowerCase() !== g.collectorDeployer.toLowerCase() || launcher.toLowerCase() !== adapter.implementation.toLowerCase() ||
|
|
91
|
+
lockerManager.toLowerCase() !== g.manager.toLowerCase() || g.locker.toLowerCase() === g.manager.toLowerCase() || g.locker.toLowerCase() === g.hookRoot.toLowerCase())
|
|
92
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed collector or locker authority differs from the frozen graph");
|
|
93
|
+
const deployerAbi = shared ? sharedHookDeployerV1Abi : poolHookDeployerV1Abi;
|
|
94
|
+
const creationCodeHash = await readLifecycleContract(client, g.hookDeployer, deployerAbi, "creationCodeHash", [], block);
|
|
95
|
+
const chunk0 = await readLifecycleContract(client, g.hookDeployer, deployerAbi, "codeChunk0", [], block);
|
|
96
|
+
const chunk1 = await readLifecycleContract(client, g.hookDeployer, deployerAbi, "codeChunk1", [], block);
|
|
97
|
+
const chunk0Code = await readDependencyCode(client, chunk0, block);
|
|
98
|
+
const chunk1Code = chunk1 === zeroAddress ? "0x" : await readDependencyCode(client, chunk1, block);
|
|
99
|
+
if (chunk0.toLowerCase() !== g.codeChunk0.toLowerCase() || chunk1.toLowerCase() !== g.codeChunk1.toLowerCase() || chunk0.toLowerCase() === chunk1.toLowerCase() ||
|
|
100
|
+
!chunk0Code.startsWith("0x00") || chunk0Code.length <= 4 || (chunk0Code.length - 2) / 2 > 24576 ||
|
|
101
|
+
(chunk1 !== zeroAddress && (!chunk1Code.startsWith("0x00") || chunk1Code.length <= 4 || (chunk1Code.length - 2) / 2 > 24576 || (chunk0Code.length - 2) / 2 !== 24576)) ||
|
|
102
|
+
keccak256(chunk0Code).toLowerCase() !== g.codeChunk0Hash.toLowerCase() || (chunk1 === zeroAddress ? zeroHash : keccak256(chunk1Code)).toLowerCase() !== g.codeChunk1Hash.toLowerCase())
|
|
103
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed deployer chunks differ from exact immutable STOP-prefixed bytecode evidence");
|
|
104
|
+
const creationCode = concatHex([`0x${chunk0Code.slice(4)}`, chunk1 === zeroAddress ? "0x" : `0x${chunk1Code.slice(4)}`]);
|
|
105
|
+
if ((creationCode.length - 2) / 2 + (shared ? 96 : 576) > 49152 || creationCodeHash === zeroHash ||
|
|
106
|
+
creationCodeHash.toLowerCase() !== g.hookCreationCodeHash.toLowerCase() || keccak256(creationCode).toLowerCase() !== creationCodeHash.toLowerCase() ||
|
|
107
|
+
hashLaunchDependencies({ chainId, core: orchestrator, registry, registrar: adapter.implementation, graph: g }).toLowerCase() !== digest.toLowerCase())
|
|
108
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Reviewed creation artifact, constructor bound or graph digest differs from admission");
|
|
109
|
+
if (shared) {
|
|
110
|
+
const rootCode = await readDependencyCode(client, g.hookRoot, block);
|
|
111
|
+
const recordedHash = await readLifecycleContract(client, g.hookDeployer, deployerAbi, "deployedCodeHash", [g.hookRoot], block);
|
|
112
|
+
const initCodeHash = keccak256(concatHex([creationCode, encodeAbiParameters([{ type: "address" }, { type: "address" }, { type: "address" }], [g.manager, adapter.implementation, g.oracleFactory])]));
|
|
113
|
+
const prediction = predictPoolBoundHookAddress({ deployer: g.hookDeployer, initCodeHash, salt: g.sharedHookSalt });
|
|
114
|
+
const remotePrediction = await readLifecycleContract(client, g.hookDeployer, sharedHookDeployerV1Abi, "predict", [g.manager, adapter.implementation, g.oracleFactory, g.sharedHookSalt], block);
|
|
115
|
+
if (recordedHash === zeroHash || recordedHash.toLowerCase() !== g.hookRuntimeCodeHash.toLowerCase() || keccak256(rootCode).toLowerCase() !== recordedHash.toLowerCase() ||
|
|
116
|
+
!hasLifecycleV4HookPermissions(g.hookRoot) || prediction.toLowerCase() !== g.hookRoot.toLowerCase() || remotePrediction.toLowerCase() !== prediction.toLowerCase())
|
|
117
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Shared root lacks exact typed-deployer runtime and constructor/salt provenance");
|
|
118
|
+
for (const [getter, expected] of [["registrar", adapter.implementation], ["poolManager", g.manager], ["oracleFactory", g.oracleFactory]]) {
|
|
119
|
+
if ((await readLifecycleContract(client, g.hookRoot, lifecycleV4HookAbi, getter, [], block)).toLowerCase() !== expected.toLowerCase())
|
|
120
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Shared hook immutable graph differs from admission");
|
|
121
|
+
}
|
|
122
|
+
if (await readLifecycleContract(client, g.hookRoot, lifecycleV4HookAbi, "REQUIRED_HOOK_FLAGS", [], block) !== 0x1afcn ||
|
|
123
|
+
await readLifecycleContract(client, g.hookRoot, lifecycleV4HookAbi, "ALL_HOOK_MASK", [], block) !== 0x3fffn)
|
|
124
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Shared hook callbacks differ from admission");
|
|
125
|
+
}
|
|
126
|
+
else if (g.hookRoot !== zeroAddress || g.hookRuntimeCodeHash !== zeroHash || g.sharedHookSalt !== zeroHash)
|
|
127
|
+
throw new LifecyclePlanningError("PROFILE_DEPENDENCY", "Bound topology cannot reuse a shared root");
|
|
128
|
+
if ([zeroAddress, orchestrator, registry, adapter.implementation, g.manager, g.hookRoot, g.locker, g.collectorFactory, g.collectorDeployer, g.hookDeployer].some((address) => address.toLowerCase() === envelope.beneficiary.toLowerCase()))
|
|
129
|
+
throw new LifecyclePlanningError("PROFILE_TERMS", "Stable author identity is an excluded reviewed graph destination");
|
|
130
|
+
return { topology, boundGraph: bound ? { manager: g.manager, oracleFactory: g.oracleFactory, locker: g.locker, collectorFactory: g.collectorFactory, deployer: g.hookDeployer, creationCode } : undefined };
|
|
131
|
+
}
|
|
132
|
+
/** Validate the market-selected registered oracle against the certified factory at the pinned block. */
|
|
133
|
+
export async function validateV4LifecycleOracle(options) {
|
|
134
|
+
const { client, envelope, oracleConfigId, block } = options;
|
|
135
|
+
if (oracleConfigId.toLowerCase() === zeroHash)
|
|
136
|
+
throw new LifecyclePlanningError("INVALID_ORACLE_CONFIG", "Market oracle configuration must be nonzero");
|
|
137
|
+
const [move, cardinality] = await readLifecycleContract(client, envelope.graph.oracleFactory, lifecycleOracleFactoryAbi, "oracleConfigs", [oracleConfigId], block);
|
|
138
|
+
if (move <= 0 || move > 887272 || cardinality < 2 || cardinality > envelope.bounds.maximumOracleCardinality) {
|
|
139
|
+
throw new LifecyclePlanningError("INVALID_ORACLE_CONFIG", "Selected market oracle is unregistered or exceeds the admitted cardinality bounds");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function readLifecycleProfiles(options, pinnedBlock) {
|
|
143
|
+
const block = pinnedBlock ?? await readLifecycleBlock(options.client);
|
|
144
|
+
const chainId = rpcQuantity(await lifecycleRpc(options.client, "eth_chainId"), "chain ID");
|
|
145
|
+
const registry = await readLifecycleContract(options.client, options.orchestrator, launchLifecycleAbi, "registry", [], block);
|
|
146
|
+
if ((await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "core", [], block)).toLowerCase() !== options.orchestrator.toLowerCase())
|
|
147
|
+
throw new LifecyclePlanningError("REGISTRY_BINDING", "Registry is not bound to the selected lifecycle orchestrator");
|
|
148
|
+
const offset = options.offset ?? 0n;
|
|
149
|
+
const limit = options.limit ?? 100n;
|
|
150
|
+
if (offset < 0n || limit < 0n || limit > 100n)
|
|
151
|
+
throw new LifecyclePlanningError("INVALID_PROFILE_PAGE", "Registry profile pages require unsigned offset and limit at most 100");
|
|
152
|
+
const ids = options.profileIds ?? await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "profileIds", [offset, limit], block);
|
|
153
|
+
const protocolMaximumDeveloperFeeBps = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "protocolMaximumDeveloperFeeBps", [], block);
|
|
154
|
+
const profiles = [];
|
|
155
|
+
for (const id of ids) {
|
|
156
|
+
const registration = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "profile", [id], block);
|
|
157
|
+
const adapter = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "adapter", [registration.adapterId], block);
|
|
158
|
+
const schema = registration.configSchema.toLowerCase();
|
|
159
|
+
const venueKind = schema === V4_LIFECYCLE_CONFIG_SCHEMA.toLowerCase() || schema === V4_POOL_BOUND_LIFECYCLE_CONFIG_SCHEMA.toLowerCase() ? "uniswap-v4" : schema === ABYSS_LIFECYCLE_CONFIG_SCHEMA.toLowerCase() ? "abyss" : "unknown";
|
|
160
|
+
let topology = { hookTopology: 0, configVersion: adapter.configVersion, hookDeployer: zeroAddress, hookCreationCodeHash: zeroHash };
|
|
161
|
+
let envelope;
|
|
162
|
+
let developerTerms;
|
|
163
|
+
let admitted = false;
|
|
164
|
+
let reason;
|
|
165
|
+
try {
|
|
166
|
+
if (venueKind === "unknown")
|
|
167
|
+
throw new LifecyclePlanningError("UNSUPPORTED_SCHEMA", `Unsupported lifecycle config schema ${registration.configSchema}`);
|
|
168
|
+
topology = await readLifecycleProfileTopology(options.client, registry, id, block);
|
|
169
|
+
if (venueKind === "uniswap-v4") {
|
|
170
|
+
envelope = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "profileEnvelope", [id], block);
|
|
171
|
+
const [implementation, beneficiary, maximumDeveloperFeeBps, termsDigest, enabled] = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "developerTerms", [id], block);
|
|
172
|
+
developerTerms = { adapter: implementation, beneficiary, maximumDeveloperFeeBps, termsDigest, enabled };
|
|
173
|
+
if (implementation.toLowerCase() !== adapter.implementation.toLowerCase() || beneficiary.toLowerCase() !== envelope.beneficiary.toLowerCase() ||
|
|
174
|
+
termsDigest.toLowerCase() !== envelope.termsDigest.toLowerCase() || maximumDeveloperFeeBps !== envelope.maximumDeveloperFeeBps ||
|
|
175
|
+
maximumDeveloperFeeBps > protocolMaximumDeveloperFeeBps)
|
|
176
|
+
throw new LifecyclePlanningError("PROFILE_TERMS", "Registry developer terms differ from the frozen reviewed envelope");
|
|
177
|
+
}
|
|
178
|
+
await certifyLifecycleProfile(options.client, options.orchestrator, registry, id, registration, adapter, topology, envelope, block, chainId);
|
|
179
|
+
const eligible = await readLifecycleContract(options.client, registry, lifecycleRegistryAbi, "requireEligible", [registration.adapterId, id, topology.configVersion, LIFECYCLE_REQUIRED_CAPABILITIES], block);
|
|
180
|
+
if (eligible.toLowerCase() !== adapter.implementation.toLowerCase() || (developerTerms !== undefined && !developerTerms.enabled))
|
|
181
|
+
throw new LifecyclePlanningError("INELIGIBLE_PROFILE", "Registry refuses this profile for pending source admission");
|
|
182
|
+
admitted = true;
|
|
183
|
+
}
|
|
184
|
+
catch (failure) {
|
|
185
|
+
reason = failure instanceof Error ? failure.message : String(failure);
|
|
186
|
+
}
|
|
187
|
+
profiles.push({ id, registration, adapter, topology, envelope, developerTerms, protocolMaximumDeveloperFeeBps: venueKind === "uniswap-v4" ? protocolMaximumDeveloperFeeBps : undefined, admitted, reason, venueKind });
|
|
188
|
+
}
|
|
189
|
+
if (pinnedBlock === undefined)
|
|
190
|
+
await assertLifecycleBlock(options.client, block);
|
|
191
|
+
return profiles;
|
|
192
|
+
}
|
|
193
|
+
async function readPoolBoundHookDeploymentDetails(options, block) {
|
|
194
|
+
const { client, plan, marketIndex } = options;
|
|
195
|
+
const market = plan.markets[marketIndex];
|
|
196
|
+
if (market === undefined || market.configVersion !== 5)
|
|
197
|
+
throw new LifecyclePlanningError("INVALID_BOUND_MARKET", "Market index must select reviewed pool-bound config version 5");
|
|
198
|
+
const chainId = rpcQuantity(await lifecycleRpc(client, "eth_chainId"), "chain ID");
|
|
199
|
+
if (chainId !== plan.chainId)
|
|
200
|
+
throw new LifecyclePlanningError("CHAIN_MISMATCH", "RPC chain differs from the committed plan");
|
|
201
|
+
const registry = await readLifecycleContract(client, plan.orchestrator, launchLifecycleAbi, "registry", [], block);
|
|
202
|
+
if ((await readLifecycleContract(client, registry, lifecycleRegistryAbi, "core", [], block)).toLowerCase() !== plan.orchestrator.toLowerCase())
|
|
203
|
+
throw new LifecyclePlanningError("REGISTRY_BINDING", "Registry is not bound to this lifecycle core");
|
|
204
|
+
const registration = await readLifecycleContract(client, registry, lifecycleRegistryAbi, "profile", [market.profileId], block);
|
|
205
|
+
const adapter = await readLifecycleContract(client, registry, lifecycleRegistryAbi, "adapter", [registration.adapterId], block);
|
|
206
|
+
if (registration.adapterId.toLowerCase() !== market.adapterId.toLowerCase())
|
|
207
|
+
throw new LifecyclePlanningError("INVALID_BOUND_MARKET", "Market adapter differs from the profile's immutable registration");
|
|
208
|
+
const recorded = await readLifecycleProfileTopology(client, registry, market.profileId, block);
|
|
209
|
+
const envelope = await readLifecycleContract(client, registry, lifecycleRegistryAbi, "profileEnvelope", [market.profileId], block);
|
|
210
|
+
const [implementation, beneficiary, maximumDeveloperFeeBps, termsDigest, enabled] = await readLifecycleContract(client, registry, lifecycleRegistryAbi, "developerTerms", [market.profileId], block);
|
|
211
|
+
const protocolMaximumDeveloperFeeBps = await readLifecycleContract(client, registry, lifecycleRegistryAbi, "protocolMaximumDeveloperFeeBps", [], block);
|
|
212
|
+
const { boundGraph } = await certifyLifecycleProfile(client, plan.orchestrator, registry, market.profileId, registration, adapter, recorded, envelope, block, chainId);
|
|
213
|
+
if (boundGraph === undefined)
|
|
214
|
+
throw new LifecyclePlanningError("UNCERTIFIED_TOPOLOGY", "Market does not have a certified pool-bound deployer graph");
|
|
215
|
+
const token = await readLifecycleContract(client, plan.orchestrator, launchLifecycleAbi, "predictToken", [plan], block);
|
|
216
|
+
const config = decodePoolBoundV4LifecycleMarketConfig(market.config);
|
|
217
|
+
validateV4LifecycleMarket({ market, config, token, profile: {
|
|
218
|
+
id: market.profileId, registration, adapter, topology: recorded, envelope,
|
|
219
|
+
developerTerms: { adapter: implementation, beneficiary, maximumDeveloperFeeBps, termsDigest, enabled },
|
|
220
|
+
protocolMaximumDeveloperFeeBps, venueKind: "uniswap-v4", admitted: enabled,
|
|
221
|
+
} });
|
|
222
|
+
await validateV4LifecycleOracle({ client, envelope, oracleConfigId: config.oracleConfigId, block });
|
|
223
|
+
const expected = {
|
|
224
|
+
poolManager: boundGraph.manager, registrar: adapter.implementation, oracleFactory: boundGraph.oracleFactory, core: plan.orchestrator,
|
|
225
|
+
liquidityLocker: boundGraph.locker, token, quoteCurrency: market.quoteAsset, lpFeePips: config.lpFeePips, tickSpacing: config.tickSpacing,
|
|
226
|
+
sqrtPriceX96: config.sqrtPriceX96, hookFeePips: config.hookFeePips, feeMode: config.feeMode, protocolFeeDenominator: config.protocolFeeDenominator,
|
|
227
|
+
treasury: config.treasury, externalLiquidityDisabled: config.externalLiquidityDisabled, oracleConfigId: config.oracleConfigId,
|
|
228
|
+
marketCommitment: hashPoolBoundV4MarketCommitment({ chainId, core: plan.orchestrator, registrar: adapter.implementation, token, market }),
|
|
229
|
+
expectedPositionCount: config.positions.length,
|
|
230
|
+
};
|
|
231
|
+
const [parameters, parameterSalt] = await readLifecycleContract(client, boundGraph.collectorFactory, poolFeeCollectorFactoryV1Abi, "poolBoundHookParameters", [adapter.implementation, token, market], block);
|
|
232
|
+
const [deployer, initCodeHash, salt, predictedHook] = await readLifecycleContract(client, adapter.implementation, poolMarketAdapterV1Abi, "hookDeploymentMetadata", [token, market], block);
|
|
233
|
+
const remoteInitCodeHash = await readLifecycleContract(client, boundGraph.deployer, poolHookDeployerV1Abi, "initCodeHash", [expected], block);
|
|
234
|
+
const remotePrediction = await readLifecycleContract(client, boundGraph.deployer, poolHookDeployerV1Abi, "predict", [expected, config.hookSalt], block);
|
|
235
|
+
const localInitCodeHash = poolBoundHookInitCodeHash(boundGraph.creationCode, expected);
|
|
236
|
+
const localPrediction = predictPoolBoundHookAddress({ deployer: boundGraph.deployer, initCodeHash: localInitCodeHash, salt: config.hookSalt });
|
|
237
|
+
if (encodePoolBoundHookParameters(parameters).toLowerCase() !== encodePoolBoundHookParameters(expected).toLowerCase() || parameterSalt.toLowerCase() !== config.hookSalt.toLowerCase() || salt.toLowerCase() !== config.hookSalt.toLowerCase() || deployer.toLowerCase() !== boundGraph.deployer.toLowerCase() || initCodeHash.toLowerCase() !== localInitCodeHash.toLowerCase() || remoteInitCodeHash.toLowerCase() !== localInitCodeHash.toLowerCase() || predictedHook.toLowerCase() !== localPrediction.toLowerCase() || remotePrediction.toLowerCase() !== localPrediction.toLowerCase())
|
|
238
|
+
throw new LifecyclePlanningError("HOOK_DEPLOYMENT_CHANGED", "Bound hook metadata differs from the exact certified constructor economics, factory, initcode, salt or CREATE2 prediction");
|
|
239
|
+
const hookCode = rpcHex(await lifecycleRpc(client, "eth_getCode", [predictedHook, toHex(block.number)]), "bound hook code");
|
|
240
|
+
if (hookCode !== "0x") {
|
|
241
|
+
const deployedCodeHash = await readLifecycleContract(client, deployer, poolHookDeployerV1Abi, "deployedCodeHash", [predictedHook], block);
|
|
242
|
+
if ((hookCode.length - 2) / 2 > 24576 || deployedCodeHash === zeroHash || deployedCodeHash.toLowerCase() !== keccak256(hookCode).toLowerCase())
|
|
243
|
+
throw new LifecyclePlanningError("HOOK_DEPLOYMENT_CHANGED", "Existing hook lacks this exact typed deployer's bounded runtime-code provenance");
|
|
244
|
+
for (const [getter, expectedAddress] of [
|
|
245
|
+
["poolManager", expected.poolManager], ["registrar", expected.registrar], ["oracleFactory", expected.oracleFactory],
|
|
246
|
+
["core", expected.core], ["liquidityLocker", expected.liquidityLocker], ["token", expected.token],
|
|
247
|
+
]) {
|
|
248
|
+
const actual = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, getter, [], block);
|
|
249
|
+
if (actual.toLowerCase() !== expectedAddress.toLowerCase())
|
|
250
|
+
throw new LifecyclePlanningError("HOOK_DEPLOYMENT_CHANGED", "Existing hook immutable dependency graph differs from the committed constructor");
|
|
251
|
+
}
|
|
252
|
+
if (await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "REQUIRED_HOOK_FLAGS", [], block) !== 0x1afcn ||
|
|
253
|
+
await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "ALL_HOOK_MASK", [], block) !== 0x3fffn)
|
|
254
|
+
throw new LifecyclePlanningError("HOOK_DEPLOYMENT_CHANGED", "Existing bound hook callback declarations differ from the reviewed envelope");
|
|
255
|
+
const [currency0, currency1] = BigInt(token) < BigInt(market.quoteAsset) ? [token, market.quoteAsset] : [market.quoteAsset, token];
|
|
256
|
+
const expectedPoolId = keccak256(encodeAbiParameters([{ type: "address" }, { type: "address" }, { type: "uint24" }, { type: "int24" }, { type: "address" }], [currency0, currency1, config.lpFeePips, config.tickSpacing, predictedHook]));
|
|
257
|
+
const actualPoolId = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "boundPoolId", [], block);
|
|
258
|
+
const deploymentConfigHash = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "deploymentConfigHash", [], block);
|
|
259
|
+
const marketCommitment = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "marketCommitment", [], block);
|
|
260
|
+
const opening = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "openingSqrtPriceX96", [], block);
|
|
261
|
+
const positions = await readLifecycleContract(client, predictedHook, poolBoundLaunchFeeHookV1Abi, "expectedPositionCount", [], block);
|
|
262
|
+
if (actualPoolId.toLowerCase() !== expectedPoolId.toLowerCase() || deploymentConfigHash.toLowerCase() !== keccak256(encodePoolBoundHookParameters(expected)).toLowerCase() || marketCommitment.toLowerCase() !== expected.marketCommitment.toLowerCase() || opening !== expected.sqrtPriceX96 || positions !== expected.expectedPositionCount)
|
|
263
|
+
throw new LifecyclePlanningError("HOOK_DEPLOYMENT_CHANGED", "Existing hook key, economic commitment or immutable opening geometry changed");
|
|
264
|
+
}
|
|
265
|
+
return { deployment: { deployer, initCodeHash, salt, predictedHook }, parameters: expected };
|
|
266
|
+
}
|
|
267
|
+
/** Works with an unmined candidate salt and after preparation; never accepts a caller-selected root. */
|
|
268
|
+
export async function readPoolBoundHookDeployment(options, pinnedBlock) {
|
|
269
|
+
const commitment = hashLaunchPlan(options.plan);
|
|
270
|
+
const block = pinnedBlock ?? await readLifecycleBlock(options.client);
|
|
271
|
+
const { deployment } = await readPoolBoundHookDeploymentDetails(options, block);
|
|
272
|
+
if (hashLaunchPlan(options.plan) !== commitment)
|
|
273
|
+
throw new LifecyclePlanningError("PLAN_MUTATED", "Economic plan changed while reading hook deployment metadata");
|
|
274
|
+
if (pinnedBlock === undefined)
|
|
275
|
+
await assertLifecycleBlock(options.client, block);
|
|
276
|
+
return deployment;
|
|
277
|
+
}
|
|
278
|
+
/** Optional permissionless predeployment calldata; no token deployment, pool registration or wallet broadcast. */
|
|
279
|
+
export async function buildPoolBoundHookDeploymentTransaction(options) {
|
|
280
|
+
const commitment = hashLaunchPlan(options.plan);
|
|
281
|
+
const block = await readLifecycleBlock(options.client);
|
|
282
|
+
const { deployment, parameters } = await readPoolBoundHookDeploymentDetails(options, block);
|
|
283
|
+
if (!hasLifecycleV4HookPermissions(deployment.predictedHook))
|
|
284
|
+
throw new LifecyclePlanningError("INVALID_HOOK_BITS", "Finalize a salt with the exact lifecycle hook permissions before predeployment");
|
|
285
|
+
if (hashLaunchPlan(options.plan) !== commitment)
|
|
286
|
+
throw new LifecyclePlanningError("PLAN_MUTATED", "Economic plan changed while constructing hook deployment calldata");
|
|
287
|
+
await assertLifecycleBlock(options.client, block);
|
|
288
|
+
return { to: deployment.deployer, data: encodeFunctionData({ abi: poolHookDeployerV1Abi, functionName: "deploy", args: [parameters, deployment.salt] }), value: 0n, deployment };
|
|
289
|
+
}
|
|
290
|
+
export function validateLifecycleMarketIdentity(identity, plan, token, marketIndex) {
|
|
291
|
+
const market = plan.markets[marketIndex];
|
|
292
|
+
if (market === undefined)
|
|
293
|
+
throw new LifecyclePlanningError("MARKET_IDENTITY", "Market index is outside the economic plan");
|
|
294
|
+
const [currency0, currency1] = BigInt(token) < BigInt(market.quoteAsset) ? [token, market.quoteAsset] : [market.quoteAsset, token];
|
|
295
|
+
const expectedCanonicalId = keccak256(encodeAbiParameters([
|
|
296
|
+
{ type: "uint256" }, { type: "uint8" }, { type: "address" }, { type: "address" }, { type: "address" }, { type: "bytes32" }, { type: "bytes32" },
|
|
297
|
+
], [plan.chainId, identity.venue, identity.manager, identity.factory, identity.pool, identity.poolId, identity.profileId]));
|
|
298
|
+
if (identity.canonicalId.toLowerCase() !== expectedCanonicalId.toLowerCase() || identity.profileId.toLowerCase() !== market.profileId.toLowerCase() || identity.currency0.toLowerCase() !== currency0?.toLowerCase() || identity.currency1.toLowerCase() !== currency1?.toLowerCase() || identity.openingSqrtPriceX96 === 0n || identity.tickSpacing <= 0)
|
|
299
|
+
throw new LifecyclePlanningError("MARKET_IDENTITY", "Venue identity does not match canonical chain, plan, currencies and opening price");
|
|
300
|
+
if (identity.venue === LifecycleVenue.UniswapV4) {
|
|
301
|
+
const expectedPoolId = keccak256(encodeAbiParameters([{ type: "address" }, { type: "address" }, { type: "uint24" }, { type: "int24" }, { type: "address" }], [identity.currency0, identity.currency1, identity.fee, identity.tickSpacing, identity.hook]));
|
|
302
|
+
if (identity.manager === zeroAddress || identity.factory !== zeroAddress || identity.pool !== zeroAddress || identity.poolId.toLowerCase() !== expectedPoolId.toLowerCase() || !hasLifecycleV4HookPermissions(identity.hook))
|
|
303
|
+
throw new LifecyclePlanningError("MARKET_IDENTITY", "V4 full permissioned PoolKey identity differs from its canonical pool ID");
|
|
304
|
+
}
|
|
305
|
+
else if (identity.venue !== LifecycleVenue.Abyss || identity.pool === zeroAddress || identity.factory === zeroAddress)
|
|
306
|
+
throw new LifecyclePlanningError("MARKET_IDENTITY", "Abyss canonical factory/pool identity is missing");
|
|
307
|
+
}
|
|
308
|
+
async function transactionMatchesLaunch(transaction, options, block) {
|
|
309
|
+
const { planned } = options;
|
|
310
|
+
const from = rpcHex(transaction.from, "receipt transaction account");
|
|
311
|
+
if (from.toLowerCase() !== planned.account.toLowerCase())
|
|
312
|
+
throw new LifecyclePlanningError("RECEIPT_ACCOUNT", "Receipt transaction belongs to a different account");
|
|
313
|
+
if (transaction.chainId !== undefined && rpcQuantity(transaction.chainId, "receipt transaction chain") !== planned.plan.chainId)
|
|
314
|
+
throw new LifecyclePlanningError("RECEIPT_CHAIN", "Receipt transaction belongs to a different chain");
|
|
315
|
+
const to = transaction.to === null ? zeroAddress : rpcHex(transaction.to, "receipt transaction target");
|
|
316
|
+
const input = rpcHex(transaction.input ?? transaction.data, "receipt transaction calldata");
|
|
317
|
+
if (to.toLowerCase() === planned.plan.orchestrator.toLowerCase()) {
|
|
318
|
+
try {
|
|
319
|
+
const decoded = decodeFunctionData({ abi: launchLifecycleAbi, data: input });
|
|
320
|
+
if (!["launchAtomic", "beginLaunch", "prepareMarkets", "activateLaunch", "cancelLaunch"].includes(decoded.functionName) || !Array.isArray(decoded.args))
|
|
321
|
+
return false;
|
|
322
|
+
// Decoded plan layout is validated by the exact ABI, not trusted raw RPC JSON.
|
|
323
|
+
const plan = decoded.args[0];
|
|
324
|
+
return hashLaunchPlan(plan).toLowerCase() === planned.planHash.toLowerCase();
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const fundingAsset = planned.plan.funding.some((funding) => funding.inputAsset.toLowerCase() === to.toLowerCase());
|
|
331
|
+
if (!fundingAsset)
|
|
332
|
+
return false;
|
|
333
|
+
let spender;
|
|
334
|
+
try {
|
|
335
|
+
const decoded = decodeFunctionData({ abi: lifecycleErc20Abi, data: input });
|
|
336
|
+
if (decoded.functionName !== "approve" || rpcQuantity(transaction.value ?? "0x0", "approval native value") !== 0n)
|
|
337
|
+
return false;
|
|
338
|
+
spender = decoded.args[0];
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
const escrow = await readLifecycleContract(options.client, planned.plan.orchestrator, launchLifecycleAbi, "fundingEscrow", [], block);
|
|
344
|
+
return spender.toLowerCase() === escrow.toLowerCase();
|
|
345
|
+
}
|
|
346
|
+
async function readReceipt(reference, options, block) {
|
|
347
|
+
const effectiveHash = reference.replacementHash ?? reference.transactionHash;
|
|
348
|
+
const base = { transactionHash: reference.transactionHash, effectiveHash, replaced: reference.replacementHash !== undefined && reference.replacementHash.toLowerCase() !== reference.transactionHash.toLowerCase() };
|
|
349
|
+
const observedNumber = reference.observedBlockNumber;
|
|
350
|
+
if (observedNumber !== undefined && reference.observedBlockHash !== undefined) {
|
|
351
|
+
const observed = await lifecycleRpc(options.client, "eth_getBlockByNumber", [toHex(observedNumber), false]);
|
|
352
|
+
if (observed === null || rpcHex(rpcObject(observed, "observed receipt block").hash, "observed receipt block hash").toLowerCase() !== reference.observedBlockHash.toLowerCase())
|
|
353
|
+
return { ...base, status: "reorged", blockNumber: observedNumber, blockHash: reference.observedBlockHash };
|
|
354
|
+
}
|
|
355
|
+
const receiptValue = await lifecycleRpc(options.client, "eth_getTransactionReceipt", [effectiveHash]);
|
|
356
|
+
const transactionValue = await lifecycleRpc(options.client, "eth_getTransactionByHash", [effectiveHash]);
|
|
357
|
+
if (receiptValue === null) {
|
|
358
|
+
// An absent receipt with an unchanged canonical observed block is not a
|
|
359
|
+
// reorg: the transaction is simply not (yet) mined. A missing/changed
|
|
360
|
+
// canonical block above already reported the real reorg.
|
|
361
|
+
if (reference.observedBlockHash !== undefined)
|
|
362
|
+
return { ...base, status: "pending", blockNumber: observedNumber, blockHash: reference.observedBlockHash };
|
|
363
|
+
return { ...base, status: "pending" };
|
|
364
|
+
}
|
|
365
|
+
if (transactionValue === null)
|
|
366
|
+
throw new LifecyclePlanningError("INVALID_RPC_RESPONSE", "Receipt exists without its canonical transaction");
|
|
367
|
+
const transaction = rpcObject(transactionValue, "receipt transaction");
|
|
368
|
+
const receiptBlock = await readLifecycleBlock(options.client, toHex(rpcQuantity(rpcObject(receiptValue, "receipt").blockNumber, "receipt block number")));
|
|
369
|
+
const matches = await transactionMatchesLaunch(transaction, options, receiptBlock);
|
|
370
|
+
if (!matches && !base.replaced)
|
|
371
|
+
throw new LifecyclePlanningError("RECEIPT_IDENTITY", "Receipt calldata does not belong to the exact committed launch");
|
|
372
|
+
const receipt = rpcObject(receiptValue, "receipt");
|
|
373
|
+
const blockNumber = rpcQuantity(receipt.blockNumber, "receipt block number");
|
|
374
|
+
const blockHash = rpcHex(receipt.blockHash, "receipt block hash");
|
|
375
|
+
const canonicalBlockValue = await lifecycleRpc(options.client, "eth_getBlockByNumber", [toHex(blockNumber), false]);
|
|
376
|
+
if (canonicalBlockValue === null || rpcHex(rpcObject(canonicalBlockValue, "receipt canonical block").hash, "receipt canonical hash").toLowerCase() !== blockHash.toLowerCase())
|
|
377
|
+
return { ...base, status: "reorged", blockNumber, blockHash };
|
|
378
|
+
const confirmations = block.number >= blockNumber ? block.number - blockNumber + 1n : 0n;
|
|
379
|
+
const required = reference.confirmations ?? 1;
|
|
380
|
+
if (!Number.isSafeInteger(required) || required < 1)
|
|
381
|
+
throw new LifecyclePlanningError("INVALID_CONFIRMATIONS", "Receipt confirmations must be a positive integer");
|
|
382
|
+
if (confirmations < BigInt(required))
|
|
383
|
+
return { ...base, status: "unconfirmed", blockNumber, blockHash, confirmations };
|
|
384
|
+
if (!matches)
|
|
385
|
+
return { ...base, status: "replacement-cancelled", blockNumber, blockHash, confirmations };
|
|
386
|
+
if (rpcQuantity(receipt.status, "receipt status") !== 1n)
|
|
387
|
+
return { ...base, status: "reverted", blockNumber, blockHash, confirmations };
|
|
388
|
+
return { ...base, status: "confirmed", blockNumber, blockHash, confirmations };
|
|
389
|
+
}
|
|
390
|
+
/** Reads confirmation-bound canonical state and receipt provenance; local step counters are never used. */
|
|
391
|
+
export async function readLaunchProgress(options, pinnedBlock) {
|
|
392
|
+
const { client, planned } = options;
|
|
393
|
+
const block = pinnedBlock ?? await readLifecycleBlock(client);
|
|
394
|
+
const confirmationDepth = options.confirmations ?? planned.confirmations;
|
|
395
|
+
if (!Number.isSafeInteger(confirmationDepth) || confirmationDepth < 1)
|
|
396
|
+
throw new LifecyclePlanningError("INVALID_CONFIRMATIONS", "Confirmation depth must be a positive integer");
|
|
397
|
+
const confirmedNumber = block.number >= BigInt(confirmationDepth - 1) ? block.number - BigInt(confirmationDepth - 1) : 0n;
|
|
398
|
+
const confirmedBlock = confirmedNumber === block.number ? block : await readLifecycleBlock(client, toHex(confirmedNumber));
|
|
399
|
+
const chainId = rpcQuantity(await lifecycleRpc(client, "eth_chainId"), "chain ID");
|
|
400
|
+
if (chainId !== planned.plan.chainId)
|
|
401
|
+
throw new LifecyclePlanningError("CHAIN_MISMATCH", "RPC chain differs from the committed launch");
|
|
402
|
+
if (planned.account.toLowerCase() !== planned.plan.creator.toLowerCase())
|
|
403
|
+
throw new LifecyclePlanningError("ACCOUNT_MISMATCH", "Execution account must be the committed creator/payer/refund account");
|
|
404
|
+
if (hashLaunchPlan(planned.plan).toLowerCase() !== planned.planHash.toLowerCase() || hashLaunchIdentity(planned.plan).toLowerCase() !== planned.launchId.toLowerCase())
|
|
405
|
+
throw new LifecyclePlanningError("PLAN_MUTATED", "Stored economic plan no longer matches its commitment");
|
|
406
|
+
const head = await readLifecycleContract(client, planned.plan.orchestrator, launchLifecycleAbi, "readLaunchProgress", [planned.launchId], block, planned.account);
|
|
407
|
+
const canonical = confirmedNumber === block.number ? head : await readLifecycleContract(client, planned.plan.orchestrator, launchLifecycleAbi, "readLaunchProgress", [planned.launchId], confirmedBlock, planned.account);
|
|
408
|
+
const token = await readLifecycleContract(client, planned.plan.orchestrator, launchLifecycleAbi, "predictToken", [planned.plan], block);
|
|
409
|
+
if (token.toLowerCase() !== planned.predictedToken.toLowerCase())
|
|
410
|
+
throw new LifecyclePlanningError("TOKEN_IDENTITY", "Predicted token changed for the committed token configuration");
|
|
411
|
+
for (const progress of [canonical, head])
|
|
412
|
+
if (progress.phase !== LifecyclePhase.None) {
|
|
413
|
+
if (progress.planHash.toLowerCase() !== planned.planHash.toLowerCase() || progress.launchId.toLowerCase() !== planned.launchId.toLowerCase() || progress.creator.toLowerCase() !== planned.account.toLowerCase() || progress.nonce !== planned.plan.nonce || progress.token.toLowerCase() !== token.toLowerCase() || progress.marketCount !== planned.plan.markets.length || progress.buyCount !== planned.plan.buys.length || progress.deadline !== planned.plan.deadline)
|
|
414
|
+
throw new LifecyclePlanningError("PLAN_REPLAY", "This creator nonce is already bound to a different economic launch");
|
|
415
|
+
if (progress.mode !== (planned.mode === "atomic" ? LifecycleMode.Atomic : LifecycleMode.Staged))
|
|
416
|
+
throw new LifecyclePlanningError("MODE_MISMATCH", "Execution mode differs from the already recorded launch");
|
|
417
|
+
if (progress.preparedMarkets > progress.marketCount || progress.phase === LifecyclePhase.Activating || (progress.phase === LifecyclePhase.Ready && progress.preparedMarkets !== progress.marketCount))
|
|
418
|
+
throw new LifecyclePlanningError("INVALID_PROGRESS", "Canonical progress violates the committed ordered state machine");
|
|
419
|
+
}
|
|
420
|
+
const confirmedAccountNonce = rpcQuantity(await lifecycleRpc(client, "eth_getTransactionCount", [planned.account, toHex(confirmedBlock.number)]), "confirmed account nonce");
|
|
421
|
+
const headAccountNonce = confirmedNumber === block.number ? confirmedAccountNonce : rpcQuantity(await lifecycleRpc(client, "eth_getTransactionCount", [planned.account, toHex(block.number)]), "head account nonce");
|
|
422
|
+
const pendingAccountNonce = rpcQuantity(await lifecycleRpc(client, "eth_getTransactionCount", [planned.account, "pending"]), "pending account nonce");
|
|
423
|
+
const progressParameters = [{ type: "tuple", components: launchProgressV1Components }];
|
|
424
|
+
const confirmationSafe = confirmedAccountNonce === headAccountNonce && pendingAccountNonce === headAccountNonce && keccak256(encodeAbiParameters(progressParameters, [canonical])) === keccak256(encodeAbiParameters(progressParameters, [head]));
|
|
425
|
+
const receipts = [];
|
|
426
|
+
for (const reference of options.receipts ?? [])
|
|
427
|
+
receipts.push(await readReceipt({ ...reference, confirmations: Math.max(reference.confirmations ?? 1, confirmationDepth) }, options, block));
|
|
428
|
+
const markets = [];
|
|
429
|
+
if (canonical.preparedMarkets > 0) {
|
|
430
|
+
const directory = await readLifecycleContract(client, planned.plan.orchestrator, launchLifecycleAbi, "directory", [], confirmedBlock);
|
|
431
|
+
for (let index = 0; index < canonical.preparedMarkets; index += 1) {
|
|
432
|
+
const [adapter, prepared] = await readLifecycleContract(client, directory, lifecycleDirectoryAbi, "market", [planned.launchId, index], confirmedBlock);
|
|
433
|
+
validateLifecycleMarketIdentity(prepared.identity, planned.plan, token, index);
|
|
434
|
+
try {
|
|
435
|
+
const live = await readLifecycleContract(client, adapter, lifecycleAdapterAbi, "readMarket", [planned.launchId, index], confirmedBlock);
|
|
436
|
+
markets.push({ index, prepared, live });
|
|
437
|
+
}
|
|
438
|
+
catch (failure) {
|
|
439
|
+
markets.push({ index, prepared, error: failure instanceof Error ? failure.message : String(failure) });
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (pinnedBlock === undefined)
|
|
444
|
+
await assertLifecycleBlock(client, block);
|
|
445
|
+
if (confirmedNumber !== block.number)
|
|
446
|
+
await assertLifecycleBlock(client, confirmedBlock);
|
|
447
|
+
return { canonical, head, confirmationDepth, confirmedBlockNumber: confirmedBlock.number, confirmedBlockHash: confirmedBlock.hash, confirmedAccountNonce, headAccountNonce, pendingAccountNonce, confirmationSafe, token, planHash: planned.planHash, launchId: planned.launchId, chainId, blockNumber: block.number, blockHash: block.hash, markets, receipts };
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lifecycle/progress.ts"],"names":[],"mappings":"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"}
|