@shapeshiftoss/swapper 17.6.5 → 17.6.6-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +17 -8
  3. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.d.ts +2 -0
  4. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +11 -0
  5. package/dist/cjs/swappers/NearIntentsSwapper/constants.d.ts +3 -0
  6. package/dist/cjs/swappers/NearIntentsSwapper/constants.js +6 -0
  7. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.d.ts +2 -0
  8. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +165 -0
  9. package/dist/cjs/swappers/NearIntentsSwapper/index.d.ts +4 -0
  10. package/dist/cjs/swappers/NearIntentsSwapper/index.js +20 -0
  11. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  12. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +209 -0
  13. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +3 -0
  14. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +208 -0
  15. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +6 -0
  16. package/dist/cjs/swappers/NearIntentsSwapper/types.js +32 -0
  17. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.d.ts +12 -0
  18. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +99 -0
  19. package/dist/cjs/swappers/NearIntentsSwapper/utils/oneClickService.d.ts +3 -0
  20. package/dist/cjs/swappers/NearIntentsSwapper/utils/oneClickService.js +16 -0
  21. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +55 -12
  22. package/dist/cjs/swappers/RelaySwapper/constant.js +1 -0
  23. package/dist/cjs/swappers/RelaySwapper/utils/fetchRelayTrade.d.ts +1 -1
  24. package/dist/cjs/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +2 -2
  25. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +45 -0
  26. package/dist/cjs/swappers/RelaySwapper/utils/notifyTransactionIndexing.d.ts +1 -1
  27. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +0 -2
  28. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +1 -0
  29. package/dist/cjs/swappers/RelaySwapper/utils/types.js +1 -0
  30. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +3153 -3153
  31. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +6 -6
  32. package/dist/cjs/swappers/ZrxSwapper/utils/helpers/helpers.js +1 -3
  33. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +20 -17
  34. package/dist/cjs/types.d.ts +18 -1
  35. package/dist/cjs/types.js +1 -0
  36. package/dist/cjs/utils/tenderly/index.d.ts +3 -0
  37. package/dist/cjs/utils/tenderly/index.js +19 -0
  38. package/dist/cjs/utils/tenderly/simulate.d.ts +20 -0
  39. package/dist/cjs/utils/tenderly/simulate.js +109 -0
  40. package/dist/cjs/utils/tenderly/storageSlots.d.ts +8 -0
  41. package/dist/cjs/utils/tenderly/storageSlots.js +94 -0
  42. package/dist/cjs/utils/tenderly/types.d.ts +56 -0
  43. package/dist/cjs/utils/tenderly/types.js +2 -0
  44. package/dist/esm/.tsbuildinfo +1 -1
  45. package/dist/esm/constants.js +9 -0
  46. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.d.ts +2 -0
  47. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +8 -0
  48. package/dist/esm/swappers/NearIntentsSwapper/constants.d.ts +3 -0
  49. package/dist/esm/swappers/NearIntentsSwapper/constants.js +3 -0
  50. package/dist/esm/swappers/NearIntentsSwapper/endpoints.d.ts +2 -0
  51. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +162 -0
  52. package/dist/esm/swappers/NearIntentsSwapper/index.d.ts +4 -0
  53. package/dist/esm/swappers/NearIntentsSwapper/index.js +4 -0
  54. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  55. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +205 -0
  56. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +3 -0
  57. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +204 -0
  58. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +6 -0
  59. package/dist/esm/swappers/NearIntentsSwapper/types.js +28 -0
  60. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.d.ts +12 -0
  61. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +91 -0
  62. package/dist/esm/swappers/NearIntentsSwapper/utils/oneClickService.d.ts +3 -0
  63. package/dist/esm/swappers/NearIntentsSwapper/utils/oneClickService.js +12 -0
  64. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +59 -16
  65. package/dist/esm/swappers/RelaySwapper/constant.js +1 -0
  66. package/dist/esm/swappers/RelaySwapper/utils/fetchRelayTrade.d.ts +1 -1
  67. package/dist/esm/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +2 -2
  68. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +47 -2
  69. package/dist/esm/swappers/RelaySwapper/utils/notifyTransactionIndexing.d.ts +1 -1
  70. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +0 -2
  71. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +1 -0
  72. package/dist/esm/swappers/RelaySwapper/utils/types.js +1 -0
  73. package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +3153 -3153
  74. package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +6 -6
  75. package/dist/esm/swappers/ZrxSwapper/utils/helpers/helpers.js +1 -3
  76. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +20 -17
  77. package/dist/esm/types.d.ts +18 -1
  78. package/dist/esm/types.js +1 -0
  79. package/dist/esm/utils/tenderly/index.d.ts +3 -0
  80. package/dist/esm/utils/tenderly/index.js +3 -0
  81. package/dist/esm/utils/tenderly/simulate.d.ts +20 -0
  82. package/dist/esm/utils/tenderly/simulate.js +102 -0
  83. package/dist/esm/utils/tenderly/storageSlots.d.ts +8 -0
  84. package/dist/esm/utils/tenderly/storageSlots.js +86 -0
  85. package/dist/esm/utils/tenderly/types.d.ts +56 -0
  86. package/dist/esm/utils/tenderly/types.js +1 -0
  87. package/package.json +31 -5
@@ -9,12 +9,12 @@
9
9
  "BASE.VVV-0XACFE6019ED1A7DC6F7B508C02D1B04EC88CC21BF": "eip155:8453/erc20:0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf",
10
10
  "BCH.BCH": "bip122:000000000000000000651ef99cb9fcbe/slip44:145",
11
11
  "BSC.BNB": "eip155:56/slip44:60",
12
- "BSC.BTCB-0X7130D2A12B9BCBFAE4F2634D864A1EE1CE3EAD9C": "eip155:56/bep20:0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c",
13
- "BSC.BUSD-0XE9E7CEA3DEDCA5984780BAFC599BD69ADD087D56": "eip155:56/bep20:0xe9e7cea3dedca5984780bafc599bd69add087d56",
14
- "BSC.ETH-0X2170ED0880AC9A755FD29B2688956BD959F933F8": "eip155:56/bep20:0x2170ed0880ac9a755fd29b2688956bd959f933f8",
15
- "BSC.TWT-0X4B0F1812E5DF2A09796481FF14017E6005508003": "eip155:56/bep20:0x4b0f1812e5df2a09796481ff14017e6005508003",
16
- "BSC.USDC-0X8AC76A51CC950D9822D68B83FE1AD97B32CD580D": "eip155:56/bep20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d",
17
- "BSC.USDT-0X55D398326F99059FF775485246999027B3197955": "eip155:56/bep20:0x55d398326f99059ff775485246999027b3197955",
12
+ "BSC.BTCB-0X7130D2A12B9BCBFAE4F2634D864A1EE1CE3EAD9C": "eip155:56/erc20:0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c",
13
+ "BSC.BUSD-0XE9E7CEA3DEDCA5984780BAFC599BD69ADD087D56": "eip155:56/erc20:0xe9e7cea3dedca5984780bafc599bd69add087d56",
14
+ "BSC.ETH-0X2170ED0880AC9A755FD29B2688956BD959F933F8": "eip155:56/erc20:0x2170ed0880ac9a755fd29b2688956bd959f933f8",
15
+ "BSC.TWT-0X4B0F1812E5DF2A09796481FF14017E6005508003": "eip155:56/erc20:0x4b0f1812e5df2a09796481ff14017e6005508003",
16
+ "BSC.USDC-0X8AC76A51CC950D9822D68B83FE1AD97B32CD580D": "eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d",
17
+ "BSC.USDT-0X55D398326F99059FF775485246999027B3197955": "eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955",
18
18
  "BTC.BTC": "bip122:000000000019d6689c085ae165831e93/slip44:0",
19
19
  "DOGE.DOGE": "bip122:00000000001a91e3dace36e2be3bf030/slip44:3",
20
20
  "ETH.AAVE-0X7FC66500C84A76AD7E9C93437BFC5AC33E2DDAE9": "eip155:1/erc20:0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9",
@@ -22,9 +22,7 @@ const zrxTokenToAssetId = (token, chainId) => {
22
22
  if (!isDefaultAddress)
23
23
  return {
24
24
  assetReference: token,
25
- assetNamespace: chainId === types_1.KnownChainIds.BnbSmartChainMainnet
26
- ? caip_1.ASSET_NAMESPACE.bep20
27
- : caip_1.ASSET_NAMESPACE.erc20,
25
+ assetNamespace: caip_1.ASSET_NAMESPACE.erc20,
28
26
  };
29
27
  switch (chainId) {
30
28
  case types_1.KnownChainIds.EthereumMainnet:
@@ -59,21 +59,14 @@ const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType, swapp
59
59
  swapperName,
60
60
  };
61
61
  const maybeSwapQuote = await (0, getQuote_1.getQuote)({ ...baseQuoteArgs, streaming: false }, deps);
62
- if (maybeSwapQuote.isErr())
63
- return (0, monads_1.Err)(maybeSwapQuote.unwrapErr());
64
- const swapQuote = maybeSwapQuote.unwrap();
65
62
  const maybeStreamingSwapQuote = await (0, getQuote_1.getQuote)({ ...baseQuoteArgs, streaming: true, streamingInterval }, deps);
66
- if (maybeStreamingSwapQuote?.isErr())
67
- return (0, monads_1.Err)(maybeStreamingSwapQuote.unwrapErr());
68
- const streamingSwapQuote = maybeStreamingSwapQuote?.unwrap();
69
- // recommended_min_amount_in should be the same value for both types of swaps
70
- const recommendedMinimumCryptoBaseUnit = swapQuote.recommended_min_amount_in
71
- ? (0, utils_1.convertPrecision)({
72
- value: swapQuote.recommended_min_amount_in,
73
- inputExponent: sellAssetNativePrecision,
74
- outputExponent: sellAsset.precision,
75
- }).toFixed()
76
- : '0';
63
+ if (maybeSwapQuote.isErr() && maybeStreamingSwapQuote.isErr()) {
64
+ return (0, monads_1.Err)(maybeSwapQuote.unwrapErr());
65
+ }
66
+ const swapQuote = maybeSwapQuote.isOk() ? maybeSwapQuote.unwrap() : undefined;
67
+ const streamingSwapQuote = maybeStreamingSwapQuote.isOk()
68
+ ? maybeStreamingSwapQuote.unwrap()
69
+ : undefined;
77
70
  const getRouteValues = (quote, isStreaming) => {
78
71
  const source = (0, index_2.getSwapSource)(tradeType, isStreaming, swapperName);
79
72
  return {
@@ -90,10 +83,20 @@ const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType, swapp
90
83
  : undefined,
91
84
  };
92
85
  };
93
- const perRouteValues = [getRouteValues(swapQuote, false)];
94
- if (streamingSwapQuote) {
86
+ const perRouteValues = [];
87
+ if (swapQuote)
88
+ perRouteValues.push(getRouteValues(swapQuote, false));
89
+ if (streamingSwapQuote)
95
90
  perRouteValues.push(getRouteValues(streamingSwapQuote, true));
96
- }
91
+ const recommendedMinAmountIn = swapQuote?.recommended_min_amount_in ?? streamingSwapQuote?.recommended_min_amount_in;
92
+ // recommended_min_amount_in should be the same value for both types of swaps
93
+ const recommendedMinimumCryptoBaseUnit = recommendedMinAmountIn
94
+ ? (0, utils_1.convertPrecision)({
95
+ value: recommendedMinAmountIn,
96
+ inputExponent: sellAssetNativePrecision,
97
+ outputExponent: sellAsset.precision,
98
+ }).toFixed()
99
+ : '0';
97
100
  const getRouteBuyAmountBeforeFeesCryptoBaseUnit = (quote) => {
98
101
  const buyAmountBeforeFeesCryptoThorPrecision = (0, utils_1.bn)(quote.expected_amount_out).plus(quote.fees.total);
99
102
  return (0, utils_1.toBaseUnit)((0, utils_1.fromBaseUnit)(buyAmountBeforeFeesCryptoThorPrecision, buyAssetNativePrecision), buyAsset.precision);
@@ -41,6 +41,10 @@ export type SwapperConfig = {
41
41
  VITE_JUPITER_API_URL: string;
42
42
  VITE_RELAY_API_URL: string;
43
43
  VITE_BEBOP_API_KEY: string;
44
+ VITE_NEAR_INTENTS_API_KEY: string;
45
+ VITE_TENDERLY_API_KEY: string;
46
+ VITE_TENDERLY_ACCOUNT_SLUG: string;
47
+ VITE_TENDERLY_PROJECT_SLUG: string;
44
48
  };
45
49
  export declare enum SwapperName {
46
50
  Thorchain = "THORChain",
@@ -54,7 +58,8 @@ export declare enum SwapperName {
54
58
  Jupiter = "Jupiter",
55
59
  Relay = "Relay",
56
60
  ButterSwap = "ButterSwap",
57
- Bebop = "Bebop"
61
+ Bebop = "Bebop",
62
+ NearIntents = "NEAR Intents"
58
63
  }
59
64
  export type SwapSource = SwapperName | `${SwapperName} • ${string}`;
60
65
  export type SwapErrorRight = {
@@ -233,6 +238,12 @@ export type TradeQuoteStep = {
233
238
  chainflipChunkIntervalBlocks?: number;
234
239
  chainflipMaxBoostFee?: number;
235
240
  };
241
+ nearIntentsSpecific?: {
242
+ depositAddress: string;
243
+ depositMemo?: string;
244
+ timeEstimate: number;
245
+ deadline: string;
246
+ };
236
247
  thorchainSpecific?: {
237
248
  maxStreamingQuantity?: number;
238
249
  };
@@ -288,6 +299,12 @@ export type SwapExecutionMetadata = {
288
299
  };
289
300
  export type SwapperSpecificMetadata = {
290
301
  chainflipSwapId: number | undefined;
302
+ nearIntentsSpecific?: {
303
+ depositAddress: string;
304
+ depositMemo?: string;
305
+ timeEstimate: number;
306
+ deadline: string;
307
+ };
291
308
  relayTransactionMetadata: RelayTransactionMetadata | undefined;
292
309
  relayerExplorerTxLink: string | undefined;
293
310
  relayerTxHash: string | undefined;
package/dist/cjs/types.js CHANGED
@@ -15,6 +15,7 @@ var SwapperName;
15
15
  SwapperName["Relay"] = "Relay";
16
16
  SwapperName["ButterSwap"] = "ButterSwap";
17
17
  SwapperName["Bebop"] = "Bebop";
18
+ SwapperName["NearIntents"] = "NEAR Intents";
18
19
  })(SwapperName || (exports.SwapperName = SwapperName = {}));
19
20
  var TradeQuoteError;
20
21
  (function (TradeQuoteError) {
@@ -0,0 +1,3 @@
1
+ export * from './simulate';
2
+ export * from './storageSlots';
3
+ export * from './types';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./simulate"), exports);
18
+ __exportStar(require("./storageSlots"), exports);
19
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,20 @@
1
+ import type { ChainId } from '@shapeshiftoss/caip';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ import type { Address, Hex } from 'viem';
4
+ import type { TenderlyConfig } from './types';
5
+ export type SimulationResult = {
6
+ success: boolean;
7
+ gasUsed: bigint;
8
+ gasLimit: bigint;
9
+ errorMessage?: string;
10
+ };
11
+ export type SimulateTransactionParams = {
12
+ chainId: ChainId;
13
+ from: Address;
14
+ to: Address;
15
+ data: Hex;
16
+ value?: string | bigint;
17
+ sellAsset: Asset;
18
+ spenderAddress?: Address;
19
+ };
20
+ export declare const simulateWithStateOverrides: (params: SimulateTransactionParams, config: TenderlyConfig) => Promise<SimulationResult>;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.simulateWithStateOverrides = void 0;
7
+ const caip_1 = require("@shapeshiftoss/caip");
8
+ const utils_1 = require("@shapeshiftoss/utils");
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const viem_1 = require("viem");
11
+ const helpers_1 = require("../../swappers/utils/helpers/helpers");
12
+ const storageSlots_1 = require("./storageSlots");
13
+ const simulateWithStateOverrides = async (params, config) => {
14
+ const { chainId, from, to, data, value, sellAsset, spenderAddress } = params;
15
+ try {
16
+ if (!(0, viem_1.isAddress)(from))
17
+ throw new Error(`Invalid from address: ${from}`);
18
+ if (!(0, viem_1.isAddress)(to))
19
+ throw new Error(`Invalid to address: ${to}`);
20
+ const evmNetworkId = Number((0, caip_1.fromChainId)(chainId).chainReference);
21
+ const spender = spenderAddress ?? to;
22
+ const stateOverrides = buildStateOverrides({
23
+ from,
24
+ spender,
25
+ sellAsset,
26
+ });
27
+ const request = {
28
+ network_id: evmNetworkId.toString(),
29
+ from: from.toLowerCase(),
30
+ to: to.toLowerCase(),
31
+ input: data,
32
+ value: value ? (0, viem_1.toHex)(BigInt(value)) : '0x0',
33
+ save: false,
34
+ state_objects: stateOverrides,
35
+ };
36
+ const url = `https://api.tenderly.co/api/v1/account/${config.accountSlug}/project/${config.projectSlug}/simulate`;
37
+ const response = await axios_1.default.post(url, request, {
38
+ headers: {
39
+ 'Content-Type': 'application/json',
40
+ 'X-Access-Key': config.apiKey,
41
+ },
42
+ timeout: 10000,
43
+ });
44
+ if ('error' in response.data) {
45
+ const error = response.data.error;
46
+ return {
47
+ success: false,
48
+ gasUsed: 0n,
49
+ gasLimit: 0n,
50
+ errorMessage: `Tenderly API error: ${error.message}`,
51
+ };
52
+ }
53
+ const { transaction } = response.data;
54
+ const gasUsed = BigInt(transaction.gas_used);
55
+ return {
56
+ success: transaction.status,
57
+ gasUsed,
58
+ gasLimit: gasUsed,
59
+ errorMessage: transaction.error_message,
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ success: false,
65
+ gasUsed: 0n,
66
+ gasLimit: 0n,
67
+ errorMessage: error instanceof Error ? error.message : 'Unknown simulation error',
68
+ };
69
+ }
70
+ };
71
+ exports.simulateWithStateOverrides = simulateWithStateOverrides;
72
+ const buildStateOverrides = (params) => {
73
+ const { from, spender, sellAsset } = params;
74
+ // Large native balance for gas (1B is overkill but guarantees success on all chains)
75
+ const nativeBalanceOverride = (0, viem_1.toHex)((0, viem_1.parseEther)('1000000000'));
76
+ const isNative = (0, helpers_1.isNativeEvmAsset)(sellAsset.assetId);
77
+ return isNative
78
+ ? {
79
+ [from.toLowerCase()]: {
80
+ balance: nativeBalanceOverride,
81
+ },
82
+ }
83
+ : (() => {
84
+ const contractAddress = (0, utils_1.contractAddressOrUndefined)(sellAsset.assetId);
85
+ if (!contractAddress) {
86
+ return {
87
+ [from.toLowerCase()]: {
88
+ balance: nativeBalanceOverride,
89
+ },
90
+ };
91
+ }
92
+ const balanceSlot = (0, storageSlots_1.getTokenBalanceSlot)(contractAddress);
93
+ const balanceStorageSlot = (0, storageSlots_1.getBalanceStorageSlot)(from, balanceSlot);
94
+ const maxBalance = (0, storageSlots_1.getMaxBalanceValue)(contractAddress);
95
+ const allowanceSlot = (0, storageSlots_1.getTokenAllowanceSlot)(contractAddress);
96
+ const allowanceStorageSlot = (0, storageSlots_1.getAllowanceStorageSlot)(from, spender, allowanceSlot);
97
+ return {
98
+ [from.toLowerCase()]: {
99
+ balance: nativeBalanceOverride,
100
+ },
101
+ [contractAddress.toLowerCase()]: {
102
+ storage: {
103
+ [balanceStorageSlot]: maxBalance,
104
+ [allowanceStorageSlot]: (0, viem_1.toHex)(viem_1.maxUint256),
105
+ },
106
+ },
107
+ };
108
+ })();
109
+ };
@@ -0,0 +1,8 @@
1
+ import type { Address, Hex } from 'viem';
2
+ export declare const getBalanceStorageSlot: (userAddress: Address, balanceSlotNumber?: number) => Hex;
3
+ export declare const getAllowanceStorageSlot: (ownerAddress: Address, spenderAddress: Address, allowanceSlotNumber?: number) => Hex;
4
+ export declare const KNOWN_BALANCE_SLOTS: Record<string, number>;
5
+ export declare const KNOWN_ALLOWANCE_SLOTS: Record<string, number>;
6
+ export declare const getTokenBalanceSlot: (tokenAddress: Address) => number;
7
+ export declare const getTokenAllowanceSlot: (tokenAddress: Address) => number;
8
+ export declare const getMaxBalanceValue: (tokenAddress: Address) => Hex;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMaxBalanceValue = exports.getTokenAllowanceSlot = exports.getTokenBalanceSlot = exports.KNOWN_ALLOWANCE_SLOTS = exports.KNOWN_BALANCE_SLOTS = exports.getAllowanceStorageSlot = exports.getBalanceStorageSlot = void 0;
4
+ const viem_1 = require("viem");
5
+ // keccak256(concat(pad(address), pad(slot)))
6
+ const getBalanceStorageSlot = (userAddress, balanceSlotNumber = 0) => {
7
+ const paddedAddress = (0, viem_1.pad)(userAddress.toLowerCase(), { size: 32 });
8
+ const paddedSlot = (0, viem_1.pad)((0, viem_1.toHex)(balanceSlotNumber), { size: 32 });
9
+ return (0, viem_1.keccak256)((0, viem_1.concat)([paddedAddress, paddedSlot]));
10
+ };
11
+ exports.getBalanceStorageSlot = getBalanceStorageSlot;
12
+ // keccak256(spender, keccak256(owner, slot))
13
+ const getAllowanceStorageSlot = (ownerAddress, spenderAddress, allowanceSlotNumber = 1) => {
14
+ const paddedOwner = (0, viem_1.pad)(ownerAddress.toLowerCase(), { size: 32 });
15
+ const paddedAllowanceSlot = (0, viem_1.pad)((0, viem_1.toHex)(allowanceSlotNumber), { size: 32 });
16
+ const innerSlot = (0, viem_1.keccak256)((0, viem_1.concat)([paddedOwner, paddedAllowanceSlot]));
17
+ const paddedSpender = (0, viem_1.pad)(spenderAddress.toLowerCase(), { size: 32 });
18
+ return (0, viem_1.keccak256)((0, viem_1.concat)([paddedSpender, innerSlot]));
19
+ };
20
+ exports.getAllowanceStorageSlot = getAllowanceStorageSlot;
21
+ // Most ERC20s: balance at slot 0, allowance at slot 1
22
+ // Slot 51/52 pattern (StandardArbERC20, some L2 implementations)
23
+ // Slot 5/6 pattern (Wormhole bridge)
24
+ // USDT (native Tether - Ethereum): balance at slot 2, allowance at slot 5
25
+ // USDT (BEP20 - BSC): balance at slot 1, allowance at slot 2
26
+ // USDT (xDai bridge - Gnosis): balance at slot 3, allowance at slot 4
27
+ // USDC (Circle native): balance at slot 9, allowance at slot 10
28
+ // USDC (BEP20 - BSC): balance at slot 1, allowance at slot 2
29
+ exports.KNOWN_BALANCE_SLOTS = {
30
+ // USDT - Native Tether deployment (custom slot 2)
31
+ '0xdac17f958d2ee523a2206206994597c13d831ec7': 2,
32
+ // Slot 51 pattern (L2GatewayToken + ERC20Upgradeable + storage gaps)
33
+ // Various L2 tokens use this pattern with different implementations
34
+ '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9': 51,
35
+ '0x912ce59144191c1204e64559fe8253a0e49e6548': 51,
36
+ '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7': 51,
37
+ '0x01bff41798a0bcf287b996046ca68b395dbc1071': 51,
38
+ // Wormhole bridge pattern (slot 5)
39
+ '0xca7dec8550f43a5e46e3dfb95801f64280e75b27': 5,
40
+ // USDT - BEP20 pattern (slot 1 - Binance-Peg token)
41
+ '0x55d398326f99059ff775485246999027b3197955': 1,
42
+ // USDT - xDai bridge pattern (slot 3)
43
+ '0x4ecaba5870353805a9f068101a40e0f32ed605c6': 3,
44
+ // USDT - Standard ERC20 deployments (slot 0)
45
+ // Polygon confirmed, Optimism bridged USDT (0x94b008aa...) also uses slot 0
46
+ // USDC (Circle native deployments - all use slot 9)
47
+ '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48': 9,
48
+ '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e': 9,
49
+ '0x0b2c639c533813f4aa9d7837caf62653d097ff85': 9,
50
+ '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359': 9,
51
+ '0xaf88d065e77c8cc2239327c5edb3a432268e5831': 9,
52
+ '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': 9,
53
+ // USDC (BEP20 pattern on BSC - slot 1)
54
+ '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d': 1, // USDC BSC (BEP20)
55
+ };
56
+ exports.KNOWN_ALLOWANCE_SLOTS = {
57
+ // USDT allowance slots (explicit mapping for all non-standard implementations)
58
+ '0xdac17f958d2ee523a2206206994597c13d831ec7': 5,
59
+ '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9': 52,
60
+ '0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7': 52,
61
+ '0x01bff41798a0bcf287b996046ca68b395dbc1071': 52,
62
+ '0x55d398326f99059ff775485246999027b3197955': 2,
63
+ '0x4ecaba5870353805a9f068101a40e0f32ed605c6': 4,
64
+ // Note: Polygon and Optimism standard bridged USDT (0x94b008aa...) use slot 1 (fallback)
65
+ // Note: SWEAT (slot 5) allowance auto-inferred to slot 6 via Wormhole pattern
66
+ // USDC allowance slots (BSC uses BEP20 pattern, not Circle FiatToken)
67
+ '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d': 2, // USDC BSC (BEP20)
68
+ // Note: All other USDC (Circle native) use slot 10 (handled by USDC pattern check)
69
+ };
70
+ const getTokenBalanceSlot = (tokenAddress) => exports.KNOWN_BALANCE_SLOTS[tokenAddress.toLowerCase()] ?? 0;
71
+ exports.getTokenBalanceSlot = getTokenBalanceSlot;
72
+ const getTokenAllowanceSlot = (tokenAddress) => {
73
+ // Check explicit allowance mapping first
74
+ const explicitSlot = exports.KNOWN_ALLOWANCE_SLOTS[tokenAddress.toLowerCase()];
75
+ if (explicitSlot !== undefined)
76
+ return explicitSlot;
77
+ // Infer allowance slot from balance slot for known patterns
78
+ const balanceSlot = (0, exports.getTokenBalanceSlot)(tokenAddress);
79
+ if (balanceSlot === 9)
80
+ return 10; // USDC pattern
81
+ if (balanceSlot === 51)
82
+ return 52; // StandardArbERC20 pattern
83
+ if (balanceSlot === 5)
84
+ return 6; // Wormhole pattern
85
+ // Standard ERC20: allowance at slot 1
86
+ return 1;
87
+ };
88
+ exports.getTokenAllowanceSlot = getTokenAllowanceSlot;
89
+ // USDC slot 9: bit 255 is blacklist flag, must keep cleared
90
+ const getMaxBalanceValue = (tokenAddress) => {
91
+ const slot = (0, exports.getTokenBalanceSlot)(tokenAddress);
92
+ return slot === 9 ? (0, viem_1.toHex)(viem_1.maxUint256 >> 1n) : (0, viem_1.toHex)(viem_1.maxUint256);
93
+ };
94
+ exports.getMaxBalanceValue = getMaxBalanceValue;
@@ -0,0 +1,56 @@
1
+ import type { Address, Hex } from 'viem';
2
+ export type TenderlyStateOverrides = {
3
+ [address: Address]: {
4
+ balance?: Hex;
5
+ storage?: {
6
+ [slot: Hex]: Hex;
7
+ };
8
+ };
9
+ };
10
+ export type TenderlySimulationRequest = {
11
+ network_id: string;
12
+ from: Address;
13
+ to: Address;
14
+ input: Hex;
15
+ value?: Hex;
16
+ gas?: number;
17
+ gas_price?: string;
18
+ max_fee_per_gas?: string;
19
+ max_priority_fee_per_gas?: string;
20
+ save?: boolean;
21
+ state_objects?: TenderlyStateOverrides;
22
+ };
23
+ export type TenderlySimulationResponse = {
24
+ transaction: {
25
+ hash: string;
26
+ status: boolean;
27
+ error_message?: string;
28
+ gas_used: number;
29
+ gas: number;
30
+ gas_price: string;
31
+ value: string;
32
+ call_trace?: unknown[];
33
+ asset_changes?: unknown[];
34
+ };
35
+ simulation: {
36
+ id: string;
37
+ network_id: string;
38
+ block_number: number;
39
+ block_hash: string;
40
+ timestamp: string;
41
+ gas_used: number;
42
+ status: boolean;
43
+ };
44
+ };
45
+ export type TenderlyErrorResponse = {
46
+ error: {
47
+ id: string;
48
+ slug: string;
49
+ message: string;
50
+ };
51
+ };
52
+ export type TenderlyConfig = {
53
+ apiKey: string;
54
+ accountSlug: string;
55
+ projectSlug: string;
56
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });