@shapeshiftoss/swapper 17.6.7 → 17.6.8
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 +42 -24
- package/dist/cjs/cowswap-utils/constants.js +1 -0
- package/dist/cjs/cowswap-utils/index.js +2 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/swappers/AvnuSwapper/AvnuSwapper.d.ts +2 -0
- package/dist/cjs/swappers/AvnuSwapper/AvnuSwapper.js +7 -0
- package/dist/cjs/swappers/AvnuSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/AvnuSwapper/endpoints.js +181 -0
- package/dist/cjs/swappers/AvnuSwapper/index.d.ts +1 -0
- package/dist/cjs/swappers/AvnuSwapper/index.js +5 -0
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.d.ts +3 -0
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +142 -0
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.d.ts +3 -0
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +120 -0
- package/dist/cjs/swappers/AvnuSwapper/types.d.ts +2 -0
- package/dist/cjs/swappers/AvnuSwapper/types.js +2 -0
- package/dist/cjs/swappers/AvnuSwapper/utils/constants.d.ts +5 -0
- package/dist/cjs/swappers/AvnuSwapper/utils/constants.js +11 -0
- package/dist/cjs/swappers/AvnuSwapper/utils/helpers.d.ts +7 -0
- package/dist/cjs/swappers/AvnuSwapper/utils/helpers.js +21 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
- package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -0
- package/dist/cjs/swappers/CetusSwapper/endpoints.js +33 -27
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeData.d.ts +24 -0
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeData.js +79 -0
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +44 -69
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +49 -65
- package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +1 -0
- package/dist/cjs/swappers/CetusSwapper/utils/constants.js +2 -1
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +6 -11
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +41 -96
- package/dist/cjs/swappers/JupiterSwapper/utils/helpers.d.ts +0 -2
- package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +1 -0
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +68 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +30 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +53 -5
- package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +1 -1
- package/dist/cjs/swappers/NearIntentsSwapper/types.js +8 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +28 -8
- package/dist/cjs/swappers/PortalsSwapper/constants.js +1 -1
- package/dist/cjs/swappers/PortalsSwapper/endpoints.js +92 -1
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +29 -17
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +21 -17
- package/dist/cjs/swappers/PortalsSwapper/types.js +1 -0
- package/dist/cjs/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.d.ts +9 -0
- package/dist/cjs/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.js +52 -0
- package/dist/cjs/swappers/PortalsSwapper/utils/fetchPortalsTradeOrder.d.ts +1 -0
- package/dist/cjs/swappers/PortalsSwapper/utils/fetchSquidStatus.d.ts +9 -0
- package/dist/cjs/swappers/PortalsSwapper/utils/fetchSquidStatus.js +57 -0
- package/dist/cjs/swappers/RelaySwapper/constant.js +3 -0
- package/dist/cjs/swappers/RelaySwapper/utils/fetchRelayTrade.js +1 -1
- package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +16 -1
- package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +20 -0
- package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +13 -4
- package/dist/cjs/swappers/RelaySwapper/utils/types.js +5 -1
- package/dist/cjs/swappers/SunioSwapper/SunioSwapper.d.ts +2 -0
- package/dist/cjs/swappers/SunioSwapper/SunioSwapper.js +7 -0
- package/dist/cjs/swappers/SunioSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/SunioSwapper/endpoints.js +131 -0
- package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.d.ts +3 -0
- package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +8 -0
- package/dist/cjs/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.d.ts +3 -0
- package/dist/cjs/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +8 -0
- package/dist/cjs/swappers/SunioSwapper/index.d.ts +4 -0
- package/dist/cjs/swappers/SunioSwapper/index.js +23 -0
- package/dist/cjs/swappers/SunioSwapper/types.d.ts +22 -0
- package/dist/cjs/swappers/SunioSwapper/types.js +12 -0
- package/dist/cjs/swappers/SunioSwapper/utils/abi.d.ts +48 -0
- package/dist/cjs/swappers/SunioSwapper/utils/abi.js +28 -0
- package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +14 -0
- package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +32 -0
- package/dist/cjs/swappers/SunioSwapper/utils/buildSwapTransaction.d.ts +11 -0
- package/dist/cjs/swappers/SunioSwapper/utils/buildSwapTransaction.js +57 -0
- package/dist/cjs/swappers/SunioSwapper/utils/constants.d.ts +6 -0
- package/dist/cjs/swappers/SunioSwapper/utils/constants.js +16 -0
- package/dist/cjs/swappers/SunioSwapper/utils/fetchFromSunio.d.ts +11 -0
- package/dist/cjs/swappers/SunioSwapper/utils/fetchFromSunio.js +45 -0
- package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.d.ts +4 -0
- package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +203 -0
- package/dist/cjs/swappers/SunioSwapper/utils/helpers/helpers.d.ts +4 -0
- package/dist/cjs/swappers/SunioSwapper/utils/helpers/helpers.js +22 -0
- package/dist/cjs/swappers/SunioSwapper/utils/sunioService.d.ts +6 -0
- package/dist/cjs/swappers/SunioSwapper/utils/sunioService.js +18 -0
- package/dist/cjs/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
- package/dist/cjs/swappers/ThorchainSwapper/endpoints.js +2 -0
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +2 -2
- package/dist/cjs/swappers/utils/helpers/helpers.js +7 -0
- package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +80 -3
- package/dist/cjs/thorchain-utils/index.d.ts +1 -0
- package/dist/cjs/thorchain-utils/index.js +2 -1
- package/dist/cjs/thorchain-utils/tron/getThorTxData.d.ts +12 -0
- package/dist/cjs/thorchain-utils/tron/getThorTxData.js +14 -0
- package/dist/cjs/thorchain-utils/tron/getTronTransactionFees.d.ts +2 -0
- package/dist/cjs/thorchain-utils/tron/getTronTransactionFees.js +65 -0
- package/dist/cjs/thorchain-utils/tron/getUnsignedTronTransaction.d.ts +3 -0
- package/dist/cjs/thorchain-utils/tron/getUnsignedTronTransaction.js +35 -0
- package/dist/cjs/thorchain-utils/tron/index.d.ts +3 -0
- package/dist/cjs/thorchain-utils/tron/index.js +19 -0
- package/dist/cjs/types.d.ts +74 -9
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils/tenderly/simulate.d.ts +6 -1
- package/dist/cjs/utils/tenderly/simulate.js +22 -2
- package/dist/cjs/utils/tenderly/types.d.ts +21 -0
- package/dist/cjs/utils.d.ts +9 -3
- package/dist/cjs/utils.js +53 -1
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +18 -0
- package/dist/esm/cowswap-utils/constants.js +1 -0
- package/dist/esm/cowswap-utils/index.js +2 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/swappers/AvnuSwapper/AvnuSwapper.d.ts +2 -0
- package/dist/esm/swappers/AvnuSwapper/AvnuSwapper.js +4 -0
- package/dist/esm/swappers/AvnuSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/AvnuSwapper/endpoints.js +178 -0
- package/dist/esm/swappers/AvnuSwapper/index.d.ts +1 -0
- package/dist/esm/swappers/AvnuSwapper/index.js +1 -0
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.d.ts +3 -0
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +138 -0
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.d.ts +3 -0
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +116 -0
- package/dist/esm/swappers/AvnuSwapper/types.d.ts +2 -0
- package/dist/esm/swappers/AvnuSwapper/types.js +1 -0
- package/dist/esm/swappers/AvnuSwapper/utils/constants.d.ts +5 -0
- package/dist/esm/swappers/AvnuSwapper/utils/constants.js +7 -0
- package/dist/esm/swappers/AvnuSwapper/utils/helpers.d.ts +7 -0
- package/dist/esm/swappers/AvnuSwapper/utils/helpers.js +17 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
- package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -0
- package/dist/esm/swappers/CetusSwapper/endpoints.js +28 -22
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeData.d.ts +24 -0
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeData.js +75 -0
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +44 -69
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +50 -66
- package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +1 -0
- package/dist/esm/swappers/CetusSwapper/utils/constants.js +1 -0
- package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +6 -11
- package/dist/esm/swappers/CetusSwapper/utils/helpers.js +37 -67
- package/dist/esm/swappers/JupiterSwapper/utils/helpers.d.ts +0 -2
- package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +1 -0
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +3 -1
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +68 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +30 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +54 -6
- package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +1 -1
- package/dist/esm/swappers/NearIntentsSwapper/types.js +8 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +29 -9
- package/dist/esm/swappers/PortalsSwapper/constants.js +1 -1
- package/dist/esm/swappers/PortalsSwapper/endpoints.js +92 -1
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +30 -18
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +21 -17
- package/dist/esm/swappers/PortalsSwapper/types.js +1 -0
- package/dist/esm/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.d.ts +9 -0
- package/dist/esm/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.js +47 -0
- package/dist/esm/swappers/PortalsSwapper/utils/fetchPortalsTradeOrder.d.ts +1 -0
- package/dist/esm/swappers/PortalsSwapper/utils/fetchSquidStatus.d.ts +9 -0
- package/dist/esm/swappers/PortalsSwapper/utils/fetchSquidStatus.js +52 -0
- package/dist/esm/swappers/RelaySwapper/constant.js +5 -2
- package/dist/esm/swappers/RelaySwapper/utils/fetchRelayTrade.js +1 -1
- package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +18 -3
- package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +20 -0
- package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +13 -4
- package/dist/esm/swappers/RelaySwapper/utils/types.js +3 -0
- package/dist/esm/swappers/SunioSwapper/SunioSwapper.d.ts +2 -0
- package/dist/esm/swappers/SunioSwapper/SunioSwapper.js +4 -0
- package/dist/esm/swappers/SunioSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/SunioSwapper/endpoints.js +128 -0
- package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.d.ts +3 -0
- package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +4 -0
- package/dist/esm/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.d.ts +3 -0
- package/dist/esm/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +4 -0
- package/dist/esm/swappers/SunioSwapper/index.d.ts +4 -0
- package/dist/esm/swappers/SunioSwapper/index.js +4 -0
- package/dist/esm/swappers/SunioSwapper/types.d.ts +22 -0
- package/dist/esm/swappers/SunioSwapper/types.js +9 -0
- package/dist/esm/swappers/SunioSwapper/utils/abi.d.ts +48 -0
- package/dist/esm/swappers/SunioSwapper/utils/abi.js +25 -0
- package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +14 -0
- package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +28 -0
- package/dist/esm/swappers/SunioSwapper/utils/buildSwapTransaction.d.ts +11 -0
- package/dist/esm/swappers/SunioSwapper/utils/buildSwapTransaction.js +53 -0
- package/dist/esm/swappers/SunioSwapper/utils/constants.d.ts +6 -0
- package/dist/esm/swappers/SunioSwapper/utils/constants.js +13 -0
- package/dist/esm/swappers/SunioSwapper/utils/fetchFromSunio.d.ts +11 -0
- package/dist/esm/swappers/SunioSwapper/utils/fetchFromSunio.js +41 -0
- package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.d.ts +4 -0
- package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +199 -0
- package/dist/esm/swappers/SunioSwapper/utils/helpers/helpers.d.ts +4 -0
- package/dist/esm/swappers/SunioSwapper/utils/helpers/helpers.js +16 -0
- package/dist/esm/swappers/SunioSwapper/utils/sunioService.d.ts +6 -0
- package/dist/esm/swappers/SunioSwapper/utils/sunioService.js +14 -0
- package/dist/esm/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
- package/dist/esm/swappers/ThorchainSwapper/endpoints.js +3 -1
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +2 -2
- package/dist/esm/swappers/utils/helpers/helpers.js +9 -2
- package/dist/esm/thorchain-utils/getL1RateOrQuote.js +81 -4
- package/dist/esm/thorchain-utils/index.d.ts +1 -0
- package/dist/esm/thorchain-utils/index.js +1 -0
- package/dist/esm/thorchain-utils/tron/getThorTxData.d.ts +12 -0
- package/dist/esm/thorchain-utils/tron/getThorTxData.js +10 -0
- package/dist/esm/thorchain-utils/tron/getTronTransactionFees.d.ts +2 -0
- package/dist/esm/thorchain-utils/tron/getTronTransactionFees.js +61 -0
- package/dist/esm/thorchain-utils/tron/getUnsignedTronTransaction.d.ts +3 -0
- package/dist/esm/thorchain-utils/tron/getUnsignedTronTransaction.js +31 -0
- package/dist/esm/thorchain-utils/tron/index.d.ts +3 -0
- package/dist/esm/thorchain-utils/tron/index.js +3 -0
- package/dist/esm/types.d.ts +74 -9
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/tenderly/simulate.d.ts +6 -1
- package/dist/esm/utils/tenderly/simulate.js +20 -1
- package/dist/esm/utils/tenderly/types.d.ts +21 -0
- package/dist/esm/utils.d.ts +9 -3
- package/dist/esm/utils.js +50 -1
- package/package.json +9 -8
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { TronWeb } from 'tronweb';
|
|
2
|
+
import { SUNIO_SMART_ROUTER_CONTRACT } from './constants.js';
|
|
3
|
+
const convertAddressesToEvmFormat = (value) => {
|
|
4
|
+
if (Array.isArray(value)) {
|
|
5
|
+
return value.map(v => convertAddressesToEvmFormat(v));
|
|
6
|
+
}
|
|
7
|
+
if (typeof value === 'string' && value.startsWith('T') && TronWeb.isAddress(value)) {
|
|
8
|
+
const hex = TronWeb.address.toHex(value);
|
|
9
|
+
return hex.replace(/^41/, '0x');
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
export const buildSunioSwapTransaction = async (args) => {
|
|
14
|
+
const { route, from, to, sellAmountCryptoBaseUnit, minBuyAmountCryptoBaseUnit, rpcUrl, deadline, } = args;
|
|
15
|
+
const tronWeb = new TronWeb({
|
|
16
|
+
fullHost: rpcUrl,
|
|
17
|
+
});
|
|
18
|
+
const path = route.tokens;
|
|
19
|
+
const poolVersion = route.poolVersions;
|
|
20
|
+
const versionLen = Array(poolVersion.length).fill(2);
|
|
21
|
+
const fees = route.poolFees.map(fee => Number(fee));
|
|
22
|
+
const swapData = {
|
|
23
|
+
amountIn: sellAmountCryptoBaseUnit,
|
|
24
|
+
amountOutMin: minBuyAmountCryptoBaseUnit,
|
|
25
|
+
recipient: to,
|
|
26
|
+
deadline: deadline ?? Math.floor(Date.now() / 1000) + 60 * 20,
|
|
27
|
+
};
|
|
28
|
+
const parameters = [
|
|
29
|
+
{ type: 'address[]', value: path },
|
|
30
|
+
{ type: 'string[]', value: poolVersion },
|
|
31
|
+
{ type: 'uint256[]', value: versionLen },
|
|
32
|
+
{ type: 'uint24[]', value: fees },
|
|
33
|
+
{
|
|
34
|
+
type: 'tuple(uint256,uint256,address,uint256)',
|
|
35
|
+
value: convertAddressesToEvmFormat([
|
|
36
|
+
swapData.amountIn,
|
|
37
|
+
swapData.amountOutMin,
|
|
38
|
+
swapData.recipient,
|
|
39
|
+
swapData.deadline,
|
|
40
|
+
]),
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
const functionSelector = 'swapExactInput(address[],string[],uint256[],uint24[],(uint256,uint256,address,uint256))';
|
|
44
|
+
const options = {
|
|
45
|
+
feeLimit: 100_000_000,
|
|
46
|
+
callValue: 0,
|
|
47
|
+
};
|
|
48
|
+
const txData = await tronWeb.transactionBuilder.triggerSmartContract(SUNIO_SMART_ROUTER_CONTRACT, functionSelector, options, parameters, from);
|
|
49
|
+
if (!txData.result || !txData.result.result) {
|
|
50
|
+
throw new Error('[Sun.io] Failed to build swap transaction');
|
|
51
|
+
}
|
|
52
|
+
return txData.transaction;
|
|
53
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const SUNIO_SUPPORTED_CHAIN_IDS: readonly [import("@shapeshiftoss/caip").ChainId];
|
|
2
|
+
export declare const SUNIO_API_BASE_URL = "https://rot.endjgfsv.link";
|
|
3
|
+
export declare const SUNIO_SMART_ROUTER_CONTRACT: "TCFNp179Lg46D16zKoumd4Poa2WFFdtqYj";
|
|
4
|
+
export declare const DEFAULT_SLIPPAGE_PERCENTAGE = "0.005";
|
|
5
|
+
export declare const SUNIO_DEX_TYPES: "PSM,CURVE,CURVE_COMBINATION,WTRX,SUNSWAP_V1,SUNSWAP_V2,SUNSWAP_V3";
|
|
6
|
+
export declare const SUNIO_TRON_NATIVE_ADDRESS: "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { tronChainId } from '@shapeshiftoss/caip';
|
|
2
|
+
export const SUNIO_SUPPORTED_CHAIN_IDS = [tronChainId];
|
|
3
|
+
// NOTE: This domain looks suspicious, but it's the official Sun.io backend API
|
|
4
|
+
// Verified by inspecting XHR requests from sun.io's own frontend application
|
|
5
|
+
// The sun.io frontend makes requests to this endpoint with origin: https://sun.io
|
|
6
|
+
export const SUNIO_API_BASE_URL = 'https://rot.endjgfsv.link';
|
|
7
|
+
// Smart Exchange Router - aggregates liquidity across V1, V2, V3, PSM, and SunCurve
|
|
8
|
+
// This is the current mainnet router that sun.io's frontend uses
|
|
9
|
+
export const SUNIO_SMART_ROUTER_CONTRACT = 'TCFNp179Lg46D16zKoumd4Poa2WFFdtqYj';
|
|
10
|
+
export const DEFAULT_SLIPPAGE_PERCENTAGE = '0.005';
|
|
11
|
+
export const SUNIO_DEX_TYPES = 'PSM,CURVE,CURVE_COMBINATION,WTRX,SUNSWAP_V1,SUNSWAP_V2,SUNSWAP_V3';
|
|
12
|
+
// Native TRX token address (used when assetId is not a TRC-20 token)
|
|
13
|
+
export const SUNIO_TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AssetId } from '@shapeshiftoss/caip';
|
|
2
|
+
import type { Result } from '@sniptt/monads';
|
|
3
|
+
import type { SwapErrorRight } from '../../../types.js';
|
|
4
|
+
import type { SunioQuoteResponse } from '../types.js';
|
|
5
|
+
import type { SunioService } from './sunioService.js';
|
|
6
|
+
export type FetchSunioQuoteParams = {
|
|
7
|
+
sellAssetId: AssetId;
|
|
8
|
+
buyAssetId: AssetId;
|
|
9
|
+
sellAmountCryptoBaseUnit: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const fetchSunioQuote: (params: FetchSunioQuoteParams, service: SunioService) => Promise<Result<SunioQuoteResponse, SwapErrorRight>>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
2
|
+
import { TradeQuoteError } from '../../../types.js';
|
|
3
|
+
import { makeSwapErrorRight } from '../../../utils.js';
|
|
4
|
+
import { SUNIO_API_BASE_URL, SUNIO_DEX_TYPES } from './constants.js';
|
|
5
|
+
import { assetIdToTronToken } from './helpers/helpers.js';
|
|
6
|
+
export const fetchSunioQuote = async (params, service) => {
|
|
7
|
+
try {
|
|
8
|
+
const { sellAssetId, buyAssetId, sellAmountCryptoBaseUnit } = params;
|
|
9
|
+
const fromToken = assetIdToTronToken(sellAssetId);
|
|
10
|
+
const toToken = assetIdToTronToken(buyAssetId);
|
|
11
|
+
const queryParams = {
|
|
12
|
+
fromToken,
|
|
13
|
+
toToken,
|
|
14
|
+
amountIn: sellAmountCryptoBaseUnit,
|
|
15
|
+
typeList: SUNIO_DEX_TYPES,
|
|
16
|
+
};
|
|
17
|
+
const url = `${SUNIO_API_BASE_URL}/swap/router`;
|
|
18
|
+
const maybeResponse = await service.get(url, {
|
|
19
|
+
params: queryParams,
|
|
20
|
+
});
|
|
21
|
+
if (maybeResponse.isErr()) {
|
|
22
|
+
return Err(maybeResponse.unwrapErr());
|
|
23
|
+
}
|
|
24
|
+
const { data: response } = maybeResponse.unwrap();
|
|
25
|
+
if (response.code !== 0 || !response.data || response.data.length === 0) {
|
|
26
|
+
return Err(makeSwapErrorRight({
|
|
27
|
+
message: `[Sun.io] ${response.message || 'No routes found'}`,
|
|
28
|
+
code: TradeQuoteError.NoRouteFound,
|
|
29
|
+
details: { response },
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
return Ok(response);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return Err(makeSwapErrorRight({
|
|
36
|
+
message: '[Sun.io] Failed to fetch quote',
|
|
37
|
+
code: TradeQuoteError.QueryFailed,
|
|
38
|
+
cause: error,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Result } from '@sniptt/monads';
|
|
2
|
+
import type { CommonTradeQuoteInput, GetTradeRateInput, GetTronTradeQuoteInput, SwapErrorRight, SwapperDeps, TradeQuote, TradeRate } from '../../../types.js';
|
|
3
|
+
export declare function getQuoteOrRate(input: GetTronTradeQuoteInput | CommonTradeQuoteInput, deps: SwapperDeps): Promise<Result<TradeQuote, SwapErrorRight>>;
|
|
4
|
+
export declare function getQuoteOrRate(input: GetTradeRateInput, deps: SwapperDeps): Promise<Result<TradeRate, SwapErrorRight>>;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { tronChainId } from '@shapeshiftoss/caip';
|
|
2
|
+
import { bn, contractAddressOrUndefined } from '@shapeshiftoss/utils';
|
|
3
|
+
import { Err, Ok } from '@sniptt/monads';
|
|
4
|
+
import { TronWeb } from 'tronweb';
|
|
5
|
+
import { SwapperName, TradeQuoteError } from '../../../types.js';
|
|
6
|
+
import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
|
|
7
|
+
import { DEFAULT_SLIPPAGE_PERCENTAGE, SUNIO_SMART_ROUTER_CONTRACT } from './constants.js';
|
|
8
|
+
import { fetchSunioQuote } from './fetchFromSunio.js';
|
|
9
|
+
import { isSupportedChainId } from './helpers/helpers.js';
|
|
10
|
+
import { sunioServiceFactory } from './sunioService.js';
|
|
11
|
+
export async function getQuoteOrRate(input, deps) {
|
|
12
|
+
try {
|
|
13
|
+
const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, accountNumber, affiliateBps, slippageTolerancePercentageDecimal, } = input;
|
|
14
|
+
const { assertGetTronChainAdapter: _assertGetTronChainAdapter } = deps;
|
|
15
|
+
if (!isSupportedChainId(sellAsset.chainId)) {
|
|
16
|
+
return Err(makeSwapErrorRight({
|
|
17
|
+
message: `[${SwapperName.Sunio}] Unsupported chainId: ${sellAsset.chainId}`,
|
|
18
|
+
code: TradeQuoteError.UnsupportedChain,
|
|
19
|
+
details: { chainId: sellAsset.chainId },
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
if (sellAsset.chainId !== buyAsset.chainId) {
|
|
23
|
+
return Err(makeSwapErrorRight({
|
|
24
|
+
message: `[${SwapperName.Sunio}] Cross-chain not supported`,
|
|
25
|
+
code: TradeQuoteError.CrossChainNotSupported,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
if (sellAsset.chainId !== tronChainId) {
|
|
29
|
+
return Err(makeSwapErrorRight({
|
|
30
|
+
message: `[${SwapperName.Sunio}] Only TRON chain supported`,
|
|
31
|
+
code: TradeQuoteError.UnsupportedChain,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
const service = sunioServiceFactory();
|
|
35
|
+
const maybeQuoteResponse = await fetchSunioQuote({
|
|
36
|
+
sellAssetId: sellAsset.assetId,
|
|
37
|
+
buyAssetId: buyAsset.assetId,
|
|
38
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
39
|
+
}, service);
|
|
40
|
+
if (maybeQuoteResponse.isErr()) {
|
|
41
|
+
return Err(maybeQuoteResponse.unwrapErr());
|
|
42
|
+
}
|
|
43
|
+
const quoteResponse = maybeQuoteResponse.unwrap();
|
|
44
|
+
const bestRoute = quoteResponse.data[0];
|
|
45
|
+
if (!bestRoute) {
|
|
46
|
+
return Err(makeSwapErrorRight({
|
|
47
|
+
message: '[Sun.io] No routes available',
|
|
48
|
+
code: TradeQuoteError.NoRouteFound,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
const isQuote = input.quoteOrRate === 'quote';
|
|
52
|
+
// For quotes, receiveAddress is required
|
|
53
|
+
if (isQuote && !receiveAddress) {
|
|
54
|
+
return Err(makeSwapErrorRight({
|
|
55
|
+
message: '[Sun.io] receiveAddress is required for quotes',
|
|
56
|
+
code: TradeQuoteError.InternalError,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
// Fetch network fees for both quotes and rates (when wallet connected)
|
|
60
|
+
let networkFeeCryptoBaseUnit = undefined;
|
|
61
|
+
// Estimate fees when we have an address to estimate from
|
|
62
|
+
if (receiveAddress) {
|
|
63
|
+
try {
|
|
64
|
+
const contractAddress = contractAddressOrUndefined(sellAsset.assetId);
|
|
65
|
+
const isSellingNativeTrx = !contractAddress;
|
|
66
|
+
const tronWeb = new TronWeb({ fullHost: deps.config.VITE_TRON_NODE_URL });
|
|
67
|
+
// Get chain parameters for pricing
|
|
68
|
+
const params = await tronWeb.trx.getChainParameters();
|
|
69
|
+
const bandwidthPrice = params.find(p => p.key === 'getTransactionFee')?.value ?? 1000;
|
|
70
|
+
const energyPrice = params.find(p => p.key === 'getEnergyFee')?.value ?? 100;
|
|
71
|
+
// Check if recipient needs activation (applies to all swaps)
|
|
72
|
+
let accountActivationFee = 0;
|
|
73
|
+
try {
|
|
74
|
+
const recipientInfoResponse = await fetch(`${deps.config.VITE_TRON_NODE_URL}/wallet/getaccount`, {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
headers: { 'Content-Type': 'application/json' },
|
|
77
|
+
body: JSON.stringify({ address: receiveAddress, visible: true }),
|
|
78
|
+
});
|
|
79
|
+
const recipientInfo = await recipientInfoResponse.json();
|
|
80
|
+
const recipientExists = recipientInfo && Object.keys(recipientInfo).length > 1;
|
|
81
|
+
if (!recipientExists) {
|
|
82
|
+
accountActivationFee = 1_000_000; // 1 TRX
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Ignore activation check errors
|
|
87
|
+
}
|
|
88
|
+
// For native TRX swaps, Sun.io uses a contract call with value
|
|
89
|
+
// We need to estimate energy for the swap contract, not just bandwidth
|
|
90
|
+
if (isSellingNativeTrx) {
|
|
91
|
+
try {
|
|
92
|
+
// Sun.io contract owner provides most energy (~117k), users only pay ~2k
|
|
93
|
+
// Use fixed 2k energy estimate instead of querying (which returns total 120k)
|
|
94
|
+
const energyUsed = 2000; // User pays ~2k energy, contract covers the rest
|
|
95
|
+
const energyFee = energyUsed * energyPrice; // No multiplier - contract provides energy
|
|
96
|
+
// Estimate bandwidth for contract call (much larger than simple transfer)
|
|
97
|
+
const bandwidthFee = 1100 * bandwidthPrice; // ~1100 bytes for contract call (with safety buffer)
|
|
98
|
+
networkFeeCryptoBaseUnit = bn(energyFee)
|
|
99
|
+
.plus(bandwidthFee)
|
|
100
|
+
.plus(accountActivationFee)
|
|
101
|
+
.toFixed(0);
|
|
102
|
+
}
|
|
103
|
+
catch (estimationError) {
|
|
104
|
+
// Fallback estimate: ~2k energy + ~1100 bytes bandwidth + activation fee
|
|
105
|
+
const fallbackEnergyFee = 2000 * energyPrice;
|
|
106
|
+
const fallbackBandwidthFee = 1100 * bandwidthPrice;
|
|
107
|
+
networkFeeCryptoBaseUnit = bn(fallbackEnergyFee)
|
|
108
|
+
.plus(fallbackBandwidthFee)
|
|
109
|
+
.plus(accountActivationFee)
|
|
110
|
+
.toFixed(0);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// For TRC-20 swaps through Sun.io router
|
|
115
|
+
// Same as TRX: contract owner provides most energy, user pays ~2k
|
|
116
|
+
// Sun.io provides ~217k energy, user pays ~2k
|
|
117
|
+
const energyFee = 2000 * energyPrice;
|
|
118
|
+
const bandwidthFee = 1100 * bandwidthPrice;
|
|
119
|
+
networkFeeCryptoBaseUnit = bn(energyFee)
|
|
120
|
+
.plus(bandwidthFee)
|
|
121
|
+
.plus(accountActivationFee)
|
|
122
|
+
.toFixed(0);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// For rates, fall back to '0' on estimation failure
|
|
127
|
+
// For quotes, let it error (required for accurate swap)
|
|
128
|
+
if (!isQuote) {
|
|
129
|
+
networkFeeCryptoBaseUnit = '0';
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const buyAmountCryptoBaseUnit = bn(bestRoute.amountOut)
|
|
137
|
+
.times(bn(10).pow(buyAsset.precision))
|
|
138
|
+
.toFixed(0);
|
|
139
|
+
// Calculate protocol fees only for quotes
|
|
140
|
+
const protocolFeeCryptoBaseUnit = isQuote
|
|
141
|
+
? bn(bestRoute.fee).times(sellAmountIncludingProtocolFeesCryptoBaseUnit).toFixed(0)
|
|
142
|
+
: '0';
|
|
143
|
+
const buyAmountAfterFeesCryptoBaseUnit = buyAmountCryptoBaseUnit;
|
|
144
|
+
const rate = getInputOutputRate({
|
|
145
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
146
|
+
buyAmountCryptoBaseUnit,
|
|
147
|
+
sellAsset,
|
|
148
|
+
buyAsset,
|
|
149
|
+
});
|
|
150
|
+
const trade = {
|
|
151
|
+
id: crypto.randomUUID(),
|
|
152
|
+
quoteOrRate: input.quoteOrRate,
|
|
153
|
+
rate,
|
|
154
|
+
slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ?? DEFAULT_SLIPPAGE_PERCENTAGE,
|
|
155
|
+
receiveAddress,
|
|
156
|
+
affiliateBps,
|
|
157
|
+
steps: [
|
|
158
|
+
{
|
|
159
|
+
buyAmountBeforeFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
|
|
160
|
+
buyAmountAfterFeesCryptoBaseUnit,
|
|
161
|
+
sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
162
|
+
feeData: {
|
|
163
|
+
networkFeeCryptoBaseUnit,
|
|
164
|
+
protocolFees: protocolFeeCryptoBaseUnit !== '0'
|
|
165
|
+
? {
|
|
166
|
+
[sellAsset.assetId]: {
|
|
167
|
+
amountCryptoBaseUnit: protocolFeeCryptoBaseUnit,
|
|
168
|
+
requiresBalance: false,
|
|
169
|
+
asset: sellAsset,
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
: {},
|
|
173
|
+
},
|
|
174
|
+
rate,
|
|
175
|
+
source: SwapperName.Sunio,
|
|
176
|
+
buyAsset,
|
|
177
|
+
sellAsset,
|
|
178
|
+
accountNumber,
|
|
179
|
+
allowanceContract: SUNIO_SMART_ROUTER_CONTRACT,
|
|
180
|
+
estimatedExecutionTimeMs: undefined,
|
|
181
|
+
...(isQuote && {
|
|
182
|
+
sunioTransactionMetadata: {
|
|
183
|
+
route: bestRoute,
|
|
184
|
+
},
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
swapperName: SwapperName.Sunio,
|
|
189
|
+
};
|
|
190
|
+
return Ok(trade);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return Err(makeSwapErrorRight({
|
|
194
|
+
message: `[Sun.io] Failed to get trade ${input.quoteOrRate}`,
|
|
195
|
+
code: TradeQuoteError.UnknownError,
|
|
196
|
+
cause: error,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AssetId } from '@shapeshiftoss/caip';
|
|
2
|
+
export declare const isSupportedChainId: (chainId: string) => boolean;
|
|
3
|
+
export declare const assetIdToTronToken: (assetId: AssetId) => string;
|
|
4
|
+
export declare const isTronChainId: (chainId: string) => chainId is import("@shapeshiftoss/caip").ChainId;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { fromAssetId, tronChainId } from '@shapeshiftoss/caip';
|
|
2
|
+
import { isToken } from '@shapeshiftoss/utils';
|
|
3
|
+
import { SUNIO_SUPPORTED_CHAIN_IDS, SUNIO_TRON_NATIVE_ADDRESS } from '../constants.js';
|
|
4
|
+
export const isSupportedChainId = (chainId) => {
|
|
5
|
+
return SUNIO_SUPPORTED_CHAIN_IDS.includes(chainId);
|
|
6
|
+
};
|
|
7
|
+
export const assetIdToTronToken = (assetId) => {
|
|
8
|
+
if (isToken(assetId)) {
|
|
9
|
+
const { assetReference } = fromAssetId(assetId);
|
|
10
|
+
return assetReference;
|
|
11
|
+
}
|
|
12
|
+
return SUNIO_TRON_NATIVE_ADDRESS;
|
|
13
|
+
};
|
|
14
|
+
export const isTronChainId = (chainId) => {
|
|
15
|
+
return chainId === tronChainId;
|
|
16
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const sunioServiceFactory: () => {
|
|
2
|
+
get: <T = any>(url: string, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../../index.js").SwapErrorRight>>;
|
|
3
|
+
post: <T_1 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_1, any, {}>, import("../../../index.js").SwapErrorRight>>;
|
|
4
|
+
delete: <T_2 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_2, any, {}>, import("../../../index.js").SwapErrorRight>>;
|
|
5
|
+
};
|
|
6
|
+
export type SunioService = ReturnType<typeof sunioServiceFactory>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createCache, makeSwapperAxiosServiceMonadic } from '../../../utils.js';
|
|
2
|
+
const maxAge = 5 * 1000;
|
|
3
|
+
const cachedUrls = ['/swap/router'];
|
|
4
|
+
export const sunioServiceFactory = () => {
|
|
5
|
+
const axiosConfig = {
|
|
6
|
+
timeout: 10000,
|
|
7
|
+
headers: {
|
|
8
|
+
Accept: 'application/json',
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
const serviceBase = createCache(maxAge, cachedUrls, axiosConfig);
|
|
13
|
+
return makeSwapperAxiosServiceMonadic(serviceBase);
|
|
14
|
+
};
|
|
@@ -7,4 +7,7 @@ export const thorchainSwapper = {
|
|
|
7
7
|
executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
|
|
8
8
|
return signAndBroadcastTransaction(txToSign);
|
|
9
9
|
},
|
|
10
|
+
executeTronTransaction: (txToSign, { signAndBroadcastTransaction }) => {
|
|
11
|
+
return signAndBroadcastTransaction(txToSign);
|
|
12
|
+
},
|
|
10
13
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cosmosAssetId, rujiAssetId, tcyAssetId, thorchainAssetId } from '@shapeshiftoss/caip';
|
|
2
|
-
import { checkTradeStatus, cosmossdk, evm, getInboundAddressDataForChain, utxo, } from '../../thorchain-utils/index.js';
|
|
2
|
+
import { checkTradeStatus, cosmossdk, evm, getInboundAddressDataForChain, tron, utxo, } from '../../thorchain-utils/index.js';
|
|
3
3
|
import { SwapperName } from '../../types.js';
|
|
4
4
|
import { getExecutableTradeStep, isExecutableTradeQuote } from '../../utils.js';
|
|
5
5
|
import { getTradeQuote } from './getTradeQuote/getTradeQuote.js';
|
|
@@ -12,6 +12,8 @@ export const thorchainApi = {
|
|
|
12
12
|
getEvmTransactionFees: input => evm.getEvmTransactionFees(input, swapperName),
|
|
13
13
|
getUnsignedUtxoTransaction: input => utxo.getUnsignedUtxoTransaction(input, swapperName),
|
|
14
14
|
getUtxoTransactionFees: input => utxo.getUtxoTransactionFees(input, swapperName),
|
|
15
|
+
getUnsignedTronTransaction: input => tron.getUnsignedTronTransaction(input, swapperName),
|
|
16
|
+
getTronTransactionFees: input => tron.getTronTransactionFees(input, swapperName),
|
|
15
17
|
getUnsignedCosmosSdkTransaction: async ({ tradeQuote, stepIndex, from, config, assertGetCosmosSdkChainAdapter, }) => {
|
|
16
18
|
if (!isExecutableTradeQuote(tradeQuote))
|
|
17
19
|
throw new Error('Unable to execute a trade rate quote');
|
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
"ETH.GUSD-0X056FD409E1D7A124BD7017459DFEA2F387B6D5CD": "eip155:1/erc20:0x056fd409e1d7a124bd7017459dfea2f387b6d5cd",
|
|
26
26
|
"ETH.LINK-0X514910771AF9CA656AF840DFF83E8264ECF986CA": "eip155:1/erc20:0x514910771af9ca656af840dff83e8264ecf986ca",
|
|
27
27
|
"ETH.LUSD-0X5F98805A4E8BE255A32880FDEC7F6728C6568BA0": "eip155:1/erc20:0x5f98805a4e8be255a32880fdec7f6728c6568ba0",
|
|
28
|
-
"ETH.RAZE-0X5EAA69B29F99C84FE5DE8200340B4E9B4AB38EAC": "eip155:1/erc20:0x5eaa69b29f99c84fe5de8200340b4e9b4ab38eac",
|
|
29
28
|
"ETH.SNX-0XC011A73EE8576FB46F5E1C5751CA3B9FE0AF2A6F": "eip155:1/erc20:0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f",
|
|
30
29
|
"ETH.TGT-0X108A850856DB3F85D0269A2693D896B394C80325": "eip155:1/erc20:0x108a850856db3f85d0269a2693d896b394c80325",
|
|
31
30
|
"ETH.THOR-0XA5F2211B9B8170F694421F2046281775E8468044": "eip155:1/erc20:0xa5f2211b9b8170f694421f2046281775e8468044",
|
|
@@ -34,12 +33,13 @@
|
|
|
34
33
|
"ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7",
|
|
35
34
|
"ETH.VTHOR-0X815C23ECA83261B6EC689B60CC4A58B54BC24D8D": "eip155:1/erc20:0x815c23eca83261b6ec689b60cc4a58b54bc24d8d",
|
|
36
35
|
"ETH.WBTC-0X2260FAC5E5542A773AA44FBCFEDF7C193BC2C599": "eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
|
|
37
|
-
"ETH.XDEFI-0X72B886D09C117654AB7DA13A14D603001DE0B777": "eip155:1/erc20:0x72b886d09c117654ab7da13a14d603001de0b777",
|
|
38
36
|
"ETH.XRUNE-0X69FA0FEE221AD11012BAB0FDB45D444D3D2CE71C": "eip155:1/erc20:0x69fa0fee221ad11012bab0fdb45d444d3d2ce71c",
|
|
39
37
|
"ETH.YFI-0X0BC529C00C6401AEF6D220BE8C6EA1667F6AD93E": "eip155:1/erc20:0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e",
|
|
40
38
|
"GAIA.ATOM": "cosmos:cosmoshub-4/slip44:118",
|
|
41
39
|
"LTC.LTC": "bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2",
|
|
42
40
|
"THOR.RUJI": "cosmos:thorchain-1/slip44:ruji",
|
|
43
41
|
"THOR.TCY": "cosmos:thorchain-1/slip44:tcy",
|
|
42
|
+
"TRON.TRX": "tron:0x2b6653dc/slip44:195",
|
|
43
|
+
"TRON.USDT-TR7NHQJEKQXGTCI8Q8ZY4PL8OTSZGJLJ6T": "tron:0x2b6653dc/trc20:tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t",
|
|
44
44
|
"THOR.RUNE": "cosmos:thorchain-1/slip44:931"
|
|
45
45
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { arbitrumAssetId, avalancheAssetId, baseAssetId, bscAssetId, ethAssetId, fromAssetId, gnosisAssetId, optimismAssetId, polygonAssetId, } from '@shapeshiftoss/caip';
|
|
1
|
+
import { arbitrumAssetId, avalancheAssetId, baseAssetId, bscAssetId, ethAssetId, fromAssetId, gnosisAssetId, katanaAssetId, monadAssetId, optimismAssetId, plasmaAssetId, polygonAssetId, } from '@shapeshiftoss/caip';
|
|
2
2
|
import { KnownChainIds } from '@shapeshiftoss/types';
|
|
3
|
-
import { DAO_TREASURY_ARBITRUM, DAO_TREASURY_AVALANCHE, DAO_TREASURY_BASE, DAO_TREASURY_BITCOIN, DAO_TREASURY_BSC, DAO_TREASURY_ETHEREUM_MAINNET, DAO_TREASURY_GNOSIS, DAO_TREASURY_OPTIMISM, DAO_TREASURY_POLYGON, DAO_TREASURY_SOLANA, isTreasuryChainId, } from '@shapeshiftoss/utils';
|
|
3
|
+
import { DAO_TREASURY_ARBITRUM, DAO_TREASURY_AVALANCHE, DAO_TREASURY_BASE, DAO_TREASURY_BITCOIN, DAO_TREASURY_BSC, DAO_TREASURY_ETHEREUM_MAINNET, DAO_TREASURY_GNOSIS, DAO_TREASURY_OPTIMISM, DAO_TREASURY_POLYGON, DAO_TREASURY_SOLANA, DAO_TREASURY_STARKNET, isTreasuryChainId, } from '@shapeshiftoss/utils';
|
|
4
4
|
export const isNativeEvmAsset = (assetId) => {
|
|
5
5
|
const { chainId } = fromAssetId(assetId);
|
|
6
6
|
switch (chainId) {
|
|
@@ -20,6 +20,12 @@ export const isNativeEvmAsset = (assetId) => {
|
|
|
20
20
|
return assetId === arbitrumAssetId;
|
|
21
21
|
case KnownChainIds.BaseMainnet:
|
|
22
22
|
return assetId === baseAssetId;
|
|
23
|
+
case KnownChainIds.MonadMainnet:
|
|
24
|
+
return assetId === monadAssetId;
|
|
25
|
+
case KnownChainIds.PlasmaMainnet:
|
|
26
|
+
return assetId === plasmaAssetId;
|
|
27
|
+
case KnownChainIds.KatanaMainnet:
|
|
28
|
+
return assetId === katanaAssetId;
|
|
23
29
|
default:
|
|
24
30
|
return false;
|
|
25
31
|
}
|
|
@@ -35,6 +41,7 @@ const DAO_TREASURY_BY_CHAIN_ID = {
|
|
|
35
41
|
[KnownChainIds.BaseMainnet]: DAO_TREASURY_BASE,
|
|
36
42
|
[KnownChainIds.SolanaMainnet]: DAO_TREASURY_SOLANA,
|
|
37
43
|
[KnownChainIds.BitcoinMainnet]: DAO_TREASURY_BITCOIN,
|
|
44
|
+
[KnownChainIds.StarknetMainnet]: DAO_TREASURY_STARKNET,
|
|
38
45
|
};
|
|
39
46
|
export const getTreasuryAddressFromChainId = (chainId) => {
|
|
40
47
|
const maybeTreasuryChainId = isTreasuryChainId(chainId) ? chainId : undefined;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { CHAIN_NAMESPACE, fromAssetId } from '@shapeshiftoss/caip';
|
|
2
2
|
import * as adapters from '@shapeshiftoss/chain-adapters';
|
|
3
|
-
import { assertUnreachable, bn, bnOrZero, convertDecimalPercentageToBasisPoints, convertPrecision, fromBaseUnit, isFulfilled, isRejected, toBaseUnit, } from '@shapeshiftoss/utils';
|
|
3
|
+
import { assertUnreachable, bn, bnOrZero, contractAddressOrUndefined, convertDecimalPercentageToBasisPoints, convertPrecision, fromBaseUnit, isFulfilled, isRejected, toBaseUnit, } from '@shapeshiftoss/utils';
|
|
4
4
|
import { Err, Ok } from '@sniptt/monads';
|
|
5
|
+
import { TronWeb } from 'tronweb';
|
|
5
6
|
import { v4 as uuid } from 'uuid';
|
|
6
7
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../index.js';
|
|
7
8
|
import { TradeQuoteError } from '../types.js';
|
|
@@ -10,6 +11,7 @@ import * as evm from './evm/index.js';
|
|
|
10
11
|
import { getLimitWithManualSlippage } from './getLimitWithManualSlippage/getLimitWithManualSlippage.js';
|
|
11
12
|
import { getQuote } from './getQuote.js';
|
|
12
13
|
import { addLimitToMemo, assertAndProcessMemo, getAffiliate, getNativePrecision, getSwapSource, } from './index.js';
|
|
14
|
+
import * as tron from './tron/index.js';
|
|
13
15
|
import * as utxo from './utxo/index.js';
|
|
14
16
|
const SAFE_GAS_LIMIT = '100000'; // depositWithExpiry()
|
|
15
17
|
export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType, swapperName) => {
|
|
@@ -273,10 +275,73 @@ export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType
|
|
|
273
275
|
}));
|
|
274
276
|
}
|
|
275
277
|
case CHAIN_NAMESPACE.Tron: {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
278
|
+
const maybeRoutes = await Promise.allSettled(perRouteValues.map(async (route) => {
|
|
279
|
+
const memo = getMemo(route);
|
|
280
|
+
let networkFeeCryptoBaseUnit = undefined;
|
|
281
|
+
// Calculate fees for rates when we have a receive address (wallet connected)
|
|
282
|
+
if (input.quoteOrRate === 'rate' && input.receiveAddress) {
|
|
283
|
+
try {
|
|
284
|
+
const { sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit } = input;
|
|
285
|
+
const contractAddress = contractAddressOrUndefined(sellAsset.assetId);
|
|
286
|
+
// Get vault address
|
|
287
|
+
const { vault } = await tron.getThorTxData({ sellAsset, config, swapperName });
|
|
288
|
+
// Estimate fees using the receive address for accurate energy calculation
|
|
289
|
+
const tronWeb = new TronWeb({ fullHost: deps.config.VITE_TRON_NODE_URL });
|
|
290
|
+
const params = await tronWeb.trx.getChainParameters();
|
|
291
|
+
const bandwidthPrice = params.find(p => p.key === 'getTransactionFee')?.value ?? 1000;
|
|
292
|
+
const energyPrice = params.find(p => p.key === 'getEnergyFee')?.value ?? 100;
|
|
293
|
+
let totalFee = 0;
|
|
294
|
+
if (contractAddress) {
|
|
295
|
+
// TRC20: Estimate energy with actual recipient
|
|
296
|
+
try {
|
|
297
|
+
const result = await tronWeb.transactionBuilder.triggerConstantContract(contractAddress, 'transfer(address,uint256)', {}, [
|
|
298
|
+
{ type: 'address', value: vault },
|
|
299
|
+
{ type: 'uint256', value: sellAmountIncludingProtocolFeesCryptoBaseUnit },
|
|
300
|
+
], input.receiveAddress);
|
|
301
|
+
const energyUsed = result.energy_used ?? 65000;
|
|
302
|
+
const energyFee = energyUsed * energyPrice * 1.5; // 1.5x safety margin
|
|
303
|
+
const bandwidthFee = 276 * bandwidthPrice; // TRC20 bandwidth
|
|
304
|
+
totalFee = Math.ceil(energyFee + bandwidthFee);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Fallback: Conservative estimate
|
|
308
|
+
totalFee = 13_000_000; // 13 TRX worst case
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// TRX transfer bandwidth: Base tx + memo bytes
|
|
313
|
+
const baseBytes = 198;
|
|
314
|
+
const memoBytes = route.quote.memo
|
|
315
|
+
? Buffer.from(route.quote.memo, 'utf8').length
|
|
316
|
+
: 0;
|
|
317
|
+
const totalBandwidth = baseBytes + memoBytes;
|
|
318
|
+
totalFee = totalBandwidth * bandwidthPrice;
|
|
319
|
+
}
|
|
320
|
+
networkFeeCryptoBaseUnit = String(totalFee);
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Leave as undefined if estimation fails
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// For quotes, fees will be calculated in getTronTransactionFees when executing
|
|
327
|
+
return Promise.resolve(makeThorTradeRateOrQuote({
|
|
328
|
+
route,
|
|
329
|
+
allowanceContract: '0x0',
|
|
330
|
+
memo,
|
|
331
|
+
feeData: {
|
|
332
|
+
networkFeeCryptoBaseUnit,
|
|
333
|
+
protocolFees: getProtocolFees(route.quote),
|
|
334
|
+
},
|
|
335
|
+
}));
|
|
279
336
|
}));
|
|
337
|
+
const routes = maybeRoutes.filter(isFulfilled).map(maybeRoute => maybeRoute.value);
|
|
338
|
+
if (!routes.length)
|
|
339
|
+
return Err(makeSwapErrorRight({
|
|
340
|
+
message: 'Unable to create any routes',
|
|
341
|
+
code: TradeQuoteError.UnsupportedTradePair,
|
|
342
|
+
cause: maybeRoutes.filter(isRejected).map(maybeRoute => maybeRoute.reason),
|
|
343
|
+
}));
|
|
344
|
+
return Ok(routes);
|
|
280
345
|
}
|
|
281
346
|
case CHAIN_NAMESPACE.Sui: {
|
|
282
347
|
return Err(makeSwapErrorRight({
|
|
@@ -284,6 +349,18 @@ export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType
|
|
|
284
349
|
code: TradeQuoteError.UnsupportedTradePair,
|
|
285
350
|
}));
|
|
286
351
|
}
|
|
352
|
+
case CHAIN_NAMESPACE.Near: {
|
|
353
|
+
return Err(makeSwapErrorRight({
|
|
354
|
+
message: 'NEAR is not supported',
|
|
355
|
+
code: TradeQuoteError.UnsupportedTradePair,
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
case CHAIN_NAMESPACE.Starknet: {
|
|
359
|
+
return Err(makeSwapErrorRight({
|
|
360
|
+
message: 'Starknet is not supported',
|
|
361
|
+
code: TradeQuoteError.UnsupportedTradePair,
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
287
364
|
default:
|
|
288
365
|
return assertUnreachable(chainNamespace);
|
|
289
366
|
}
|
|
@@ -13,6 +13,7 @@ export * from './getL1RateOrQuote.js';
|
|
|
13
13
|
export * from './getPoolDetails.js';
|
|
14
14
|
export * as cosmossdk from './cosmossdk/index.js';
|
|
15
15
|
export * as evm from './evm/index.js';
|
|
16
|
+
export * as tron from './tron/index.js';
|
|
16
17
|
export * as utxo from './utxo/index.js';
|
|
17
18
|
export declare const getChainIdBySwapper: (swapperName: SwapperName) => import("@shapeshiftoss/caip").ChainId;
|
|
18
19
|
export declare const isThorTradeRate: (quote: TradeRate | undefined) => quote is ThorTradeRate;
|
|
@@ -14,6 +14,7 @@ export * from './getL1RateOrQuote.js';
|
|
|
14
14
|
export * from './getPoolDetails.js';
|
|
15
15
|
export * as cosmossdk from './cosmossdk/index.js';
|
|
16
16
|
export * as evm from './evm/index.js';
|
|
17
|
+
export * as tron from './tron/index.js';
|
|
17
18
|
export * as utxo from './utxo/index.js';
|
|
18
19
|
export const getChainIdBySwapper = (swapperName) => {
|
|
19
20
|
switch (swapperName) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Asset } from '@shapeshiftoss/types';
|
|
2
|
+
import type { SwapperConfig, SwapperName } from '../../types.js';
|
|
3
|
+
type GetThorTxDataArgs = {
|
|
4
|
+
sellAsset: Asset;
|
|
5
|
+
config: SwapperConfig;
|
|
6
|
+
swapperName: SwapperName;
|
|
7
|
+
};
|
|
8
|
+
type GetThorTxDataReturn = {
|
|
9
|
+
vault: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const getThorTxData: ({ sellAsset, config, swapperName, }: GetThorTxDataArgs) => Promise<GetThorTxDataReturn>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getInboundAddressDataForChain } from '../getInboundAddressDataForChain.js';
|
|
2
|
+
import { getDaemonUrl } from '../index.js';
|
|
3
|
+
export const getThorTxData = async ({ sellAsset, config, swapperName, }) => {
|
|
4
|
+
const daemonUrl = getDaemonUrl(config, swapperName);
|
|
5
|
+
const res = await getInboundAddressDataForChain(daemonUrl, sellAsset.assetId, false, swapperName);
|
|
6
|
+
if (res.isErr())
|
|
7
|
+
throw res.unwrapErr();
|
|
8
|
+
const { address: vault } = res.unwrap();
|
|
9
|
+
return { vault };
|
|
10
|
+
};
|