@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.
Files changed (88) hide show
  1. package/README.md +92 -20
  2. package/dist/abyss.d.ts +4 -2748
  3. package/dist/abyss.d.ts.map +1 -1
  4. package/dist/abyss.js +3 -1029
  5. package/dist/abyss.js.map +1 -1
  6. package/dist/addresses.d.ts +3 -7
  7. package/dist/addresses.d.ts.map +1 -1
  8. package/dist/addresses.js +6 -21
  9. package/dist/addresses.js.map +1 -1
  10. package/dist/auction.d.ts +2 -2
  11. package/dist/auction.d.ts.map +1 -1
  12. package/dist/auction.js +2 -2
  13. package/dist/auction.js.map +1 -1
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/launch-api.d.ts +151 -0
  19. package/dist/launch-api.d.ts.map +1 -0
  20. package/dist/launch-api.js +117 -0
  21. package/dist/launch-api.js.map +1 -0
  22. package/dist/launch.d.ts +23 -185
  23. package/dist/launch.d.ts.map +1 -1
  24. package/dist/launch.js +35 -272
  25. package/dist/launch.js.map +1 -1
  26. package/dist/lifecycle/abi.d.ts +6391 -0
  27. package/dist/lifecycle/abi.d.ts.map +1 -0
  28. package/dist/lifecycle/abi.js +335 -0
  29. package/dist/lifecycle/abi.js.map +1 -0
  30. package/dist/lifecycle/authors.d.ts +133 -0
  31. package/dist/lifecycle/authors.d.ts.map +1 -0
  32. package/dist/lifecycle/authors.js +217 -0
  33. package/dist/lifecycle/authors.js.map +1 -0
  34. package/dist/lifecycle/fork.d.ts +15 -0
  35. package/dist/lifecycle/fork.d.ts.map +1 -0
  36. package/dist/lifecycle/fork.js +36 -0
  37. package/dist/lifecycle/fork.js.map +1 -0
  38. package/dist/lifecycle/index.d.ts +10 -0
  39. package/dist/lifecycle/index.d.ts.map +1 -0
  40. package/dist/lifecycle/index.js +10 -0
  41. package/dist/lifecycle/index.js.map +1 -0
  42. package/dist/lifecycle/markets.d.ts +349 -0
  43. package/dist/lifecycle/markets.d.ts.map +1 -0
  44. package/dist/lifecycle/markets.js +186 -0
  45. package/dist/lifecycle/markets.js.map +1 -0
  46. package/dist/lifecycle/planner.d.ts +20 -0
  47. package/dist/lifecycle/planner.d.ts.map +1 -0
  48. package/dist/lifecycle/planner.js +481 -0
  49. package/dist/lifecycle/planner.js.map +1 -0
  50. package/dist/lifecycle/progress.d.ts +43 -0
  51. package/dist/lifecycle/progress.d.ts.map +1 -0
  52. package/dist/lifecycle/progress.js +449 -0
  53. package/dist/lifecycle/progress.js.map +1 -0
  54. package/dist/lifecycle/rpc.d.ts +17 -0
  55. package/dist/lifecycle/rpc.d.ts.map +1 -0
  56. package/dist/lifecycle/rpc.js +100 -0
  57. package/dist/lifecycle/rpc.js.map +1 -0
  58. package/dist/lifecycle/schema.d.ts +1068 -0
  59. package/dist/lifecycle/schema.d.ts.map +1 -0
  60. package/dist/lifecycle/schema.js +335 -0
  61. package/dist/lifecycle/schema.js.map +1 -0
  62. package/dist/lifecycle/simulation.d.ts +3 -0
  63. package/dist/lifecycle/simulation.d.ts.map +1 -0
  64. package/dist/lifecycle/simulation.js +393 -0
  65. package/dist/lifecycle/simulation.js.map +1 -0
  66. package/dist/lifecycle/types.d.ts +273 -0
  67. package/dist/lifecycle/types.d.ts.map +1 -0
  68. package/dist/lifecycle/types.js +11 -0
  69. package/dist/lifecycle/types.js.map +1 -0
  70. package/docs/launch-lifecycle.md +243 -0
  71. package/package.json +12 -3
  72. package/src/abyss.ts +3 -1059
  73. package/src/addresses.ts +9 -26
  74. package/src/auction.ts +2 -2
  75. package/src/index.ts +2 -0
  76. package/src/launch-api.ts +110 -0
  77. package/src/launch.ts +43 -411
  78. package/src/lifecycle/abi.ts +343 -0
  79. package/src/lifecycle/authors.ts +203 -0
  80. package/src/lifecycle/fork.ts +36 -0
  81. package/src/lifecycle/index.ts +9 -0
  82. package/src/lifecycle/markets.ts +205 -0
  83. package/src/lifecycle/planner.ts +396 -0
  84. package/src/lifecycle/progress.ts +378 -0
  85. package/src/lifecycle/rpc.ts +88 -0
  86. package/src/lifecycle/schema.ts +387 -0
  87. package/src/lifecycle/simulation.ts +329 -0
  88. package/src/lifecycle/types.ts +132 -0
@@ -0,0 +1,393 @@
1
+ import { decodeEventLog, decodeFunctionResult, encodeFunctionData, encodeFunctionResult, toHex } from "viem";
2
+ import { launchLifecycleAbi, lifecycleErc20Abi } from "./abi.js";
3
+ import { LifecyclePhase } from "./schema.js";
4
+ import { assertLifecycleBlock, lifecycleRpc, readLifecycleBlock, resolveLifecycleLimits, rpcHex, rpcObject, rpcQuantity } from "./rpc.js";
5
+ import { LifecyclePlanningError } from "./types.js";
6
+ function conditionRequest(condition, planned) {
7
+ if (condition.kind === "allowance")
8
+ return {
9
+ to: condition.asset, data: encodeFunctionData({ abi: lifecycleErc20Abi, functionName: "allowance", args: [planned.account, condition.spender] }),
10
+ };
11
+ return { to: planned.plan.orchestrator, data: encodeFunctionData({ abi: launchLifecycleAbi, functionName: "readLaunchProgress", args: [planned.launchId] }) };
12
+ }
13
+ function checkCondition(condition, data, planned) {
14
+ if (condition.kind === "allowance") {
15
+ const allowance = decodeFunctionResult({ abi: lifecycleErc20Abi, functionName: "allowance", data });
16
+ if (allowance < condition.minimum || (condition.exact !== undefined && allowance !== condition.exact))
17
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Funding allowance was not established");
18
+ return;
19
+ }
20
+ // The frozen ABI decoder produces the precise progress tuple, including all identity fields.
21
+ const progress = decodeFunctionResult({ abi: launchLifecycleAbi, functionName: "readLaunchProgress", data });
22
+ const phase = LifecyclePhase[condition.phase];
23
+ if (progress.phase !== phase || progress.preparedMarkets !== condition.preparedMarkets || progress.planHash.toLowerCase() !== planned.planHash.toLowerCase() || progress.launchId.toLowerCase() !== planned.launchId.toLowerCase() || progress.token.toLowerCase() !== planned.predictedToken.toLowerCase()) {
24
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Simulation did not establish the committed launch identity, phase and ordered progress");
25
+ }
26
+ }
27
+ async function simulateRpcPass(client, planned, block, transactions, gasLimits, limits, gasPrice, validation) {
28
+ const totalRequestedGas = gasLimits.reduce((total, gas) => total + gas, 0n);
29
+ if (limits.maxSimulationGas !== undefined && totalRequestedGas > limits.maxSimulationGas)
30
+ throw new LifecyclePlanningError("SIMULATION_RPC_CAP", "Sequential request exceeds the current RPC aggregate simulation gas cap; use an isolated controlled fork");
31
+ // Natural child-block fees must govern fee-bearing admission; overriding
32
+ // baseFeePerGas with the parent's would fabricate a lower envelope and admit
33
+ // calls that the actual chain would reject. eth_simulateV1 derives the child
34
+ // base fee itself; only structural child fields (number/time) and the
35
+ // parent gasLimit are set.
36
+ const blockStateCalls = transactions.map((transaction, index) => ({
37
+ blockOverrides: { number: toHex(block.number + BigInt(index + 1)), time: toHex(block.timestamp + BigInt(index + 1)), gasLimit: toHex(block.gasLimit) },
38
+ calls: [{ from: transaction.from, to: transaction.to, data: transaction.data, value: toHex(transaction.value), gas: toHex(gasLimits[index] ?? limits.executionGasCeiling), gasPrice: toHex(gasPrice) }],
39
+ }));
40
+ const result = await lifecycleRpc(client, "eth_simulateV1", [{ blockStateCalls, validation, traceTransfers: false, returnFullTransactions: false }, toHex(block.number)]);
41
+ if (!Array.isArray(result) || result.length !== transactions.length)
42
+ throw new LifecyclePlanningError("INVALID_RPC_RESPONSE", "Sequential simulation omitted blocks");
43
+ const steps = [];
44
+ for (let index = 0; index < transactions.length; index += 1) {
45
+ const transaction = transactions[index];
46
+ if (transaction === undefined)
47
+ throw new LifecyclePlanningError("INVALID_SIMULATION", "Missing simulation transaction");
48
+ const simulatedBlock = rpcObject(result[index], "simulated block");
49
+ if (!Array.isArray(simulatedBlock.calls) || simulatedBlock.calls.length !== 1)
50
+ throw new LifecyclePlanningError("INVALID_RPC_RESPONSE", "Sequential simulation omitted transaction results");
51
+ const call = rpcObject(simulatedBlock.calls[0], "simulated transaction");
52
+ const gasUsed = rpcQuantity(call.gasUsed, "simulated gas used");
53
+ const returnData = rpcHex(call.returnData, "simulated return data");
54
+ const success = rpcQuantity(call.status, "simulated status") === 1n;
55
+ let error;
56
+ if (!success)
57
+ error = call.error === undefined ? `Execution reverted: ${returnData}` : JSON.stringify(call.error);
58
+ if (success) {
59
+ try {
60
+ // Verification reads must not become synthetic transactions that consume creator nonce/fees.
61
+ // Core return tuples/events and subsequent dependent commands prove persisted transitions.
62
+ const events = (Array.isArray(call.logs) ? call.logs : []).flatMap((raw) => {
63
+ const log = rpcObject(raw, "simulation event");
64
+ if (rpcHex(log.address, "simulation event address").toLowerCase() !== planned.plan.orchestrator.toLowerCase() || !Array.isArray(log.topics))
65
+ return [];
66
+ const topics = log.topics.map((topic) => rpcHex(topic, "event topic"));
67
+ if (topics.length === 0)
68
+ return [];
69
+ const event = decodeEventLog({ abi: launchLifecycleAbi, topics: topics, data: rpcHex(log.data, "simulation event data") });
70
+ return [event];
71
+ });
72
+ if (transaction.kind === "begin")
73
+ checkCondition({ kind: "launch", phase: "Preparing", preparedMarkets: 0 }, returnData, planned);
74
+ else if (transaction.kind === "prepare") {
75
+ const prepared = events.filter((event) => event.eventName === "MarketPrepared");
76
+ if (prepared.length !== transaction.marketCount || prepared.some((event, ordinal) => event.eventName !== "MarketPrepared" || event.args.launchId.toLowerCase() !== planned.launchId.toLowerCase() || event.args.marketIndex !== (transaction.marketStart ?? 0) + ordinal))
77
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Simulation did not prepare each exact ordered market");
78
+ }
79
+ else if (transaction.kind === "atomic" || transaction.kind === "activate") {
80
+ const functionName = transaction.kind === "atomic" ? "launchAtomic" : "activateLaunch";
81
+ const receipt = decodeFunctionResult({ abi: launchLifecycleAbi, functionName, data: returnData });
82
+ if (receipt.planHash.toLowerCase() !== planned.planHash.toLowerCase() || receipt.launchId.toLowerCase() !== planned.launchId.toLowerCase() || receipt.token.toLowerCase() !== planned.predictedToken.toLowerCase() || receipt.marketCount !== planned.plan.markets.length || receipt.quoteSpent.length !== planned.plan.buys.length || receipt.tokenOut.length !== planned.plan.buys.length || !events.some((event) => event.eventName === "LaunchActivated" && event.args.planHash.toLowerCase() === planned.planHash.toLowerCase() && event.args.token.toLowerCase() === planned.predictedToken.toLowerCase()))
83
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Simulation did not atomically complete the committed launch");
84
+ for (let buyIndex = 0; buyIndex < planned.plan.buys.length; buyIndex += 1) {
85
+ const buy = planned.plan.buys[buyIndex];
86
+ if (buy === undefined || (receipt.quoteSpent[buyIndex] ?? buy.quoteAmountIn + 1n) > buy.quoteAmountIn || (receipt.tokenOut[buyIndex] ?? 0n) < buy.minTokenOut)
87
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Simulation did not satisfy every ordered buy's budget and output minimum");
88
+ }
89
+ }
90
+ else if (transaction.kind === "cancel" && !events.some((event) => event.eventName === "LaunchCancelled" && event.args.launchId.toLowerCase() === planned.launchId.toLowerCase() && event.args.creator.toLowerCase() === planned.account.toLowerCase()))
91
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Simulation did not cancel the exact committed launch");
92
+ else if ((transaction.kind === "approve" || transaction.kind === "approve-reset") && returnData !== "0x" && decodeFunctionResult({ abi: lifecycleErc20Abi, functionName: "approve", data: returnData }) !== true)
93
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Funding approval returned failure");
94
+ }
95
+ catch (failure) {
96
+ error = failure instanceof Error ? failure.message : String(failure);
97
+ }
98
+ }
99
+ steps.push({ transactionId: transaction.id, success: success && error === undefined, gasUsed, gasLimit: gasLimits[index], returnData, error });
100
+ if (!success || error !== undefined)
101
+ break;
102
+ }
103
+ return steps;
104
+ }
105
+ /** A failure that consumed nearly the whole limit is treated as possible gas-envelope
106
+ * exhaustion (EIP-150 retention starves forwarded sub-calls; the surfaced revert bytes
107
+ * may be a wrapped inner bubble rather than empty). Discovery is safe: a genuine
108
+ * business revert also fails at the exact ceiling, so it can never be masked. */
109
+ function looksGasExhausted(step, gasLimit) {
110
+ return !step.success && step.gasUsed !== undefined && step.gasUsed >= gasLimit - gasLimit / 64n;
111
+ }
112
+ async function waitForkReceipt(client, transactionHash, timeoutMs) {
113
+ const deadline = Date.now() + timeoutMs;
114
+ while (Date.now() <= deadline) {
115
+ const receipt = await lifecycleRpc(client, "eth_getTransactionReceipt", [transactionHash]);
116
+ if (receipt !== null)
117
+ return rpcObject(receipt, "fork receipt");
118
+ await new Promise((resolve) => globalThis.setTimeout(resolve, 25));
119
+ }
120
+ throw new LifecyclePlanningError("FORK_RECEIPT_TIMEOUT", "The disposable fork did not mine its simulation transaction");
121
+ }
122
+ async function simulateForkPass(fork, planned, block, transactions, gasLimits, gasPrice, measure, headroomBps) {
123
+ if (fork.isolation !== "disposable" || fork.allowTransactions !== true || !fork.sourceRpcUrl || !fork.forkRpcUrl)
124
+ throw new LifecyclePlanningError("UNSAFE_FORK", "Actual simulation transactions require an explicitly distinct disposable controlled fork");
125
+ const sourceUrl = new URL(fork.sourceRpcUrl);
126
+ const forkUrl = new URL(fork.forkRpcUrl);
127
+ const loopback = ["localhost", "127.0.0.1", "[::1]", "::1"];
128
+ const sourcePort = sourceUrl.port || (sourceUrl.protocol === "https:" ? "443" : "80");
129
+ const forkPort = forkUrl.port || (forkUrl.protocol === "https:" ? "443" : "80");
130
+ if (!loopback.includes(forkUrl.hostname) || sourceUrl.href === forkUrl.href || (loopback.includes(sourceUrl.hostname) && sourcePort === forkPort))
131
+ throw new LifecyclePlanningError("UNSAFE_FORK", "Disposable fork must not alias or share the loopback source endpoint");
132
+ let forkBlock = await readLifecycleBlock(fork.client);
133
+ if (fork.sourceRpcUrl !== undefined && forkBlock.hash.toLowerCase() !== block.hash.toLowerCase()) {
134
+ if (block.number > BigInt(Number.MAX_SAFE_INTEGER))
135
+ throw new LifecyclePlanningError("FORK_STATE_MISMATCH", "Pinned block is not exactly representable by the fork reset API");
136
+ await lifecycleRpc(fork.client, fork.resetMethod ?? "anvil_reset", [{ forking: { jsonRpcUrl: fork.sourceRpcUrl, blockNumber: Number(block.number) } }]);
137
+ forkBlock = await readLifecycleBlock(fork.client);
138
+ }
139
+ const forkChain = rpcQuantity(await lifecycleRpc(fork.client, "eth_chainId"), "fork chain ID");
140
+ if (forkChain !== planned.chainId || forkChain !== (fork.expectedChainId ?? planned.chainId) || forkBlock.hash.toLowerCase() !== block.hash.toLowerCase() || forkBlock.hash.toLowerCase() !== (fork.expectedBlockHash ?? block.hash).toLowerCase())
141
+ throw new LifecyclePlanningError("FORK_STATE_MISMATCH", "Controlled fork must match the exact source chain and pinned latest block before simulation");
142
+ const snapshot = rpcHex(await lifecycleRpc(fork.client, "evm_snapshot"), "fork snapshot");
143
+ const steps = [];
144
+ let impersonated = false;
145
+ try {
146
+ if (fork.impersonation !== undefined && fork.impersonation !== "none") {
147
+ await lifecycleRpc(fork.client, `${fork.impersonation}_impersonateAccount`, [planned.account]);
148
+ impersonated = true;
149
+ }
150
+ for (let index = 0; index < transactions.length; index += 1) {
151
+ const transaction = transactions[index];
152
+ let gas = gasLimits[index];
153
+ let gasRequired;
154
+ if (transaction === undefined || gas === undefined)
155
+ throw new LifecyclePlanningError("INVALID_SIMULATION", "Missing fork transaction/gas context");
156
+ try {
157
+ if (measure) {
158
+ const estimated = rpcQuantity(await lifecycleRpc(fork.client, "eth_estimateGas", [{ from: transaction.from, to: transaction.to, data: transaction.data, value: toHex(transaction.value), gasPrice: toHex(gasPrice) }]), "fork sequential gas estimate");
159
+ gasRequired = estimated;
160
+ const buffered = (estimated * BigInt(10000 + headroomBps) + 9999n) / 10000n;
161
+ if (buffered < gas)
162
+ gas = buffered;
163
+ }
164
+ const hash = rpcHex(await lifecycleRpc(fork.client, "eth_sendTransaction", [{ from: transaction.from, to: transaction.to, data: transaction.data, value: toHex(transaction.value), gas: toHex(gas), gasPrice: toHex(gasPrice) }]), "fork transaction hash");
165
+ const receipt = await waitForkReceipt(fork.client, hash, fork.receiptTimeoutMs ?? 10_000);
166
+ const gasUsed = rpcQuantity(receipt.gasUsed, "fork gas used");
167
+ if (rpcQuantity(receipt.status, "fork transaction status") !== 1n) {
168
+ steps.push({ transactionId: transaction.id, success: false, gasUsed, gasLimit: gas, error: "Actual fork transaction reverted" });
169
+ break;
170
+ }
171
+ const currentBlock = await readLifecycleBlock(fork.client);
172
+ let returnData;
173
+ if (transaction.kind === "atomic" || transaction.kind === "activate") {
174
+ const progressData = rpcHex(await lifecycleRpc(fork.client, "eth_call", [{ to: planned.plan.orchestrator, data: encodeFunctionData({ abi: launchLifecycleAbi, functionName: "readLaunchProgress", args: [planned.launchId] }) }, toHex(currentBlock.number)]), "fork activation progress");
175
+ const progress = decodeFunctionResult({ abi: launchLifecycleAbi, functionName: "readLaunchProgress", data: progressData });
176
+ if (!Array.isArray(receipt.logs))
177
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Actual fork receipt does not contain canonical launch logs");
178
+ const events = receipt.logs.flatMap((raw) => {
179
+ const log = rpcObject(raw, "fork activation log");
180
+ if (rpcHex(log.address, "fork log emitter").toLowerCase() !== planned.plan.orchestrator.toLowerCase())
181
+ return [];
182
+ if (!Array.isArray(log.topics))
183
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Actual fork log topics are malformed");
184
+ try {
185
+ return [decodeEventLog({ abi: launchLifecycleAbi, data: rpcHex(log.data, "fork log data"), topics: log.topics.map((topic) => rpcHex(topic, "fork log topic")) })];
186
+ }
187
+ catch {
188
+ return [];
189
+ }
190
+ });
191
+ const activated = events.filter((event) => event.eventName === "LaunchActivated");
192
+ const buys = events.filter((event) => event.eventName === "InitialBuyExecuted");
193
+ if (activated.length !== 1 || !activated.some((event) => event.eventName === "LaunchActivated" && event.args.launchId.toLowerCase() === planned.launchId.toLowerCase() && event.args.planHash.toLowerCase() === planned.planHash.toLowerCase() && event.args.token.toLowerCase() === planned.predictedToken.toLowerCase()) ||
194
+ progress.phase !== LifecyclePhase.Active || progress.planHash.toLowerCase() !== planned.planHash.toLowerCase() || progress.token.toLowerCase() !== planned.predictedToken.toLowerCase() ||
195
+ buys.length !== planned.plan.buys.length)
196
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Actual fork activation differs from the exact committed launch");
197
+ const quoteSpent = [];
198
+ const tokenOut = [];
199
+ for (let buyIndex = 0; buyIndex < buys.length; buyIndex += 1) {
200
+ const event = buys[buyIndex];
201
+ const buy = planned.plan.buys[buyIndex];
202
+ if (event?.eventName !== "InitialBuyExecuted" || buy === undefined || event.args.launchId.toLowerCase() !== planned.launchId.toLowerCase() ||
203
+ event.args.buyIndex !== buyIndex || event.args.marketIndex !== buy.marketIndex || event.args.recipient.toLowerCase() !== buy.recipient.toLowerCase() ||
204
+ event.args.quoteAsset.toLowerCase() !== planned.plan.markets[buy.marketIndex]?.quoteAsset.toLowerCase() ||
205
+ event.args.quoteSpent > buy.quoteAmountIn || event.args.tokenOut < buy.minTokenOut)
206
+ throw new LifecyclePlanningError("POSTCONDITION_FAILED", "Actual fork initial buy differs from its committed index, budget, destination or minimum");
207
+ quoteSpent.push(event.args.quoteSpent);
208
+ tokenOut.push(event.args.tokenOut);
209
+ }
210
+ returnData = encodeFunctionResult({ abi: launchLifecycleAbi, functionName: transaction.kind === "atomic" ? "launchAtomic" : "activateLaunch", result: {
211
+ launchId: planned.launchId, planHash: progress.planHash, token: progress.token, feeHub: progress.feeHub, rewards: progress.rewards,
212
+ marketCount: progress.marketCount, positionCount: progress.positionCount, quoteSpent, tokenOut,
213
+ } });
214
+ }
215
+ for (const condition of transaction.postconditions) {
216
+ const request = conditionRequest(condition, planned);
217
+ const data = rpcHex(await lifecycleRpc(fork.client, "eth_call", [{ ...request, from: planned.account }, toHex(currentBlock.number)]), "fork postcondition");
218
+ checkCondition(condition, data, planned);
219
+ }
220
+ steps.push({ transactionId: transaction.id, success: true, gasUsed, gasLimit: gas, gasRequired, returnData });
221
+ }
222
+ catch (failure) {
223
+ steps.push({ transactionId: transaction.id, success: false, gasLimit: gas, error: failure instanceof Error ? failure.message : String(failure) });
224
+ break;
225
+ }
226
+ }
227
+ return steps;
228
+ }
229
+ finally {
230
+ try {
231
+ if (impersonated && fork.impersonation !== undefined)
232
+ await lifecycleRpc(fork.client, `${fork.impersonation}_stopImpersonatingAccount`, [planned.account]);
233
+ }
234
+ finally {
235
+ if (await lifecycleRpc(fork.client, "evm_revert", [snapshot]) !== true)
236
+ throw new LifecyclePlanningError("FORK_CLEANUP_FAILED", "Disposable fork snapshot could not be reverted; do not reuse this RPC");
237
+ }
238
+ }
239
+ }
240
+ export async function simulateLaunchTransactions(options, transactions, pinnedBlock) {
241
+ const { client, planned } = options;
242
+ if (options.fork?.client === client)
243
+ throw new LifecyclePlanningError("UNSAFE_FORK", "Source RPC must never receive controlled simulation transactions/snapshots/resets");
244
+ const block = pinnedBlock ?? await readLifecycleBlock(client);
245
+ const context = { client, account: planned.account, orchestrator: planned.plan.orchestrator, block, chainId: planned.chainId };
246
+ const { limits, configuration } = await resolveLifecycleLimits(context, options.limits ?? planned.limits);
247
+ const base = { confidence: "stateful", blockNumber: block.number, blockHash: block.hash, account: planned.account, chainId: planned.chainId, limits };
248
+ if (rpcQuantity(await lifecycleRpc(client, "eth_chainId"), "chain ID") !== planned.chainId)
249
+ throw new LifecyclePlanningError("CHAIN_MISMATCH", "RPC chain changed before sequential simulation");
250
+ const accountCode = rpcHex(await lifecycleRpc(client, "eth_getCode", [planned.account, toHex(block.number)]), "account code");
251
+ if (accountCode !== "0x")
252
+ return { ...base, confidence: "provisional", backend: "unavailable", admitted: false, steps: [], reason: "Direct EOA transaction simulation cannot prove smart-account signature/execution behavior" };
253
+ for (const transaction of transactions) {
254
+ if (limits.maxCalldataBytes !== undefined && (transaction.data.length - 2) / 2 > limits.maxCalldataBytes)
255
+ return { ...base, backend: "unavailable", admitted: false, steps: [], failedTransactionId: transaction.id, reason: "Exact calldata exceeds the current chain/account/RPC byte cap" };
256
+ }
257
+ if (transactions.length === 0) {
258
+ await assertLifecycleBlock(client, block);
259
+ return { ...base, backend: "unavailable", admitted: true, steps: [] };
260
+ }
261
+ const gasPrice = rpcQuantity(await lifecycleRpc(client, "eth_gasPrice"), "gas price");
262
+ const capGas = transactions.map(() => limits.executionGasCeiling);
263
+ let backend = "eth_simulateV1";
264
+ let measured;
265
+ // Permissive cap measurement is not proof; only the exact-gas validated replay admits a plan.
266
+ try {
267
+ measured = await simulateRpcPass(client, planned, block, transactions, capGas, limits, gasPrice, false);
268
+ }
269
+ catch (failure) {
270
+ if (options.fork === undefined) {
271
+ await assertLifecycleBlock(client, block);
272
+ return { ...base, confidence: "provisional", backend: "unavailable", admitted: false, steps: [], reason: `Stateful sequential RPC simulation unavailable: ${failure instanceof Error ? failure.message : String(failure)}. Dependent eth_call estimates are not proof.` };
273
+ }
274
+ backend = "controlled-fork";
275
+ measured = await simulateForkPass(options.fork, planned, block, transactions, capGas, gasPrice, true, limits.headroomBps);
276
+ }
277
+ const failed = measured.find((step) => !step.success);
278
+ if (failed !== undefined) {
279
+ await assertLifecycleBlock(client, block);
280
+ return { ...base, backend, admitted: false, steps: measured, reason: failed.error, failedTransactionId: failed.transactionId };
281
+ }
282
+ const gasLimits = measured.map((step) => ((step.gasRequired ?? step.gasUsed ?? limits.executionGasCeiling) * BigInt(10000 + limits.headroomBps) + 9999n) / 10000n);
283
+ const exceeds = gasLimits.findIndex((gas) => gas > limits.executionGasCeiling);
284
+ if (exceeds >= 0) {
285
+ await assertLifecycleBlock(client, block);
286
+ return { ...base, backend, admitted: false, steps: measured, reason: "Execution gas plus conservative headroom exceeds current transaction limits", failedTransactionId: transactions[exceeds]?.id };
287
+ }
288
+ // Replay from the same initial state with exact headroom limits: gasUsed alone is not an EIP-150/gasleft proof.
289
+ // eth_simulateV1 with validation raises an RPC error on any revert (a generic
290
+ // -32000 "execution failed" carries no gasUsed/returnData), so a validated
291
+ // replay failure surfaces as a thrown error here. Route it through envelope
292
+ // discovery too: EIP-150 retention can starve a forwarded sub-call below the
293
+ // buffered limit while the true envelope still fits the execution ceiling.
294
+ let verified;
295
+ let validatedReplayError;
296
+ try {
297
+ if (backend === "eth_simulateV1")
298
+ verified = await simulateRpcPass(client, planned, block, transactions, gasLimits, limits, gasPrice, true);
299
+ else {
300
+ if (options.fork === undefined)
301
+ throw new LifecyclePlanningError("INVALID_SIMULATION", "Controlled fork is missing for the exact-gas replay");
302
+ verified = await simulateForkPass(options.fork, planned, block, transactions, gasLimits, gasPrice, false, limits.headroomBps);
303
+ }
304
+ }
305
+ catch (failure) {
306
+ const message = failure instanceof Error ? failure.message : String(failure);
307
+ if (backend !== "eth_simulateV1") {
308
+ await assertLifecycleBlock(client, block);
309
+ return { ...base, backend, admitted: false, steps: [], reason: `Exact-gas validated replay failed: ${message}` };
310
+ }
311
+ validatedReplayError = message;
312
+ verified = [];
313
+ }
314
+ let verifiedSteps = verified;
315
+ let admittedGasLimits = gasLimits;
316
+ let finalFailure = verifiedSteps.find((step) => !step.success);
317
+ if (finalFailure === undefined && validatedReplayError !== undefined) {
318
+ // The buffered validated replay threw before yielding steps. Attempt one
319
+ // explicit envelope-discovery replay at the exact execution ceiling on the
320
+ // same pinned block; headroom is never silently raised — the carried gas is
321
+ // the validated envelope itself.
322
+ try {
323
+ const ceilingLimits = transactions.map(() => limits.executionGasCeiling);
324
+ const retried = backend === "eth_simulateV1"
325
+ ? await simulateRpcPass(client, planned, block, transactions, ceilingLimits, limits, gasPrice, true)
326
+ : options.fork === undefined ? undefined : await simulateForkPass(options.fork, planned, block, transactions, ceilingLimits, gasPrice, false, limits.headroomBps);
327
+ if (retried === undefined || retried.some((step) => !step.success)) {
328
+ await assertLifecycleBlock(client, block);
329
+ return { ...base, backend, admitted: false, steps: measured, reason: `Validated execution at the exact current gas ceiling still failed: ${retried?.find((step) => !step.success)?.error ?? validatedReplayError}; final mint/lock/all-buys/public-opening is indivisible and will not be partitioned`, failedTransactionId: transactions[0]?.id };
330
+ }
331
+ admittedGasLimits = ceilingLimits;
332
+ verifiedSteps = retried;
333
+ finalFailure = undefined;
334
+ validatedReplayError = undefined;
335
+ }
336
+ catch {
337
+ await assertLifecycleBlock(client, block);
338
+ return { ...base, backend, admitted: false, steps: measured, reason: `Validated buffered replay failed (${validatedReplayError}) and envelope discovery at the exact gas ceiling was rejected by the simulation backend; final mint/lock/all-buys/public-opening is indivisible`, failedTransactionId: transactions[0]?.id };
339
+ }
340
+ }
341
+ if (finalFailure !== undefined) {
342
+ const failedIndex = verifiedSteps.findIndex((step) => !step.success);
343
+ const bufferedLimit = gasLimits[failedIndex];
344
+ const failedTransaction = transactions[failedIndex];
345
+ if (bufferedLimit !== undefined && failedTransaction !== undefined && looksGasExhausted(finalFailure, bufferedLimit) && limits.executionGasCeiling > bufferedLimit) {
346
+ // Buffered replay returned an exhaustion-shaped failed step; learn the true
347
+ // validated envelope with one explicit replay at the exact execution ceiling.
348
+ try {
349
+ const ceilingLimits = transactions.map(() => limits.executionGasCeiling);
350
+ const retried = backend === "eth_simulateV1"
351
+ ? await simulateRpcPass(client, planned, block, transactions, ceilingLimits, limits, gasPrice, true)
352
+ : options.fork === undefined ? undefined : await simulateForkPass(options.fork, planned, block, transactions, ceilingLimits, gasPrice, false, limits.headroomBps);
353
+ if (retried !== undefined) {
354
+ const retryFailure = retried.find((step) => !step.success);
355
+ if (retryFailure === undefined) {
356
+ admittedGasLimits = ceilingLimits;
357
+ verifiedSteps = retried;
358
+ finalFailure = undefined;
359
+ }
360
+ else {
361
+ const indivisible = failedTransaction.kind === "activate" || failedTransaction.kind === "atomic";
362
+ await assertLifecycleBlock(client, block);
363
+ return { ...base, backend, admitted: false, steps: measured, reason: `Validated execution at the exact current gas ceiling still failed: ${retryFailure.error ?? "the true gas envelope exceeds the current execution limit"}${indivisible ? "; final mint/lock/all-buys/public-opening is indivisible and will not be partitioned" : ""}`, failedTransactionId: failedTransaction.id };
364
+ }
365
+ }
366
+ }
367
+ catch { /* Envelope discovery unavailable; report the original buffered-limit failure unchanged. */ }
368
+ }
369
+ }
370
+ const estimates = [];
371
+ const balance = rpcQuantity(await lifecycleRpc(client, "eth_getBalance", [planned.account, toHex(block.number)]), "creator native balance");
372
+ let remainingBalance = balance;
373
+ let affordabilityFailure;
374
+ for (let index = 0; index < verifiedSteps.length; index += 1) {
375
+ const step = verifiedSteps[index];
376
+ const transaction = transactions[index];
377
+ const gasLimit = admittedGasLimits[index];
378
+ if (step === undefined || transaction === undefined || gasLimit === undefined)
379
+ throw new LifecyclePlanningError("INVALID_SIMULATION", "Missing verified fee context");
380
+ const dataFee = configuration.estimateDataFee === undefined ? undefined : await configuration.estimateDataFee({ ...transaction, gas: gasLimit }, context);
381
+ if (dataFee !== undefined && dataFee < 0n)
382
+ throw new LifecyclePlanningError("INVALID_DATA_FEE", "Data-fee oracle returned a negative amount");
383
+ const executionFee = gasLimit * gasPrice;
384
+ const required = transaction.value + executionFee + (dataFee ?? 0n);
385
+ if (required > remainingBalance && affordabilityFailure === undefined)
386
+ affordabilityFailure = "Creator native balance cannot fund the remaining transaction value and execution/data fee envelopes";
387
+ remainingBalance -= required;
388
+ estimates.push({ ...step, estimate: { gasUsed: step.gasUsed ?? 0n, gasLimit, gasPrice, executionFee, dataFee, totalFee: dataFee === undefined ? undefined : executionFee + dataFee, feeConfidence: dataFee === undefined ? "execution-only" : "execution-and-data" } });
389
+ }
390
+ await assertLifecycleBlock(client, block);
391
+ return { ...base, backend, admitted: finalFailure === undefined && affordabilityFailure === undefined && limits.admissionKnown, steps: estimates, reason: finalFailure?.error ?? affordabilityFailure ?? (limits.admissionKnown ? undefined : `Stateful execution was proved, but current execution admission constraints are incomplete: ${limits.unknownExecutionConstraints.join("; ")}`), failedTransactionId: finalFailure?.transactionId };
392
+ }
393
+ //# sourceMappingURL=simulation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation.js","sourceRoot":"","sources":["../../src/lifecycle/simulation.ts"],"names":[],"mappings":"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"}