viem-tx-sim 0.1.1 → 0.2.1
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 +115 -34
- package/contracts/TxSimulator.sol +83 -20
- package/dist/generated/txSimulatorBytecode.d.ts +1 -1
- package/dist/generated/txSimulatorBytecode.d.ts.map +1 -1
- package/dist/generated/txSimulatorBytecode.js +1 -1
- package/dist/generated/txSimulatorBytecode.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internal/queryDiscovery.d.ts +8 -0
- package/dist/internal/queryDiscovery.d.ts.map +1 -0
- package/dist/internal/queryDiscovery.js +38 -0
- package/dist/internal/queryDiscovery.js.map +1 -0
- package/dist/internal/requirements.d.ts +2 -1
- package/dist/internal/requirements.d.ts.map +1 -1
- package/dist/internal/requirements.js +23 -9
- package/dist/internal/requirements.js.map +1 -1
- package/dist/internal/simulator.d.ts +19 -3
- package/dist/internal/simulator.d.ts.map +1 -1
- package/dist/internal/simulator.js +12 -16
- package/dist/internal/simulator.js.map +1 -1
- package/dist/internal/slots.d.ts +4 -2
- package/dist/internal/slots.d.ts.map +1 -1
- package/dist/internal/slots.js +4 -2
- package/dist/internal/slots.js.map +1 -1
- package/dist/txSimulator.d.ts +64 -40
- package/dist/txSimulator.d.ts.map +1 -1
- package/dist/txSimulator.js +68 -16
- package/dist/txSimulator.js.map +1 -1
- package/dist/types.d.ts +59 -16
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/generated/txSimulatorBytecode.ts +1 -1
- package/src/index.ts +4 -1
- package/src/internal/queryDiscovery.ts +49 -0
- package/src/internal/requirements.ts +23 -9
- package/src/internal/simulator.ts +28 -24
- package/src/internal/slots.ts +5 -2
- package/src/txSimulator.ts +164 -63
- package/src/types.ts +63 -17
package/README.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# viem-tx-sim
|
|
2
2
|
|
|
3
|
+
- [Motivation](#motivation)
|
|
4
|
+
- [Mental model](#mental-model)
|
|
5
|
+
- [API at a glance](#api-at-a-glance)
|
|
6
|
+
- [Getting started](#getting-started)
|
|
7
|
+
- [Preparing balance and allowance overrides](#preparing-balance-and-allowance-overrides)
|
|
8
|
+
- [Estimating asset requirements (optional)](#estimating-asset-requirements-optional)
|
|
9
|
+
- [Debugging](#debugging)
|
|
10
|
+
- [Decoding Reverts](#decoding-reverts)
|
|
11
|
+
- [Known limitations](#known-limitations)
|
|
12
|
+
- [Development](#development)
|
|
13
|
+
- [Scope](#scope)
|
|
14
|
+
|
|
3
15
|
RPC-only transaction simulation helpers for [viem](https://viem.sh) applications: preview the asset changes of a transaction (or an ERC-5792 batch) before anyone signs it, using nothing but standard JSON-RPC.
|
|
4
16
|
|
|
5
17
|
## Motivation
|
|
@@ -8,10 +20,44 @@ Credit to the [apoorv X thread](https://x.com/apoorveth/status/20415440704814492
|
|
|
8
20
|
|
|
9
21
|
Every wallet shows "asset changes" before you sign. Most do it by sending your data to a centralized simulation API — a single point of failure and a privacy leak. viem-tx-sim makes the EVM do the work itself:
|
|
10
22
|
|
|
11
|
-
1. `
|
|
12
|
-
2.
|
|
23
|
+
1. For wallet-style previews, `sim.balanceQueries.forUser()` can dry-run each call with `eth_createAccessList` and filter touched contracts into token balance queries, with no token lists or indexers.
|
|
24
|
+
2. `sim.simulate()` takes explicit balance queries and performs one `eth_call` with state overrides, injecting a never-deployed `TxSimulator` contract **at the user's own address**. Because the simulator runs as the user, `address(this)` and `msg.sender` are the real account, so balance reads, allowance checks, and `msg.sender`-gated logic behave exactly as they would in the real transaction. Batch calls run sequentially in one EVM context, so an approval in call 1 is visible to a swap in call 2.
|
|
25
|
+
|
|
26
|
+
The core simulation is one RPC call when you already know what to observe. The wallet discovery flow is N access lists + one token-filter call + one simulation for an N-call batch. Zero servers, zero trust assumptions. See [docs/motivation.md](https://github.com/frontier159/viem-tx-sim/blob/main/docs/motivation.md) for the design's origin story, including how Permit2's ERC-1271 path and proxy-token storage are handled.
|
|
27
|
+
|
|
28
|
+
## Mental model
|
|
29
|
+
|
|
30
|
+
Everything passed to `sim.simulate()` is explicit: `calls` are what executes, `balanceQueries` are what you observe, and `tokenSlotOverrides` / `nativeBalanceOverrides` are the state assumptions you want to forge. `simulate()` does not discover tokens, retry, or forge balances by itself. The helper namespaces only build those data inputs: `balanceQueries.*` builds observations, and `tokenOverrides.*` builds token assumptions.
|
|
31
|
+
|
|
32
|
+
## API at a glance
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
const sim = TxSimulator.create({ client, gas, debug, errorAbi });
|
|
36
|
+
|
|
37
|
+
const result = await sim.simulate({
|
|
38
|
+
from,
|
|
39
|
+
calls, // SimulatedCall[]
|
|
40
|
+
balanceQueries, // BalanceQuery[]
|
|
41
|
+
tokenSlotOverrides, // TokenSlotOverride[] | undefined
|
|
42
|
+
nativeBalanceOverrides, // NativeBalanceOverride[] | undefined
|
|
43
|
+
gas,
|
|
44
|
+
debug,
|
|
45
|
+
errorAbi,
|
|
46
|
+
blockNumber,
|
|
47
|
+
blockTag,
|
|
48
|
+
});
|
|
49
|
+
// success -> { status: "success", balanceDeltas, unresolved }
|
|
50
|
+
// reverted -> success fields + { revertData, failingCallIndex, revertReason?, revertError? }
|
|
51
|
+
|
|
52
|
+
await sim.balanceQueries.forUser({ from, calls }); // BalanceQuery[]
|
|
53
|
+
await sim.balanceQueries.discoverErc20s({ from, calls }); // Address[]
|
|
54
|
+
await sim.tokenOverrides.forBalances({ from, tokens }); // PreparedBalanceOverrides
|
|
55
|
+
await sim.tokenOverrides.forAllowances({ from, pairs }); // PreparedAllowanceOverrides
|
|
56
|
+
await sim.tokenOverrides.estimateRequirements({ from, calls }); // EstimatedAssetRequirements
|
|
13
57
|
|
|
14
|
-
|
|
58
|
+
// Exports: DEFAULT_SIMULATION_GAS_LIMIT, OVERRIDE_TOKEN_AMOUNT, TxSimError,
|
|
59
|
+
// AccessListUnsupportedError, StateOverrideUnsupportedError, InvalidSimulationInputError.
|
|
60
|
+
```
|
|
15
61
|
|
|
16
62
|
## Getting started
|
|
17
63
|
|
|
@@ -39,39 +85,59 @@ const sim = TxSimulator.create({ client, gas: DEFAULT_SIMULATION_GAS_LIMIT });
|
|
|
39
85
|
const user = "0xYourAddress"; // no key or signing involved — any address can be simulated
|
|
40
86
|
const assets = parseUnits("1000", 18);
|
|
41
87
|
|
|
88
|
+
const calls = [
|
|
89
|
+
{
|
|
90
|
+
to: USDS,
|
|
91
|
+
data: encodeFunctionData({
|
|
92
|
+
abi: parseAbi(["function approve(address spender, uint256 amount) returns (bool)"]),
|
|
93
|
+
functionName: "approve",
|
|
94
|
+
args: [SUSDS, assets],
|
|
95
|
+
}),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
to: SUSDS,
|
|
99
|
+
data: encodeFunctionData({
|
|
100
|
+
abi: parseAbi(["function deposit(uint256 assets, address receiver) returns (uint256 shares)"]),
|
|
101
|
+
functionName: "deposit",
|
|
102
|
+
args: [assets, user],
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
const balanceQueries = await sim.balanceQueries.forUser({ from: user, calls });
|
|
42
107
|
const result = await sim.simulate({
|
|
43
108
|
from: user,
|
|
44
|
-
calls
|
|
45
|
-
|
|
46
|
-
to: USDS,
|
|
47
|
-
data: encodeFunctionData({
|
|
48
|
-
abi: parseAbi(["function approve(address spender, uint256 amount) returns (bool)"]),
|
|
49
|
-
functionName: "approve",
|
|
50
|
-
args: [SUSDS, assets],
|
|
51
|
-
}),
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
to: SUSDS,
|
|
55
|
-
data: encodeFunctionData({
|
|
56
|
-
abi: parseAbi(["function deposit(uint256 assets, address receiver) returns (uint256 shares)"]),
|
|
57
|
-
functionName: "deposit",
|
|
58
|
-
args: [assets, user],
|
|
59
|
-
}),
|
|
60
|
-
},
|
|
61
|
-
],
|
|
109
|
+
calls,
|
|
110
|
+
balanceQueries,
|
|
62
111
|
});
|
|
63
112
|
|
|
64
113
|
console.log(result.status); // "success"
|
|
65
|
-
console.log(result.
|
|
114
|
+
console.log(result.balanceDeltas);
|
|
66
115
|
// [
|
|
67
|
-
// { asset: "
|
|
68
|
-
// { asset: "
|
|
116
|
+
// { asset: "native", account: user, before: 1n..., after: 1n..., delta: 0n, byCall: [0n, 0n] },
|
|
117
|
+
// { asset: "0xdC03...384F", account: user, before: 1000n..., after: 0n, delta: -1000n..., byCall: [0n, -1000n...] },
|
|
118
|
+
// { asset: "0xa393...7fbD", account: user, before: 0n, after: 9xx...n, delta: 9xx...n, byCall: [0n, 9xx...n] },
|
|
69
119
|
// ]
|
|
70
120
|
```
|
|
71
121
|
|
|
72
|
-
|
|
122
|
+
`balanceDeltas` mirror your `balanceQueries` in order, including zero deltas, with raw `bigint` amounts in each asset's own units. `byCall` is index-aligned with `calls`, sums to `delta`, and entries from a failing call onward are `0n` on a returned revert. A revert is returned as `status: "reverted"`, never thrown; checking `status` gives typed access to `revertData` and `failingCallIndex`.
|
|
73
123
|
|
|
74
|
-
`sim.simulate()`
|
|
124
|
+
`sim.simulate()` observes only the balances you ask for and does not retry or forge state by itself. If `user` doesn't actually hold 1,000 USDS (say you're previewing for a view-only address), prepare and pass a balance override — see the next section. Query the token or native accounts you forge if you want to observe them. `DEFAULT_SIMULATION_GAS_LIMIT` is exported for callers that want to pass or display the default 16M simulation gas budget.
|
|
125
|
+
|
|
126
|
+
If your dapp already knows what it needs to inspect, skip wallet discovery and pass explicit queries. This can observe any account, not just `from`:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
const balanceQueries = tokens.map((asset) => ({ asset, account: pluginAddress }));
|
|
130
|
+
const result = await sim.simulate({
|
|
131
|
+
from: user,
|
|
132
|
+
calls: partialBundle,
|
|
133
|
+
balanceQueries,
|
|
134
|
+
});
|
|
135
|
+
const leftoverAfterZap = result.balanceDeltas.find(
|
|
136
|
+
(delta) => delta.asset === flashToken && delta.account === pluginAddress,
|
|
137
|
+
)?.byCall[0];
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
For approvals, either include an `approve` / `permit` call in `calls` so later calls see it, or use `sim.tokenOverrides.forAllowances()` when you need to simulate already-approved state without sending an approval call.
|
|
75
141
|
|
|
76
142
|
## Preparing balance and allowance overrides
|
|
77
143
|
|
|
@@ -81,11 +147,11 @@ Override preparation is explicit and cacheable. Preparation returns ready-to-use
|
|
|
81
147
|
import { TxSimulator } from "viem-tx-sim";
|
|
82
148
|
|
|
83
149
|
const sim = TxSimulator.create({ client });
|
|
84
|
-
const balanceOverrides = await sim.
|
|
150
|
+
const balanceOverrides = await sim.tokenOverrides.forBalances({
|
|
85
151
|
from,
|
|
86
152
|
tokens: [token],
|
|
87
153
|
});
|
|
88
|
-
const allowanceOverrides = await sim.
|
|
154
|
+
const allowanceOverrides = await sim.tokenOverrides.forAllowances({
|
|
89
155
|
from,
|
|
90
156
|
pairs: [{ token, spender }],
|
|
91
157
|
});
|
|
@@ -93,21 +159,33 @@ const allowanceOverrides = await sim.prepareAllowanceOverrides({
|
|
|
93
159
|
const result = await sim.simulate({
|
|
94
160
|
from,
|
|
95
161
|
calls: [{ to, data }],
|
|
162
|
+
balanceQueries: [{ asset: token, account: from }],
|
|
96
163
|
tokenSlotOverrides: [...balanceOverrides.slots, ...allowanceOverrides.slots],
|
|
97
164
|
});
|
|
98
165
|
```
|
|
99
166
|
|
|
100
167
|
Prepared balance overrides are reusable per token/owner, and prepared allowance overrides are reusable per token/owner/spender for the block/state you trust. Preparation pre-sets `amount` to the exported `OVERRIDE_TOKEN_AMOUNT` sentinel, a non-max `10^50` value chosen so standard ERC-20 allowance decrements remain observable. Handcrafted override amounts must be below `uint256.max`; max allowance skips decrements, and max balances can overflow on incoming transfers. Deltas for real holdings still work for rebasing tokens like stETH; only dealing hypothetical balances can fail, reported in `unresolved`.
|
|
101
168
|
|
|
169
|
+
Native balances do not need preparation or slot discovery. Set them directly with `nativeBalanceOverrides`, for `from` or any other account:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
const result = await sim.simulate({
|
|
173
|
+
from,
|
|
174
|
+
calls,
|
|
175
|
+
balanceQueries: [{ asset: "native", account: from }],
|
|
176
|
+
nativeBalanceOverrides: [{ account: from, amount: OVERRIDE_TOKEN_AMOUNT }],
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
102
180
|
## Estimating asset requirements (optional)
|
|
103
181
|
|
|
104
|
-
When you don't already know which balances and approvals a transaction needs, `sim.
|
|
182
|
+
When you don't already know which balances and approvals a transaction needs, `sim.tokenOverrides.estimateRequirements()` measures them by forging generous state and observing per-call balance and allowance changes. It also forges native balance for `from`, so native zap-in routes from unfunded wallets report `requirements.native` instead of failing as a route error. Returned amounts are estimates measured under forged state and should be padded; pairs whose allowance is set inside the batch (approve or permit) are excluded, and measured allowance decreases are sanity-bounded by the token's gross outflow. Measurements discarded by that bound are reported under `unresolved.allowances`.
|
|
105
183
|
|
|
106
184
|
```ts
|
|
107
185
|
import { TxSimulator } from "viem-tx-sim";
|
|
108
186
|
|
|
109
187
|
const sim = TxSimulator.create({ client });
|
|
110
|
-
const requirements = await sim.
|
|
188
|
+
const requirements = await sim.tokenOverrides.estimateRequirements({ from, calls });
|
|
111
189
|
// requirements.allowances -> [{ token, spender, amount }]
|
|
112
190
|
// requirements.balances -> [{ token, amount }]
|
|
113
191
|
// requirements.slots -> feed to sim.simulate({ ..., tokenSlotOverrides })
|
|
@@ -115,6 +193,7 @@ const requirements = await sim.estimateAssetRequirements({ from, calls });
|
|
|
115
193
|
const result = await sim.simulate({
|
|
116
194
|
from,
|
|
117
195
|
calls,
|
|
196
|
+
balanceQueries: await sim.balanceQueries.forUser({ from, calls }),
|
|
118
197
|
tokenSlotOverrides: requirements.slots,
|
|
119
198
|
});
|
|
120
199
|
```
|
|
@@ -130,6 +209,7 @@ const sim = TxSimulator.create({ client });
|
|
|
130
209
|
const result = await sim.simulate({
|
|
131
210
|
from,
|
|
132
211
|
calls: [{ to, data, value: 0n }],
|
|
212
|
+
balanceQueries: [],
|
|
133
213
|
debug: true,
|
|
134
214
|
});
|
|
135
215
|
```
|
|
@@ -140,6 +220,7 @@ Or pass a callback to collect structured events:
|
|
|
140
220
|
await sim.simulate({
|
|
141
221
|
from,
|
|
142
222
|
calls: [{ to, data }],
|
|
223
|
+
balanceQueries: [],
|
|
143
224
|
debug: (event) => {
|
|
144
225
|
console.debug(event.method, event.step, event.phase, event.durationMs);
|
|
145
226
|
},
|
|
@@ -171,13 +252,13 @@ Situations the simulation does not cover, or where the preview can differ from r
|
|
|
171
252
|
|
|
172
253
|
**An adversarial contract can detect it is being simulated** — via the code at `from`, the recognizable forged balances, or `eth_call` context — and behave differently in the real transaction. This is inherent to state-override simulation (centralized simulation APIs share it). Treat the preview as best-effort insight, not a security guarantee against malicious contracts.
|
|
173
254
|
|
|
174
|
-
**Results are estimates against one block's state.** Deltas and estimated asset requirements reflect the chosen block; prices, liquidity, and allowances move before the real transaction lands. Pad amounts accordingly. Amounts from `sim.
|
|
255
|
+
**Results are estimates against one block's state.** Deltas and estimated asset requirements reflect the chosen block; prices, liquidity, and allowances move before the real transaction lands. Pad amounts accordingly. Amounts from `sim.tokenOverrides.estimateRequirements()` are additionally measured under forged (very large) balances, so contracts that branch on the account's real balance can be measured on the wrong branch.
|
|
175
256
|
|
|
176
257
|
**Asset coverage is native + `balanceOf(address)`.** Deltas track ETH and anything answering ERC-20-style `balanceOf` (an ERC-721 shows up as a count delta, without token IDs). ERC-1155 balances (`balanceOf(address,uint256)`) are not tracked. Tokens whose balance is computed rather than stored in one slot per holder (rebasing/share-based tokens like stETH) cannot be forged — override preparation verifies slots before writing and reports them in the `unresolved` list.
|
|
177
258
|
|
|
178
|
-
**
|
|
259
|
+
**Wallet discovery follows the dry run.** `sim.balanceQueries.forUser()` token candidates come from `eth_createAccessList` on the *unforged* calls; if that dry run reverts early, contracts that would only be touched later are not discovered. Explicit `balanceQueries` avoid this when your app already knows the assets or accounts to observe.
|
|
179
260
|
|
|
180
|
-
**RPC provider requirements.**
|
|
261
|
+
**RPC provider requirements.** `sim.simulate()` requires `eth_call` with state overrides. `sim.balanceQueries.forUser()`, `sim.balanceQueries.discoverErc20s()`, `sim.tokenOverrides.*`, and asset-requirement estimation also require `eth_createAccessList` (including returning the access list for reverting calls). Missing support surfaces as `AccessListUnsupportedError` / `StateOverrideUnsupportedError`.
|
|
181
262
|
|
|
182
263
|
**Not a gas estimator.** The simulation runs under `DEFAULT_SIMULATION_GAS_LIMIT` by default and the injected code changes gas accounting; use `eth_estimateGas` on the real transaction for gas.
|
|
183
264
|
|
|
@@ -225,4 +306,4 @@ Set `MAINNET_BLOCK_NUMBER` to override the pinned default block.
|
|
|
225
306
|
|
|
226
307
|
## Scope
|
|
227
308
|
|
|
228
|
-
|
|
309
|
+
The library returns explicit raw balance observations only. Token metadata, token lists, indexers, centralized simulation APIs, approval UX, and price enrichment are intentionally out of scope. The library never constructs or signs permits or EIP-712 payloads; callers bring fully signed calldata, and already-signed permit calls simulate as ordinary calls.
|
|
@@ -21,6 +21,11 @@ contract TxSimulator is IERC1271Like {
|
|
|
21
21
|
address spender;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
struct BalanceProbe {
|
|
25
|
+
address token;
|
|
26
|
+
address account;
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
struct SimulationResult {
|
|
25
30
|
bool success;
|
|
26
31
|
uint256 failingCallIndex;
|
|
@@ -32,6 +37,8 @@ contract TxSimulator is IERC1271Like {
|
|
|
32
37
|
uint256[] maxTokenOutflows;
|
|
33
38
|
uint256 maxNativeOutflow;
|
|
34
39
|
uint256[] allowanceCheckpoints;
|
|
40
|
+
uint256[] balanceCheckpoints;
|
|
41
|
+
bool[] balanceProbeOk;
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
struct TokenState {
|
|
@@ -45,27 +52,36 @@ contract TxSimulator is IERC1271Like {
|
|
|
45
52
|
struct ExecutionState {
|
|
46
53
|
bool[] isToken;
|
|
47
54
|
uint256[] minBalances;
|
|
48
|
-
uint256[]
|
|
55
|
+
uint256[] allowanceCheckpoints;
|
|
56
|
+
uint256[] balanceCheckpoints;
|
|
57
|
+
bool[] balanceProbeOk;
|
|
49
58
|
uint256 stride;
|
|
50
59
|
}
|
|
51
60
|
|
|
52
|
-
function simulate(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
function simulate(
|
|
62
|
+
SimulatedCall[] calldata calls,
|
|
63
|
+
address[] calldata candidates,
|
|
64
|
+
AllowanceProbe[] calldata probes,
|
|
65
|
+
BalanceProbe[] calldata balanceProbes
|
|
66
|
+
) external returns (SimulationResult memory result) {
|
|
56
67
|
uint256 nativeBefore = address(this).balance;
|
|
57
68
|
TokenState memory tokenState = _snapshotTokens(candidates);
|
|
69
|
+
uint256 stride = calls.length + 1;
|
|
70
|
+
result.balanceCheckpoints = new uint256[](balanceProbes.length * stride);
|
|
71
|
+
result.balanceProbeOk = new bool[](balanceProbes.length);
|
|
58
72
|
|
|
59
|
-
result.allowanceCheckpoints = new uint256[](probes.length *
|
|
73
|
+
result.allowanceCheckpoints = new uint256[](probes.length * stride);
|
|
60
74
|
ExecutionState memory executionState = ExecutionState({
|
|
61
75
|
isToken: tokenState.isToken,
|
|
62
76
|
minBalances: tokenState.minBalances,
|
|
63
|
-
|
|
64
|
-
|
|
77
|
+
allowanceCheckpoints: result.allowanceCheckpoints,
|
|
78
|
+
balanceCheckpoints: result.balanceCheckpoints,
|
|
79
|
+
balanceProbeOk: result.balanceProbeOk,
|
|
80
|
+
stride: stride
|
|
65
81
|
});
|
|
66
82
|
uint256 nativeMin;
|
|
67
83
|
(result.success, result.failingCallIndex, result.revertData, nativeMin) =
|
|
68
|
-
_executeCalls(calls, candidates, probes,
|
|
84
|
+
_executeCalls(calls, candidates, probes, balanceProbes, executionState);
|
|
69
85
|
|
|
70
86
|
result.nativeDelta = _signedDelta(address(this).balance, nativeBefore);
|
|
71
87
|
result.observedTokens = _trimAddresses(tokenState.observedScratch, tokenState.observedCount);
|
|
@@ -148,24 +164,38 @@ contract TxSimulator is IERC1271Like {
|
|
|
148
164
|
SimulatedCall[] calldata calls,
|
|
149
165
|
address[] calldata candidates,
|
|
150
166
|
AllowanceProbe[] calldata probes,
|
|
151
|
-
|
|
152
|
-
|
|
167
|
+
BalanceProbe[] calldata balanceProbes,
|
|
168
|
+
ExecutionState memory executionState
|
|
153
169
|
) internal returns (bool success, uint256 failingCallIndex, bytes memory revertData, uint256 nativeMin) {
|
|
154
170
|
success = true;
|
|
155
171
|
failingCallIndex = type(uint256).max;
|
|
156
|
-
nativeMin =
|
|
172
|
+
nativeMin = address(this).balance;
|
|
157
173
|
if (probes.length > 0) {
|
|
158
|
-
_recordAllowanceCheckpoints(probes, executionState.stride, 0, executionState.
|
|
174
|
+
_recordAllowanceCheckpoints(probes, executionState.stride, 0, executionState.allowanceCheckpoints);
|
|
175
|
+
}
|
|
176
|
+
if (balanceProbes.length > 0) {
|
|
177
|
+
_recordBalanceCheckpoints(
|
|
178
|
+
balanceProbes,
|
|
179
|
+
executionState.stride,
|
|
180
|
+
0,
|
|
181
|
+
executionState.balanceCheckpoints,
|
|
182
|
+
executionState.balanceProbeOk
|
|
183
|
+
);
|
|
159
184
|
}
|
|
160
185
|
|
|
161
186
|
for (uint256 i = 0; i < calls.length; ++i) {
|
|
162
|
-
(
|
|
163
|
-
if (!
|
|
164
|
-
success = false;
|
|
187
|
+
(success, revertData) = _executeCall(calls[i]);
|
|
188
|
+
if (!success) {
|
|
165
189
|
failingCallIndex = i;
|
|
166
|
-
revertData = callRevertData;
|
|
167
190
|
if (probes.length > 0) {
|
|
168
|
-
_fillRemainingCheckpoints(
|
|
191
|
+
_fillRemainingCheckpoints(
|
|
192
|
+
probes.length, executionState.stride, i, executionState.allowanceCheckpoints
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
if (balanceProbes.length > 0) {
|
|
196
|
+
_fillRemainingCheckpoints(
|
|
197
|
+
balanceProbes.length, executionState.stride, i, executionState.balanceCheckpoints
|
|
198
|
+
);
|
|
169
199
|
}
|
|
170
200
|
break;
|
|
171
201
|
}
|
|
@@ -174,14 +204,24 @@ contract TxSimulator is IERC1271Like {
|
|
|
174
204
|
if (nativeAfter < nativeMin) nativeMin = nativeAfter;
|
|
175
205
|
_updateMinBalances(candidates, executionState.isToken, executionState.minBalances);
|
|
176
206
|
if (probes.length > 0) {
|
|
177
|
-
_recordAllowanceCheckpoints(probes, executionState.stride, i + 1, executionState.
|
|
207
|
+
_recordAllowanceCheckpoints(probes, executionState.stride, i + 1, executionState.allowanceCheckpoints);
|
|
208
|
+
}
|
|
209
|
+
if (balanceProbes.length > 0) {
|
|
210
|
+
_recordBalanceCheckpoints(
|
|
211
|
+
balanceProbes,
|
|
212
|
+
executionState.stride,
|
|
213
|
+
i + 1,
|
|
214
|
+
executionState.balanceCheckpoints,
|
|
215
|
+
executionState.balanceProbeOk
|
|
216
|
+
);
|
|
178
217
|
}
|
|
179
218
|
}
|
|
180
219
|
}
|
|
181
220
|
|
|
182
221
|
function _executeCall(SimulatedCall calldata call_) internal returns (bool ok, bytes memory revertData) {
|
|
183
222
|
// forge-lint: disable-next-line(low-level-calls, arbitrary-send-eth, calls-loop)
|
|
184
|
-
|
|
223
|
+
(ok, revertData) = call_.to.call{value: call_.value}(call_.data);
|
|
224
|
+
if (ok) revertData = "";
|
|
185
225
|
}
|
|
186
226
|
|
|
187
227
|
function _updateMinBalances(address[] calldata candidates, bool[] memory isToken, uint256[] memory minBalances)
|
|
@@ -208,6 +248,20 @@ contract TxSimulator is IERC1271Like {
|
|
|
208
248
|
}
|
|
209
249
|
}
|
|
210
250
|
|
|
251
|
+
function _recordBalanceCheckpoints(
|
|
252
|
+
BalanceProbe[] calldata probes,
|
|
253
|
+
uint256 stride,
|
|
254
|
+
uint256 offset,
|
|
255
|
+
uint256[] memory checkpoints,
|
|
256
|
+
bool[] memory ok
|
|
257
|
+
) internal view {
|
|
258
|
+
for (uint256 i = 0; i < probes.length; ++i) {
|
|
259
|
+
(bool readOk, uint256 balance) = _readBalanceProbe(probes[i]);
|
|
260
|
+
checkpoints[i * stride + offset] = readOk ? balance : 0;
|
|
261
|
+
ok[i] = offset == 0 ? readOk : ok[i] && readOk;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
211
265
|
function _fillRemainingCheckpoints(
|
|
212
266
|
uint256 probeCount,
|
|
213
267
|
uint256 stride,
|
|
@@ -230,6 +284,15 @@ contract TxSimulator is IERC1271Like {
|
|
|
230
284
|
balance = abi.decode(data, (uint256));
|
|
231
285
|
}
|
|
232
286
|
|
|
287
|
+
function _readBalanceProbe(BalanceProbe calldata probe) internal view returns (bool ok, uint256 balance) {
|
|
288
|
+
if (probe.token == address(0)) {
|
|
289
|
+
ok = true;
|
|
290
|
+
balance = probe.account.balance;
|
|
291
|
+
return (ok, balance);
|
|
292
|
+
}
|
|
293
|
+
return _tryBalanceOf(probe.token, probe.account);
|
|
294
|
+
}
|
|
295
|
+
|
|
233
296
|
function _tryAllowance(address token, address owner, address spender)
|
|
234
297
|
internal
|
|
235
298
|
view
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const txSimulatorRuntimeBytecode: "0x60806040526004361061004c575f3560e01c8063150b7a02146100575780631626ba7e146100a0578063bc197c81146100bf578063cb8935e9146100ed578063f23a6e6114610119575f80fd5b3661005357005b5f80fd5b348015610062575f80fd5b506100826100713660046110ac565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100ab575f80fd5b506100826100ba366004611115565b610145565b3480156100ca575f80fd5b506100826100d936600461119c565b63bc197c8160e01b98975050505050505050565b3480156100f8575f80fd5b5061010c61010736600461124e565b610181565b60405161009791906113cb565b348015610124575f80fd5b506100826101333660046114b9565b63f23a6e6160e01b9695505050505050565b5f30610152858585610300565b6001600160a01b03161461016e576001600160e01b0319610177565b630b135d3f60e11b5b90505b9392505050565b6101d56040518061014001604052805f151581526020015f8152602001606081526020015f8152602001606081526020016060815260200160608152602001606081526020015f8152602001606081525090565b475f6101e18787610456565b90506101ee88600161153f565b6101f89085611552565b6001600160401b0381111561020f5761020f611569565b604051908082528060200260200182016040528015610238578160200160208202803683370190505b50610120840190815260408051608081018252838201518152602080850151908201529151908201525f90606081016102728b600161153f565b905290505f6102878b8b8b8b8b8b888b6106d5565b60408901919091526020880191909152901515865290506102a847856107cd565b8560600181815250506102c383606001518460800151610844565b6080860152808410156102d6575f6102e0565b6102e0818561157d565b6101008601526102f2898985886108e0565b505050509695505050505050565b5f60418290036103bb578235602084013560408501355f1a601b81101561032f5761032c601b82611590565b90505b8060ff16601b1415801561034757508060ff16601c14155b15610357575f935050505061017a565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156103a7573d5f803e3d5ffd5b50505060206040510351935050505061017a565b604082900361044d57823560208401356001600160ff1b0381165f6103e560ff84901c601b61153f565b604080515f8152602081018083528b905260ff831691810191909152606081018690526080810184905290915060019060a0016020604051602081039080840390855afa158015610438573d5f803e3d5ffd5b5050506020604051035194505050505061017a565b505f9392505050565b6104876040518060a00160405280606081526020016060815260200160608152602001606081526020015f81525090565b816001600160401b0381111561049f5761049f611569565b6040519080825280602002602001820160405280156104c8578160200160208202803683370190505b508152816001600160401b038111156104e3576104e3611569565b60405190808252806020026020018201604052801561050c578160200160208202803683370190505b506020820152816001600160401b0381111561052a5761052a611569565b604051908082528060200260200182016040528015610553578160200160208202803683370190505b506040820152816001600160401b0381111561057157610571611569565b60405190808252806020026020018201604052801561059a578160200160208202803683370190505b5060608201525f5b828110156106ce575f806105dc8686858181106105c1576105c16115a9565b90506020020160208101906105d691906115bd565b30610b97565b9150915081156106c4576001846040015184815181106105fe576105fe6115a9565b60200260200101901515908115158152505080845f01518481518110610626576106266115a9565b6020026020010181815250508084602001518481518110610649576106496115a9565b602002602001018181525050858584818110610667576106676115a9565b905060200201602081019061067c91906115bd565b606085015160808601805190610691826115d6565b9052815181106106a3576106a36115a9565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50506001016105a2565b5092915050565b60015f1960608386156106f7576106f7888888606001515f8a60400151610c6f565b5f5b8b8110156107bd575f8061072f8f8f85818110610718576107186115a9565b905060200281019061072a91906115ee565b610d2a565b9150915081610768575f96509194509092508390838915610761576107618b8b90508a60600151858c60400151610dac565b50506107bd565b4784811015610775578094505b6107888e8e8c5f01518d60200151610e4b565b8a156107af576107af8c8c8c606001518760016107a5919061153f565b8e60400151610c6f565b5050508060010190506106f9565b5098509850985098945050505050565b5f818310610808575f6107e0838561157d565b90506001600160ff1b03811115610801576001600160ff1b0391505061083e565b905061083e565b5f610813848461157d565b90506001600160ff1b0381111561083157600160ff1b91505061083e565b61083a8161160c565b9150505b92915050565b6060816001600160401b0381111561085e5761085e611569565b604051908082528060200260200182016040528015610887578160200160208202803683370190505b5090505f5b828110156106ce578381815181106108a6576108a66115a9565b60200260200101518282815181106108c0576108c06115a9565b6001600160a01b039092166020928302919091019091015260010161088c565b826001600160401b038111156108f8576108f8611569565b604051908082528060200260200182016040528015610921578160200160208202803683370190505b5060e08201525f836001600160401b0381111561094057610940611569565b604051908082528060200260200182016040528015610969578160200160208202803683370190505b5090505f846001600160401b0381111561098557610985611569565b6040519080825280602002602001820160405280156109ae578160200160208202803683370190505b5090505f805b86811015610b6c57856040015181815181106109d2576109d26115a9565b602002602001015115610b6457856020015181815181106109f5576109f56115a9565b6020026020010151865f01518281518110610a1257610a126115a9565b602002602001015110610a875785602001518181518110610a3557610a356115a9565b6020026020010151865f01518281518110610a5257610a526115a9565b6020026020010151610a64919061157d565b8560e001518281518110610a7a57610a7a6115a9565b6020026020010181815250505b5f80610a9e8a8a858181106105c1576105c16115a9565b9150915081610aae575050610b64565b5f610ad5828a5f01518681518110610ac857610ac86115a9565b60200260200101516107cd565b90508015610b60578a8a85818110610aef57610aef6115a9565b9050602002016020810190610b0491906115bd565b878681518110610b1657610b166115a9565b60200260200101906001600160a01b031690816001600160a01b03168152505080868681518110610b4957610b496115a9565b6020908102919091010152610b5d856115d6565b94505b5050505b6001016109b4565b50610b778382610844565b60a0850152610b868282610ee4565b8460c0018190525050505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839283928392881691610bf091611626565b5f60405180830381855afa9150503d805f8114610c28576040519150601f19603f3d011682016040523d82523d5f602084013e610c2d565b606091505b5091509150811580610c40575060208151105b15610c4c575050610c68565b81935080806020019051810190610c639190611637565b925050505b9250929050565b5f5b84811015610d22575f80610cd6888885818110610c9057610c906115a9565b610ca692602060409092020190810191506115bd565b308a8a87818110610cb957610cb96115a9565b9050604002016020016020810190610cd191906115bd565b610f73565b9150915081610ce5575f610ce7565b805b8486610cf38987611552565b610cfd919061153f565b81518110610d0d57610d0d6115a9565b60209081029190910101525050600101610c71565b505050505050565b5f6060610d3a60208401846115bd565b6001600160a01b03166020840135610d55604086018661164e565b604051610d63929190611690565b5f6040518083038185875af1925050503d805f8114610d9d576040519150601f19603f3d011682016040523d82523d5f602084013e610da2565b606091505b5091509150915091565b5f5b84811015610e44575f8284610dc38785611552565b610dcd919061153f565b81518110610ddd57610ddd6115a9565b602002602001015190505f846001610df5919061153f565b90505b85811015610e3a57818482610e0d8987611552565b610e17919061153f565b81518110610e2757610e276115a9565b6020908102919091010152600101610df8565b5050600101610dae565b5050505050565b5f5b83811015610e4457828181518110610e6757610e676115a9565b602002602001015115610edc575f80610e8b8787858181106105c1576105c16115a9565b91509150818015610eb45750838381518110610ea957610ea96115a9565b602002602001015181105b15610ed95780848481518110610ecc57610ecc6115a9565b6020026020010181815250505b50505b600101610e4d565b6060816001600160401b03811115610efe57610efe611569565b604051908082528060200260200182016040528015610f27578160200160208202803683370190505b5090505f5b828110156106ce57838181518110610f4657610f466115a9565b6020026020010151828281518110610f6057610f606115a9565b6020908102919091010152600101610f2c565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316636eb1769f60e11b17905291515f92839283928392891691610fd491611626565b5f60405180830381855afa9150503d805f811461100c576040519150601f19603f3d011682016040523d82523d5f602084013e611011565b606091505b5091509150811580611024575060208151105b1561103057505061104c565b819350808060200190518101906110479190611637565b925050505b935093915050565b80356001600160a01b038116811461106a575f80fd5b919050565b5f8083601f84011261107f575f80fd5b5081356001600160401b03811115611095575f80fd5b602083019150836020828501011115610c68575f80fd5b5f805f805f608086880312156110c0575f80fd5b6110c986611054565b94506110d760208701611054565b93506040860135925060608601356001600160401b038111156110f8575f80fd5b6111048882890161106f565b969995985093965092949392505050565b5f805f60408486031215611127575f80fd5b8335925060208401356001600160401b03811115611143575f80fd5b61114f8682870161106f565b9497909650939450505050565b5f8083601f84011261116c575f80fd5b5081356001600160401b03811115611182575f80fd5b6020830191508360208260051b8501011115610c68575f80fd5b5f805f805f805f8060a0898b0312156111b3575f80fd5b6111bc89611054565b97506111ca60208a01611054565b965060408901356001600160401b03808211156111e5575f80fd5b6111f18c838d0161115c565b909850965060608b0135915080821115611209575f80fd5b6112158c838d0161115c565b909650945060808b013591508082111561122d575f80fd5b5061123a8b828c0161106f565b999c989b5096995094979396929594505050565b5f805f805f8060608789031215611263575f80fd5b86356001600160401b0380821115611279575f80fd5b6112858a838b0161115c565b9098509650602089013591508082111561129d575f80fd5b6112a98a838b0161115c565b909650945060408901359150808211156112c1575f80fd5b818901915089601f8301126112d4575f80fd5b8135818111156112e2575f80fd5b8a60208260061b85010111156112f6575f80fd5b6020830194508093505050509295509295509295565b5f5b8381101561132657818101518382015260200161130e565b50505f910152565b5f815180845261134581602086016020860161130c565b601f01601f19169290920160200192915050565b5f815180845260208085019450602084015f5b838110156113915781516001600160a01b03168752958201959082019060010161136c565b509495945050505050565b5f815180845260208085019450602084015f5b83811015611391578151875295820195908201906001016113af565b602081526113de60208201835115159052565b602082015160408201525f604083015161014080606085015261140561016085018361132e565b9150606085015160808501526080850151601f19808685030160a087015261142d8483611359565b935060a08701519150808685030160c087015261144a8483611359565b935060c08701519150808685030160e0870152611467848361139c565b935060e08701519150610100818786030181880152611486858461139c565b908801516101208881019190915288015187820390920184880152935090506114af838261139c565b9695505050505050565b5f805f805f8060a087890312156114ce575f80fd5b6114d787611054565b95506114e560208801611054565b9450604087013593506060870135925060808701356001600160401b0381111561150d575f80fd5b61151989828a0161106f565b979a9699509497509295939492505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561083e5761083e61152b565b808202811582820484141761083e5761083e61152b565b634e487b7160e01b5f52604160045260245ffd5b8181038181111561083e5761083e61152b565b60ff818116838216019081111561083e5761083e61152b565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156115cd575f80fd5b61017a82611054565b5f600182016115e7576115e761152b565b5060010190565b5f8235605e19833603018112611602575f80fd5b9190910192915050565b5f600160ff1b82016116205761162061152b565b505f0390565b5f825161160281846020870161130c565b5f60208284031215611647575f80fd5b5051919050565b5f808335601e19843603018112611663575f80fd5b8301803591506001600160401b0382111561167c575f80fd5b602001915036819003821315610c68575f80fd5b818382375f910190815291905056fea2646970667358221220c9adb57984fec989769acf8df499b49fd3aadd781fd0b128ec026480393cb0a764736f6c63430008180033";
|
|
1
|
+
export declare const txSimulatorRuntimeBytecode: "0x60806040526004361061004c575f3560e01c8063150b7a02146100575780631626ba7e146100a05780639b093492146100bf578063bc197c81146100eb578063f23a6e6114610119575f80fd5b3661005357005b5f80fd5b348015610062575f80fd5b50610082610071366004611316565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100ab575f80fd5b506100826100ba36600461137f565b610145565b3480156100ca575f80fd5b506100de6100d9366004611446565b610181565b60405161009791906115f0565b3480156100f6575f80fd5b5061008261010536600461171e565b63bc197c8160e01b98975050505050505050565b348015610124575f80fd5b506100826101333660046117bc565b63f23a6e6160e01b9695505050505050565b5f306101528585856103b6565b6001600160a01b03161461016e576001600160e01b0319610177565b630b135d3f60e11b5b90505b9392505050565b6101e36040518061018001604052805f151581526020015f8152602001606081526020015f8152602001606081526020016060815260200160608152602001606081526020015f81526020016060815260200160608152602001606081525090565b475f6101ef898961050c565b90505f6101fd8b6001611842565b90506102098186611855565b6001600160401b038111156102205761022061186c565b604051908082528060200260200182016040528015610249578160200160208202803683370190505b50610140850152846001600160401b038111156102685761026861186c565b604051908082528060200260200182016040528015610291578160200160208202803683370190505b506101608501526102a28188611855565b6001600160401b038111156102b9576102b961186c565b6040519080825280602002602001820160405280156102e2578160200160208202803683370190505b5061012085019081526040805160c081018252848201518152602080860151908201529151908201526101408501516060820152610160850151608082015260a081018290525f61033a8e8e8e8e8e8e8e8e8a61078b565b60408a019190915260208901919091529015158752905061035b47866108dc565b86606001818152505061037684606001518560800151610953565b608087015280851015610389575f610393565b6103938186611880565b6101008701526103a58c8c86896109ef565b505050505098975050505050505050565b5f6041829003610471578235602084013560408501355f1a601b8110156103e5576103e2601b82611893565b90505b8060ff16601b141580156103fd57508060ff16601c14155b1561040d575f935050505061017a565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561045d573d5f803e3d5ffd5b50505060206040510351935050505061017a565b604082900361050357823560208401356001600160ff1b0381165f61049b60ff84901c601b611842565b604080515f8152602081018083528b905260ff831691810191909152606081018690526080810184905290915060019060a0016020604051602081039080840390855afa1580156104ee573d5f803e3d5ffd5b5050506020604051035194505050505061017a565b505f9392505050565b61053d6040518060a00160405280606081526020016060815260200160608152602001606081526020015f81525090565b816001600160401b038111156105555761055561186c565b60405190808252806020026020018201604052801561057e578160200160208202803683370190505b508152816001600160401b038111156105995761059961186c565b6040519080825280602002602001820160405280156105c2578160200160208202803683370190505b506020820152816001600160401b038111156105e0576105e061186c565b604051908082528060200260200182016040528015610609578160200160208202803683370190505b506040820152816001600160401b038111156106275761062761186c565b604051908082528060200260200182016040528015610650578160200160208202803683370190505b5060608201525f5b82811015610784575f80610692868685818110610677576106776118ac565b905060200201602081019061068c91906118c0565b30610ca6565b91509150811561077a576001846040015184815181106106b4576106b46118ac565b60200260200101901515908115158152505080845f015184815181106106dc576106dc6118ac565b60200260200101818152505080846020015184815181106106ff576106ff6118ac565b60200260200101818152505085858481811061071d5761071d6118ac565b905060200201602081019061073291906118c0565b606085015160808601805190610747826118d9565b905281518110610759576107596118ac565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5050600101610658565b5092915050565b60015f1960604787156107ad576107ad89898760a001515f8960400151610d7e565b85156107cd576107cd87878760a001515f89606001518a60800151610e39565b5f5b8c8110156108cb576108038e8e838181106107ec576107ec6118ac565b90506020028101906107fe91906118f1565b610f0c565b90955092508461084f57925082881561082d5761082d8a8a90508760a00151838960400151610fa5565b861561084a5761084a888890508760a00151838960600151610fa5565b6108cb565b478281101561085c578092505b61086f8d8d895f01518a60200151611044565b8915610896576108968b8b8960a0015185600161088c9190611842565b8b60400151610d7e565b87156108c2576108c289898960a001518560016108b39190611842565b8b606001518c60800151610e39565b506001016107cf565b509950995099509995505050505050565b5f818310610917575f6108ef8385611880565b90506001600160ff1b03811115610910576001600160ff1b0391505061094d565b905061094d565b5f6109228484611880565b90506001600160ff1b0381111561094057600160ff1b91505061094d565b6109498161190f565b9150505b92915050565b6060816001600160401b0381111561096d5761096d61186c565b604051908082528060200260200182016040528015610996578160200160208202803683370190505b5090505f5b82811015610784578381815181106109b5576109b56118ac565b60200260200101518282815181106109cf576109cf6118ac565b6001600160a01b039092166020928302919091019091015260010161099b565b826001600160401b03811115610a0757610a0761186c565b604051908082528060200260200182016040528015610a30578160200160208202803683370190505b5060e08201525f836001600160401b03811115610a4f57610a4f61186c565b604051908082528060200260200182016040528015610a78578160200160208202803683370190505b5090505f846001600160401b03811115610a9457610a9461186c565b604051908082528060200260200182016040528015610abd578160200160208202803683370190505b5090505f805b86811015610c7b5785604001518181518110610ae157610ae16118ac565b602002602001015115610c735785602001518181518110610b0457610b046118ac565b6020026020010151865f01518281518110610b2157610b216118ac565b602002602001015110610b965785602001518181518110610b4457610b446118ac565b6020026020010151865f01518281518110610b6157610b616118ac565b6020026020010151610b739190611880565b8560e001518281518110610b8957610b896118ac565b6020026020010181815250505b5f80610bad8a8a85818110610677576106776118ac565b9150915081610bbd575050610c73565b5f610be4828a5f01518681518110610bd757610bd76118ac565b60200260200101516108dc565b90508015610c6f578a8a85818110610bfe57610bfe6118ac565b9050602002016020810190610c1391906118c0565b878681518110610c2557610c256118ac565b60200260200101906001600160a01b031690816001600160a01b03168152505080868681518110610c5857610c586118ac565b6020908102919091010152610c6c856118d9565b94505b5050505b600101610ac3565b50610c868382610953565b60a0850152610c9582826110dd565b8460c0018190525050505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839283928392881691610cff91611929565b5f60405180830381855afa9150503d805f8114610d37576040519150601f19603f3d011682016040523d82523d5f602084013e610d3c565b606091505b5091509150811580610d4f575060208151105b15610d5b575050610d77565b81935080806020019051810190610d72919061193a565b925050505b9250929050565b5f5b84811015610e31575f80610de5888885818110610d9f57610d9f6118ac565b610db592602060409092020190810191506118c0565b308a8a87818110610dc857610dc86118ac565b9050604002016020016020810190610de091906118c0565b61116c565b9150915081610df4575f610df6565b805b8486610e028987611855565b610e0c9190611842565b81518110610e1c57610e1c6118ac565b60209081029190910101525050600101610d80565b505050505050565b5f5b85811015610f03575f80610e65898985818110610e5a57610e5a6118ac565b90506040020161124d565b9150915081610e74575f610e76565b805b8587610e828a87611855565b610e8c9190611842565b81518110610e9c57610e9c6118ac565b60209081029190910101528515610ed557838381518110610ebf57610ebf6118ac565b60200260200101518015610ed05750815b610ed7565b815b848481518110610ee957610ee96118ac565b911515602092830291909101909101525050600101610e3b565b50505050505050565b5f6060610f1c60208401846118c0565b6001600160a01b03166020840135610f376040860186611951565b604051610f45929190611993565b5f6040518083038185875af1925050503d805f8114610f7f576040519150601f19603f3d011682016040523d82523d5f602084013e610f84565b606091505b5090925090508115610fa0575060408051602081019091525f81525b915091565b5f5b8481101561103d575f8284610fbc8785611855565b610fc69190611842565b81518110610fd657610fd66118ac565b602002602001015190505f846001610fee9190611842565b90505b85811015611033578184826110068987611855565b6110109190611842565b81518110611020576110206118ac565b6020908102919091010152600101610ff1565b5050600101610fa7565b5050505050565b5f5b8381101561103d57828181518110611060576110606118ac565b6020026020010151156110d5575f80611084878785818110610677576106776118ac565b915091508180156110ad57508383815181106110a2576110a26118ac565b602002602001015181105b156110d257808484815181106110c5576110c56118ac565b6020026020010181815250505b50505b600101611046565b6060816001600160401b038111156110f7576110f761186c565b604051908082528060200260200182016040528015611120578160200160208202803683370190505b5090505f5b828110156107845783818151811061113f5761113f6118ac565b6020026020010151828281518110611159576111596118ac565b6020908102919091010152600101611125565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316636eb1769f60e11b17905291515f928392839283928916916111cd91611929565b5f60405180830381855afa9150503d805f8114611205576040519150601f19603f3d011682016040523d82523d5f602084013e61120a565b606091505b509150915081158061121d575060208151105b15611229575050611245565b81935080806020019051810190611240919061193a565b925050505b935093915050565b5f808061125d60208501856118c0565b6001600160a01b031603611290576001915061127f60408401602085016118c0565b6001600160a01b0316319050915091565b6112b56112a060208501856118c0565b6112b060408601602087016118c0565b610ca6565b91509150915091565b80356001600160a01b03811681146112d4575f80fd5b919050565b5f8083601f8401126112e9575f80fd5b5081356001600160401b038111156112ff575f80fd5b602083019150836020828501011115610d77575f80fd5b5f805f805f6080868803121561132a575f80fd5b611333866112be565b9450611341602087016112be565b93506040860135925060608601356001600160401b03811115611362575f80fd5b61136e888289016112d9565b969995985093965092949392505050565b5f805f60408486031215611391575f80fd5b8335925060208401356001600160401b038111156113ad575f80fd5b6113b9868287016112d9565b9497909650939450505050565b5f8083601f8401126113d6575f80fd5b5081356001600160401b038111156113ec575f80fd5b6020830191508360208260051b8501011115610d77575f80fd5b5f8083601f840112611416575f80fd5b5081356001600160401b0381111561142c575f80fd5b6020830191508360208260061b8501011115610d77575f80fd5b5f805f805f805f806080898b03121561145d575f80fd5b88356001600160401b0380821115611473575f80fd5b61147f8c838d016113c6565b909a50985060208b0135915080821115611497575f80fd5b6114a38c838d016113c6565b909850965060408b01359150808211156114bb575f80fd5b6114c78c838d01611406565b909650945060608b01359150808211156114df575f80fd5b506114ec8b828c01611406565b999c989b5096995094979396929594505050565b5f5b8381101561151a578181015183820152602001611502565b50505f910152565b5f8151808452611539816020860160208601611500565b601f01601f19169290920160200192915050565b5f815180845260208085019450602084015f5b838110156115855781516001600160a01b031687529582019590820190600101611560565b509495945050505050565b5f815180845260208085019450602084015f5b83811015611585578151875295820195908201906001016115a3565b5f815180845260208085019450602084015f5b838110156115855781511515875295820195908201906001016115d2565b6020815261160360208201835115159052565b602082015160408201525f604083015161018080606085015261162a6101a0850183611522565b9150606085015160808501526080850151601f19808685030160a0870152611652848361154d565b935060a08701519150808685030160c087015261166f848361154d565b935060c08701519150808685030160e087015261168c8483611590565b935060e087015191506101008187860301818801526116ab8584611590565b9450808801519250506101208281880152808801519250506101408187860301818801526116d98584611590565b9450808801519250506101608187860301818801526116f88584611590565b90880151878203909201848801529350905061171483826115bf565b9695505050505050565b5f805f805f805f8060a0898b031215611735575f80fd5b61173e896112be565b975061174c60208a016112be565b965060408901356001600160401b0380821115611767575f80fd5b6117738c838d016113c6565b909850965060608b013591508082111561178b575f80fd5b6117978c838d016113c6565b909650945060808b01359150808211156117af575f80fd5b506114ec8b828c016112d9565b5f805f805f8060a087890312156117d1575f80fd5b6117da876112be565b95506117e8602088016112be565b9450604087013593506060870135925060808701356001600160401b03811115611810575f80fd5b61181c89828a016112d9565b979a9699509497509295939492505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561094d5761094d61182e565b808202811582820484141761094d5761094d61182e565b634e487b7160e01b5f52604160045260245ffd5b8181038181111561094d5761094d61182e565b60ff818116838216019081111561094d5761094d61182e565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156118d0575f80fd5b61017a826112be565b5f600182016118ea576118ea61182e565b5060010190565b5f8235605e19833603018112611905575f80fd5b9190910192915050565b5f600160ff1b82016119235761192361182e565b505f0390565b5f8251611905818460208701611500565b5f6020828403121561194a575f80fd5b5051919050565b5f808335601e19843603018112611966575f80fd5b8301803591506001600160401b0382111561197f575f80fd5b602001915036819003821315610d77575f80fd5b818382375f910190815291905056fea26469706673582212204c77b0c567d34ad97024dab0976d2c9adabfbedde5c906937beb807267751de464736f6c63430008180033";
|
|
2
2
|
//# sourceMappingURL=txSimulatorBytecode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txSimulatorBytecode.d.ts","sourceRoot":"","sources":["../../src/generated/txSimulatorBytecode.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"txSimulatorBytecode.d.ts","sourceRoot":"","sources":["../../src/generated/txSimulatorBytecode.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,0BAA0B,s7ZACs6Z,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Generated by scripts/generate-txsim-bytecode.mjs.
|
|
2
|
-
export const txSimulatorRuntimeBytecode = "0x60806040526004361061004c575f3560e01c8063150b7a02146100575780631626ba7e146100a0578063bc197c81146100bf578063cb8935e9146100ed578063f23a6e6114610119575f80fd5b3661005357005b5f80fd5b348015610062575f80fd5b506100826100713660046110ac565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100ab575f80fd5b506100826100ba366004611115565b610145565b3480156100ca575f80fd5b506100826100d936600461119c565b63bc197c8160e01b98975050505050505050565b3480156100f8575f80fd5b5061010c61010736600461124e565b610181565b60405161009791906113cb565b348015610124575f80fd5b506100826101333660046114b9565b63f23a6e6160e01b9695505050505050565b5f30610152858585610300565b6001600160a01b03161461016e576001600160e01b0319610177565b630b135d3f60e11b5b90505b9392505050565b6101d56040518061014001604052805f151581526020015f8152602001606081526020015f8152602001606081526020016060815260200160608152602001606081526020015f8152602001606081525090565b475f6101e18787610456565b90506101ee88600161153f565b6101f89085611552565b6001600160401b0381111561020f5761020f611569565b604051908082528060200260200182016040528015610238578160200160208202803683370190505b50610120840190815260408051608081018252838201518152602080850151908201529151908201525f90606081016102728b600161153f565b905290505f6102878b8b8b8b8b8b888b6106d5565b60408901919091526020880191909152901515865290506102a847856107cd565b8560600181815250506102c383606001518460800151610844565b6080860152808410156102d6575f6102e0565b6102e0818561157d565b6101008601526102f2898985886108e0565b505050509695505050505050565b5f60418290036103bb578235602084013560408501355f1a601b81101561032f5761032c601b82611590565b90505b8060ff16601b1415801561034757508060ff16601c14155b15610357575f935050505061017a565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156103a7573d5f803e3d5ffd5b50505060206040510351935050505061017a565b604082900361044d57823560208401356001600160ff1b0381165f6103e560ff84901c601b61153f565b604080515f8152602081018083528b905260ff831691810191909152606081018690526080810184905290915060019060a0016020604051602081039080840390855afa158015610438573d5f803e3d5ffd5b5050506020604051035194505050505061017a565b505f9392505050565b6104876040518060a00160405280606081526020016060815260200160608152602001606081526020015f81525090565b816001600160401b0381111561049f5761049f611569565b6040519080825280602002602001820160405280156104c8578160200160208202803683370190505b508152816001600160401b038111156104e3576104e3611569565b60405190808252806020026020018201604052801561050c578160200160208202803683370190505b506020820152816001600160401b0381111561052a5761052a611569565b604051908082528060200260200182016040528015610553578160200160208202803683370190505b506040820152816001600160401b0381111561057157610571611569565b60405190808252806020026020018201604052801561059a578160200160208202803683370190505b5060608201525f5b828110156106ce575f806105dc8686858181106105c1576105c16115a9565b90506020020160208101906105d691906115bd565b30610b97565b9150915081156106c4576001846040015184815181106105fe576105fe6115a9565b60200260200101901515908115158152505080845f01518481518110610626576106266115a9565b6020026020010181815250508084602001518481518110610649576106496115a9565b602002602001018181525050858584818110610667576106676115a9565b905060200201602081019061067c91906115bd565b606085015160808601805190610691826115d6565b9052815181106106a3576106a36115a9565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50506001016105a2565b5092915050565b60015f1960608386156106f7576106f7888888606001515f8a60400151610c6f565b5f5b8b8110156107bd575f8061072f8f8f85818110610718576107186115a9565b905060200281019061072a91906115ee565b610d2a565b9150915081610768575f96509194509092508390838915610761576107618b8b90508a60600151858c60400151610dac565b50506107bd565b4784811015610775578094505b6107888e8e8c5f01518d60200151610e4b565b8a156107af576107af8c8c8c606001518760016107a5919061153f565b8e60400151610c6f565b5050508060010190506106f9565b5098509850985098945050505050565b5f818310610808575f6107e0838561157d565b90506001600160ff1b03811115610801576001600160ff1b0391505061083e565b905061083e565b5f610813848461157d565b90506001600160ff1b0381111561083157600160ff1b91505061083e565b61083a8161160c565b9150505b92915050565b6060816001600160401b0381111561085e5761085e611569565b604051908082528060200260200182016040528015610887578160200160208202803683370190505b5090505f5b828110156106ce578381815181106108a6576108a66115a9565b60200260200101518282815181106108c0576108c06115a9565b6001600160a01b039092166020928302919091019091015260010161088c565b826001600160401b038111156108f8576108f8611569565b604051908082528060200260200182016040528015610921578160200160208202803683370190505b5060e08201525f836001600160401b0381111561094057610940611569565b604051908082528060200260200182016040528015610969578160200160208202803683370190505b5090505f846001600160401b0381111561098557610985611569565b6040519080825280602002602001820160405280156109ae578160200160208202803683370190505b5090505f805b86811015610b6c57856040015181815181106109d2576109d26115a9565b602002602001015115610b6457856020015181815181106109f5576109f56115a9565b6020026020010151865f01518281518110610a1257610a126115a9565b602002602001015110610a875785602001518181518110610a3557610a356115a9565b6020026020010151865f01518281518110610a5257610a526115a9565b6020026020010151610a64919061157d565b8560e001518281518110610a7a57610a7a6115a9565b6020026020010181815250505b5f80610a9e8a8a858181106105c1576105c16115a9565b9150915081610aae575050610b64565b5f610ad5828a5f01518681518110610ac857610ac86115a9565b60200260200101516107cd565b90508015610b60578a8a85818110610aef57610aef6115a9565b9050602002016020810190610b0491906115bd565b878681518110610b1657610b166115a9565b60200260200101906001600160a01b031690816001600160a01b03168152505080868681518110610b4957610b496115a9565b6020908102919091010152610b5d856115d6565b94505b5050505b6001016109b4565b50610b778382610844565b60a0850152610b868282610ee4565b8460c0018190525050505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839283928392881691610bf091611626565b5f60405180830381855afa9150503d805f8114610c28576040519150601f19603f3d011682016040523d82523d5f602084013e610c2d565b606091505b5091509150811580610c40575060208151105b15610c4c575050610c68565b81935080806020019051810190610c639190611637565b925050505b9250929050565b5f5b84811015610d22575f80610cd6888885818110610c9057610c906115a9565b610ca692602060409092020190810191506115bd565b308a8a87818110610cb957610cb96115a9565b9050604002016020016020810190610cd191906115bd565b610f73565b9150915081610ce5575f610ce7565b805b8486610cf38987611552565b610cfd919061153f565b81518110610d0d57610d0d6115a9565b60209081029190910101525050600101610c71565b505050505050565b5f6060610d3a60208401846115bd565b6001600160a01b03166020840135610d55604086018661164e565b604051610d63929190611690565b5f6040518083038185875af1925050503d805f8114610d9d576040519150601f19603f3d011682016040523d82523d5f602084013e610da2565b606091505b5091509150915091565b5f5b84811015610e44575f8284610dc38785611552565b610dcd919061153f565b81518110610ddd57610ddd6115a9565b602002602001015190505f846001610df5919061153f565b90505b85811015610e3a57818482610e0d8987611552565b610e17919061153f565b81518110610e2757610e276115a9565b6020908102919091010152600101610df8565b5050600101610dae565b5050505050565b5f5b83811015610e4457828181518110610e6757610e676115a9565b602002602001015115610edc575f80610e8b8787858181106105c1576105c16115a9565b91509150818015610eb45750838381518110610ea957610ea96115a9565b602002602001015181105b15610ed95780848481518110610ecc57610ecc6115a9565b6020026020010181815250505b50505b600101610e4d565b6060816001600160401b03811115610efe57610efe611569565b604051908082528060200260200182016040528015610f27578160200160208202803683370190505b5090505f5b828110156106ce57838181518110610f4657610f466115a9565b6020026020010151828281518110610f6057610f606115a9565b6020908102919091010152600101610f2c565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316636eb1769f60e11b17905291515f92839283928392891691610fd491611626565b5f60405180830381855afa9150503d805f811461100c576040519150601f19603f3d011682016040523d82523d5f602084013e611011565b606091505b5091509150811580611024575060208151105b1561103057505061104c565b819350808060200190518101906110479190611637565b925050505b935093915050565b80356001600160a01b038116811461106a575f80fd5b919050565b5f8083601f84011261107f575f80fd5b5081356001600160401b03811115611095575f80fd5b602083019150836020828501011115610c68575f80fd5b5f805f805f608086880312156110c0575f80fd5b6110c986611054565b94506110d760208701611054565b93506040860135925060608601356001600160401b038111156110f8575f80fd5b6111048882890161106f565b969995985093965092949392505050565b5f805f60408486031215611127575f80fd5b8335925060208401356001600160401b03811115611143575f80fd5b61114f8682870161106f565b9497909650939450505050565b5f8083601f84011261116c575f80fd5b5081356001600160401b03811115611182575f80fd5b6020830191508360208260051b8501011115610c68575f80fd5b5f805f805f805f8060a0898b0312156111b3575f80fd5b6111bc89611054565b97506111ca60208a01611054565b965060408901356001600160401b03808211156111e5575f80fd5b6111f18c838d0161115c565b909850965060608b0135915080821115611209575f80fd5b6112158c838d0161115c565b909650945060808b013591508082111561122d575f80fd5b5061123a8b828c0161106f565b999c989b5096995094979396929594505050565b5f805f805f8060608789031215611263575f80fd5b86356001600160401b0380821115611279575f80fd5b6112858a838b0161115c565b9098509650602089013591508082111561129d575f80fd5b6112a98a838b0161115c565b909650945060408901359150808211156112c1575f80fd5b818901915089601f8301126112d4575f80fd5b8135818111156112e2575f80fd5b8a60208260061b85010111156112f6575f80fd5b6020830194508093505050509295509295509295565b5f5b8381101561132657818101518382015260200161130e565b50505f910152565b5f815180845261134581602086016020860161130c565b601f01601f19169290920160200192915050565b5f815180845260208085019450602084015f5b838110156113915781516001600160a01b03168752958201959082019060010161136c565b509495945050505050565b5f815180845260208085019450602084015f5b83811015611391578151875295820195908201906001016113af565b602081526113de60208201835115159052565b602082015160408201525f604083015161014080606085015261140561016085018361132e565b9150606085015160808501526080850151601f19808685030160a087015261142d8483611359565b935060a08701519150808685030160c087015261144a8483611359565b935060c08701519150808685030160e0870152611467848361139c565b935060e08701519150610100818786030181880152611486858461139c565b908801516101208881019190915288015187820390920184880152935090506114af838261139c565b9695505050505050565b5f805f805f8060a087890312156114ce575f80fd5b6114d787611054565b95506114e560208801611054565b9450604087013593506060870135925060808701356001600160401b0381111561150d575f80fd5b61151989828a0161106f565b979a9699509497509295939492505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561083e5761083e61152b565b808202811582820484141761083e5761083e61152b565b634e487b7160e01b5f52604160045260245ffd5b8181038181111561083e5761083e61152b565b60ff818116838216019081111561083e5761083e61152b565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156115cd575f80fd5b61017a82611054565b5f600182016115e7576115e761152b565b5060010190565b5f8235605e19833603018112611602575f80fd5b9190910192915050565b5f600160ff1b82016116205761162061152b565b505f0390565b5f825161160281846020870161130c565b5f60208284031215611647575f80fd5b5051919050565b5f808335601e19843603018112611663575f80fd5b8301803591506001600160401b0382111561167c575f80fd5b602001915036819003821315610c68575f80fd5b818382375f910190815291905056fea2646970667358221220c9adb57984fec989769acf8df499b49fd3aadd781fd0b128ec026480393cb0a764736f6c63430008180033";
|
|
2
|
+
export const txSimulatorRuntimeBytecode = "0x60806040526004361061004c575f3560e01c8063150b7a02146100575780631626ba7e146100a05780639b093492146100bf578063bc197c81146100eb578063f23a6e6114610119575f80fd5b3661005357005b5f80fd5b348015610062575f80fd5b50610082610071366004611316565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100ab575f80fd5b506100826100ba36600461137f565b610145565b3480156100ca575f80fd5b506100de6100d9366004611446565b610181565b60405161009791906115f0565b3480156100f6575f80fd5b5061008261010536600461171e565b63bc197c8160e01b98975050505050505050565b348015610124575f80fd5b506100826101333660046117bc565b63f23a6e6160e01b9695505050505050565b5f306101528585856103b6565b6001600160a01b03161461016e576001600160e01b0319610177565b630b135d3f60e11b5b90505b9392505050565b6101e36040518061018001604052805f151581526020015f8152602001606081526020015f8152602001606081526020016060815260200160608152602001606081526020015f81526020016060815260200160608152602001606081525090565b475f6101ef898961050c565b90505f6101fd8b6001611842565b90506102098186611855565b6001600160401b038111156102205761022061186c565b604051908082528060200260200182016040528015610249578160200160208202803683370190505b50610140850152846001600160401b038111156102685761026861186c565b604051908082528060200260200182016040528015610291578160200160208202803683370190505b506101608501526102a28188611855565b6001600160401b038111156102b9576102b961186c565b6040519080825280602002602001820160405280156102e2578160200160208202803683370190505b5061012085019081526040805160c081018252848201518152602080860151908201529151908201526101408501516060820152610160850151608082015260a081018290525f61033a8e8e8e8e8e8e8e8e8a61078b565b60408a019190915260208901919091529015158752905061035b47866108dc565b86606001818152505061037684606001518560800151610953565b608087015280851015610389575f610393565b6103938186611880565b6101008701526103a58c8c86896109ef565b505050505098975050505050505050565b5f6041829003610471578235602084013560408501355f1a601b8110156103e5576103e2601b82611893565b90505b8060ff16601b141580156103fd57508060ff16601c14155b1561040d575f935050505061017a565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561045d573d5f803e3d5ffd5b50505060206040510351935050505061017a565b604082900361050357823560208401356001600160ff1b0381165f61049b60ff84901c601b611842565b604080515f8152602081018083528b905260ff831691810191909152606081018690526080810184905290915060019060a0016020604051602081039080840390855afa1580156104ee573d5f803e3d5ffd5b5050506020604051035194505050505061017a565b505f9392505050565b61053d6040518060a00160405280606081526020016060815260200160608152602001606081526020015f81525090565b816001600160401b038111156105555761055561186c565b60405190808252806020026020018201604052801561057e578160200160208202803683370190505b508152816001600160401b038111156105995761059961186c565b6040519080825280602002602001820160405280156105c2578160200160208202803683370190505b506020820152816001600160401b038111156105e0576105e061186c565b604051908082528060200260200182016040528015610609578160200160208202803683370190505b506040820152816001600160401b038111156106275761062761186c565b604051908082528060200260200182016040528015610650578160200160208202803683370190505b5060608201525f5b82811015610784575f80610692868685818110610677576106776118ac565b905060200201602081019061068c91906118c0565b30610ca6565b91509150811561077a576001846040015184815181106106b4576106b46118ac565b60200260200101901515908115158152505080845f015184815181106106dc576106dc6118ac565b60200260200101818152505080846020015184815181106106ff576106ff6118ac565b60200260200101818152505085858481811061071d5761071d6118ac565b905060200201602081019061073291906118c0565b606085015160808601805190610747826118d9565b905281518110610759576107596118ac565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5050600101610658565b5092915050565b60015f1960604787156107ad576107ad89898760a001515f8960400151610d7e565b85156107cd576107cd87878760a001515f89606001518a60800151610e39565b5f5b8c8110156108cb576108038e8e838181106107ec576107ec6118ac565b90506020028101906107fe91906118f1565b610f0c565b90955092508461084f57925082881561082d5761082d8a8a90508760a00151838960400151610fa5565b861561084a5761084a888890508760a00151838960600151610fa5565b6108cb565b478281101561085c578092505b61086f8d8d895f01518a60200151611044565b8915610896576108968b8b8960a0015185600161088c9190611842565b8b60400151610d7e565b87156108c2576108c289898960a001518560016108b39190611842565b8b606001518c60800151610e39565b506001016107cf565b509950995099509995505050505050565b5f818310610917575f6108ef8385611880565b90506001600160ff1b03811115610910576001600160ff1b0391505061094d565b905061094d565b5f6109228484611880565b90506001600160ff1b0381111561094057600160ff1b91505061094d565b6109498161190f565b9150505b92915050565b6060816001600160401b0381111561096d5761096d61186c565b604051908082528060200260200182016040528015610996578160200160208202803683370190505b5090505f5b82811015610784578381815181106109b5576109b56118ac565b60200260200101518282815181106109cf576109cf6118ac565b6001600160a01b039092166020928302919091019091015260010161099b565b826001600160401b03811115610a0757610a0761186c565b604051908082528060200260200182016040528015610a30578160200160208202803683370190505b5060e08201525f836001600160401b03811115610a4f57610a4f61186c565b604051908082528060200260200182016040528015610a78578160200160208202803683370190505b5090505f846001600160401b03811115610a9457610a9461186c565b604051908082528060200260200182016040528015610abd578160200160208202803683370190505b5090505f805b86811015610c7b5785604001518181518110610ae157610ae16118ac565b602002602001015115610c735785602001518181518110610b0457610b046118ac565b6020026020010151865f01518281518110610b2157610b216118ac565b602002602001015110610b965785602001518181518110610b4457610b446118ac565b6020026020010151865f01518281518110610b6157610b616118ac565b6020026020010151610b739190611880565b8560e001518281518110610b8957610b896118ac565b6020026020010181815250505b5f80610bad8a8a85818110610677576106776118ac565b9150915081610bbd575050610c73565b5f610be4828a5f01518681518110610bd757610bd76118ac565b60200260200101516108dc565b90508015610c6f578a8a85818110610bfe57610bfe6118ac565b9050602002016020810190610c1391906118c0565b878681518110610c2557610c256118ac565b60200260200101906001600160a01b031690816001600160a01b03168152505080868681518110610c5857610c586118ac565b6020908102919091010152610c6c856118d9565b94505b5050505b600101610ac3565b50610c868382610953565b60a0850152610c9582826110dd565b8460c0018190525050505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839283928392881691610cff91611929565b5f60405180830381855afa9150503d805f8114610d37576040519150601f19603f3d011682016040523d82523d5f602084013e610d3c565b606091505b5091509150811580610d4f575060208151105b15610d5b575050610d77565b81935080806020019051810190610d72919061193a565b925050505b9250929050565b5f5b84811015610e31575f80610de5888885818110610d9f57610d9f6118ac565b610db592602060409092020190810191506118c0565b308a8a87818110610dc857610dc86118ac565b9050604002016020016020810190610de091906118c0565b61116c565b9150915081610df4575f610df6565b805b8486610e028987611855565b610e0c9190611842565b81518110610e1c57610e1c6118ac565b60209081029190910101525050600101610d80565b505050505050565b5f5b85811015610f03575f80610e65898985818110610e5a57610e5a6118ac565b90506040020161124d565b9150915081610e74575f610e76565b805b8587610e828a87611855565b610e8c9190611842565b81518110610e9c57610e9c6118ac565b60209081029190910101528515610ed557838381518110610ebf57610ebf6118ac565b60200260200101518015610ed05750815b610ed7565b815b848481518110610ee957610ee96118ac565b911515602092830291909101909101525050600101610e3b565b50505050505050565b5f6060610f1c60208401846118c0565b6001600160a01b03166020840135610f376040860186611951565b604051610f45929190611993565b5f6040518083038185875af1925050503d805f8114610f7f576040519150601f19603f3d011682016040523d82523d5f602084013e610f84565b606091505b5090925090508115610fa0575060408051602081019091525f81525b915091565b5f5b8481101561103d575f8284610fbc8785611855565b610fc69190611842565b81518110610fd657610fd66118ac565b602002602001015190505f846001610fee9190611842565b90505b85811015611033578184826110068987611855565b6110109190611842565b81518110611020576110206118ac565b6020908102919091010152600101610ff1565b5050600101610fa7565b5050505050565b5f5b8381101561103d57828181518110611060576110606118ac565b6020026020010151156110d5575f80611084878785818110610677576106776118ac565b915091508180156110ad57508383815181106110a2576110a26118ac565b602002602001015181105b156110d257808484815181106110c5576110c56118ac565b6020026020010181815250505b50505b600101611046565b6060816001600160401b038111156110f7576110f761186c565b604051908082528060200260200182016040528015611120578160200160208202803683370190505b5090505f5b828110156107845783818151811061113f5761113f6118ac565b6020026020010151828281518110611159576111596118ac565b6020908102919091010152600101611125565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316636eb1769f60e11b17905291515f928392839283928916916111cd91611929565b5f60405180830381855afa9150503d805f8114611205576040519150601f19603f3d011682016040523d82523d5f602084013e61120a565b606091505b509150915081158061121d575060208151105b15611229575050611245565b81935080806020019051810190611240919061193a565b925050505b935093915050565b5f808061125d60208501856118c0565b6001600160a01b031603611290576001915061127f60408401602085016118c0565b6001600160a01b0316319050915091565b6112b56112a060208501856118c0565b6112b060408601602087016118c0565b610ca6565b91509150915091565b80356001600160a01b03811681146112d4575f80fd5b919050565b5f8083601f8401126112e9575f80fd5b5081356001600160401b038111156112ff575f80fd5b602083019150836020828501011115610d77575f80fd5b5f805f805f6080868803121561132a575f80fd5b611333866112be565b9450611341602087016112be565b93506040860135925060608601356001600160401b03811115611362575f80fd5b61136e888289016112d9565b969995985093965092949392505050565b5f805f60408486031215611391575f80fd5b8335925060208401356001600160401b038111156113ad575f80fd5b6113b9868287016112d9565b9497909650939450505050565b5f8083601f8401126113d6575f80fd5b5081356001600160401b038111156113ec575f80fd5b6020830191508360208260051b8501011115610d77575f80fd5b5f8083601f840112611416575f80fd5b5081356001600160401b0381111561142c575f80fd5b6020830191508360208260061b8501011115610d77575f80fd5b5f805f805f805f806080898b03121561145d575f80fd5b88356001600160401b0380821115611473575f80fd5b61147f8c838d016113c6565b909a50985060208b0135915080821115611497575f80fd5b6114a38c838d016113c6565b909850965060408b01359150808211156114bb575f80fd5b6114c78c838d01611406565b909650945060608b01359150808211156114df575f80fd5b506114ec8b828c01611406565b999c989b5096995094979396929594505050565b5f5b8381101561151a578181015183820152602001611502565b50505f910152565b5f8151808452611539816020860160208601611500565b601f01601f19169290920160200192915050565b5f815180845260208085019450602084015f5b838110156115855781516001600160a01b031687529582019590820190600101611560565b509495945050505050565b5f815180845260208085019450602084015f5b83811015611585578151875295820195908201906001016115a3565b5f815180845260208085019450602084015f5b838110156115855781511515875295820195908201906001016115d2565b6020815261160360208201835115159052565b602082015160408201525f604083015161018080606085015261162a6101a0850183611522565b9150606085015160808501526080850151601f19808685030160a0870152611652848361154d565b935060a08701519150808685030160c087015261166f848361154d565b935060c08701519150808685030160e087015261168c8483611590565b935060e087015191506101008187860301818801526116ab8584611590565b9450808801519250506101208281880152808801519250506101408187860301818801526116d98584611590565b9450808801519250506101608187860301818801526116f88584611590565b90880151878203909201848801529350905061171483826115bf565b9695505050505050565b5f805f805f805f8060a0898b031215611735575f80fd5b61173e896112be565b975061174c60208a016112be565b965060408901356001600160401b0380821115611767575f80fd5b6117738c838d016113c6565b909850965060608b013591508082111561178b575f80fd5b6117978c838d016113c6565b909650945060808b01359150808211156117af575f80fd5b506114ec8b828c016112d9565b5f805f805f8060a087890312156117d1575f80fd5b6117da876112be565b95506117e8602088016112be565b9450604087013593506060870135925060808701356001600160401b03811115611810575f80fd5b61181c89828a016112d9565b979a9699509497509295939492505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561094d5761094d61182e565b808202811582820484141761094d5761094d61182e565b634e487b7160e01b5f52604160045260245ffd5b8181038181111561094d5761094d61182e565b60ff818116838216019081111561094d5761094d61182e565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156118d0575f80fd5b61017a826112be565b5f600182016118ea576118ea61182e565b5060010190565b5f8235605e19833603018112611905575f80fd5b9190910192915050565b5f600160ff1b82016119235761192361182e565b505f0390565b5f8251611905818460208701611500565b5f6020828403121561194a575f80fd5b5051919050565b5f808335601e19843603018112611966575f80fd5b8301803591506001600160401b0382111561197f575f80fd5b602001915036819003821315610d77575f80fd5b818382375f910190815291905056fea26469706673582212204c77b0c567d34ad97024dab0976d2c9adabfbedde5c906937beb807267751de464736f6c63430008180033";
|
|
3
3
|
//# sourceMappingURL=txSimulatorBytecode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txSimulatorBytecode.js","sourceRoot":"","sources":["../../src/generated/txSimulatorBytecode.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,MAAM,CAAC,MAAM,0BAA0B,GACrC,
|
|
1
|
+
{"version":3,"file":"txSimulatorBytecode.js","sourceRoot":"","sources":["../../src/generated/txSimulatorBytecode.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,MAAM,CAAC,MAAM,0BAA0B,GACrC,o7ZAA28Z,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DEFAULT_SIMULATION_GAS_LIMIT, OVERRIDE_TOKEN_AMOUNT } from "./constants.js";
|
|
2
2
|
export { TxSimulator } from "./txSimulator.js";
|
|
3
3
|
export { AccessListUnsupportedError, InvalidSimulationInputError, StateOverrideUnsupportedError, TxSimError, } from "./errors.js";
|
|
4
|
-
export type { AllowanceSlot, PreparedAllowanceOverrides, AllowanceSlotPair,
|
|
4
|
+
export type { AllowanceSlot, BalanceDelta, BalanceQuery, NativeBalanceOverride, PreparedAllowanceOverrides, AllowanceSlotPair, PreparedBalanceOverrides, ForUserBalanceQueriesArgs, PrepareAllowanceOverridesArgs, PrepareBalanceOverridesArgs, EstimatedAssetRequirements, EstimatedAssetRequirementsReverted, EstimatedAssetRequirementsSuccess, EstimateAssetRequirementsArgs, SimulateArgs, SimulatedCall, SimulationDebug, SimulationDebugEvent, SimulationDebugLogger, RequiredAllowance, RequiredBalance, RevertError, SimulationReverted, SimulationResult, SimulationSuccess, TokenSlotOverride, TxSimulatorConfig, } from "./types.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,6BAA6B,EAC7B,YAAY,EACZ,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Address } from "viem";
|
|
2
|
+
import type { BalanceQuery, ForUserBalanceQueriesArgs } from "../types.js";
|
|
3
|
+
import type { ClientArgs } from "./rpc.js";
|
|
4
|
+
/** @internal Implements {@link TxSimulator.balanceQueries.forUser}. Prefer the instance API from the package root. */
|
|
5
|
+
export declare function forUserBalanceQueries(args: ForUserBalanceQueriesArgs & ClientArgs): Promise<BalanceQuery[]>;
|
|
6
|
+
/** @internal Implements {@link TxSimulator.balanceQueries.discoverErc20s}. Prefer the instance API from the package root. */
|
|
7
|
+
export declare function discoverErc20s(args: ForUserBalanceQueriesArgs & ClientArgs): Promise<Address[]>;
|
|
8
|
+
//# sourceMappingURL=queryDiscovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryDiscovery.d.ts","sourceRoot":"","sources":["../../src/internal/queryDiscovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAiB,MAAM,aAAa,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,sHAAsH;AACtH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,yBAAyB,GAAG,UAAU,GAC3C,OAAO,CAAC,YAAY,EAAE,CAAC,CAOzB;AAED,6HAA6H;AAC7H,wBAAsB,cAAc,CAClC,IAAI,EAAE,yBAAyB,GAAG,UAAU,GAC3C,OAAO,CAAC,OAAO,EAAE,CAAC,CA0BpB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { blockOptionsSpread } from "./rpc.js";
|
|
2
|
+
import { discoverCandidateAddresses, runSimulator } from "./simulator.js";
|
|
3
|
+
/** @internal Implements {@link TxSimulator.balanceQueries.forUser}. Prefer the instance API from the package root. */
|
|
4
|
+
export async function forUserBalanceQueries(args) {
|
|
5
|
+
const tokens = await discoverErc20s(args);
|
|
6
|
+
return [
|
|
7
|
+
{ asset: "native", account: args.from },
|
|
8
|
+
...tokens.map((asset) => ({ asset, account: args.from })),
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
/** @internal Implements {@link TxSimulator.balanceQueries.discoverErc20s}. Prefer the instance API from the package root. */
|
|
12
|
+
export async function discoverErc20s(args) {
|
|
13
|
+
const calls = args.calls.map((call) => ({
|
|
14
|
+
to: call.to,
|
|
15
|
+
data: call.data,
|
|
16
|
+
value: call.value ?? 0n,
|
|
17
|
+
}));
|
|
18
|
+
const candidates = await discoverCandidateAddresses({
|
|
19
|
+
client: args.client,
|
|
20
|
+
from: args.from,
|
|
21
|
+
calls,
|
|
22
|
+
gas: args.gas,
|
|
23
|
+
debug: args.debug,
|
|
24
|
+
...blockOptionsSpread(args),
|
|
25
|
+
});
|
|
26
|
+
const result = await runSimulator({
|
|
27
|
+
client: args.client,
|
|
28
|
+
from: args.from,
|
|
29
|
+
calls: [],
|
|
30
|
+
candidates,
|
|
31
|
+
debug: args.debug,
|
|
32
|
+
debugStep: "balanceQueries.tokenFilter",
|
|
33
|
+
gas: args.gas,
|
|
34
|
+
...blockOptionsSpread(args),
|
|
35
|
+
});
|
|
36
|
+
return result.probeData.observedTokens;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=queryDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryDiscovery.js","sourceRoot":"","sources":["../../src/internal/queryDiscovery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1E,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA4C;IAE5C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO;QACL,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACvC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,6HAA6H;AAC7H,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAA4C;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;KACxB,CAAC,CAA2B,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC;QAClD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,kBAAkB,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,EAAE;QACT,UAAU;QACV,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,4BAA4B;QACvC,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,kBAAkB,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;AACzC,CAAC"}
|