@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.
Files changed (129) hide show
  1. package/dist/src/entities/Account.d.ts +10 -2
  2. package/dist/src/entities/Account.d.ts.map +1 -1
  3. package/dist/src/entities/Account.js +15 -2
  4. package/dist/src/entities/Account.js.map +1 -1
  5. package/dist/src/entities/EVault.d.ts +6 -1
  6. package/dist/src/entities/EVault.d.ts.map +1 -1
  7. package/dist/src/entities/EVault.js.map +1 -1
  8. package/dist/src/entities/Portfolio.d.ts +143 -18
  9. package/dist/src/entities/Portfolio.d.ts.map +1 -1
  10. package/dist/src/entities/Portfolio.js +240 -36
  11. package/dist/src/entities/Portfolio.js.map +1 -1
  12. package/dist/src/plugins/keyring/keyringPlugin.d.ts.map +1 -1
  13. package/dist/src/plugins/keyring/keyringPlugin.js +67 -17
  14. package/dist/src/plugins/keyring/keyringPlugin.js.map +1 -1
  15. package/dist/src/plugins/pyth/pythPlugin.d.ts +3 -1
  16. package/dist/src/plugins/pyth/pythPlugin.d.ts.map +1 -1
  17. package/dist/src/plugins/pyth/pythPlugin.js +101 -6
  18. package/dist/src/plugins/pyth/pythPlugin.js.map +1 -1
  19. package/dist/src/plugins/types.d.ts +38 -2
  20. package/dist/src/plugins/types.d.ts.map +1 -1
  21. package/dist/src/plugins/types.js.map +1 -1
  22. package/dist/src/sdk/buildSDK.d.ts.map +1 -1
  23. package/dist/src/sdk/buildSDK.js +3 -2
  24. package/dist/src/sdk/buildSDK.js.map +1 -1
  25. package/dist/src/sdk/sdk.d.ts +15 -4
  26. package/dist/src/sdk/sdk.d.ts.map +1 -1
  27. package/dist/src/sdk/sdk.js +40 -3
  28. package/dist/src/sdk/sdk.js.map +1 -1
  29. package/dist/src/services/accountService/accountService.d.ts +7 -1
  30. package/dist/src/services/accountService/accountService.d.ts.map +1 -1
  31. package/dist/src/services/accountService/accountService.js +55 -1
  32. package/dist/src/services/accountService/accountService.js.map +1 -1
  33. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts.map +1 -1
  34. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js +2 -2
  35. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js.map +1 -1
  36. package/dist/src/services/accountService/index.d.ts +1 -1
  37. package/dist/src/services/accountService/index.d.ts.map +1 -1
  38. package/dist/src/services/executionService/cowExecutor.d.ts +3 -0
  39. package/dist/src/services/executionService/cowExecutor.d.ts.map +1 -1
  40. package/dist/src/services/executionService/cowExecutor.js.map +1 -1
  41. package/dist/src/services/executionService/execute.d.ts +8 -0
  42. package/dist/src/services/executionService/execute.d.ts.map +1 -1
  43. package/dist/src/services/executionService/execute.js.map +1 -1
  44. package/dist/src/services/executionService/executionService.d.ts +70 -8
  45. package/dist/src/services/executionService/executionService.d.ts.map +1 -1
  46. package/dist/src/services/executionService/executionService.js +278 -124
  47. package/dist/src/services/executionService/executionService.js.map +1 -1
  48. package/dist/src/services/executionService/executionServiceTypes.d.ts +4 -0
  49. package/dist/src/services/executionService/executionServiceTypes.d.ts.map +1 -1
  50. package/dist/src/services/executionService/simulate.d.ts +29 -0
  51. package/dist/src/services/executionService/simulate.d.ts.map +1 -1
  52. package/dist/src/services/executionService/simulate.js +42 -5
  53. package/dist/src/services/executionService/simulate.js.map +1 -1
  54. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts +2 -1
  55. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts.map +1 -1
  56. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js +2 -2
  57. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js.map +1 -1
  58. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts +2 -1
  59. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts.map +1 -1
  60. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js +11 -2
  61. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js.map +1 -1
  62. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts +4 -0
  63. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts.map +1 -1
  64. package/dist/src/services/rewardsService/index.d.ts +4 -1
  65. package/dist/src/services/rewardsService/index.d.ts.map +1 -1
  66. package/dist/src/services/rewardsService/index.js +2 -0
  67. package/dist/src/services/rewardsService/index.js.map +1 -1
  68. package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts +32 -0
  69. package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts.map +1 -0
  70. package/dist/src/services/rewardsService/rewardCampaignEligibility.js +21 -0
  71. package/dist/src/services/rewardsService/rewardCampaignEligibility.js.map +1 -0
  72. package/dist/src/services/rewardsService/rewardsService.d.ts +6 -0
  73. package/dist/src/services/rewardsService/rewardsService.d.ts.map +1 -1
  74. package/dist/src/services/rewardsService/rewardsService.js +20 -3
  75. package/dist/src/services/rewardsService/rewardsService.js.map +1 -1
  76. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts +8 -5
  77. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts.map +1 -1
  78. package/dist/src/services/rewardsService/rewardsServiceTypes.js +1 -1
  79. package/dist/src/services/rewardsService/rewardsServiceTypes.js.map +1 -1
  80. package/dist/src/services/rewardsService/vaultRewardInfo.d.ts +25 -0
  81. package/dist/src/services/rewardsService/vaultRewardInfo.d.ts.map +1 -0
  82. package/dist/src/services/rewardsService/vaultRewardInfo.js +39 -0
  83. package/dist/src/services/rewardsService/vaultRewardInfo.js.map +1 -0
  84. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.d.ts +2 -1
  85. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.d.ts.map +1 -1
  86. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.js +1 -0
  87. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultLensTypes.js.map +1 -1
  88. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts.map +1 -1
  89. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js +7 -0
  90. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js.map +1 -1
  91. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts.map +1 -1
  92. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js +17 -6
  93. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js.map +1 -1
  94. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.d.ts.map +1 -1
  95. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js +52 -17
  96. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js.map +1 -1
  97. package/dist/src/utils/accountComputations.d.ts +41 -8
  98. package/dist/src/utils/accountComputations.d.ts.map +1 -1
  99. package/dist/src/utils/accountComputations.js +127 -77
  100. package/dist/src/utils/accountComputations.js.map +1 -1
  101. package/dist/src/utils/irm.d.ts +10 -2
  102. package/dist/src/utils/irm.d.ts.map +1 -1
  103. package/dist/src/utils/irm.js +33 -0
  104. package/dist/src/utils/irm.js.map +1 -1
  105. package/dist/src/utils/oracle.d.ts +16 -0
  106. package/dist/src/utils/oracle.d.ts.map +1 -1
  107. package/dist/src/utils/oracle.js +98 -0
  108. package/dist/src/utils/oracle.js.map +1 -1
  109. package/dist/src/utils/stateOverrides/approvalOverrides.d.ts +25 -8
  110. package/dist/src/utils/stateOverrides/approvalOverrides.d.ts.map +1 -1
  111. package/dist/src/utils/stateOverrides/approvalOverrides.js +76 -16
  112. package/dist/src/utils/stateOverrides/approvalOverrides.js.map +1 -1
  113. package/dist/src/utils/stateOverrides/balanceOverrides.d.ts +26 -7
  114. package/dist/src/utils/stateOverrides/balanceOverrides.d.ts.map +1 -1
  115. package/dist/src/utils/stateOverrides/balanceOverrides.js +72 -13
  116. package/dist/src/utils/stateOverrides/balanceOverrides.js.map +1 -1
  117. package/dist/src/utils/stateOverrides/getStateOverrides.d.ts +38 -0
  118. package/dist/src/utils/stateOverrides/getStateOverrides.d.ts.map +1 -1
  119. package/dist/src/utils/stateOverrides/getStateOverrides.js +14 -4
  120. package/dist/src/utils/stateOverrides/getStateOverrides.js.map +1 -1
  121. package/dist/src/utils/stateOverrides/index.d.ts +3 -2
  122. package/dist/src/utils/stateOverrides/index.d.ts.map +1 -1
  123. package/dist/src/utils/stateOverrides/index.js +2 -1
  124. package/dist/src/utils/stateOverrides/index.js.map +1 -1
  125. package/dist/src/utils/stateOverrides/slotHints.d.ts +78 -0
  126. package/dist/src/utils/stateOverrides/slotHints.d.ts.map +1 -0
  127. package/dist/src/utils/stateOverrides/slotHints.js +152 -0
  128. package/dist/src/utils/stateOverrides/slotHints.js.map +1 -0
  129. 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 discoverAllowanceSlots(client, account, assets, permit2) {
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
- * 1. Computes Permit2 storage slots deterministically (keccak256 mapping layout)
84
- * 2. Traces actual ERC20 approve() calls to discover approval storage slots
85
- *
86
- * @param client - viem PublicClient (must support eth_createAccessList and eth_call with state overrides)
87
- * @param account - token owner address
88
- * @param approvals - array of [assetAddress, spenderAddress] pairs
89
- * @param permit2Address - Permit2 contract address
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
- // 1. Permit2 allowance overrides (deterministic slot computation)
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
- // 2. ERC20 approval overrides (discovered via eth_createAccessList)
104
- const uniqueAssets = [
105
- ...new Set(approvals.map(([asset]) => getAddress(asset))),
106
- ];
107
- const allowanceOverrides = await discoverAllowanceSlots(client, account, uniqueAssets, permit2Address);
108
- stateOverride.push(...allowanceOverrides);
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":"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"}
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
- * For each token where the on-chain balance is below the requested amount,
6
- * uses eth_createAccessList to discover the balanceOf storage slot, then builds
7
- * a stateDiff that sets that slot to the desired value.
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
- * @param client - viem PublicClient (must support eth_createAccessList and eth_call with state overrides)
10
- * @param account - address whose balance to override
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;AA6Dd;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GACzB,OAAO,CAAC,aAAa,CAAC,CAiGxB"}
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
- * For each token where the on-chain balance is below the requested amount,
55
- * uses eth_createAccessList to discover the balanceOf storage slot, then builds
56
- * a stateDiff that sets that slot to the desired value.
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
- * @param client - viem PublicClient (must support eth_createAccessList and eth_call with state overrides)
59
- * @param account - address whose balance to override
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
- // Batch-read current balances
70
- const currentBalances = await Promise.all(tokens.map(([token]) => client
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 tokens.entries()) {
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 cacheKey = `${chainId}:${account}:${token}`;
100
+ const tokenAddr = getAddress(token);
83
101
  const valueHex = numberToHex(requiredAmount, { size: 32 });
84
- // Check cache first
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
- // Use eth_createAccessList to find candidate storage slots
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":"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"}
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;AAKhG,MAAM,MAAM,2BAA2B,GAAG;IACzC,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,cAAc,EAAE,OAAO,CAAC;CACxB,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,CAsBxB"}
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 = extractBalanceRequirements(plan, account);
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
- getApprovalOverrides(client, account, approvalPairs, permit2Address),
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;AAS/D;;;;GAIG;AACH,SAAS,0BAA0B,CAClC,IAAqB,EACrB,OAAgB;IAEhB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAAE,SAAS;QAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAC3B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAS,2BAA2B,CACnC,IAAqB,EACrB,OAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAyB,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAAE,SAAS;QAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QAE7D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,MAAoB,EACpB,IAAqB,EACrB,OAAgB,EAChB,OAAoC;IAEpC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEvE,MAAM,aAAa,GAAG,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjE,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QACnD,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,0BAA0B;IAC1B,IAAI,aAAa,GAAG,EAAE,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACvC,YAAY,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAExC,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC;AAC1C,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,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACN,oBAAoB,EACpB,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
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,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACN,oBAAoB,EACpB,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
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"}