@eulerxyz/euler-v2-sdk 0.2.6-beta → 0.2.8-beta
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/dist/src/entities/Account.d.ts +10 -2
- package/dist/src/entities/Account.d.ts.map +1 -1
- package/dist/src/entities/Account.js +15 -2
- package/dist/src/entities/Account.js.map +1 -1
- package/dist/src/entities/EVault.d.ts +6 -1
- package/dist/src/entities/EVault.d.ts.map +1 -1
- package/dist/src/entities/EVault.js.map +1 -1
- package/dist/src/entities/Portfolio.d.ts +143 -18
- package/dist/src/entities/Portfolio.d.ts.map +1 -1
- package/dist/src/entities/Portfolio.js +240 -36
- package/dist/src/entities/Portfolio.js.map +1 -1
- package/dist/src/plugins/keyring/keyringPlugin.d.ts.map +1 -1
- package/dist/src/plugins/keyring/keyringPlugin.js +67 -17
- package/dist/src/plugins/keyring/keyringPlugin.js.map +1 -1
- package/dist/src/plugins/pyth/pythPlugin.d.ts +3 -1
- package/dist/src/plugins/pyth/pythPlugin.d.ts.map +1 -1
- package/dist/src/plugins/pyth/pythPlugin.js +101 -6
- package/dist/src/plugins/pyth/pythPlugin.js.map +1 -1
- package/dist/src/plugins/types.d.ts +38 -2
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/plugins/types.js.map +1 -1
- package/dist/src/sdk/buildSDK.d.ts.map +1 -1
- package/dist/src/sdk/buildSDK.js +3 -2
- package/dist/src/sdk/buildSDK.js.map +1 -1
- package/dist/src/sdk/sdk.d.ts +15 -4
- package/dist/src/sdk/sdk.d.ts.map +1 -1
- package/dist/src/sdk/sdk.js +40 -3
- package/dist/src/sdk/sdk.js.map +1 -1
- package/dist/src/services/accountService/accountService.d.ts +7 -1
- package/dist/src/services/accountService/accountService.d.ts.map +1 -1
- package/dist/src/services/accountService/accountService.js +55 -1
- package/dist/src/services/accountService/accountService.js.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js +2 -2
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js.map +1 -1
- package/dist/src/services/accountService/index.d.ts +1 -1
- package/dist/src/services/accountService/index.d.ts.map +1 -1
- package/dist/src/services/executionService/cowExecutor.d.ts +3 -0
- package/dist/src/services/executionService/cowExecutor.d.ts.map +1 -1
- package/dist/src/services/executionService/cowExecutor.js.map +1 -1
- package/dist/src/services/executionService/execute.d.ts +8 -0
- package/dist/src/services/executionService/execute.d.ts.map +1 -1
- package/dist/src/services/executionService/execute.js.map +1 -1
- package/dist/src/services/executionService/executionService.d.ts +70 -8
- package/dist/src/services/executionService/executionService.d.ts.map +1 -1
- package/dist/src/services/executionService/executionService.js +278 -124
- package/dist/src/services/executionService/executionService.js.map +1 -1
- package/dist/src/services/executionService/executionServiceTypes.d.ts +4 -0
- package/dist/src/services/executionService/executionServiceTypes.d.ts.map +1 -1
- package/dist/src/services/executionService/simulate.d.ts +29 -0
- package/dist/src/services/executionService/simulate.d.ts.map +1 -1
- package/dist/src/services/executionService/simulate.js +42 -5
- package/dist/src/services/executionService/simulate.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts +2 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js +2 -2
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts +2 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js +11 -2
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts +4 -0
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts.map +1 -1
- package/dist/src/services/rewardsService/index.d.ts +4 -1
- package/dist/src/services/rewardsService/index.d.ts.map +1 -1
- package/dist/src/services/rewardsService/index.js +2 -0
- package/dist/src/services/rewardsService/index.js.map +1 -1
- package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts +32 -0
- package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts.map +1 -0
- package/dist/src/services/rewardsService/rewardCampaignEligibility.js +21 -0
- package/dist/src/services/rewardsService/rewardCampaignEligibility.js.map +1 -0
- package/dist/src/services/rewardsService/rewardsService.d.ts +6 -0
- package/dist/src/services/rewardsService/rewardsService.d.ts.map +1 -1
- package/dist/src/services/rewardsService/rewardsService.js +20 -3
- package/dist/src/services/rewardsService/rewardsService.js.map +1 -1
- package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts +8 -5
- package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts.map +1 -1
- package/dist/src/services/rewardsService/rewardsServiceTypes.js +1 -1
- package/dist/src/services/rewardsService/rewardsServiceTypes.js.map +1 -1
- package/dist/src/services/rewardsService/vaultRewardInfo.d.ts +25 -0
- package/dist/src/services/rewardsService/vaultRewardInfo.d.ts.map +1 -0
- package/dist/src/services/rewardsService/vaultRewardInfo.js +39 -0
- package/dist/src/services/rewardsService/vaultRewardInfo.js.map +1 -0
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.d.ts +2 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.js +1 -0
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js +7 -0
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js +17 -6
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js +52 -17
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js.map +1 -1
- package/dist/src/utils/accountComputations.d.ts +41 -8
- package/dist/src/utils/accountComputations.d.ts.map +1 -1
- package/dist/src/utils/accountComputations.js +127 -77
- package/dist/src/utils/accountComputations.js.map +1 -1
- package/dist/src/utils/irm.d.ts +10 -2
- package/dist/src/utils/irm.d.ts.map +1 -1
- package/dist/src/utils/irm.js +33 -0
- package/dist/src/utils/irm.js.map +1 -1
- package/dist/src/utils/oracle.d.ts +16 -0
- package/dist/src/utils/oracle.d.ts.map +1 -1
- package/dist/src/utils/oracle.js +98 -0
- package/dist/src/utils/oracle.js.map +1 -1
- package/dist/src/utils/stateOverrides/approvalOverrides.d.ts +25 -8
- package/dist/src/utils/stateOverrides/approvalOverrides.d.ts.map +1 -1
- package/dist/src/utils/stateOverrides/approvalOverrides.js +76 -16
- package/dist/src/utils/stateOverrides/approvalOverrides.js.map +1 -1
- package/dist/src/utils/stateOverrides/balanceOverrides.d.ts +26 -7
- package/dist/src/utils/stateOverrides/balanceOverrides.d.ts.map +1 -1
- package/dist/src/utils/stateOverrides/balanceOverrides.js +72 -13
- package/dist/src/utils/stateOverrides/balanceOverrides.js.map +1 -1
- package/dist/src/utils/stateOverrides/getStateOverrides.d.ts +38 -0
- package/dist/src/utils/stateOverrides/getStateOverrides.d.ts.map +1 -1
- package/dist/src/utils/stateOverrides/getStateOverrides.js +14 -4
- package/dist/src/utils/stateOverrides/getStateOverrides.js.map +1 -1
- package/dist/src/utils/stateOverrides/index.d.ts +3 -2
- package/dist/src/utils/stateOverrides/index.d.ts.map +1 -1
- package/dist/src/utils/stateOverrides/index.js +2 -1
- package/dist/src/utils/stateOverrides/index.js.map +1 -1
- package/dist/src/utils/stateOverrides/slotHints.d.ts +78 -0
- package/dist/src/utils/stateOverrides/slotHints.d.ts.map +1 -0
- package/dist/src/utils/stateOverrides/slotHints.js +152 -0
- package/dist/src/utils/stateOverrides/slotHints.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { erc20Abi, encodePacked, getAddress, hexToBigInt, keccak256, maxUint256, toHex, } from "viem";
|
|
2
2
|
import { encodeFunctionData } from "viem/utils";
|
|
3
3
|
import { getAccessedSlots } from "./accessList.js";
|
|
4
|
+
import { computeAllowanceSlot, fetchErc20SlotHints, getCachedSlotHints, } from "./slotHints.js";
|
|
4
5
|
/**
|
|
5
6
|
* Compute Permit2 allowance storage slots for the given approvals.
|
|
6
7
|
*
|
|
@@ -30,7 +31,7 @@ export function computePermit2StateDiff(account, approvals) {
|
|
|
30
31
|
* Traces allowance(account, permit2) to find candidate slots, then
|
|
31
32
|
* tests each by overriding and re-reading to verify.
|
|
32
33
|
*/
|
|
33
|
-
async function
|
|
34
|
+
async function discoverAllowanceSlotsViaAccessList(client, account, assets, permit2) {
|
|
34
35
|
const stateOverride = [];
|
|
35
36
|
const valueHex = toHex(maxUint256, { size: 32 });
|
|
36
37
|
for (const asset of assets) {
|
|
@@ -77,22 +78,30 @@ async function discoverAllowanceSlots(client, account, assets, permit2) {
|
|
|
77
78
|
}
|
|
78
79
|
return stateOverride;
|
|
79
80
|
}
|
|
81
|
+
const allowanceKey = (asset, spender) => `${getAddress(asset)}:${getAddress(spender)}`;
|
|
80
82
|
/**
|
|
81
83
|
* Generate state overrides for ERC20 approvals and Permit2 allowances.
|
|
82
84
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
85
|
+
* Resolution order, per asset:
|
|
86
|
+
* 1. Permit2 storage slots are always derivable cryptographically — no RPC.
|
|
87
|
+
* 2. Apply caller-supplied `walletAllowances[asset:spender]` — if `maxUint256`,
|
|
88
|
+
* skip emitting an override entirely.
|
|
89
|
+
* 3. Use caller-supplied `slotHints[asset].allowanceSlotIndex` →
|
|
90
|
+
* cryptographic slot, no RPC.
|
|
91
|
+
* 4. Use cached probed slot index (`fetchErc20SlotHints` cache) → same.
|
|
92
|
+
* 5. Probe sequentially via `fetchErc20SlotHints`.
|
|
93
|
+
* 6. Fall back to legacy `eth_createAccessList` discovery.
|
|
90
94
|
*/
|
|
91
|
-
export async function getApprovalOverrides(client, account, approvals, permit2Address) {
|
|
95
|
+
export async function getApprovalOverrides(client, account, approvals, permit2Address, options = {}) {
|
|
92
96
|
if (approvals.length === 0)
|
|
93
97
|
return [];
|
|
98
|
+
const chainId = client.chain?.id;
|
|
99
|
+
if (!chainId)
|
|
100
|
+
throw new Error("Client must have a chain configured");
|
|
94
101
|
const stateOverride = [];
|
|
95
|
-
|
|
102
|
+
const { walletAllowances, slotHints } = options;
|
|
103
|
+
const valueHex = toHex(maxUint256, { size: 32 });
|
|
104
|
+
// 1. Permit2 allowance overrides (deterministic, no RPC).
|
|
96
105
|
const permit2StateDiff = computePermit2StateDiff(account, approvals);
|
|
97
106
|
if (permit2StateDiff.length > 0) {
|
|
98
107
|
stateOverride.push({
|
|
@@ -100,12 +109,63 @@ export async function getApprovalOverrides(client, account, approvals, permit2Ad
|
|
|
100
109
|
stateDiff: permit2StateDiff,
|
|
101
110
|
});
|
|
102
111
|
}
|
|
103
|
-
//
|
|
104
|
-
const uniqueAssets = [
|
|
105
|
-
|
|
106
|
-
]
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
// Decide which assets still need an ERC20 allowance override.
|
|
113
|
+
const uniqueAssets = [];
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
for (const [asset, spender] of approvals) {
|
|
116
|
+
const a = getAddress(asset);
|
|
117
|
+
// Token already approved → skip.
|
|
118
|
+
const supplied = walletAllowances?.[allowanceKey(a, spender)];
|
|
119
|
+
if (supplied !== undefined && supplied === maxUint256)
|
|
120
|
+
continue;
|
|
121
|
+
if (!seen.has(a)) {
|
|
122
|
+
seen.add(a);
|
|
123
|
+
uniqueAssets.push(a);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Partition assets by which resolution path applies.
|
|
127
|
+
const fallbackAssets = [];
|
|
128
|
+
for (const asset of uniqueAssets) {
|
|
129
|
+
const callerHintIdx = slotHints?.[asset]?.allowanceSlotIndex;
|
|
130
|
+
const cachedIdx = getCachedSlotHints(chainId, asset)?.allowanceSlotIndex;
|
|
131
|
+
const idx = callerHintIdx ?? cachedIdx;
|
|
132
|
+
if (idx !== undefined) {
|
|
133
|
+
const slot = computeAllowanceSlot(account, permit2Address, idx);
|
|
134
|
+
stateOverride.push({
|
|
135
|
+
address: asset,
|
|
136
|
+
stateDiff: [{ slot, value: valueHex }],
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
fallbackAssets.push(asset);
|
|
141
|
+
}
|
|
142
|
+
// Probe via sequential scan first; only fall back to access-list for the
|
|
143
|
+
// rare token where that fails.
|
|
144
|
+
const stillUnknown = [];
|
|
145
|
+
for (const asset of fallbackAssets) {
|
|
146
|
+
try {
|
|
147
|
+
const hints = await fetchErc20SlotHints(client, asset, {
|
|
148
|
+
skipBalance: true,
|
|
149
|
+
allowanceSpender: permit2Address,
|
|
150
|
+
});
|
|
151
|
+
if (hints.allowanceSlotIndex !== undefined) {
|
|
152
|
+
const slot = computeAllowanceSlot(account, permit2Address, hints.allowanceSlotIndex);
|
|
153
|
+
stateOverride.push({
|
|
154
|
+
address: asset,
|
|
155
|
+
stateDiff: [{ slot, value: valueHex }],
|
|
156
|
+
});
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
// fall through
|
|
162
|
+
}
|
|
163
|
+
stillUnknown.push(asset);
|
|
164
|
+
}
|
|
165
|
+
if (stillUnknown.length > 0) {
|
|
166
|
+
const legacy = await discoverAllowanceSlotsViaAccessList(client, account, stillUnknown, permit2Address);
|
|
167
|
+
stateOverride.push(...legacy);
|
|
168
|
+
}
|
|
109
169
|
return stateOverride;
|
|
110
170
|
}
|
|
111
171
|
//# sourceMappingURL=approvalOverrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvalOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/approvalOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,GACL,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"approvalOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/approvalOverrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
import { type Address, type PublicClient, type StateOverride } from "viem";
|
|
2
|
+
import { type SlotHints } from "./slotHints.js";
|
|
3
|
+
export type GetBalanceOverridesOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* Caller-supplied on-chain balances. When a token's balance here meets the
|
|
6
|
+
* required amount, the per-call `balanceOf` RPC is skipped and no override
|
|
7
|
+
* is emitted.
|
|
8
|
+
*/
|
|
9
|
+
walletBalances?: Record<Address, bigint>;
|
|
10
|
+
/**
|
|
11
|
+
* Caller-supplied slot hints. When `balanceSlotIndex` is present for a
|
|
12
|
+
* token, the slot is computed cryptographically; access-list discovery is
|
|
13
|
+
* skipped. Missing entries fall back to `fetchErc20SlotHints` (sequential
|
|
14
|
+
* probing) before finally falling back to access-list discovery.
|
|
15
|
+
*/
|
|
16
|
+
slotHints?: SlotHints;
|
|
17
|
+
};
|
|
2
18
|
/**
|
|
3
19
|
* Generate state overrides that give `account` sufficient ERC20 balances.
|
|
4
20
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
21
|
+
* Resolution order, per token:
|
|
22
|
+
* 1. Use caller-supplied wallet balance when sufficient → no work.
|
|
23
|
+
* 2. Read `balanceOf` on-chain; skip if sufficient.
|
|
24
|
+
* 3. Use caller-supplied `balanceSlotIndex` → compute slot cryptographically.
|
|
25
|
+
* 4. Use cached probed slot index (`fetchErc20SlotHints` cache) → same.
|
|
26
|
+
* 5. Probe sequentially via `fetchErc20SlotHints` (small N `eth_call`s).
|
|
27
|
+
* 6. Fall back to legacy `eth_createAccessList` discovery + per-slot probe.
|
|
8
28
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* @param tokens - array of [tokenAddress, requiredAmount]
|
|
29
|
+
* Steps 3–5 are dramatically cheaper than (6) and work for the vast majority
|
|
30
|
+
* of ERC20 layouts. Step 6 remains as a safety net for exotic packed storage.
|
|
12
31
|
*/
|
|
13
|
-
export declare function getBalanceOverrides(client: PublicClient, account: Address, tokens: [Address, bigint][]): Promise<StateOverride>;
|
|
32
|
+
export declare function getBalanceOverrides(client: PublicClient, account: Address, tokens: [Address, bigint][], options?: GetBalanceOverridesOptions): Promise<StateOverride>;
|
|
14
33
|
//# sourceMappingURL=balanceOverrides.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceOverrides.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/balanceOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,OAAO,EAEZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAIlB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"balanceOverrides.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/balanceOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,OAAO,EAEZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAIlB,MAAM,MAAM,CAAC;AAGd,OAAO,EAIN,KAAK,SAAS,EACd,MAAM,gBAAgB,CAAC;AA2DxB,MAAM,MAAM,0BAA0B,GAAG;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAC3B,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,aAAa,CAAC,CAyJxB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { erc20Abi, getAddress, numberToHex, } from "viem";
|
|
2
2
|
import { encodeFunctionData } from "viem/utils";
|
|
3
3
|
import { getAccessedSlots } from "./accessList.js";
|
|
4
|
+
import { computeBalanceSlot, fetchErc20SlotHints, getCachedSlotHints, } from "./slotHints.js";
|
|
4
5
|
const balanceSlotCache = new Map();
|
|
5
6
|
// wM token requires special storage layout handling
|
|
6
7
|
const WM_CONTRACT = "0x437cc33344a0B27A429f795ff6B469C72698B291";
|
|
@@ -51,23 +52,40 @@ function findIndexOfLargest(arr) {
|
|
|
51
52
|
/**
|
|
52
53
|
* Generate state overrides that give `account` sufficient ERC20 balances.
|
|
53
54
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
55
|
+
* Resolution order, per token:
|
|
56
|
+
* 1. Use caller-supplied wallet balance when sufficient → no work.
|
|
57
|
+
* 2. Read `balanceOf` on-chain; skip if sufficient.
|
|
58
|
+
* 3. Use caller-supplied `balanceSlotIndex` → compute slot cryptographically.
|
|
59
|
+
* 4. Use cached probed slot index (`fetchErc20SlotHints` cache) → same.
|
|
60
|
+
* 5. Probe sequentially via `fetchErc20SlotHints` (small N `eth_call`s).
|
|
61
|
+
* 6. Fall back to legacy `eth_createAccessList` discovery + per-slot probe.
|
|
57
62
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* @param tokens - array of [tokenAddress, requiredAmount]
|
|
63
|
+
* Steps 3–5 are dramatically cheaper than (6) and work for the vast majority
|
|
64
|
+
* of ERC20 layouts. Step 6 remains as a safety net for exotic packed storage.
|
|
61
65
|
*/
|
|
62
|
-
export async function getBalanceOverrides(client, account, tokens) {
|
|
66
|
+
export async function getBalanceOverrides(client, account, tokens, options = {}) {
|
|
63
67
|
if (tokens.length === 0)
|
|
64
68
|
return [];
|
|
65
69
|
const chainId = client.chain?.id;
|
|
66
70
|
if (!chainId)
|
|
67
71
|
throw new Error("Client must have a chain configured");
|
|
68
72
|
const stateOverride = [];
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
const { walletBalances, slotHints } = options;
|
|
74
|
+
// Determine which tokens still need work after applying caller-supplied
|
|
75
|
+
// balances. Tokens with `walletBalances[token] >= requiredAmount` need
|
|
76
|
+
// nothing at all.
|
|
77
|
+
const remaining = [];
|
|
78
|
+
for (const [token, requiredAmount] of tokens) {
|
|
79
|
+
const supplied = walletBalances?.[getAddress(token)];
|
|
80
|
+
if (supplied !== undefined && supplied >= requiredAmount)
|
|
81
|
+
continue;
|
|
82
|
+
remaining.push([token, requiredAmount]);
|
|
83
|
+
}
|
|
84
|
+
if (remaining.length === 0)
|
|
85
|
+
return [];
|
|
86
|
+
// Batch-read current balances for the remaining set (those without a
|
|
87
|
+
// caller-supplied sufficient balance).
|
|
88
|
+
const currentBalances = await Promise.all(remaining.map(([token]) => client
|
|
71
89
|
.readContract({
|
|
72
90
|
abi: erc20Abi,
|
|
73
91
|
address: token,
|
|
@@ -75,13 +93,26 @@ export async function getBalanceOverrides(client, account, tokens) {
|
|
|
75
93
|
args: [account],
|
|
76
94
|
})
|
|
77
95
|
.catch(() => 0n)));
|
|
78
|
-
for (const [i, [token, requiredAmount]] of
|
|
96
|
+
for (const [i, [token, requiredAmount]] of remaining.entries()) {
|
|
79
97
|
const currentBalance = currentBalances[i] ?? 0n;
|
|
80
98
|
if (currentBalance >= requiredAmount)
|
|
81
99
|
continue;
|
|
82
|
-
const
|
|
100
|
+
const tokenAddr = getAddress(token);
|
|
83
101
|
const valueHex = numberToHex(requiredAmount, { size: 32 });
|
|
84
|
-
//
|
|
102
|
+
// Fast path: caller hint → cryptographic slot computation, no RPC.
|
|
103
|
+
const callerHintIdx = slotHints?.[tokenAddr]?.balanceSlotIndex;
|
|
104
|
+
if (callerHintIdx !== undefined && !shouldSkipCaching(token)) {
|
|
105
|
+
const slot = computeBalanceSlot(account, callerHintIdx);
|
|
106
|
+
stateOverride.push({
|
|
107
|
+
address: tokenAddr,
|
|
108
|
+
stateDiff: [{ slot, value: valueHex }],
|
|
109
|
+
});
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Per-account slot cache (legacy: keyed by chainId:owner:token, useful
|
|
113
|
+
// when discovery was done via access-list against this account
|
|
114
|
+
// directly).
|
|
115
|
+
const cacheKey = `${chainId}:${account}:${token}`;
|
|
85
116
|
const cached = balanceSlotCache.get(cacheKey);
|
|
86
117
|
if (cached && !shouldSkipCaching(token)) {
|
|
87
118
|
stateOverride.push({
|
|
@@ -90,7 +121,35 @@ export async function getBalanceOverrides(client, account, tokens) {
|
|
|
90
121
|
});
|
|
91
122
|
continue;
|
|
92
123
|
}
|
|
93
|
-
//
|
|
124
|
+
// Token-keyed cache from `fetchErc20SlotHints` (owner-agnostic).
|
|
125
|
+
const probed = getCachedSlotHints(chainId, tokenAddr);
|
|
126
|
+
if (probed?.balanceSlotIndex !== undefined && !shouldSkipCaching(token)) {
|
|
127
|
+
const slot = computeBalanceSlot(account, probed.balanceSlotIndex);
|
|
128
|
+
stateOverride.push({
|
|
129
|
+
address: tokenAddr,
|
|
130
|
+
stateDiff: [{ slot, value: valueHex }],
|
|
131
|
+
});
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
// Sequential probing via fetchErc20SlotHints (cheap, owner-agnostic).
|
|
135
|
+
try {
|
|
136
|
+
const fresh = await fetchErc20SlotHints(client, tokenAddr, {
|
|
137
|
+
skipAllowance: true,
|
|
138
|
+
});
|
|
139
|
+
if (fresh.balanceSlotIndex !== undefined && !shouldSkipCaching(token)) {
|
|
140
|
+
const slot = computeBalanceSlot(account, fresh.balanceSlotIndex);
|
|
141
|
+
stateOverride.push({
|
|
142
|
+
address: tokenAddr,
|
|
143
|
+
stateDiff: [{ slot, value: valueHex }],
|
|
144
|
+
});
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
// fall through to legacy access-list discovery
|
|
150
|
+
}
|
|
151
|
+
// Legacy fallback: eth_createAccessList-based discovery. Only reached
|
|
152
|
+
// for exotic storage layouts where the small-integer slot probe failed.
|
|
94
153
|
try {
|
|
95
154
|
const accessedSlots = await getAccessedSlots(client, {
|
|
96
155
|
data: encodeFunctionData({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/balanceOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,QAAQ,EACR,UAAU,EACV,WAAW,GACX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"balanceOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/balanceOverrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,48 @@
|
|
|
1
1
|
import { type Address, type PublicClient, type StateOverride } from "viem";
|
|
2
2
|
import type { TransactionPlan } from "../../services/executionService/executionServiceTypes.js";
|
|
3
|
+
import type { SlotHints } from "./slotHints.js";
|
|
3
4
|
export type DeriveStateOverridesOptions = {
|
|
4
5
|
/** Override the native (ETH) balance. Defaults to 1000 ETH. Set to 0n to skip. */
|
|
5
6
|
nativeBalance?: bigint;
|
|
6
7
|
/** Permit2 contract address. Required for approval overrides. */
|
|
7
8
|
permit2Address: Address;
|
|
9
|
+
/**
|
|
10
|
+
* Skip ERC20 balance overrides entirely. Use when the caller has already
|
|
11
|
+
* validated that the account holds sufficient funds (e.g. UI form validation).
|
|
12
|
+
* No `balanceOf` reads, no slot probing — only allowance overrides + native
|
|
13
|
+
* balance + Permit2 deterministic overrides are emitted.
|
|
14
|
+
*/
|
|
15
|
+
noBalanceOverride?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Skip ERC20 allowance overrides entirely (the Permit2 deterministic
|
|
18
|
+
* overrides are still emitted because they cost no RPC). Use when the
|
|
19
|
+
* caller knows the account has already approved the relevant spenders.
|
|
20
|
+
*/
|
|
21
|
+
noAllowanceOverride?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Caller-supplied wallet snapshot. Lets the SDK skip per-call `balanceOf`
|
|
24
|
+
* and `allowance` reads when the supplied values already cover the
|
|
25
|
+
* requirement.
|
|
26
|
+
*
|
|
27
|
+
* - `balances[token]`: when ≥ the plan's required amount, no override
|
|
28
|
+
* is emitted and no `balanceOf` RPC fires.
|
|
29
|
+
* - `allowances[token:spender]`: when `maxUint256`, no override is emitted
|
|
30
|
+
* and no `allowance` RPC fires.
|
|
31
|
+
*/
|
|
32
|
+
wallet?: {
|
|
33
|
+
balances?: Record<Address, bigint>;
|
|
34
|
+
allowances?: Record<`${Address}:${Address}`, bigint>;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Caller-supplied storage slot hints. When the `balanceSlotIndex` or
|
|
38
|
+
* `allowanceSlotIndex` is present for a token, the SDK computes the slot
|
|
39
|
+
* cryptographically and bypasses access-list discovery. Missing entries
|
|
40
|
+
* fall through to the SDK's own probing + final access-list fallback.
|
|
41
|
+
*
|
|
42
|
+
* Pre-fetch with `fetchErc20SlotHints` (exported from this module) to
|
|
43
|
+
* amortise discovery across many simulate/estimate calls.
|
|
44
|
+
*/
|
|
45
|
+
slotHints?: SlotHints;
|
|
8
46
|
};
|
|
9
47
|
/**
|
|
10
48
|
* Generate all state overrides needed to simulate a TransactionPlan
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStateOverrides.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/getStateOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAGlB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;
|
|
1
|
+
{"version":3,"file":"getStateOverrides.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/getStateOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAGlB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAIhG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,MAAM,2BAA2B,GAAG;IACzC,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;KACrD,CAAC;IACF;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAsDF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,2BAA2B,GAClC,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|
|
@@ -67,12 +67,22 @@ function extractApprovalRequirements(plan, account) {
|
|
|
67
67
|
* ```
|
|
68
68
|
*/
|
|
69
69
|
export async function deriveStateOverrides(client, plan, account, options) {
|
|
70
|
-
const { nativeBalance = parseEther("1000"), permit2Address } = options;
|
|
71
|
-
const balanceTokens =
|
|
70
|
+
const { nativeBalance = parseEther("1000"), permit2Address, noBalanceOverride = false, noAllowanceOverride = false, wallet, slotHints, } = options;
|
|
71
|
+
const balanceTokens = noBalanceOverride
|
|
72
|
+
? []
|
|
73
|
+
: extractBalanceRequirements(plan, account);
|
|
72
74
|
const approvalPairs = extractApprovalRequirements(plan, account);
|
|
73
75
|
const [balanceOverrides, approvalOverrides] = await Promise.all([
|
|
74
|
-
getBalanceOverrides(client, account, balanceTokens
|
|
75
|
-
|
|
76
|
+
getBalanceOverrides(client, account, balanceTokens, {
|
|
77
|
+
walletBalances: wallet?.balances,
|
|
78
|
+
slotHints,
|
|
79
|
+
}),
|
|
80
|
+
noAllowanceOverride
|
|
81
|
+
? Promise.resolve([])
|
|
82
|
+
: getApprovalOverrides(client, account, approvalPairs, permit2Address, {
|
|
83
|
+
walletAllowances: wallet?.allowances,
|
|
84
|
+
slotHints,
|
|
85
|
+
}),
|
|
76
86
|
]);
|
|
77
87
|
const allOverrides = [];
|
|
78
88
|
// Native balance override
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStateOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/getStateOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,UAAU,EACV,UAAU,GACV,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"getStateOverrides.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/getStateOverrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { deriveStateOverrides, type DeriveStateOverridesOptions, } from "./getStateOverrides.js";
|
|
2
|
-
export { getBalanceOverrides } from "./balanceOverrides.js";
|
|
3
|
-
export { getApprovalOverrides, computePermit2StateDiff, } from "./approvalOverrides.js";
|
|
2
|
+
export { getBalanceOverrides, type GetBalanceOverridesOptions, } from "./balanceOverrides.js";
|
|
3
|
+
export { getApprovalOverrides, computePermit2StateDiff, type GetApprovalOverridesOptions, } from "./approvalOverrides.js";
|
|
4
4
|
export { mergeStateOverrides } from "./mergeStateOverrides.js";
|
|
5
|
+
export { fetchErc20SlotHints, fetchErc20SlotHintsBatch, computeBalanceSlot, computeAllowanceSlot, primeSlotHintsCache, getCachedSlotHints, type Erc20SlotHints, type SlotHints, type FetchSlotHintsOptions, } from "./slotHints.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,KAAK,2BAA2B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,KAAK,2BAA2B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,mBAAmB,EACnB,KAAK,0BAA0B,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,2BAA2B,GAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,qBAAqB,GAC1B,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { deriveStateOverrides, } from "./getStateOverrides.js";
|
|
2
|
-
export { getBalanceOverrides } from "./balanceOverrides.js";
|
|
2
|
+
export { getBalanceOverrides, } from "./balanceOverrides.js";
|
|
3
3
|
export { getApprovalOverrides, computePermit2StateDiff, } from "./approvalOverrides.js";
|
|
4
4
|
export { mergeStateOverrides } from "./mergeStateOverrides.js";
|
|
5
|
+
export { fetchErc20SlotHints, fetchErc20SlotHintsBatch, computeBalanceSlot, computeAllowanceSlot, primeSlotHintsCache, getCachedSlotHints, } from "./slotHints.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,GAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,GAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,mBAAmB,GAEnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,oBAAoB,EACpB,uBAAuB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAIlB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type Address, type Hex, type PublicClient, toHex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* Discovered storage-slot indices for a single ERC20 token. Slot indices are
|
|
4
|
+
* the small-integer base index used in the contract's `mapping(address =>
|
|
5
|
+
* uint256) balances` / `mapping(address => mapping(address => uint256))
|
|
6
|
+
* allowances` declaration. They are owner-/spender-agnostic — the concrete
|
|
7
|
+
* storage slot is then derived cryptographically.
|
|
8
|
+
*
|
|
9
|
+
* Cache and reuse these across calls: they don't change for a deployed token.
|
|
10
|
+
*/
|
|
11
|
+
export type Erc20SlotHints = {
|
|
12
|
+
/** Slot index for the `balances` mapping (base storage slot). */
|
|
13
|
+
balanceSlotIndex?: bigint;
|
|
14
|
+
/** Slot index for the `allowance` mapping (outer base storage slot). */
|
|
15
|
+
allowanceSlotIndex?: bigint;
|
|
16
|
+
};
|
|
17
|
+
export type SlotHints = Record<Address, Erc20SlotHints>;
|
|
18
|
+
export type FetchSlotHintsOptions = {
|
|
19
|
+
/** When `true`, do not probe for the balance slot. */
|
|
20
|
+
skipBalance?: boolean;
|
|
21
|
+
/** When `true`, do not probe for the allowance slot. */
|
|
22
|
+
skipAllowance?: boolean;
|
|
23
|
+
/** Spender for allowance probing. Defaults to the Permit2 address. */
|
|
24
|
+
allowanceSpender?: Address;
|
|
25
|
+
/** Max sequential base slot to scan (0..N). Defaults to 20. */
|
|
26
|
+
maxSequentialSlot?: number;
|
|
27
|
+
/** Extra non-sequential slot indices to try (e.g. known anomalies). */
|
|
28
|
+
extraSlotCandidates?: bigint[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Compute the storage slot of `balances[owner]` in a Solidity-style
|
|
32
|
+
* `mapping(address => uint256)` at base slot `slotIndex`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function computeBalanceSlot(owner: Address, slotIndex: bigint): Hex;
|
|
35
|
+
/**
|
|
36
|
+
* Compute the storage slot of `allowance[owner][spender]` in a Solidity-style
|
|
37
|
+
* `mapping(address => mapping(address => uint256))` at base slot `slotIndex`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeAllowanceSlot(owner: Address, spender: Address, slotIndex: bigint): Hex;
|
|
40
|
+
/**
|
|
41
|
+
* Probe a single ERC20 token to discover its `balances` and `allowance` slot
|
|
42
|
+
* indices, by overriding sequential base-slot candidates and reading the
|
|
43
|
+
* value back.
|
|
44
|
+
*
|
|
45
|
+
* Strategy is intentionally simpler than `eth_createAccessList`-based
|
|
46
|
+
* discovery: most ERC20 layouts (OpenZeppelin, Solady, custom) use a small
|
|
47
|
+
* integer base slot. Sequential probing from 0 hits the answer in 1–3 RPC
|
|
48
|
+
* calls; access-list discovery costs an `eth_createAccessList` + per-candidate
|
|
49
|
+
* probe and isn't supported by all proxies.
|
|
50
|
+
*
|
|
51
|
+
* Results are cached module-scope by `chainId:token` (slot indices are
|
|
52
|
+
* owner-/spender-agnostic and immutable for a deployed token), so subsequent
|
|
53
|
+
* calls for the same token short-circuit to a Map lookup.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const hints = await fetchErc20SlotHints(client, token, {
|
|
58
|
+
* allowanceSpender: permit2Address,
|
|
59
|
+
* })
|
|
60
|
+
* // → { balanceSlotIndex: 0n, allowanceSlotIndex: 1n }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function fetchErc20SlotHints(client: PublicClient, token: Address, options?: FetchSlotHintsOptions): Promise<Erc20SlotHints>;
|
|
64
|
+
/**
|
|
65
|
+
* Convenience batch wrapper for `fetchErc20SlotHints` over many tokens.
|
|
66
|
+
* Caller-side parallelism is preserved (one `Promise.all` over the inputs);
|
|
67
|
+
* the per-token cache means repeats are free.
|
|
68
|
+
*/
|
|
69
|
+
export declare function fetchErc20SlotHintsBatch(client: PublicClient, tokens: Address[], options?: FetchSlotHintsOptions): Promise<SlotHints>;
|
|
70
|
+
/**
|
|
71
|
+
* Helper for callers who want to pre-seed the slot-hints cache from their own
|
|
72
|
+
* persistence layer (e.g. localStorage).
|
|
73
|
+
*/
|
|
74
|
+
export declare function primeSlotHintsCache(chainId: number, hints: Record<Address, Erc20SlotHints>): void;
|
|
75
|
+
/** Helper used by deriveStateOverrides to look up a hint without re-probing. */
|
|
76
|
+
export declare function getCachedSlotHints(chainId: number, token: Address): Erc20SlotHints | undefined;
|
|
77
|
+
export { toHex };
|
|
78
|
+
//# sourceMappingURL=slotHints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotHints.d.ts","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/slotHints.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAQjB,KAAK,EACL,MAAM,MAAM,CAAC;AAId;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IACnC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAUF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAIzE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GACf,GAAG,CAUL;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,cAAc,CAAC,CAoGzB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC7C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,SAAS,CAAC,CASpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,QAKtC;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACZ,cAAc,GAAG,SAAS,CAE5B;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|