@morpho-org/evm-simulation 4.2.0 → 5.0.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 +109 -17
- package/lib/cjs/authorizations.d.ts +95 -0
- package/lib/cjs/authorizations.js +2 -0
- package/lib/cjs/errors.d.ts +207 -13
- package/lib/cjs/errors.js +197 -13
- package/lib/cjs/index.d.ts +10 -2
- package/lib/cjs/index.js +19 -3
- package/lib/cjs/limits.d.ts +112 -0
- package/lib/cjs/limits.js +50 -0
- package/lib/cjs/params.d.ts +25 -0
- package/lib/cjs/params.js +5 -0
- package/lib/cjs/requirements/index.d.ts +1 -0
- package/lib/cjs/requirements/index.js +5 -0
- package/lib/cjs/requirements/requirements.d.ts +64 -0
- package/lib/cjs/requirements/requirements.js +149 -0
- package/lib/cjs/result.d.ts +49 -0
- package/lib/cjs/result.js +2 -0
- package/lib/cjs/simulate/asset-changes.d.ts +7 -5
- package/lib/cjs/simulate/asset-changes.js +6 -5
- package/lib/cjs/simulate/backends/client.d.ts +16 -0
- package/lib/cjs/simulate/backends/client.js +27 -0
- package/lib/cjs/simulate/backends/eth-simulate-v1.d.ts +66 -20
- package/lib/cjs/simulate/backends/eth-simulate-v1.js +172 -98
- package/lib/cjs/simulate/backends/index.d.ts +1 -2
- package/lib/cjs/simulate/backends/index.js +3 -4
- package/lib/cjs/simulate/backends/parse-response.d.ts +69 -0
- package/lib/cjs/simulate/backends/parse-response.js +168 -0
- package/lib/cjs/simulate/backends/resolve-assets.d.ts +26 -0
- package/lib/cjs/simulate/backends/resolve-assets.js +111 -0
- package/lib/cjs/simulate/backends/resolve-pinned-block.d.ts +33 -0
- package/lib/cjs/simulate/backends/resolve-pinned-block.js +46 -0
- package/lib/cjs/simulate/context.d.ts +14 -0
- package/lib/cjs/simulate/context.js +2 -0
- package/lib/cjs/simulate/measurement-plan.d.ts +29 -0
- package/lib/cjs/simulate/measurement-plan.js +115 -0
- package/lib/cjs/simulate/parsing/transfers.d.ts +4 -3
- package/lib/cjs/simulate/parsing/transfers.js +4 -6
- package/lib/cjs/simulate/pipeline/bundles-retention.d.ts +7 -10
- package/lib/cjs/simulate/pipeline/bundles-retention.js +11 -14
- package/lib/cjs/simulate/pipeline/resolve-chain.d.ts +5 -11
- package/lib/cjs/simulate/pipeline/resolve-chain.js +5 -10
- package/lib/cjs/simulate/plan/plan-execution.d.ts +58 -0
- package/lib/cjs/simulate/plan/plan-execution.js +75 -0
- package/lib/cjs/simulate/prepare.d.ts +30 -0
- package/lib/cjs/simulate/prepare.js +80 -0
- package/lib/cjs/simulate/request/index.d.ts +1 -0
- package/lib/cjs/simulate/request/index.js +5 -0
- package/lib/cjs/simulate/request/parse-request.d.ts +44 -0
- package/lib/cjs/simulate/request/parse-request.js +759 -0
- package/lib/cjs/simulate/result.d.ts +19 -0
- package/lib/cjs/simulate/result.js +29 -0
- package/lib/cjs/simulate/run-simulation.d.ts +18 -0
- package/lib/cjs/simulate/run-simulation.js +151 -0
- package/lib/cjs/simulate/simulate.d.ts +100 -50
- package/lib/cjs/simulate/simulate.js +99 -81
- package/lib/cjs/simulate/slippage.d.ts +18 -0
- package/lib/cjs/simulate/slippage.js +41 -0
- package/lib/cjs/simulate/state/contract.d.ts +19 -0
- package/lib/cjs/simulate/state/contract.js +2 -0
- package/lib/cjs/simulate/state/read-state.d.ts +60 -0
- package/lib/cjs/simulate/state/read-state.js +148 -0
- package/lib/cjs/simulate/verify-slippage.d.ts +24 -0
- package/lib/cjs/simulate/verify-slippage.js +85 -0
- package/lib/cjs/types.d.ts +35 -95
- package/lib/esm/authorizations.d.ts +95 -0
- package/lib/esm/authorizations.js +1 -0
- package/lib/esm/errors.d.ts +207 -13
- package/lib/esm/errors.js +189 -12
- package/lib/esm/index.d.ts +10 -2
- package/lib/esm/index.js +4 -1
- package/lib/esm/limits.d.ts +112 -0
- package/lib/esm/limits.js +47 -0
- package/lib/esm/params.d.ts +25 -0
- package/lib/esm/params.js +2 -0
- package/lib/esm/requirements/index.d.ts +1 -0
- package/lib/esm/requirements/index.js +1 -0
- package/lib/esm/requirements/requirements.d.ts +64 -0
- package/lib/esm/requirements/requirements.js +146 -0
- package/lib/esm/result.d.ts +49 -0
- package/lib/esm/result.js +1 -0
- package/lib/esm/simulate/asset-changes.d.ts +7 -5
- package/lib/esm/simulate/asset-changes.js +6 -5
- package/lib/esm/simulate/backends/client.d.ts +16 -0
- package/lib/esm/simulate/backends/client.js +24 -0
- package/lib/esm/simulate/backends/eth-simulate-v1.d.ts +66 -20
- package/lib/esm/simulate/backends/eth-simulate-v1.js +170 -99
- package/lib/esm/simulate/backends/index.d.ts +1 -2
- package/lib/esm/simulate/backends/index.js +1 -2
- package/lib/esm/simulate/backends/parse-response.d.ts +69 -0
- package/lib/esm/simulate/backends/parse-response.js +165 -0
- package/lib/esm/simulate/backends/resolve-assets.d.ts +26 -0
- package/lib/esm/simulate/backends/resolve-assets.js +108 -0
- package/lib/esm/simulate/backends/resolve-pinned-block.d.ts +33 -0
- package/lib/esm/simulate/backends/resolve-pinned-block.js +43 -0
- package/lib/esm/simulate/context.d.ts +14 -0
- package/lib/esm/simulate/context.js +1 -0
- package/lib/esm/simulate/measurement-plan.d.ts +29 -0
- package/lib/esm/simulate/measurement-plan.js +112 -0
- package/lib/esm/simulate/parsing/transfers.d.ts +4 -3
- package/lib/esm/simulate/parsing/transfers.js +4 -6
- package/lib/esm/simulate/pipeline/bundles-retention.d.ts +7 -10
- package/lib/esm/simulate/pipeline/bundles-retention.js +11 -14
- package/lib/esm/simulate/pipeline/resolve-chain.d.ts +5 -11
- package/lib/esm/simulate/pipeline/resolve-chain.js +5 -10
- package/lib/esm/simulate/plan/plan-execution.d.ts +58 -0
- package/lib/esm/simulate/plan/plan-execution.js +72 -0
- package/lib/esm/simulate/prepare.d.ts +30 -0
- package/lib/esm/simulate/prepare.js +77 -0
- package/lib/esm/simulate/request/index.d.ts +1 -0
- package/lib/esm/simulate/request/index.js +1 -0
- package/lib/esm/simulate/request/parse-request.d.ts +44 -0
- package/lib/esm/simulate/request/parse-request.js +756 -0
- package/lib/esm/simulate/result.d.ts +19 -0
- package/lib/esm/simulate/result.js +26 -0
- package/lib/esm/simulate/run-simulation.d.ts +18 -0
- package/lib/esm/simulate/run-simulation.js +148 -0
- package/lib/esm/simulate/simulate.d.ts +100 -50
- package/lib/esm/simulate/simulate.js +99 -81
- package/lib/esm/simulate/slippage.d.ts +18 -0
- package/lib/esm/simulate/slippage.js +38 -0
- package/lib/esm/simulate/state/contract.d.ts +19 -0
- package/lib/esm/simulate/state/contract.js +1 -0
- package/lib/esm/simulate/state/read-state.d.ts +60 -0
- package/lib/esm/simulate/state/read-state.js +144 -0
- package/lib/esm/simulate/verify-slippage.d.ts +24 -0
- package/lib/esm/simulate/verify-slippage.js +82 -0
- package/lib/esm/types.d.ts +35 -95
- package/package.json +7 -6
- package/lib/cjs/simulate/authorizations/index.d.ts +0 -2
- package/lib/cjs/simulate/authorizations/index.js +0 -7
- package/lib/cjs/simulate/authorizations/resolve.d.ts +0 -9
- package/lib/cjs/simulate/authorizations/resolve.js +0 -29
- package/lib/cjs/simulate/authorizations/validate.d.ts +0 -6
- package/lib/cjs/simulate/authorizations/validate.js +0 -23
- package/lib/cjs/simulate/backends/tenderly-rpc.d.ts +0 -23
- package/lib/cjs/simulate/backends/tenderly-rpc.js +0 -234
- package/lib/cjs/simulate/pipeline/build-simulation-txs.d.ts +0 -17
- package/lib/cjs/simulate/pipeline/build-simulation-txs.js +0 -50
- package/lib/cjs/simulate/pipeline/execute-simulation.d.ts +0 -22
- package/lib/cjs/simulate/pipeline/execute-simulation.js +0 -82
- package/lib/cjs/simulate/pipeline/index.d.ts +0 -4
- package/lib/cjs/simulate/pipeline/index.js +0 -11
- package/lib/cjs/simulate/pipeline/validate-input.d.ts +0 -10
- package/lib/cjs/simulate/pipeline/validate-input.js +0 -55
- package/lib/esm/simulate/authorizations/index.d.ts +0 -2
- package/lib/esm/simulate/authorizations/index.js +0 -2
- package/lib/esm/simulate/authorizations/resolve.d.ts +0 -9
- package/lib/esm/simulate/authorizations/resolve.js +0 -26
- package/lib/esm/simulate/authorizations/validate.d.ts +0 -6
- package/lib/esm/simulate/authorizations/validate.js +0 -20
- package/lib/esm/simulate/backends/tenderly-rpc.d.ts +0 -23
- package/lib/esm/simulate/backends/tenderly-rpc.js +0 -231
- package/lib/esm/simulate/pipeline/build-simulation-txs.d.ts +0 -17
- package/lib/esm/simulate/pipeline/build-simulation-txs.js +0 -47
- package/lib/esm/simulate/pipeline/execute-simulation.d.ts +0 -22
- package/lib/esm/simulate/pipeline/execute-simulation.js +0 -79
- package/lib/esm/simulate/pipeline/index.d.ts +0 -4
- package/lib/esm/simulate/pipeline/index.js +0 -4
- package/lib/esm/simulate/pipeline/validate-input.d.ts +0 -10
- package/lib/esm/simulate/pipeline/validate-input.js +0 -52
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Address } from "viem";
|
|
2
|
+
import type { SimulationAuthorization } from "../authorizations.js";
|
|
3
|
+
import type { SimulationTransaction } from "../types.js";
|
|
4
|
+
/** One authorization's preparation calls, in execution order. @internal */
|
|
5
|
+
export interface PlannedPreparation {
|
|
6
|
+
readonly authorizationIndex: number;
|
|
7
|
+
readonly calls: readonly Required<Readonly<SimulationTransaction>>[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the ordered preparation calls a preview execution runs before the
|
|
11
|
+
* user transactions, so each pending wallet request is satisfied onchain.
|
|
12
|
+
*
|
|
13
|
+
* - `erc20Approval` → `approve(spender, amount)`; zero-reset entries produce
|
|
14
|
+
* their own `approve(0)` call in list order.
|
|
15
|
+
* - Signature variants (`erc2612Permit`, `permit2SignatureTransfer`) grant
|
|
16
|
+
* owner→bundle allowance for the previewed pull — a permit2 transfer makes
|
|
17
|
+
* no change to the nonce bitmap.
|
|
18
|
+
* - `blueAuthorization` / `blueAuthorizationSignature` →
|
|
19
|
+
* `setAuthorization(authorized, isAuthorized)`.
|
|
20
|
+
*
|
|
21
|
+
* Final mode produces no preparations. Successful execution proves only the
|
|
22
|
+
* simulated permissions, not the validity of a future signature.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare function prepareAuthorizations(params: {
|
|
27
|
+
readonly authorizations: readonly SimulationAuthorization[];
|
|
28
|
+
readonly owner: Address;
|
|
29
|
+
readonly morpho: Address;
|
|
30
|
+
}): readonly PlannedPreparation[];
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { blueAbi } from "@morpho-org/morpho-sdk/abis";
|
|
2
|
+
import { deepFreeze } from "@morpho-org/morpho-ts";
|
|
3
|
+
import { encodeFunctionData, erc20Abi, getAddress } from "viem";
|
|
4
|
+
// biome-ignore lint/complexity/useMaxParams: lookup helpers read clearest with positional arguments
|
|
5
|
+
const approvalTx = (owner, token, spender, amount) => ({
|
|
6
|
+
from: getAddress(owner),
|
|
7
|
+
to: getAddress(token),
|
|
8
|
+
data: encodeFunctionData({
|
|
9
|
+
abi: erc20Abi,
|
|
10
|
+
functionName: "approve",
|
|
11
|
+
args: [spender, amount],
|
|
12
|
+
}),
|
|
13
|
+
value: 0n,
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Build the ordered preparation calls a preview execution runs before the
|
|
17
|
+
* user transactions, so each pending wallet request is satisfied onchain.
|
|
18
|
+
*
|
|
19
|
+
* - `erc20Approval` → `approve(spender, amount)`; zero-reset entries produce
|
|
20
|
+
* their own `approve(0)` call in list order.
|
|
21
|
+
* - Signature variants (`erc2612Permit`, `permit2SignatureTransfer`) grant
|
|
22
|
+
* owner→bundle allowance for the previewed pull — a permit2 transfer makes
|
|
23
|
+
* no change to the nonce bitmap.
|
|
24
|
+
* - `blueAuthorization` / `blueAuthorizationSignature` →
|
|
25
|
+
* `setAuthorization(authorized, isAuthorized)`.
|
|
26
|
+
*
|
|
27
|
+
* Final mode produces no preparations. Successful execution proves only the
|
|
28
|
+
* simulated permissions, not the validity of a future signature.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export function prepareAuthorizations(params) {
|
|
33
|
+
const { authorizations, owner, morpho } = params;
|
|
34
|
+
const preparations = [];
|
|
35
|
+
authorizations.forEach((auth, authorizationIndex) => {
|
|
36
|
+
const calls = [];
|
|
37
|
+
switch (auth.type) {
|
|
38
|
+
case "erc20Approval":
|
|
39
|
+
calls.push(approvalTx(owner, auth.token, auth.spender, auth.amount));
|
|
40
|
+
break;
|
|
41
|
+
case "erc2612Permit": {
|
|
42
|
+
const { message, domain } = auth.typedData;
|
|
43
|
+
calls.push(approvalTx(owner, domain.verifyingContract, message.spender, message.value));
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case "permit2SignatureTransfer": {
|
|
47
|
+
const { message } = auth.typedData;
|
|
48
|
+
calls.push(approvalTx(owner, message.permitted.token, message.spender, message.permitted.amount));
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case "blueAuthorization":
|
|
52
|
+
case "blueAuthorizationSignature": {
|
|
53
|
+
const { authorized, isAuthorized } = auth.type === "blueAuthorization" ? auth : auth.typedData.message;
|
|
54
|
+
calls.push({
|
|
55
|
+
from: getAddress(owner),
|
|
56
|
+
to: getAddress(morpho),
|
|
57
|
+
data: encodeFunctionData({
|
|
58
|
+
abi: blueAbi,
|
|
59
|
+
functionName: "setAuthorization",
|
|
60
|
+
args: [authorized, isAuthorized],
|
|
61
|
+
}),
|
|
62
|
+
value: 0n,
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
default: {
|
|
67
|
+
const exhaustive = auth;
|
|
68
|
+
void exhaustive;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
preparations.push({
|
|
72
|
+
authorizationIndex,
|
|
73
|
+
calls: deepFreeze(calls),
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
return deepFreeze(preparations);
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { parseRequest } from "./parse-request.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { parseRequest } from "./parse-request.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type Address, type BlockTag, type Hex } from "viem";
|
|
2
|
+
import type { SimulationAuthorization } from "../../authorizations.js";
|
|
3
|
+
import type { SimulationLimits } from "../../limits.js";
|
|
4
|
+
import { type SimulateParams, type SimulationMode } from "../../params.js";
|
|
5
|
+
/** A normalized user transaction: checksummed addresses, `value` defaulted to `0n`.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export interface ParsedTransaction {
|
|
9
|
+
readonly from: Address;
|
|
10
|
+
readonly to: Address;
|
|
11
|
+
readonly data: Hex;
|
|
12
|
+
readonly value: bigint;
|
|
13
|
+
}
|
|
14
|
+
/** The output of {@link parseRequest}: the caller's input validated, checksummed and defaulted.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export interface ParsedRequest {
|
|
18
|
+
readonly chainId: number;
|
|
19
|
+
readonly mode: SimulationMode;
|
|
20
|
+
readonly transactions: readonly ParsedTransaction[];
|
|
21
|
+
/** Always empty in final mode. */
|
|
22
|
+
readonly authorizations: readonly SimulationAuthorization[];
|
|
23
|
+
readonly blockNumber?: bigint | Exclude<BlockTag, "pending">;
|
|
24
|
+
readonly limits?: SimulationLimits;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse and normalize raw `simulate` input into a {@link ParsedRequest}.
|
|
28
|
+
*
|
|
29
|
+
* The public types own the key shape; runtime validation rejects unknown keys
|
|
30
|
+
* (`<path>.<key>: unknown field`), checks values — address and hex formats,
|
|
31
|
+
* uint256 ranges, typed-data field lists — and rejects legacy `{type: "approval"}` / `{type: "signature"}` authorizations and Permit2
|
|
32
|
+
* `PermitSingle` payloads rather than silently reinterpreting them. Cross-field
|
|
33
|
+
* rules then pin a single owner: every transaction `from` and every
|
|
34
|
+
* authorization owner must be the same checksummed address, typed-data domains
|
|
35
|
+
* must bind to `chainId`, and `mode: "final"` rejects authorizations outright.
|
|
36
|
+
*
|
|
37
|
+
* @param input - Caller input (`SimulateParams`-shaped).
|
|
38
|
+
* @returns A deep-frozen, checksummed request: `mode` explicit (`"final"`
|
|
39
|
+
* default), `authorizations` always an array, `value` defaulted to `0n`.
|
|
40
|
+
* @throws {SimulationValidationError} On any unknown key, value or cross-field
|
|
41
|
+
* violation.
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseRequest(input: SimulateParams): ParsedRequest;
|