@shapeshiftoss/swapper 17.6.9 → 17.6.10
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 +61 -43
- package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
- package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.js +8 -0
- package/dist/cjs/swappers/AcrossSwapper/constant.d.ts +9 -0
- package/dist/cjs/swappers/AcrossSwapper/constant.js +48 -0
- package/dist/cjs/swappers/AcrossSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/AcrossSwapper/endpoints.js +113 -0
- package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
- package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +31 -0
- package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
- package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +19 -0
- package/dist/cjs/swappers/AcrossSwapper/index.d.ts +1 -0
- package/dist/cjs/swappers/AcrossSwapper/index.js +5 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.js +17 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +27 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.js +335 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/types.d.ts +177 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/types.js +17 -0
- package/dist/cjs/swappers/AvnuSwapper/endpoints.js +42 -14
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
- package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
- package/dist/cjs/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
- package/dist/cjs/swappers/ButterSwap/ButterSwap.js +1 -0
- package/dist/cjs/swappers/ButterSwap/endpoints.js +56 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/checkTradeStatus.js +19 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +27 -14
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.js +23 -16
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
- package/dist/cjs/swappers/ButterSwap/types.d.ts +1 -0
- package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -0
- package/dist/cjs/swappers/ButterSwap/xhr.d.ts +2 -2
- package/dist/cjs/swappers/ButterSwap/xhr.js +7 -2
- package/dist/cjs/swappers/CetusSwapper/endpoints.js +3 -8
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/cjs/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +11 -5
- package/dist/cjs/swappers/ChainflipSwapper/utils/helpers.js +8 -2
- package/dist/cjs/swappers/CowSwapper/CowSwapper.js +1 -1
- package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
- package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
- package/dist/cjs/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
- package/dist/cjs/swappers/CowSwapper/utils/helpers/helpers.js +8 -2
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +31 -0
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
- package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +1 -1
- package/dist/cjs/swappers/NearIntentsSwapper/types.js +6 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
- package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
- package/dist/cjs/swappers/RelaySwapper/constant.js +26 -1
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
- package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +13 -2
- package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
- package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +15 -0
- package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
- package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.js +8 -0
- package/dist/cjs/swappers/StonfiSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/StonfiSwapper/endpoints.js +227 -0
- package/dist/cjs/swappers/StonfiSwapper/index.d.ts +4 -0
- package/dist/cjs/swappers/StonfiSwapper/index.js +25 -0
- package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
- package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +119 -0
- package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
- package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.js +105 -0
- package/dist/cjs/swappers/StonfiSwapper/types.d.ts +60 -0
- package/dist/cjs/swappers/StonfiSwapper/types.js +5 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/constants.js +8 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/helpers.js +135 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
- package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.js +20 -0
- package/dist/cjs/swappers/SunioSwapper/endpoints.js +1 -1
- package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +4 -3
- package/dist/cjs/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
- package/dist/cjs/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
- package/dist/cjs/swappers/utils/helpers/helpers.js +3 -0
- package/dist/cjs/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
- package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +30 -5
- package/dist/cjs/thorchain-utils/getQuote.js +8 -2
- package/dist/cjs/tron-utils/getUnsignedTronTransaction.js +22 -2
- package/dist/cjs/types.d.ts +79 -8
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils.d.ts +4 -3
- package/dist/cjs/utils.js +35 -7
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +31 -13
- package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
- package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.js +5 -0
- package/dist/esm/swappers/AcrossSwapper/constant.d.ts +9 -0
- package/dist/esm/swappers/AcrossSwapper/constant.js +42 -0
- package/dist/esm/swappers/AcrossSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/AcrossSwapper/endpoints.js +107 -0
- package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
- package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +27 -0
- package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
- package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +15 -0
- package/dist/esm/swappers/AcrossSwapper/index.d.ts +1 -0
- package/dist/esm/swappers/AcrossSwapper/index.js +1 -0
- package/dist/esm/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
- package/dist/esm/swappers/AcrossSwapper/utils/acrossService.js +11 -0
- package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
- package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +23 -0
- package/dist/esm/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
- package/dist/esm/swappers/AcrossSwapper/utils/getTrade.js +328 -0
- package/dist/esm/swappers/AcrossSwapper/utils/types.d.ts +177 -0
- package/dist/esm/swappers/AcrossSwapper/utils/types.js +13 -0
- package/dist/esm/swappers/AvnuSwapper/endpoints.js +43 -15
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
- package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
- package/dist/esm/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
- package/dist/esm/swappers/ButterSwap/ButterSwap.js +2 -1
- package/dist/esm/swappers/ButterSwap/endpoints.js +56 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/checkTradeStatus.js +20 -1
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +29 -16
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.js +25 -18
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
- package/dist/esm/swappers/ButterSwap/types.d.ts +1 -0
- package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -0
- package/dist/esm/swappers/ButterSwap/xhr.d.ts +2 -2
- package/dist/esm/swappers/ButterSwap/xhr.js +8 -3
- package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -8
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
- package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/esm/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +12 -6
- package/dist/esm/swappers/ChainflipSwapper/utils/helpers.js +9 -3
- package/dist/esm/swappers/CowSwapper/CowSwapper.js +1 -1
- package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
- package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
- package/dist/esm/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
- package/dist/esm/swappers/CowSwapper/utils/helpers/helpers.js +9 -3
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +31 -0
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
- package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +1 -1
- package/dist/esm/swappers/NearIntentsSwapper/types.js +6 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
- package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
- package/dist/esm/swappers/RelaySwapper/constant.js +28 -3
- package/dist/esm/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
- package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +13 -2
- package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
- package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +15 -0
- package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
- package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.js +5 -0
- package/dist/esm/swappers/StonfiSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/StonfiSwapper/endpoints.js +224 -0
- package/dist/esm/swappers/StonfiSwapper/index.d.ts +4 -0
- package/dist/esm/swappers/StonfiSwapper/index.js +4 -0
- package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
- package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +115 -0
- package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
- package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.js +101 -0
- package/dist/esm/swappers/StonfiSwapper/types.d.ts +60 -0
- package/dist/esm/swappers/StonfiSwapper/types.js +2 -0
- package/dist/esm/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
- package/dist/esm/swappers/StonfiSwapper/utils/constants.js +5 -0
- package/dist/esm/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
- package/dist/esm/swappers/StonfiSwapper/utils/helpers.js +124 -0
- package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
- package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.js +17 -0
- package/dist/esm/swappers/SunioSwapper/endpoints.js +1 -1
- package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +5 -4
- package/dist/esm/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
- package/dist/esm/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
- package/dist/esm/swappers/utils/helpers/helpers.js +4 -1
- package/dist/esm/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
- package/dist/esm/thorchain-utils/getL1RateOrQuote.js +31 -6
- package/dist/esm/thorchain-utils/getQuote.js +9 -3
- package/dist/esm/tron-utils/getUnsignedTronTransaction.js +22 -2
- package/dist/esm/types.d.ts +79 -8
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils.d.ts +4 -3
- package/dist/esm/utils.js +34 -7
- package/package.json +17 -15
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { getQuotes } from '@avnu/avnu-sdk';
|
|
2
2
|
import { bn } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err, Ok } from '@sniptt/monads';
|
|
4
|
-
import {
|
|
4
|
+
import { validateAndParseAddress } from 'starknet';
|
|
5
5
|
import { v4 as uuid } from 'uuid';
|
|
6
6
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
7
7
|
import { SwapperName, TradeQuoteError } from '../../../types.js';
|
|
8
8
|
import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
|
|
9
|
+
import { getTreasuryAddressFromChainId } from '../../utils/helpers/helpers.js';
|
|
9
10
|
import { AVNU_SUPPORTED_CHAIN_IDS } from '../utils/constants.js';
|
|
10
11
|
import { getTokenAddress } from '../utils/helpers.js';
|
|
11
12
|
export const getTradeRate = async (input, deps) => {
|
|
@@ -25,6 +26,9 @@ export const getTradeRate = async (input, deps) => {
|
|
|
25
26
|
try {
|
|
26
27
|
const sellTokenAddress = getTokenAddress(sellAsset);
|
|
27
28
|
const buyTokenAddress = getTokenAddress(buyAsset);
|
|
29
|
+
// Normalize receive address if provided (for fee estimation)
|
|
30
|
+
// Rate quotes may not have a receive address, so this is optional
|
|
31
|
+
const normalizedReceiveAddress = receiveAddress ? validateAndParseAddress(receiveAddress) : '';
|
|
28
32
|
const quotes = await getQuotes({
|
|
29
33
|
sellTokenAddress,
|
|
30
34
|
buyTokenAddress,
|
|
@@ -50,10 +54,10 @@ export const getTradeRate = async (input, deps) => {
|
|
|
50
54
|
const sellAdapter = deps.assertGetStarknetChainAdapter(sellAsset.chainId);
|
|
51
55
|
// For rate quotes, use receiveAddress as a dummy from/to for fee estimation
|
|
52
56
|
const feeData = await sellAdapter.getFeeData({
|
|
53
|
-
to:
|
|
57
|
+
to: normalizedReceiveAddress,
|
|
54
58
|
value: sellAmount,
|
|
55
59
|
chainSpecific: {
|
|
56
|
-
from:
|
|
60
|
+
from: normalizedReceiveAddress,
|
|
57
61
|
tokenContractAddress: sellTokenAddress,
|
|
58
62
|
},
|
|
59
63
|
sendMax: false,
|
|
@@ -78,7 +82,7 @@ export const getTradeRate = async (input, deps) => {
|
|
|
78
82
|
: {};
|
|
79
83
|
const tradeRate = {
|
|
80
84
|
id: uuid(),
|
|
81
|
-
receiveAddress,
|
|
85
|
+
receiveAddress: normalizedReceiveAddress || receiveAddress,
|
|
82
86
|
affiliateBps,
|
|
83
87
|
rate,
|
|
84
88
|
slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ??
|
|
@@ -5,7 +5,7 @@ export declare const isSupportedChainId: (chainId: ChainId) => chainId is import
|
|
|
5
5
|
export declare const assertValidTrade: ({ buyAsset, sellAsset, }: {
|
|
6
6
|
buyAsset: Asset;
|
|
7
7
|
sellAsset: Asset;
|
|
8
|
-
}) => import("@sniptt/monads/build/result/result").
|
|
8
|
+
}) => import("@sniptt/monads/build/result/result").ResErr<unknown, import("../../../../types.js").SwapErrorRight> | import("@sniptt/monads/build/result/result").ResOk<boolean, never>;
|
|
9
9
|
export declare const calculateRate: ({ buyAmount, sellAmount, buyAsset, sellAsset, }: {
|
|
10
10
|
buyAmount: string;
|
|
11
11
|
sellAmount: string;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { executeEvmTransaction, executeSolanaTransaction } from '../../utils.js';
|
|
1
|
+
import { executeEvmTransaction, executeSolanaTransaction, executeTronTransaction, } from '../../utils.js';
|
|
2
2
|
export const butterSwap = {
|
|
3
3
|
executeEvmTransaction,
|
|
4
4
|
executeSolanaTransaction,
|
|
5
|
+
executeTronTransaction,
|
|
5
6
|
executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
|
|
6
7
|
return signAndBroadcastTransaction(txToSign);
|
|
7
8
|
},
|
|
@@ -2,6 +2,8 @@ import { evm } from '@shapeshiftoss/chain-adapters';
|
|
|
2
2
|
import BigNumber from 'bignumber.js';
|
|
3
3
|
import { getSolanaTransactionFees } from '../../solana-utils/getSolanaTransactionFees.js';
|
|
4
4
|
import { getUnsignedSolanaTransaction } from '../../solana-utils/getUnsignedSolanaTransaction.js';
|
|
5
|
+
import { getTronTransactionFees } from '../../tron-utils/getTronTransactionFees.js';
|
|
6
|
+
import { getUnsignedTronTransaction } from '../../tron-utils/getUnsignedTronTransaction.js';
|
|
5
7
|
import { getExecutableTradeStep, isExecutableTradeQuote } from '../../utils.js';
|
|
6
8
|
import { checkTradeStatus } from './swapperApi/checkTradeStatus.js';
|
|
7
9
|
import { getTradeQuote } from './swapperApi/getTradeQuote.js';
|
|
@@ -64,6 +66,60 @@ export const butterSwapApi = {
|
|
|
64
66
|
gasLimit: BigNumber.max(feeData.gasLimit, gasLimit).toFixed(),
|
|
65
67
|
});
|
|
66
68
|
},
|
|
69
|
+
getUnsignedUtxoTransaction: async ({ stepIndex, tradeQuote, xpub, accountType, assertGetUtxoChainAdapter, }) => {
|
|
70
|
+
if (!isExecutableTradeQuote(tradeQuote))
|
|
71
|
+
throw new Error('Unable to execute a trade rate quote');
|
|
72
|
+
const step = getExecutableTradeStep(tradeQuote, stepIndex);
|
|
73
|
+
const { accountNumber, sellAsset, butterSwapTransactionMetadata } = step;
|
|
74
|
+
if (!butterSwapTransactionMetadata)
|
|
75
|
+
throw new Error('Transaction metadata is required');
|
|
76
|
+
const { to, memo } = butterSwapTransactionMetadata;
|
|
77
|
+
if (!to)
|
|
78
|
+
throw new Error('Missing deposit address');
|
|
79
|
+
if (!memo)
|
|
80
|
+
throw new Error('Missing memo (opReturnData)');
|
|
81
|
+
const adapter = assertGetUtxoChainAdapter(sellAsset.chainId);
|
|
82
|
+
const { fast } = await adapter.getFeeData({
|
|
83
|
+
to,
|
|
84
|
+
value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
85
|
+
chainSpecific: { pubkey: xpub, opReturnData: memo },
|
|
86
|
+
sendMax: false,
|
|
87
|
+
});
|
|
88
|
+
return adapter.buildSendApiTransaction({
|
|
89
|
+
value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
90
|
+
xpub,
|
|
91
|
+
to,
|
|
92
|
+
accountNumber,
|
|
93
|
+
chainSpecific: {
|
|
94
|
+
accountType,
|
|
95
|
+
opReturnData: memo,
|
|
96
|
+
satoshiPerByte: fast.chainSpecific.satoshiPerByte,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
getUtxoTransactionFees: async ({ stepIndex, tradeQuote, xpub, assertGetUtxoChainAdapter }) => {
|
|
101
|
+
if (!isExecutableTradeQuote(tradeQuote))
|
|
102
|
+
throw new Error('Unable to execute a trade rate quote');
|
|
103
|
+
const step = getExecutableTradeStep(tradeQuote, stepIndex);
|
|
104
|
+
const { sellAsset, butterSwapTransactionMetadata } = step;
|
|
105
|
+
if (!butterSwapTransactionMetadata)
|
|
106
|
+
throw new Error('Transaction metadata is required');
|
|
107
|
+
const { to, memo } = butterSwapTransactionMetadata;
|
|
108
|
+
if (!to)
|
|
109
|
+
throw new Error('Missing deposit address');
|
|
110
|
+
if (!memo)
|
|
111
|
+
throw new Error('Missing memo (opReturnData)');
|
|
112
|
+
const adapter = assertGetUtxoChainAdapter(sellAsset.chainId);
|
|
113
|
+
const { fast } = await adapter.getFeeData({
|
|
114
|
+
to,
|
|
115
|
+
value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
116
|
+
chainSpecific: { pubkey: xpub, opReturnData: memo },
|
|
117
|
+
sendMax: false,
|
|
118
|
+
});
|
|
119
|
+
return fast.txFee;
|
|
120
|
+
},
|
|
67
121
|
getUnsignedSolanaTransaction,
|
|
68
122
|
getSolanaTransactionFees,
|
|
123
|
+
getTronTransactionFees,
|
|
124
|
+
getUnsignedTronTransaction,
|
|
69
125
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { solanaChainId } from '@shapeshiftoss/caip';
|
|
1
|
+
import { solanaChainId, tronChainId } from '@shapeshiftoss/caip';
|
|
2
2
|
import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
|
|
3
3
|
import { TxStatus } from '@shapeshiftoss/unchained-client';
|
|
4
4
|
import { checkEvmSwapStatus, checkSolanaSwapStatus, createDefaultStatusResponse, } from '../../../utils.js';
|
|
@@ -33,6 +33,25 @@ export const checkTradeStatus = async (input) => {
|
|
|
33
33
|
fetchIsSmartContractAddressQuery,
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
+
if (sellChainId === tronChainId) {
|
|
37
|
+
const adapter = input.assertGetTronChainAdapter(tronChainId);
|
|
38
|
+
const tx = await adapter.httpProvider.getTransaction({ txid: txHash });
|
|
39
|
+
if (!tx) {
|
|
40
|
+
return createDefaultStatusResponse(txHash);
|
|
41
|
+
}
|
|
42
|
+
const contractRet = tx.ret?.[0]?.contractRet;
|
|
43
|
+
// Only mark as confirmed if SUCCESS AND has confirmations (in a block)
|
|
44
|
+
const status = contractRet === 'SUCCESS' && tx.confirmations > 0
|
|
45
|
+
? TxStatus.Confirmed
|
|
46
|
+
: contractRet === 'REVERT'
|
|
47
|
+
? TxStatus.Failed
|
|
48
|
+
: TxStatus.Pending;
|
|
49
|
+
return {
|
|
50
|
+
status,
|
|
51
|
+
buyTxHash: txHash,
|
|
52
|
+
message: undefined,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
36
55
|
// Fallback: unknown same-chain type (should never happen for Butter, but just in case). Avoid bridge polling.
|
|
37
56
|
return createDefaultStatusResponse(txHash);
|
|
38
57
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
|
|
2
2
|
import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
|
|
3
|
-
import { bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints,
|
|
3
|
+
import { BigAmount, bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, } from '@shapeshiftoss/utils';
|
|
4
4
|
import { Err, Ok } from '@sniptt/monads';
|
|
5
5
|
import { AddressLookupTableAccount, PublicKey, TransactionMessage, VersionedTransaction, } from '@solana/web3.js';
|
|
6
6
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
@@ -12,19 +12,14 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
12
12
|
const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, sendAddress, slippageTolerancePercentageDecimal, accountNumber, affiliateBps, } = input;
|
|
13
13
|
if (!isEvmChainId(sellAsset.chainId) &&
|
|
14
14
|
sellAsset.chainId !== btcChainId &&
|
|
15
|
-
sellAsset.chainId !== solanaChainId
|
|
15
|
+
sellAsset.chainId !== solanaChainId &&
|
|
16
|
+
sellAsset.chainId !== tronChainId) {
|
|
16
17
|
return Err(makeSwapErrorRight({
|
|
17
18
|
message: `Unsupported chain`,
|
|
18
19
|
code: TradeQuoteError.UnsupportedChain,
|
|
19
20
|
}));
|
|
20
21
|
}
|
|
21
|
-
//
|
|
22
|
-
if (sellAsset.assetId === btcAssetId) {
|
|
23
|
-
return Err(makeSwapErrorRight({
|
|
24
|
-
message: `BTC sells are currently unsupported`,
|
|
25
|
-
code: TradeQuoteError.UnsupportedChain,
|
|
26
|
-
}));
|
|
27
|
-
}
|
|
22
|
+
// TODO: Debug why same-chain Tron swaps revert (swapAndCall method works on EVM but 0 successful on Tron)
|
|
28
23
|
if (!sendAddress) {
|
|
29
24
|
return Err(makeSwapErrorRight({
|
|
30
25
|
message: '[getTradeQuote] sendAddress is required for ButterSwap',
|
|
@@ -38,7 +33,10 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
38
33
|
const routeResult = await getButterRoute({
|
|
39
34
|
sellAsset,
|
|
40
35
|
buyAsset,
|
|
41
|
-
|
|
36
|
+
sellAmountCryptoPrecision: BigAmount.fromBaseUnit({
|
|
37
|
+
value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
38
|
+
precision: sellAsset.precision,
|
|
39
|
+
}).toPrecision(),
|
|
42
40
|
slippage,
|
|
43
41
|
affiliate: makeButterSwapAffiliate(affiliateBps),
|
|
44
42
|
});
|
|
@@ -47,7 +45,10 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
47
45
|
const routeResponse = routeResult.unwrap();
|
|
48
46
|
if (!isRouteSuccess(routeResponse)) {
|
|
49
47
|
if (routeResponse.errno === ButterSwapErrorCode.InsufficientAmount) {
|
|
50
|
-
const minAmountCryptoBaseUnit =
|
|
48
|
+
const minAmountCryptoBaseUnit = BigAmount.fromPrecision({
|
|
49
|
+
value: routeResponse.minAmount,
|
|
50
|
+
precision: sellAsset.precision,
|
|
51
|
+
}).toBaseUnit();
|
|
51
52
|
return Err(createTradeAmountTooSmallErr({
|
|
52
53
|
minAmountCryptoBaseUnit,
|
|
53
54
|
assetId: sellAsset.assetId,
|
|
@@ -97,13 +98,19 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
97
98
|
}));
|
|
98
99
|
}
|
|
99
100
|
// Map gasFee.amount to networkFeeCryptoBaseUnit using fee asset precision
|
|
100
|
-
const networkFeeCryptoBaseUnit =
|
|
101
|
+
const networkFeeCryptoBaseUnit = BigAmount.fromPrecision({
|
|
102
|
+
value: bnOrZero(route.gasFee?.amount),
|
|
103
|
+
precision: feeAsset.precision,
|
|
104
|
+
}).toBaseUnit();
|
|
101
105
|
// Use destination receive amount as a priority if present and defined
|
|
102
106
|
// It won't for same-chain swaps, so we fall back to the source chain receive amount (i.e source chain *is* the destination chain)
|
|
103
107
|
const outputAmount = route.dstChain?.totalAmountOut ?? route.srcChain.totalAmountOut;
|
|
104
108
|
// TODO: affiliate fees not yet here, gut feel is that Butter won't do the swap output - fees logic for us here
|
|
105
109
|
// Sanity check me when affiliates are implemented, and do the math ourselves if needed
|
|
106
|
-
const buyAmountAfterFeesCryptoBaseUnit =
|
|
110
|
+
const buyAmountAfterFeesCryptoBaseUnit = BigAmount.fromPrecision({
|
|
111
|
+
value: outputAmount,
|
|
112
|
+
precision: buyAsset.precision,
|
|
113
|
+
}).toBaseUnit();
|
|
107
114
|
const rate = getInputOutputRate({
|
|
108
115
|
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
109
116
|
buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
|
|
@@ -148,7 +155,10 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
148
155
|
}
|
|
149
156
|
const solanaTransactionMetadata = maybeSolanaTransactionMetadata?.unwrap();
|
|
150
157
|
const step = {
|
|
151
|
-
buyAmountBeforeFeesCryptoBaseUnit:
|
|
158
|
+
buyAmountBeforeFeesCryptoBaseUnit: BigAmount.fromPrecision({
|
|
159
|
+
value: outputAmount,
|
|
160
|
+
precision: buyAsset.precision,
|
|
161
|
+
}).toBaseUnit(),
|
|
152
162
|
buyAmountAfterFeesCryptoBaseUnit,
|
|
153
163
|
sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
154
164
|
feeData: {
|
|
@@ -160,13 +170,16 @@ export const getTradeQuote = async (input, _deps) => {
|
|
|
160
170
|
buyAsset,
|
|
161
171
|
sellAsset,
|
|
162
172
|
accountNumber,
|
|
163
|
-
allowanceContract: route.contract ?? '0x0',
|
|
173
|
+
allowanceContract: sellAsset.chainId === tronChainId ? buildTx.to : route.contract ?? '0x0',
|
|
164
174
|
estimatedExecutionTimeMs: route.timeEstimated * 1000,
|
|
165
175
|
butterSwapTransactionMetadata: {
|
|
166
176
|
to: buildTx.to,
|
|
167
177
|
data: buildTx.data,
|
|
168
178
|
value: buildTx.value,
|
|
169
179
|
gasLimit: bnOrZero(route.gasEstimatedTarget).toFixed(),
|
|
180
|
+
method: buildTx.method,
|
|
181
|
+
args: buildTx.args,
|
|
182
|
+
memo: buildTx.memo,
|
|
170
183
|
},
|
|
171
184
|
...(solanaTransactionMetadata && {
|
|
172
185
|
solanaTransactionMetadata,
|
|
@@ -34,6 +34,7 @@ describe('getTradeQuote', () => {
|
|
|
34
34
|
assertGetSuiChainAdapter: () => vi.fn(),
|
|
35
35
|
assertGetNearChainAdapter: () => vi.fn(),
|
|
36
36
|
assertGetStarknetChainAdapter: () => vi.fn(),
|
|
37
|
+
assertGetTonChainAdapter: () => vi.fn(),
|
|
37
38
|
config: {
|
|
38
39
|
VITE_BUTTERSWAP_CLIENT_ID: 'test',
|
|
39
40
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
|
|
2
2
|
import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
|
|
3
|
-
import {
|
|
3
|
+
import { BigAmount, bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, } from '@shapeshiftoss/utils';
|
|
4
4
|
import { Err, Ok } from '@sniptt/monads';
|
|
5
5
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
6
6
|
import { SwapperName, TradeQuoteError } from '../../../types.js';
|
|
@@ -11,29 +11,24 @@ export const getTradeRate = async (input, _deps) => {
|
|
|
11
11
|
const { sellAsset, buyAsset, affiliateBps, accountNumber, receiveAddress, sellAmountIncludingProtocolFeesCryptoBaseUnit, } = input;
|
|
12
12
|
if (!isEvmChainId(sellAsset.chainId) &&
|
|
13
13
|
sellAsset.chainId !== btcChainId &&
|
|
14
|
-
sellAsset.chainId !== solanaChainId
|
|
14
|
+
sellAsset.chainId !== solanaChainId &&
|
|
15
|
+
sellAsset.chainId !== tronChainId) {
|
|
15
16
|
return Err(makeSwapErrorRight({
|
|
16
17
|
message: `Unsupported chain`,
|
|
17
18
|
code: TradeQuoteError.UnsupportedChain,
|
|
18
19
|
}));
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
code: TradeQuoteError.UnsupportedChain,
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
const amount = bn(sellAmountIncludingProtocolFeesCryptoBaseUnit)
|
|
28
|
-
.shiftedBy(-sellAsset.precision)
|
|
29
|
-
.toString();
|
|
21
|
+
const amount = BigAmount.fromBaseUnit({
|
|
22
|
+
value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
23
|
+
precision: sellAsset.precision,
|
|
24
|
+
}).toPrecision();
|
|
30
25
|
const feeAssetId = chainIdToFeeAssetId(sellAsset.chainId);
|
|
31
26
|
const slippageTolerancePercentageDecimal = getDefaultSlippageDecimalPercentageForSwapper(SwapperName.ButterSwap);
|
|
32
27
|
const slippage = convertDecimalPercentageToBasisPoints(slippageTolerancePercentageDecimal).toString();
|
|
33
28
|
const result = await getButterRoute({
|
|
34
29
|
sellAsset,
|
|
35
30
|
buyAsset,
|
|
36
|
-
|
|
31
|
+
sellAmountCryptoPrecision: amount,
|
|
37
32
|
slippage,
|
|
38
33
|
affiliate: makeButterSwapAffiliate(affiliateBps),
|
|
39
34
|
});
|
|
@@ -43,7 +38,10 @@ export const getTradeRate = async (input, _deps) => {
|
|
|
43
38
|
const routeResponse = result.unwrap();
|
|
44
39
|
if (!isRouteSuccess(routeResponse)) {
|
|
45
40
|
if (routeResponse.errno === ButterSwapErrorCode.InsufficientAmount) {
|
|
46
|
-
const minAmountCryptoBaseUnit =
|
|
41
|
+
const minAmountCryptoBaseUnit = BigAmount.fromPrecision({
|
|
42
|
+
value: routeResponse.minAmount,
|
|
43
|
+
precision: sellAsset.precision,
|
|
44
|
+
}).toBaseUnit();
|
|
47
45
|
return Err(createTradeAmountTooSmallErr({
|
|
48
46
|
minAmountCryptoBaseUnit,
|
|
49
47
|
assetId: sellAsset.assetId,
|
|
@@ -66,7 +64,10 @@ export const getTradeRate = async (input, _deps) => {
|
|
|
66
64
|
const outputAmount = route.dstChain?.totalAmountOut ?? route.srcChain.totalAmountOut;
|
|
67
65
|
// TODO: affiliate fees not yet here, gut feel is that Butter won't do the swap output - fees logic for us here
|
|
68
66
|
// Sanity check me when affiliates are implemented, and do the math ourselves if needed
|
|
69
|
-
const buyAmountAfterFeesCryptoBaseUnit =
|
|
67
|
+
const buyAmountAfterFeesCryptoBaseUnit = BigAmount.fromPrecision({
|
|
68
|
+
value: outputAmount,
|
|
69
|
+
precision: buyAsset.precision,
|
|
70
|
+
}).toBaseUnit();
|
|
70
71
|
const rate = getInputOutputRate({
|
|
71
72
|
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
72
73
|
buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
|
|
@@ -82,12 +83,18 @@ export const getTradeRate = async (input, _deps) => {
|
|
|
82
83
|
}
|
|
83
84
|
// Map gasFee.amount to networkFeeCryptoBaseUnit using fee asset precision
|
|
84
85
|
const networkFeeCryptoBaseUnit = bnOrZero(route.gasFee?.amount).gt(0)
|
|
85
|
-
?
|
|
86
|
+
? BigAmount.fromPrecision({
|
|
87
|
+
value: route.gasFee.amount,
|
|
88
|
+
precision: feeAsset.precision,
|
|
89
|
+
}).toBaseUnit()
|
|
86
90
|
: '0';
|
|
87
91
|
// Always a single step
|
|
88
92
|
const step = {
|
|
89
93
|
rate,
|
|
90
|
-
buyAmountBeforeFeesCryptoBaseUnit:
|
|
94
|
+
buyAmountBeforeFeesCryptoBaseUnit: BigAmount.fromPrecision({
|
|
95
|
+
value: outputAmount,
|
|
96
|
+
precision: buyAsset.precision,
|
|
97
|
+
}).toBaseUnit(),
|
|
91
98
|
buyAmountAfterFeesCryptoBaseUnit,
|
|
92
99
|
sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
93
100
|
feeData: {
|
|
@@ -25,6 +25,7 @@ describe('getTradeRate', () => {
|
|
|
25
25
|
assertGetSuiChainAdapter: () => vi.fn(),
|
|
26
26
|
assertGetNearChainAdapter: () => vi.fn(),
|
|
27
27
|
assertGetStarknetChainAdapter: () => vi.fn(),
|
|
28
|
+
assertGetTonChainAdapter: () => vi.fn(),
|
|
28
29
|
config: {
|
|
29
30
|
VITE_BUTTERSWAP_CLIENT_ID: 'test',
|
|
30
31
|
},
|
|
@@ -61,6 +62,7 @@ describe('getTradeRate', () => {
|
|
|
61
62
|
assertGetSuiChainAdapter: () => vi.fn(),
|
|
62
63
|
assertGetNearChainAdapter: () => vi.fn(),
|
|
63
64
|
assertGetStarknetChainAdapter: () => vi.fn(),
|
|
65
|
+
assertGetTonChainAdapter: () => vi.fn(),
|
|
64
66
|
config: {
|
|
65
67
|
VITE_BUTTERSWAP_CLIENT_ID: 'test',
|
|
66
68
|
},
|
|
@@ -10,6 +10,7 @@ const BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID = {
|
|
|
10
10
|
43114: KnownChainIds.AvalancheMainnet,
|
|
11
11
|
1360108768460801: KnownChainIds.SolanaMainnet,
|
|
12
12
|
1360095883558913: KnownChainIds.BitcoinMainnet,
|
|
13
|
+
728126428: KnownChainIds.TronMainnet,
|
|
13
14
|
};
|
|
14
15
|
const CHAIN_ID_TO_BUTTERSWAP_CHAIN_ID = Object.entries(BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID).reduce((acc, [butterSwapChainId, chainId]) => {
|
|
15
16
|
acc[chainId] = Number(butterSwapChainId);
|
|
@@ -20,11 +20,11 @@ type ButterSwapPromise<T> = Promise<Result<T, SwapErrorRight>>;
|
|
|
20
20
|
export type GetButterRouteArgs = {
|
|
21
21
|
sellAsset: Asset;
|
|
22
22
|
buyAsset: Asset;
|
|
23
|
-
|
|
23
|
+
sellAmountCryptoPrecision: string;
|
|
24
24
|
slippage: string;
|
|
25
25
|
affiliate?: string;
|
|
26
26
|
};
|
|
27
|
-
export declare const getButterRoute: ({ sellAsset, buyAsset,
|
|
27
|
+
export declare const getButterRoute: ({ sellAsset, buyAsset, sellAmountCryptoPrecision, slippage, affiliate, }: GetButterRouteArgs) => ButterSwapPromise<RouteResponse>;
|
|
28
28
|
export type ButterBuildTxArgs = {
|
|
29
29
|
hash: string;
|
|
30
30
|
slippage: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { fromAssetId, solanaChainId } from '@shapeshiftoss/caip';
|
|
1
|
+
import { fromAssetId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
|
|
2
2
|
import { chainIdToFeeAssetId } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err, Ok } from '@sniptt/monads';
|
|
4
4
|
import { zeroAddress } from 'viem';
|
|
@@ -20,7 +20,8 @@ export var ButterSwapErrorCode;
|
|
|
20
20
|
ButterSwapErrorCode[ButterSwapErrorCode["InvalidAddress"] = 2007] = "InvalidAddress";
|
|
21
21
|
})(ButterSwapErrorCode || (ButterSwapErrorCode = {}));
|
|
22
22
|
const SOLANA_NATIVE_ADDRESS = 'So11111111111111111111111111111111111111112';
|
|
23
|
-
|
|
23
|
+
const TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
|
|
24
|
+
export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoPrecision, slippage, affiliate, }) => {
|
|
24
25
|
const butterFromChainId = chainIdToButterSwapChainId(sellAsset.chainId);
|
|
25
26
|
const butterToChainId = chainIdToButterSwapChainId(buyAsset.chainId);
|
|
26
27
|
if (!butterFromChainId || !butterToChainId) {
|
|
@@ -37,6 +38,8 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
|
|
|
37
38
|
const sellAssetAddress = (() => {
|
|
38
39
|
if (sellAsset.chainId === solanaChainId && sellAssetIsNative)
|
|
39
40
|
return SOLANA_NATIVE_ADDRESS;
|
|
41
|
+
if (sellAsset.chainId === tronChainId && sellAssetIsNative)
|
|
42
|
+
return TRON_NATIVE_ADDRESS;
|
|
40
43
|
if (sellAssetIsNative)
|
|
41
44
|
return zeroAddress;
|
|
42
45
|
return sellAssetAddressRaw;
|
|
@@ -44,6 +47,8 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
|
|
|
44
47
|
const buyAssetAddress = (() => {
|
|
45
48
|
if (buyAsset.chainId === solanaChainId && buyAssetIsNative)
|
|
46
49
|
return SOLANA_NATIVE_ADDRESS;
|
|
50
|
+
if (buyAsset.chainId === tronChainId && buyAssetIsNative)
|
|
51
|
+
return TRON_NATIVE_ADDRESS;
|
|
47
52
|
if (buyAssetIsNative)
|
|
48
53
|
return zeroAddress;
|
|
49
54
|
return buyAssetAddressRaw;
|
|
@@ -54,7 +59,7 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
|
|
|
54
59
|
tokenInAddress: sellAssetAddress,
|
|
55
60
|
toChainId: butterToChainId,
|
|
56
61
|
tokenOutAddress: buyAssetAddress,
|
|
57
|
-
amount:
|
|
62
|
+
amount: sellAmountCryptoPrecision,
|
|
58
63
|
type: 'exactIn',
|
|
59
64
|
slippage,
|
|
60
65
|
entrance: 'shapeshift',
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getProvidersExcluding } from '@cetusprotocol/aggregator-sdk';
|
|
2
|
-
import { Transaction } from '@
|
|
2
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
3
|
+
import { toAddressNList } from '@shapeshiftoss/chain-adapters';
|
|
3
4
|
import { TxStatus } from '@shapeshiftoss/unchained-client';
|
|
4
5
|
import { bnOrZero } from '@shapeshiftoss/utils';
|
|
5
6
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../constants.js';
|
|
@@ -51,13 +52,7 @@ export const cetusApi = {
|
|
|
51
52
|
intentMessage[2] = 0;
|
|
52
53
|
intentMessage.set(transactionBytes, 3);
|
|
53
54
|
const bip44Params = adapter.getBip44Params({ accountNumber });
|
|
54
|
-
const addressNList =
|
|
55
|
-
bip44Params.purpose,
|
|
56
|
-
bip44Params.coinType,
|
|
57
|
-
bip44Params.accountNumber,
|
|
58
|
-
...(bip44Params.isChange !== undefined ? [bip44Params.isChange ? 1 : 0] : []),
|
|
59
|
-
...(bip44Params.addressIndex !== undefined ? [bip44Params.addressIndex] : []),
|
|
60
|
-
];
|
|
55
|
+
const addressNList = toAddressNList(bip44Params);
|
|
61
56
|
return {
|
|
62
57
|
addressNList,
|
|
63
58
|
intentMessageBytes: intentMessage,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Transaction } from '@
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
2
|
import { bnOrZero } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err } from '@sniptt/monads';
|
|
4
4
|
import { v4 as uuid } from 'uuid';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Transaction } from '@
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
2
|
import { bnOrZero } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err } from '@sniptt/monads';
|
|
4
4
|
import { v4 as uuid } from 'uuid';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CHAIN_NAMESPACE, fromAssetId, solAssetId } from '@shapeshiftoss/caip';
|
|
2
|
-
import { assertUnreachable,
|
|
2
|
+
import { assertUnreachable, BigAmount, bnOrZero } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err, Ok } from '@sniptt/monads';
|
|
4
4
|
import { v4 as uuid } from 'uuid';
|
|
5
5
|
import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
|
|
@@ -66,11 +66,11 @@ export const getQuoteOrRate = async (input, deps) => {
|
|
|
66
66
|
if (maybeQuoteResponse.isErr()) {
|
|
67
67
|
const error = maybeQuoteResponse.unwrapErr();
|
|
68
68
|
const cause = error.cause;
|
|
69
|
-
if (cause
|
|
70
|
-
cause
|
|
69
|
+
if (cause?.message?.includes('code 400') &&
|
|
70
|
+
cause?.response?.data?.detail?.includes('Amount outside asset bounds')) {
|
|
71
71
|
return Err(createTradeAmountTooSmallErr({
|
|
72
72
|
assetId: sellAsset.assetId,
|
|
73
|
-
minAmountCryptoBaseUnit: cause.response?.data
|
|
73
|
+
minAmountCryptoBaseUnit: cause.response?.data?.errors?.minimalAmountNative?.[0],
|
|
74
74
|
}));
|
|
75
75
|
}
|
|
76
76
|
return Err(makeSwapErrorRight({
|
|
@@ -199,7 +199,10 @@ export const getQuoteOrRate = async (input, deps) => {
|
|
|
199
199
|
const boostRate = getChainflipQuoteRate(singleQuoteResponse.boostQuote.ingressAmountNative, singleQuoteResponse.boostQuote.egressAmountNative);
|
|
200
200
|
// This is not really a buyAmount before fees but rather an input/output calculation to get the sell amount
|
|
201
201
|
// prorated to the buy asset price to determine price impact
|
|
202
|
-
const buyAmountBeforeFeesCryptoBaseUnit =
|
|
202
|
+
const buyAmountBeforeFeesCryptoBaseUnit = BigAmount.fromPrecision({
|
|
203
|
+
value: bnOrZero(singleQuoteResponse.boostQuote.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)),
|
|
204
|
+
precision: buyAsset.precision,
|
|
205
|
+
}).toBaseUnit();
|
|
203
206
|
const boostTradeRateOrQuote = {
|
|
204
207
|
id: uuid(),
|
|
205
208
|
rate: boostRate,
|
|
@@ -246,7 +249,10 @@ export const getQuoteOrRate = async (input, deps) => {
|
|
|
246
249
|
: '0';
|
|
247
250
|
// This is not really a buyAmount before fees but rather an input/output calculation to get the sell amount
|
|
248
251
|
// prorated to the buy asset price to determine price impact
|
|
249
|
-
const buyAmountBeforeFeesCryptoBaseUnit =
|
|
252
|
+
const buyAmountBeforeFeesCryptoBaseUnit = BigAmount.fromPrecision({
|
|
253
|
+
value: bnOrZero(singleQuoteResponse.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)),
|
|
254
|
+
precision: buyAsset.precision,
|
|
255
|
+
}).toBaseUnit();
|
|
250
256
|
const tradeRateOrQuote = {
|
|
251
257
|
id: uuid(),
|
|
252
258
|
rate,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromAssetId } from '@shapeshiftoss/caip';
|
|
2
|
-
import { bn, bnOrZero,
|
|
2
|
+
import { BigAmount, bn, bnOrZero, isToken } from '@shapeshiftoss/utils';
|
|
3
3
|
import { Err, Ok } from '@sniptt/monads';
|
|
4
4
|
import { TradeQuoteError } from '../../../types.js';
|
|
5
5
|
import { makeSwapErrorRight } from '../../../utils.js';
|
|
@@ -15,8 +15,14 @@ export const isSupportedAssetId = (chainId, assetId) => {
|
|
|
15
15
|
return supportedAssetIds.includes(assetId);
|
|
16
16
|
};
|
|
17
17
|
export const calculateChainflipMinPrice = ({ sellAmountIncludingProtocolFeesCryptoBaseUnit, buyAmountAfterFeesCryptoBaseUnit, slippageTolerancePercentageDecimal, sellAsset, buyAsset, }) => {
|
|
18
|
-
const sellAmountCryptoPrecision = fromBaseUnit(
|
|
19
|
-
|
|
18
|
+
const sellAmountCryptoPrecision = BigAmount.fromBaseUnit({
|
|
19
|
+
value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
20
|
+
precision: sellAsset.precision,
|
|
21
|
+
}).toPrecision();
|
|
22
|
+
const buyAmountCryptoPrecision = BigAmount.fromBaseUnit({
|
|
23
|
+
value: buyAmountAfterFeesCryptoBaseUnit,
|
|
24
|
+
precision: buyAsset.precision,
|
|
25
|
+
}).toPrecision();
|
|
20
26
|
const estimatedPrice = bn(buyAmountCryptoPrecision).div(sellAmountCryptoPrecision);
|
|
21
27
|
// This is called minimumPrice upstream but this really is a rate, let's not honour confusing terminology
|
|
22
28
|
const minimumRate = estimatedPrice
|
|
@@ -9,7 +9,7 @@ export const cowSwapper = {
|
|
|
9
9
|
throw Error('Missing appDataHash');
|
|
10
10
|
const signature = await signCowOrder(orderToSign, chainId, signMessage);
|
|
11
11
|
const network = assertGetCowNetwork(chainId);
|
|
12
|
-
const maybeOrdersResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/orders
|
|
12
|
+
const maybeOrdersResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/orders`, {
|
|
13
13
|
...orderToSign,
|
|
14
14
|
signingScheme: SigningScheme.EIP712,
|
|
15
15
|
signature,
|
|
@@ -39,7 +39,7 @@ export async function getCowSwapTradeQuote(input, config) {
|
|
|
39
39
|
});
|
|
40
40
|
const { appData, appDataHash } = await getFullAppData(slippageTolerancePercentageDecimal, affiliateAppDataFragment, 'market');
|
|
41
41
|
// https://api.cow.fi/docs/#/default/post_api_v1_quote
|
|
42
|
-
const maybeQuoteResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/quote
|
|
42
|
+
const maybeQuoteResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/quote`, {
|
|
43
43
|
sellToken: fromAssetId(sellAsset.assetId).assetReference,
|
|
44
44
|
buyToken,
|
|
45
45
|
receiver: receiveAddress,
|