@eulerxyz/euler-v2-sdk 0.2.7-beta → 0.2.9-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 (134) 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 +3 -1
  6. package/dist/src/entities/EVault.d.ts.map +1 -1
  7. package/dist/src/entities/EVault.js +28 -2
  8. package/dist/src/entities/EVault.js.map +1 -1
  9. package/dist/src/entities/Portfolio.d.ts +143 -18
  10. package/dist/src/entities/Portfolio.d.ts.map +1 -1
  11. package/dist/src/entities/Portfolio.js +240 -36
  12. package/dist/src/entities/Portfolio.js.map +1 -1
  13. package/dist/src/plugins/keyring/keyringPlugin.d.ts.map +1 -1
  14. package/dist/src/plugins/keyring/keyringPlugin.js +67 -17
  15. package/dist/src/plugins/keyring/keyringPlugin.js.map +1 -1
  16. package/dist/src/plugins/pyth/pythPlugin.d.ts +3 -1
  17. package/dist/src/plugins/pyth/pythPlugin.d.ts.map +1 -1
  18. package/dist/src/plugins/pyth/pythPlugin.js +101 -6
  19. package/dist/src/plugins/pyth/pythPlugin.js.map +1 -1
  20. package/dist/src/plugins/types.d.ts +38 -2
  21. package/dist/src/plugins/types.d.ts.map +1 -1
  22. package/dist/src/plugins/types.js.map +1 -1
  23. package/dist/src/sdk/buildSDK.d.ts.map +1 -1
  24. package/dist/src/sdk/buildSDK.js +3 -2
  25. package/dist/src/sdk/buildSDK.js.map +1 -1
  26. package/dist/src/sdk/sdk.d.ts +15 -4
  27. package/dist/src/sdk/sdk.d.ts.map +1 -1
  28. package/dist/src/sdk/sdk.js +40 -3
  29. package/dist/src/sdk/sdk.js.map +1 -1
  30. package/dist/src/services/accountService/accountService.d.ts +7 -1
  31. package/dist/src/services/accountService/accountService.d.ts.map +1 -1
  32. package/dist/src/services/accountService/accountService.js +55 -1
  33. package/dist/src/services/accountService/accountService.js.map +1 -1
  34. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts.map +1 -1
  35. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js +2 -2
  36. package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js.map +1 -1
  37. package/dist/src/services/accountService/index.d.ts +1 -1
  38. package/dist/src/services/accountService/index.d.ts.map +1 -1
  39. package/dist/src/services/executionService/cowExecutor.d.ts +3 -0
  40. package/dist/src/services/executionService/cowExecutor.d.ts.map +1 -1
  41. package/dist/src/services/executionService/cowExecutor.js.map +1 -1
  42. package/dist/src/services/executionService/execute.d.ts +8 -0
  43. package/dist/src/services/executionService/execute.d.ts.map +1 -1
  44. package/dist/src/services/executionService/execute.js.map +1 -1
  45. package/dist/src/services/executionService/executionService.d.ts +69 -7
  46. package/dist/src/services/executionService/executionService.d.ts.map +1 -1
  47. package/dist/src/services/executionService/executionService.js +266 -122
  48. package/dist/src/services/executionService/executionService.js.map +1 -1
  49. package/dist/src/services/executionService/executionServiceTypes.d.ts +4 -0
  50. package/dist/src/services/executionService/executionServiceTypes.d.ts.map +1 -1
  51. package/dist/src/services/executionService/simulate.d.ts +29 -0
  52. package/dist/src/services/executionService/simulate.d.ts.map +1 -1
  53. package/dist/src/services/executionService/simulate.js +42 -5
  54. package/dist/src/services/executionService/simulate.js.map +1 -1
  55. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts +2 -1
  56. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts.map +1 -1
  57. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js +2 -2
  58. package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js.map +1 -1
  59. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts +2 -1
  60. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts.map +1 -1
  61. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js +11 -2
  62. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js.map +1 -1
  63. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts +4 -0
  64. package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts.map +1 -1
  65. package/dist/src/services/rewardsService/index.d.ts +4 -1
  66. package/dist/src/services/rewardsService/index.d.ts.map +1 -1
  67. package/dist/src/services/rewardsService/index.js +2 -0
  68. package/dist/src/services/rewardsService/index.js.map +1 -1
  69. package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts +32 -0
  70. package/dist/src/services/rewardsService/rewardCampaignEligibility.d.ts.map +1 -0
  71. package/dist/src/services/rewardsService/rewardCampaignEligibility.js +21 -0
  72. package/dist/src/services/rewardsService/rewardCampaignEligibility.js.map +1 -0
  73. package/dist/src/services/rewardsService/rewardsService.d.ts +6 -0
  74. package/dist/src/services/rewardsService/rewardsService.d.ts.map +1 -1
  75. package/dist/src/services/rewardsService/rewardsService.js +20 -3
  76. package/dist/src/services/rewardsService/rewardsService.js.map +1 -1
  77. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts +8 -5
  78. package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts.map +1 -1
  79. package/dist/src/services/rewardsService/rewardsServiceTypes.js +1 -1
  80. package/dist/src/services/rewardsService/rewardsServiceTypes.js.map +1 -1
  81. package/dist/src/services/rewardsService/vaultRewardInfo.d.ts +25 -0
  82. package/dist/src/services/rewardsService/vaultRewardInfo.d.ts.map +1 -0
  83. package/dist/src/services/rewardsService/vaultRewardInfo.js +39 -0
  84. package/dist/src/services/rewardsService/vaultRewardInfo.js.map +1 -0
  85. package/dist/src/services/swapService/swapService.d.ts +2 -1
  86. package/dist/src/services/swapService/swapService.d.ts.map +1 -1
  87. package/dist/src/services/swapService/swapService.js +19 -19
  88. package/dist/src/services/swapService/swapService.js.map +1 -1
  89. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts.map +1 -1
  90. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js +13 -1
  91. package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js.map +1 -1
  92. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts.map +1 -1
  93. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js +39 -2
  94. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js.map +1 -1
  95. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterTypes.d.ts +6 -0
  96. package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterTypes.d.ts.map +1 -1
  97. package/dist/src/services/vaults/eVaultService/eVaultService.d.ts.map +1 -1
  98. package/dist/src/services/vaults/eVaultService/eVaultService.js +9 -1
  99. package/dist/src/services/vaults/eVaultService/eVaultService.js.map +1 -1
  100. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.d.ts.map +1 -1
  101. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js +52 -17
  102. package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js.map +1 -1
  103. package/dist/src/utils/accountComputations.d.ts +45 -9
  104. package/dist/src/utils/accountComputations.d.ts.map +1 -1
  105. package/dist/src/utils/accountComputations.js +133 -81
  106. package/dist/src/utils/accountComputations.js.map +1 -1
  107. package/dist/src/utils/accountPositionClassification.d.ts.map +1 -1
  108. package/dist/src/utils/accountPositionClassification.js +12 -1
  109. package/dist/src/utils/accountPositionClassification.js.map +1 -1
  110. package/dist/src/utils/oracle.d.ts +70 -0
  111. package/dist/src/utils/oracle.d.ts.map +1 -1
  112. package/dist/src/utils/oracle.js +307 -0
  113. package/dist/src/utils/oracle.js.map +1 -1
  114. package/dist/src/utils/stateOverrides/approvalOverrides.d.ts +25 -8
  115. package/dist/src/utils/stateOverrides/approvalOverrides.d.ts.map +1 -1
  116. package/dist/src/utils/stateOverrides/approvalOverrides.js +76 -16
  117. package/dist/src/utils/stateOverrides/approvalOverrides.js.map +1 -1
  118. package/dist/src/utils/stateOverrides/balanceOverrides.d.ts +26 -7
  119. package/dist/src/utils/stateOverrides/balanceOverrides.d.ts.map +1 -1
  120. package/dist/src/utils/stateOverrides/balanceOverrides.js +72 -13
  121. package/dist/src/utils/stateOverrides/balanceOverrides.js.map +1 -1
  122. package/dist/src/utils/stateOverrides/getStateOverrides.d.ts +38 -0
  123. package/dist/src/utils/stateOverrides/getStateOverrides.d.ts.map +1 -1
  124. package/dist/src/utils/stateOverrides/getStateOverrides.js +14 -4
  125. package/dist/src/utils/stateOverrides/getStateOverrides.js.map +1 -1
  126. package/dist/src/utils/stateOverrides/index.d.ts +3 -2
  127. package/dist/src/utils/stateOverrides/index.d.ts.map +1 -1
  128. package/dist/src/utils/stateOverrides/index.js +2 -1
  129. package/dist/src/utils/stateOverrides/index.js.map +1 -1
  130. package/dist/src/utils/stateOverrides/slotHints.d.ts +78 -0
  131. package/dist/src/utils/stateOverrides/slotHints.d.ts.map +1 -0
  132. package/dist/src/utils/stateOverrides/slotHints.js +152 -0
  133. package/dist/src/utils/stateOverrides/slotHints.js.map +1 -0
  134. package/package.json +1 -1
@@ -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":"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"}
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"}
@@ -0,0 +1,152 @@
1
+ import { encodePacked, erc20Abi, getAddress, hexToBigInt, keccak256, maxUint256, numberToHex, toHex, } from "viem";
2
+ const DEFAULT_MAX_SEQUENTIAL = 20;
3
+ const DEFAULT_EXTRA_CANDIDATES = [];
4
+ const slotHintsCache = new Map();
5
+ const probeAddress = (chainId, token) => `${chainId}:${getAddress(token)}`;
6
+ /**
7
+ * Compute the storage slot of `balances[owner]` in a Solidity-style
8
+ * `mapping(address => uint256)` at base slot `slotIndex`.
9
+ */
10
+ export function computeBalanceSlot(owner, slotIndex) {
11
+ return keccak256(encodePacked(["uint256", "uint256"], [hexToBigInt(owner), slotIndex]));
12
+ }
13
+ /**
14
+ * Compute the storage slot of `allowance[owner][spender]` in a Solidity-style
15
+ * `mapping(address => mapping(address => uint256))` at base slot `slotIndex`.
16
+ */
17
+ export function computeAllowanceSlot(owner, spender, slotIndex) {
18
+ const baseSlot = keccak256(encodePacked(["uint256", "uint256"], [hexToBigInt(owner), slotIndex]));
19
+ return keccak256(encodePacked(["uint256", "uint256"], [hexToBigInt(spender), hexToBigInt(baseSlot)]));
20
+ }
21
+ /**
22
+ * Probe a single ERC20 token to discover its `balances` and `allowance` slot
23
+ * indices, by overriding sequential base-slot candidates and reading the
24
+ * value back.
25
+ *
26
+ * Strategy is intentionally simpler than `eth_createAccessList`-based
27
+ * discovery: most ERC20 layouts (OpenZeppelin, Solady, custom) use a small
28
+ * integer base slot. Sequential probing from 0 hits the answer in 1–3 RPC
29
+ * calls; access-list discovery costs an `eth_createAccessList` + per-candidate
30
+ * probe and isn't supported by all proxies.
31
+ *
32
+ * Results are cached module-scope by `chainId:token` (slot indices are
33
+ * owner-/spender-agnostic and immutable for a deployed token), so subsequent
34
+ * calls for the same token short-circuit to a Map lookup.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const hints = await fetchErc20SlotHints(client, token, {
39
+ * allowanceSpender: permit2Address,
40
+ * })
41
+ * // → { balanceSlotIndex: 0n, allowanceSlotIndex: 1n }
42
+ * ```
43
+ */
44
+ export async function fetchErc20SlotHints(client, token, options = {}) {
45
+ const chainId = client.chain?.id;
46
+ if (!chainId)
47
+ throw new Error("Client must have a chain configured");
48
+ const cacheKey = probeAddress(chainId, token);
49
+ const cached = slotHintsCache.get(cacheKey);
50
+ if (cached) {
51
+ const stillNeedsBalance = !options.skipBalance && cached.balanceSlotIndex === undefined;
52
+ const stillNeedsAllowance = !options.skipAllowance && cached.allowanceSlotIndex === undefined;
53
+ if (!stillNeedsBalance && !stillNeedsAllowance) {
54
+ return cached;
55
+ }
56
+ }
57
+ const max = options.maxSequentialSlot ?? DEFAULT_MAX_SEQUENTIAL;
58
+ const extras = options.extraSlotCandidates ?? DEFAULT_EXTRA_CANDIDATES;
59
+ const candidates = [];
60
+ for (let i = 0; i <= max; i++)
61
+ candidates.push(BigInt(i));
62
+ for (const idx of extras)
63
+ candidates.push(idx);
64
+ const probeOwner = "0x1111111111111111111111111111111111111111";
65
+ const probeSpender = options.allowanceSpender ??
66
+ "0x2222222222222222222222222222222222222222";
67
+ const valueHex = numberToHex(maxUint256, { size: 32 });
68
+ const findSlotIndex = async (computeSlot, read) => {
69
+ for (const idx of candidates) {
70
+ try {
71
+ const slot = computeSlot(idx);
72
+ const value = await read(idx, slot);
73
+ if (value === maxUint256)
74
+ return idx;
75
+ }
76
+ catch {
77
+ // candidate didn't decode; try next
78
+ }
79
+ }
80
+ return undefined;
81
+ };
82
+ const balancePromise = options.skipBalance || cached?.balanceSlotIndex !== undefined
83
+ ? Promise.resolve(cached?.balanceSlotIndex)
84
+ : findSlotIndex((idx) => computeBalanceSlot(probeOwner, idx), (_idx, slot) => client
85
+ .readContract({
86
+ abi: erc20Abi,
87
+ address: token,
88
+ functionName: "balanceOf",
89
+ args: [probeOwner],
90
+ stateOverride: [
91
+ {
92
+ address: token,
93
+ stateDiff: [{ slot, value: valueHex }],
94
+ },
95
+ ],
96
+ })
97
+ .catch(() => 0n));
98
+ const allowancePromise = options.skipAllowance || cached?.allowanceSlotIndex !== undefined
99
+ ? Promise.resolve(cached?.allowanceSlotIndex)
100
+ : findSlotIndex((idx) => computeAllowanceSlot(probeOwner, probeSpender, idx), (_idx, slot) => client
101
+ .readContract({
102
+ abi: erc20Abi,
103
+ address: token,
104
+ functionName: "allowance",
105
+ args: [probeOwner, probeSpender],
106
+ stateOverride: [
107
+ {
108
+ address: token,
109
+ stateDiff: [{ slot, value: valueHex }],
110
+ },
111
+ ],
112
+ })
113
+ .catch(() => 0n));
114
+ const [balanceSlotIndex, allowanceSlotIndex] = await Promise.all([
115
+ balancePromise,
116
+ allowancePromise,
117
+ ]);
118
+ const hints = {
119
+ balanceSlotIndex,
120
+ allowanceSlotIndex,
121
+ };
122
+ slotHintsCache.set(cacheKey, hints);
123
+ return hints;
124
+ }
125
+ /**
126
+ * Convenience batch wrapper for `fetchErc20SlotHints` over many tokens.
127
+ * Caller-side parallelism is preserved (one `Promise.all` over the inputs);
128
+ * the per-token cache means repeats are free.
129
+ */
130
+ export async function fetchErc20SlotHintsBatch(client, tokens, options = {}) {
131
+ const result = {};
132
+ await Promise.all(tokens.map(async (rawToken) => {
133
+ const token = getAddress(rawToken);
134
+ result[token] = await fetchErc20SlotHints(client, token, options);
135
+ }));
136
+ return result;
137
+ }
138
+ /**
139
+ * Helper for callers who want to pre-seed the slot-hints cache from their own
140
+ * persistence layer (e.g. localStorage).
141
+ */
142
+ export function primeSlotHintsCache(chainId, hints) {
143
+ for (const [token, h] of Object.entries(hints)) {
144
+ slotHintsCache.set(probeAddress(chainId, token), h);
145
+ }
146
+ }
147
+ /** Helper used by deriveStateOverrides to look up a hint without re-probing. */
148
+ export function getCachedSlotHints(chainId, token) {
149
+ return slotHintsCache.get(probeAddress(chainId, token));
150
+ }
151
+ export { toHex };
152
+ //# sourceMappingURL=slotHints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotHints.js","sourceRoot":"","sources":["../../../../src/utils/stateOverrides/slotHints.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eulerxyz/euler-v2-sdk",
3
- "version": "0.2.7-beta",
3
+ "version": "0.2.9-beta",
4
4
  "description": "SDK for interacting with Euler V2 Lending Platform",
5
5
  "repository": {
6
6
  "type": "git",