@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.
- package/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/constants.js +17 -8
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.d.ts +2 -0
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +11 -0
- package/dist/cjs/swappers/NearIntentsSwapper/constants.d.ts +3 -0
- package/dist/cjs/swappers/NearIntentsSwapper/constants.js +6 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +165 -0
- package/dist/cjs/swappers/NearIntentsSwapper/index.d.ts +4 -0
- package/dist/cjs/swappers/NearIntentsSwapper/index.js +20 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +3 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +209 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +3 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +208 -0
- package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +6 -0
- package/dist/cjs/swappers/NearIntentsSwapper/types.js +32 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.d.ts +12 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +99 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/oneClickService.d.ts +3 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/oneClickService.js +16 -0
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +55 -12
- package/dist/cjs/swappers/RelaySwapper/constant.js +1 -0
- package/dist/cjs/swappers/RelaySwapper/utils/fetchRelayTrade.d.ts +1 -1
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +2 -2
- package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +45 -0
- package/dist/cjs/swappers/RelaySwapper/utils/notifyTransactionIndexing.d.ts +1 -1
- package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +0 -2
- package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +1 -0
- package/dist/cjs/swappers/RelaySwapper/utils/types.js +1 -0
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +3153 -3153
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +6 -6
- package/dist/cjs/swappers/ZrxSwapper/utils/helpers/helpers.js +1 -3
- package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +20 -17
- package/dist/cjs/types.d.ts +18 -1
- package/dist/cjs/types.js +1 -0
- package/dist/cjs/utils/tenderly/index.d.ts +3 -0
- package/dist/cjs/utils/tenderly/index.js +19 -0
- package/dist/cjs/utils/tenderly/simulate.d.ts +20 -0
- package/dist/cjs/utils/tenderly/simulate.js +109 -0
- package/dist/cjs/utils/tenderly/storageSlots.d.ts +8 -0
- package/dist/cjs/utils/tenderly/storageSlots.js +94 -0
- package/dist/cjs/utils/tenderly/types.d.ts +56 -0
- package/dist/cjs/utils/tenderly/types.js +2 -0
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +9 -0
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.d.ts +2 -0
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +8 -0
- package/dist/esm/swappers/NearIntentsSwapper/constants.d.ts +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/constants.js +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +162 -0
- package/dist/esm/swappers/NearIntentsSwapper/index.d.ts +4 -0
- package/dist/esm/swappers/NearIntentsSwapper/index.js +4 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +205 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +204 -0
- package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +6 -0
- package/dist/esm/swappers/NearIntentsSwapper/types.js +28 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.d.ts +12 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +91 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/oneClickService.d.ts +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/oneClickService.js +12 -0
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +59 -16
- package/dist/esm/swappers/RelaySwapper/constant.js +1 -0
- package/dist/esm/swappers/RelaySwapper/utils/fetchRelayTrade.d.ts +1 -1
- package/dist/esm/swappers/RelaySwapper/utils/getRelayPsbtRelayer.js +2 -2
- package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +47 -2
- package/dist/esm/swappers/RelaySwapper/utils/notifyTransactionIndexing.d.ts +1 -1
- package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +0 -2
- package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +1 -0
- package/dist/esm/swappers/RelaySwapper/utils/types.js +1 -0
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +3153 -3153
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +6 -6
- package/dist/esm/swappers/ZrxSwapper/utils/helpers/helpers.js +1 -3
- package/dist/esm/thorchain-utils/getL1RateOrQuote.js +20 -17
- package/dist/esm/types.d.ts +18 -1
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/tenderly/index.d.ts +3 -0
- package/dist/esm/utils/tenderly/index.js +3 -0
- package/dist/esm/utils/tenderly/simulate.d.ts +20 -0
- package/dist/esm/utils/tenderly/simulate.js +102 -0
- package/dist/esm/utils/tenderly/storageSlots.d.ts +8 -0
- package/dist/esm/utils/tenderly/storageSlots.js +86 -0
- package/dist/esm/utils/tenderly/types.d.ts +56 -0
- package/dist/esm/utils/tenderly/types.js +1 -0
- 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/
|
|
13
|
-
"BSC.BUSD-0XE9E7CEA3DEDCA5984780BAFC599BD69ADD087D56": "eip155:56/
|
|
14
|
-
"BSC.ETH-0X2170ED0880AC9A755FD29B2688956BD959F933F8": "eip155:56/
|
|
15
|
-
"BSC.TWT-0X4B0F1812E5DF2A09796481FF14017E6005508003": "eip155:56/
|
|
16
|
-
"BSC.USDC-0X8AC76A51CC950D9822D68B83FE1AD97B32CD580D": "eip155:56/
|
|
17
|
-
"BSC.USDT-0X55D398326F99059FF775485246999027B3197955": "eip155:56/
|
|
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:
|
|
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
|
|
67
|
-
return (0, monads_1.Err)(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
? (
|
|
72
|
-
|
|
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 = [
|
|
94
|
-
if (
|
|
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);
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -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,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
|
+
};
|