@shapeshiftoss/swapper 20.4.0 → 20.6.0
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 +6 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossStepData.js +7 -15
- package/dist/cjs/swappers/AvnuSwapper/endpoints.js +17 -12
- package/dist/cjs/swappers/BebopSwapper/utils/getBebopStepData.js +17 -22
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
- package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.js +3 -4
- package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
- package/dist/cjs/swappers/CetusSwapper/endpoints.js +2 -3
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
- package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +1 -2
- package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +0 -1
- package/dist/cjs/swappers/CetusSwapper/utils/constants.js +1 -2
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
- package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +6 -17
- package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
- package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
- package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
- package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.js +5 -7
- package/dist/cjs/swappers/KyberSwapper/KyberSwapper.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/KyberSwapper.js +5 -0
- package/dist/cjs/swappers/KyberSwapper/endpoints.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/endpoints.js +14 -0
- package/dist/cjs/swappers/KyberSwapper/index.d.ts +2 -0
- package/dist/cjs/swappers/KyberSwapper/index.js +7 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +64 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
- package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +31 -0
- package/dist/cjs/swappers/KyberSwapper/types.d.ts +62 -0
- package/dist/cjs/swappers/KyberSwapper/types.js +2 -0
- package/dist/cjs/swappers/KyberSwapper/utils/constants.d.ts +22 -0
- package/dist/cjs/swappers/KyberSwapper/utils/constants.js +25 -0
- package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
- package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.js +38 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.js +47 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.js +92 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
- package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.js +63 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.js +172 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.js +110 -0
- package/dist/cjs/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
- package/dist/cjs/swappers/KyberSwapper/utils/kyberService.js +9 -0
- package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
- package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +13 -14
- package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +4 -4
- package/dist/cjs/swappers/NearIntentsSwapper/types.js +2 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +28 -0
- package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
- package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.js +36 -55
- package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
- package/dist/cjs/swappers/RelaySwapper/constant.js +1 -0
- package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.js +7 -15
- package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +5 -0
- package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
- package/dist/cjs/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -2
- package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +3 -1
- package/dist/cjs/swappers/ZrxSwapper/types.d.ts +1 -1
- package/dist/cjs/swappers/ZrxSwapper/types.js +1 -0
- package/dist/cjs/swappers/ZrxSwapper/utils/constants.js +1 -0
- package/dist/cjs/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
- package/dist/cjs/swappers/ZrxSwapper/utils/getZrxStepData.js +29 -10
- package/dist/cjs/swappers/ZrxSwapper/utils/helpers.d.ts +1 -1
- package/dist/cjs/swappers/ZrxSwapper/utils/helpers.js +5 -0
- package/dist/cjs/types.d.ts +36 -8
- package/dist/cjs/types.js +1 -0
- package/dist/cjs/utils/aptos/constants.d.ts +2 -0
- package/dist/cjs/utils/aptos/constants.js +7 -0
- package/dist/cjs/utils/aptos/getAptosTransactionFees.d.ts +2 -0
- package/dist/cjs/utils/aptos/getAptosTransactionFees.js +13 -0
- package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
- package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.js +16 -0
- package/dist/cjs/utils/aptos/index.d.ts +3 -0
- package/dist/cjs/utils/aptos/index.js +19 -0
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +45 -35
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
- package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +103 -0
- package/dist/cjs/utils/evm/stateOverride.d.ts +3 -0
- package/dist/cjs/utils/evm/stateOverride.js +10 -4
- package/dist/cjs/utils/helpers.js +2 -0
- package/dist/cjs/utils/helpers.test.js +2 -0
- package/dist/cjs/utils/index.d.ts +3 -2
- package/dist/cjs/utils/index.js +11 -27
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/constants.js +6 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/swappers/AcrossSwapper/utils/getAcrossStepData.js +8 -16
- package/dist/esm/swappers/AvnuSwapper/endpoints.js +18 -13
- package/dist/esm/swappers/BebopSwapper/utils/getBebopStepData.js +18 -23
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
- package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
- package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.js +4 -5
- package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
- package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -4
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
- package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +2 -3
- package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +0 -1
- package/dist/esm/swappers/CetusSwapper/utils/constants.js +0 -1
- package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
- package/dist/esm/swappers/CetusSwapper/utils/helpers.js +4 -15
- package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
- package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
- package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
- package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.js +6 -8
- package/dist/esm/swappers/KyberSwapper/KyberSwapper.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/KyberSwapper.js +2 -0
- package/dist/esm/swappers/KyberSwapper/endpoints.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/endpoints.js +11 -0
- package/dist/esm/swappers/KyberSwapper/index.d.ts +2 -0
- package/dist/esm/swappers/KyberSwapper/index.js +2 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +60 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
- package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +27 -0
- package/dist/esm/swappers/KyberSwapper/types.d.ts +62 -0
- package/dist/esm/swappers/KyberSwapper/types.js +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/constants.d.ts +22 -0
- package/dist/esm/swappers/KyberSwapper/utils/constants.js +22 -0
- package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
- package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.js +33 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.js +43 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.js +90 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
- package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.js +59 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.js +158 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
- package/dist/esm/swappers/KyberSwapper/utils/helpers.test.js +108 -0
- package/dist/esm/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
- package/dist/esm/swappers/KyberSwapper/utils/kyberService.js +3 -0
- package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
- package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +13 -14
- package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
- package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +4 -4
- package/dist/esm/swappers/NearIntentsSwapper/types.js +2 -0
- package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +29 -1
- package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
- package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.js +34 -53
- package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
- package/dist/esm/swappers/RelaySwapper/constant.js +2 -1
- package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.js +9 -17
- package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +5 -0
- package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
- package/dist/esm/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -2
- package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +3 -1
- package/dist/esm/swappers/ZrxSwapper/types.d.ts +1 -1
- package/dist/esm/swappers/ZrxSwapper/types.js +1 -0
- package/dist/esm/swappers/ZrxSwapper/utils/constants.js +1 -0
- package/dist/esm/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
- package/dist/esm/swappers/ZrxSwapper/utils/getZrxStepData.js +31 -12
- package/dist/esm/swappers/ZrxSwapper/utils/helpers.d.ts +1 -1
- package/dist/esm/swappers/ZrxSwapper/utils/helpers.js +5 -0
- package/dist/esm/types.d.ts +36 -8
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/aptos/constants.d.ts +2 -0
- package/dist/esm/utils/aptos/constants.js +4 -0
- package/dist/esm/utils/aptos/getAptosTransactionFees.d.ts +2 -0
- package/dist/esm/utils/aptos/getAptosTransactionFees.js +9 -0
- package/dist/esm/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
- package/dist/esm/utils/aptos/getUnsignedAptosTransaction.js +12 -0
- package/dist/esm/utils/aptos/index.d.ts +3 -0
- package/dist/esm/utils/aptos/index.js +3 -0
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +42 -35
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
- package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +101 -0
- package/dist/esm/utils/evm/stateOverride.d.ts +3 -0
- package/dist/esm/utils/evm/stateOverride.js +8 -3
- package/dist/esm/utils/helpers.js +3 -1
- package/dist/esm/utils/helpers.test.js +2 -0
- package/dist/esm/utils/index.d.ts +3 -2
- package/dist/esm/utils/index.js +9 -26
- package/package.json +10 -11
|
@@ -0,0 +1,172 @@
|
|
|
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.validateKyberBuild = exports.validateKyberRoute = exports.getKyberRequestError = exports.getKyberTradeAmounts = exports.getKyberBuyAmountBeforeFees = exports.getKyberFeeParams = exports.assetIdToKyberToken = exports.assertValidTrade = void 0;
|
|
7
|
+
const caip_1 = require("@shapeshiftoss/caip");
|
|
8
|
+
const utils_1 = require("@shapeshiftoss/utils");
|
|
9
|
+
const monads_1 = require("@sniptt/monads");
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
const viem_1 = require("viem");
|
|
12
|
+
const types_1 = require("../../../types");
|
|
13
|
+
const utils_2 = require("../../../utils");
|
|
14
|
+
const affiliateFee_1 = require("../../../utils/affiliateFee");
|
|
15
|
+
const helpers_1 = require("../../../utils/helpers");
|
|
16
|
+
const constants_1 = require("./constants");
|
|
17
|
+
const isKyberSupportedChainId = (chainId) => chainId in constants_1.KYBER_CHAINS;
|
|
18
|
+
const invalidResponse = (message, details) => (0, utils_2.makeSwapErrorRight)({ message, details, code: types_1.TradeQuoteError.InvalidResponse });
|
|
19
|
+
const assertValidTrade = ({ sellAsset, buyAsset, }) => {
|
|
20
|
+
if (sellAsset.chainId !== buyAsset.chainId) {
|
|
21
|
+
return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
|
|
22
|
+
message: 'KyberSwap does not support cross-chain trades',
|
|
23
|
+
code: types_1.TradeQuoteError.CrossChainNotSupported,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
if (!isKyberSupportedChainId(sellAsset.chainId)) {
|
|
27
|
+
return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
|
|
28
|
+
message: 'KyberSwap only supports configured EVM chains',
|
|
29
|
+
code: types_1.TradeQuoteError.UnsupportedChain,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
return (0, monads_1.Ok)(sellAsset.chainId);
|
|
33
|
+
};
|
|
34
|
+
exports.assertValidTrade = assertValidTrade;
|
|
35
|
+
const assetIdToKyberToken = (assetId) => (0, helpers_1.isNativeEvmAsset)(assetId) ? constants_1.KYBER_NATIVE_TOKEN : (0, viem_1.getAddress)((0, caip_1.fromAssetId)(assetId).assetReference);
|
|
36
|
+
exports.assetIdToKyberToken = assetIdToKyberToken;
|
|
37
|
+
const getKyberFeeParams = ({ chainId, affiliateBps, }) => {
|
|
38
|
+
if ((0, utils_1.bnOrZero)(affiliateBps).lte(0))
|
|
39
|
+
return undefined;
|
|
40
|
+
return {
|
|
41
|
+
feeAmount: affiliateBps,
|
|
42
|
+
chargeFeeBy: 'currency_out',
|
|
43
|
+
isInBps: true,
|
|
44
|
+
feeReceiver: (0, viem_1.getAddress)((0, helpers_1.getTreasuryAddressFromChainId)(chainId)),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
exports.getKyberFeeParams = getKyberFeeParams;
|
|
48
|
+
// Kyber only returns the post-fee amountOut; the inverse is at most one base unit off
|
|
49
|
+
const getKyberBuyAmountBeforeFees = ({ buyAmountAfterFeesCryptoBaseUnit, affiliateBps, }) => {
|
|
50
|
+
if ((0, utils_1.bnOrZero)(affiliateBps).lte(0))
|
|
51
|
+
return buyAmountAfterFeesCryptoBaseUnit;
|
|
52
|
+
return (0, utils_1.bn)(buyAmountAfterFeesCryptoBaseUnit)
|
|
53
|
+
.times(10_000)
|
|
54
|
+
.div((0, utils_1.bn)(10_000).minus(affiliateBps))
|
|
55
|
+
.integerValue(utils_1.BigNumber.ROUND_DOWN)
|
|
56
|
+
.toFixed();
|
|
57
|
+
};
|
|
58
|
+
exports.getKyberBuyAmountBeforeFees = getKyberBuyAmountBeforeFees;
|
|
59
|
+
const getKyberTradeAmounts = ({ input, amountOut, }) => {
|
|
60
|
+
const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, affiliateBps } = input;
|
|
61
|
+
const buyAmountAfterFeesCryptoBaseUnit = amountOut;
|
|
62
|
+
const buyAmountBeforeFeesCryptoBaseUnit = (0, exports.getKyberBuyAmountBeforeFees)({
|
|
63
|
+
buyAmountAfterFeesCryptoBaseUnit,
|
|
64
|
+
affiliateBps,
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
rate: (0, utils_2.getInputOutputRate)({
|
|
68
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
69
|
+
buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
|
|
70
|
+
sellAsset,
|
|
71
|
+
buyAsset,
|
|
72
|
+
}),
|
|
73
|
+
buyAmountBeforeFeesCryptoBaseUnit,
|
|
74
|
+
buyAmountAfterFeesCryptoBaseUnit,
|
|
75
|
+
affiliateFee: (0, affiliateFee_1.buildAffiliateFee)({
|
|
76
|
+
strategy: 'buy_asset',
|
|
77
|
+
affiliateBps,
|
|
78
|
+
sellAsset,
|
|
79
|
+
buyAsset,
|
|
80
|
+
sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
|
|
81
|
+
buyAmountCryptoBaseUnit: buyAmountBeforeFeesCryptoBaseUnit,
|
|
82
|
+
}),
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
exports.getKyberTradeAmounts = getKyberTradeAmounts;
|
|
86
|
+
const getKyberCodeError = ({ code, message, requestId }) => {
|
|
87
|
+
const tradeQuoteError = (() => {
|
|
88
|
+
switch (code) {
|
|
89
|
+
case 4008:
|
|
90
|
+
case 4009:
|
|
91
|
+
case 4010:
|
|
92
|
+
return types_1.TradeQuoteError.NoRouteFound;
|
|
93
|
+
case 4011:
|
|
94
|
+
case 4221:
|
|
95
|
+
return types_1.TradeQuoteError.UnsupportedTradePair;
|
|
96
|
+
case 4005:
|
|
97
|
+
case 4007:
|
|
98
|
+
return types_1.TradeQuoteError.SellAmountBelowTradeFee;
|
|
99
|
+
default:
|
|
100
|
+
return types_1.TradeQuoteError.QueryFailed;
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
return (0, utils_2.makeSwapErrorRight)({
|
|
104
|
+
message: `KyberSwap request failed: ${message}`,
|
|
105
|
+
code: tradeQuoteError,
|
|
106
|
+
details: { code, requestId },
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
const isKyberErrorResponse = (value) => typeof value === 'object' &&
|
|
110
|
+
value !== null &&
|
|
111
|
+
'code' in value &&
|
|
112
|
+
typeof value.code === 'number' &&
|
|
113
|
+
'message' in value &&
|
|
114
|
+
typeof value.message === 'string';
|
|
115
|
+
const getKyberRequestError = (error) => {
|
|
116
|
+
const { cause } = error;
|
|
117
|
+
if (!axios_1.default.isAxiosError(cause))
|
|
118
|
+
return error;
|
|
119
|
+
const status = cause.response?.status;
|
|
120
|
+
if (status === 429) {
|
|
121
|
+
return (0, utils_2.makeSwapErrorRight)({
|
|
122
|
+
message: 'KyberSwap rate limit exceeded',
|
|
123
|
+
code: types_1.TradeQuoteError.RateLimitExceeded,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (status === 404) {
|
|
127
|
+
return (0, utils_2.makeSwapErrorRight)({
|
|
128
|
+
message: 'KyberSwap does not serve this chain',
|
|
129
|
+
code: types_1.TradeQuoteError.UnsupportedChain,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const body = cause.response?.data;
|
|
133
|
+
if (isKyberErrorResponse(body))
|
|
134
|
+
return getKyberCodeError(body);
|
|
135
|
+
return (0, utils_2.makeSwapErrorRight)({
|
|
136
|
+
message: `KyberSwap request failed with status ${status}`,
|
|
137
|
+
code: types_1.TradeQuoteError.QueryFailed,
|
|
138
|
+
cause,
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
exports.getKyberRequestError = getKyberRequestError;
|
|
142
|
+
const isPinnedRouter = (routerAddress) => (0, viem_1.isAddress)(routerAddress) && (0, viem_1.isAddressEqual)(routerAddress, constants_1.KYBER_ROUTER_ADDRESS);
|
|
143
|
+
const unpinnedRouterError = (routerAddress) => invalidResponse(`KyberSwap router ${routerAddress} is not the pinned router`);
|
|
144
|
+
const validateKyberRoute = (response, feeParams) => {
|
|
145
|
+
if (response.code !== 0)
|
|
146
|
+
return (0, monads_1.Err)(getKyberCodeError(response));
|
|
147
|
+
if (!response.data)
|
|
148
|
+
return (0, monads_1.Err)(invalidResponse('KyberSwap returned no route'));
|
|
149
|
+
const { routeSummary, routerAddress } = response.data;
|
|
150
|
+
if (!isPinnedRouter(routerAddress))
|
|
151
|
+
return (0, monads_1.Err)(unpinnedRouterError(routerAddress));
|
|
152
|
+
// Kyber skips the integrator fee on wrap and unwrap routes, so reject them rather than swap fee-free
|
|
153
|
+
if (feeParams && routeSummary.extraFee.feeAmount === '') {
|
|
154
|
+
return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
|
|
155
|
+
message: 'Wrapping or unwrapping the native asset is not supported through KyberSwap',
|
|
156
|
+
code: types_1.TradeQuoteError.UnsupportedTradePair,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
return (0, monads_1.Ok)(routeSummary);
|
|
160
|
+
};
|
|
161
|
+
exports.validateKyberRoute = validateKyberRoute;
|
|
162
|
+
const validateKyberBuild = (response) => {
|
|
163
|
+
if (response.code !== 0)
|
|
164
|
+
return (0, monads_1.Err)(getKyberCodeError(response));
|
|
165
|
+
if (!response.data)
|
|
166
|
+
return (0, monads_1.Err)(invalidResponse('KyberSwap returned no transaction'));
|
|
167
|
+
const { routerAddress } = response.data;
|
|
168
|
+
if (!isPinnedRouter(routerAddress))
|
|
169
|
+
return (0, monads_1.Err)(unpinnedRouterError(routerAddress));
|
|
170
|
+
return (0, monads_1.Ok)(response.data);
|
|
171
|
+
};
|
|
172
|
+
exports.validateKyberBuild = validateKyberBuild;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("@shapeshiftoss/types");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const types_2 = require("../../../types");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
const TREASURY = '0xF5AA59151bE6515C4Ca68A0282CF68B3eA4846fC';
|
|
9
|
+
const UNPINNED_ROUTER = '0x1111111111111111111111111111111111111111';
|
|
10
|
+
const EMPTY_EXTRA_FEE = {
|
|
11
|
+
feeAmount: '',
|
|
12
|
+
chargeFeeBy: '',
|
|
13
|
+
isInBps: false,
|
|
14
|
+
feeReceiver: '',
|
|
15
|
+
};
|
|
16
|
+
const hyperEvmFeeParams = (0, helpers_1.getKyberFeeParams)({
|
|
17
|
+
chainId: types_1.KnownChainIds.HyperEvmMainnet,
|
|
18
|
+
affiliateBps: '60',
|
|
19
|
+
});
|
|
20
|
+
const ROUTE = {
|
|
21
|
+
amountOut: '255332541',
|
|
22
|
+
gas: '679101',
|
|
23
|
+
gasPrice: '100000000',
|
|
24
|
+
extraFee: {
|
|
25
|
+
feeAmount: '60',
|
|
26
|
+
chargeFeeBy: 'currency_out',
|
|
27
|
+
isInBps: true,
|
|
28
|
+
feeReceiver: TREASURY.toLowerCase(),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const ROUTES_RESPONSE = {
|
|
32
|
+
code: 0,
|
|
33
|
+
message: 'successfully',
|
|
34
|
+
data: { routeSummary: ROUTE, routerAddress: constants_1.KYBER_ROUTER_ADDRESS },
|
|
35
|
+
requestId: 'route-request',
|
|
36
|
+
};
|
|
37
|
+
const BUILD_RESPONSE = {
|
|
38
|
+
code: 0,
|
|
39
|
+
message: 'successfully',
|
|
40
|
+
data: {
|
|
41
|
+
amountOut: '255332539',
|
|
42
|
+
gas: '679101',
|
|
43
|
+
data: '0xe21fd0e9',
|
|
44
|
+
routerAddress: constants_1.KYBER_ROUTER_ADDRESS,
|
|
45
|
+
transactionValue: '3000000000000000000',
|
|
46
|
+
},
|
|
47
|
+
requestId: 'build-request',
|
|
48
|
+
};
|
|
49
|
+
(0, vitest_1.describe)('getKyberFeeParams', () => {
|
|
50
|
+
(0, vitest_1.it)('sends no fee for a fee-free swap', () => {
|
|
51
|
+
(0, vitest_1.expect)((0, helpers_1.getKyberFeeParams)({ chainId: types_1.KnownChainIds.HyperEvmMainnet, affiliateBps: '0' })).toBeUndefined();
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('charges the output in bps to the chain treasury', () => {
|
|
54
|
+
(0, vitest_1.expect)(hyperEvmFeeParams).toEqual({
|
|
55
|
+
feeAmount: '60',
|
|
56
|
+
chargeFeeBy: 'currency_out',
|
|
57
|
+
isInBps: true,
|
|
58
|
+
feeReceiver: TREASURY,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.describe)('getKyberBuyAmountBeforeFees', () => {
|
|
63
|
+
vitest_1.it.each([
|
|
64
|
+
['255332541', '60', '256873783'],
|
|
65
|
+
['54334339666759063267443', '60', '54662313548047347351552'],
|
|
66
|
+
['123', '0', '123'],
|
|
67
|
+
])('grosses up %s at %s bps to %s', (buyAmountAfterFeesCryptoBaseUnit, affiliateBps, gross) => {
|
|
68
|
+
(0, vitest_1.expect)((0, helpers_1.getKyberBuyAmountBeforeFees)({ buyAmountAfterFeesCryptoBaseUnit, affiliateBps })).toBe(gross);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.describe)('validateKyberRoute', () => {
|
|
72
|
+
const validate = (summaryOverrides, dataOverrides = {}, feeParams = hyperEvmFeeParams) => (0, helpers_1.validateKyberRoute)({
|
|
73
|
+
...ROUTES_RESPONSE,
|
|
74
|
+
data: {
|
|
75
|
+
...ROUTES_RESPONSE.data,
|
|
76
|
+
routeSummary: { ...ROUTE, ...summaryOverrides },
|
|
77
|
+
...dataOverrides,
|
|
78
|
+
},
|
|
79
|
+
}, feeParams);
|
|
80
|
+
(0, vitest_1.it)('returns the route summary', () => {
|
|
81
|
+
(0, vitest_1.expect)((0, helpers_1.validateKyberRoute)(ROUTES_RESPONSE, hyperEvmFeeParams).unwrap()).toBe(ROUTE);
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.it)('rejects an unpinned router', () => {
|
|
84
|
+
(0, vitest_1.expect)(validate({}, { routerAddress: UNPINNED_ROUTER }).unwrapErr().code).toBe(types_2.TradeQuoteError.InvalidResponse);
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)('rejects a route that dropped the requested fee', () => {
|
|
87
|
+
(0, vitest_1.expect)(validate({ extraFee: EMPTY_EXTRA_FEE }).unwrapErr().code).toBe(types_2.TradeQuoteError.UnsupportedTradePair);
|
|
88
|
+
});
|
|
89
|
+
(0, vitest_1.it)('accepts a fee-free route when no fee was requested', () => {
|
|
90
|
+
(0, vitest_1.expect)((0, helpers_1.validateKyberRoute)({
|
|
91
|
+
...ROUTES_RESPONSE,
|
|
92
|
+
data: {
|
|
93
|
+
...ROUTES_RESPONSE.data,
|
|
94
|
+
routeSummary: { ...ROUTE, extraFee: EMPTY_EXTRA_FEE },
|
|
95
|
+
},
|
|
96
|
+
}, undefined).isOk()).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.describe)('validateKyberBuild', () => {
|
|
100
|
+
(0, vitest_1.it)('returns the build data', () => {
|
|
101
|
+
(0, vitest_1.expect)((0, helpers_1.validateKyberBuild)(BUILD_RESPONSE).unwrap()).toBe(BUILD_RESPONSE.data);
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('rejects an unpinned router', () => {
|
|
104
|
+
const result = (0, helpers_1.validateKyberBuild)({
|
|
105
|
+
...BUILD_RESPONSE,
|
|
106
|
+
data: { ...BUILD_RESPONSE.data, routerAddress: UNPINNED_ROUTER },
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.expect)(result.unwrapErr().code).toBe(types_2.TradeQuoteError.InvalidResponse);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const kyberService: {
|
|
2
|
+
get: <T = any>(url: string, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../..").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("../../..").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("../../..").SwapErrorRight>>;
|
|
5
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
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.kyberService = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const utils_1 = require("../../../utils");
|
|
9
|
+
exports.kyberService = (0, utils_1.makeSwapperAxiosServiceMonadic)(axios_1.default.create({ timeout: 10_000 }));
|
|
@@ -11,6 +11,7 @@ exports.nearIntentsSwapper = {
|
|
|
11
11
|
executeSuiTransaction: utils_1.executeSuiTransaction,
|
|
12
12
|
executeNearTransaction: utils_1.executeNearTransaction,
|
|
13
13
|
executeTonTransaction: utils_1.executeTonTransaction,
|
|
14
|
+
executeAptosTransaction: utils_1.executeAptosTransaction,
|
|
14
15
|
executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
|
|
15
16
|
return signAndBroadcastTransaction(txToSign);
|
|
16
17
|
},
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.nearIntentsApi = void 0;
|
|
4
4
|
const utils_1 = require("@shapeshiftoss/utils");
|
|
5
5
|
const utils_2 = require("../../utils");
|
|
6
|
+
const aptos_1 = require("../../utils/aptos");
|
|
6
7
|
const evm_1 = require("../../utils/evm");
|
|
7
8
|
const solana_1 = require("../../utils/solana");
|
|
8
9
|
const tron_1 = require("../../utils/tron");
|
|
@@ -87,7 +88,7 @@ exports.nearIntentsApi = {
|
|
|
87
88
|
}
|
|
88
89
|
return Promise.resolve(step.feeData.networkFeeCryptoBaseUnit);
|
|
89
90
|
},
|
|
90
|
-
getUnsignedStarknetTransaction: async ({ stepIndex, tradeQuote, from, assertGetStarknetChainAdapter, }) => {
|
|
91
|
+
getUnsignedStarknetTransaction: async ({ stepIndex, tradeQuote, from, callsOnly, assertGetStarknetChainAdapter, }) => {
|
|
91
92
|
if (!(0, utils_2.isExecutableTradeQuote)(tradeQuote))
|
|
92
93
|
throw new Error('Unable to execute a trade rate quote');
|
|
93
94
|
const step = (0, utils_2.getExecutableTradeStep)(tradeQuote, stepIndex);
|
|
@@ -97,24 +98,20 @@ exports.nearIntentsApi = {
|
|
|
97
98
|
const to = depositAddress;
|
|
98
99
|
const value = step.sellAmountIncludingProtocolFeesCryptoBaseUnit;
|
|
99
100
|
const tokenContractAddress = (0, utils_1.contractAddressOrUndefined)(sellAsset.assetId);
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
tokenContractAddress,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
});
|
|
101
|
+
const maxFee = callsOnly
|
|
102
|
+
? undefined
|
|
103
|
+
: (await adapter.getFeeData({
|
|
104
|
+
to,
|
|
105
|
+
value,
|
|
106
|
+
chainSpecific: { from, tokenContractAddress },
|
|
107
|
+
sendMax: false,
|
|
108
|
+
})).fast.chainSpecific.maxFee;
|
|
109
109
|
return adapter.buildSendApiTransaction({
|
|
110
110
|
from,
|
|
111
111
|
to,
|
|
112
112
|
value,
|
|
113
113
|
accountNumber,
|
|
114
|
-
chainSpecific: {
|
|
115
|
-
tokenContractAddress,
|
|
116
|
-
maxFee: fast.chainSpecific.maxFee,
|
|
117
|
-
},
|
|
114
|
+
chainSpecific: { tokenContractAddress, maxFee, callsOnly },
|
|
118
115
|
});
|
|
119
116
|
},
|
|
120
117
|
getStarknetTransactionFees: ({ tradeQuote, stepIndex }) => {
|
|
@@ -156,6 +153,8 @@ exports.nearIntentsApi = {
|
|
|
156
153
|
}
|
|
157
154
|
return Promise.resolve(step.feeData.networkFeeCryptoBaseUnit);
|
|
158
155
|
},
|
|
156
|
+
getUnsignedAptosTransaction: aptos_1.getUnsignedAptosTransaction,
|
|
157
|
+
getAptosTransactionFees: aptos_1.getAptosTransactionFees,
|
|
159
158
|
checkTradeStatus: async ({ config, swap }) => {
|
|
160
159
|
if (!swap)
|
|
161
160
|
throw new Error('Missing swap');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KnownChainIds } from '@shapeshiftoss/types';
|
|
2
|
-
import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput, GetNearTradeQuoteInput, GetNearTradeRateInput, GetSolanaTradeQuoteInput, GetSolanaTradeRateInput, GetStarknetTradeQuoteInput, GetStarknetTradeRateInput, GetSuiTradeQuoteInput, GetSuiTradeRateInput, GetTonTradeQuoteInput, GetTonTradeRateInput, GetTronTradeQuoteInput, GetTronTradeRateInput, GetUtxoTradeQuoteInput, GetUtxoTradeRateInput, WithExactBuyAmount } from '../../types';
|
|
3
|
-
export type NearIntentsTradeQuoteInput = GetEvmTradeQuoteInput | GetUtxoTradeQuoteInput | GetSolanaTradeQuoteInput | GetTronTradeQuoteInput | GetSuiTradeQuoteInput | GetStarknetTradeQuoteInput | GetNearTradeQuoteInput | GetTonTradeQuoteInput;
|
|
4
|
-
export type NearIntentsTradeRateInput = GetEvmTradeRateInput | GetUtxoTradeRateInput | GetSolanaTradeRateInput | GetTronTradeRateInput | GetSuiTradeRateInput | GetStarknetTradeRateInput | GetNearTradeRateInput | GetTonTradeRateInput;
|
|
2
|
+
import type { GetAptosTradeQuoteInput, GetAptosTradeRateInput, GetEvmTradeQuoteInput, GetEvmTradeRateInput, GetNearTradeQuoteInput, GetNearTradeRateInput, GetSolanaTradeQuoteInput, GetSolanaTradeRateInput, GetStarknetTradeQuoteInput, GetStarknetTradeRateInput, GetSuiTradeQuoteInput, GetSuiTradeRateInput, GetTonTradeQuoteInput, GetTonTradeRateInput, GetTronTradeQuoteInput, GetTronTradeRateInput, GetUtxoTradeQuoteInput, GetUtxoTradeRateInput, WithExactBuyAmount } from '../../types';
|
|
3
|
+
export type NearIntentsTradeQuoteInput = GetEvmTradeQuoteInput | GetUtxoTradeQuoteInput | GetSolanaTradeQuoteInput | GetTronTradeQuoteInput | GetSuiTradeQuoteInput | GetStarknetTradeQuoteInput | GetNearTradeQuoteInput | GetTonTradeQuoteInput | GetAptosTradeQuoteInput;
|
|
4
|
+
export type NearIntentsTradeRateInput = GetEvmTradeRateInput | GetUtxoTradeRateInput | GetSolanaTradeRateInput | GetTronTradeRateInput | GetSuiTradeRateInput | GetStarknetTradeRateInput | GetNearTradeRateInput | GetTonTradeRateInput | GetAptosTradeRateInput;
|
|
5
5
|
export type NearIntentsExactOutputTradeQuoteInput = WithExactBuyAmount<NearIntentsTradeQuoteInput>;
|
|
6
6
|
export type NearIntentsExactOutputTradeRateInput = WithExactBuyAmount<NearIntentsTradeRateInput>;
|
|
7
7
|
export type NearIntentsMetadata = {
|
|
@@ -11,6 +11,6 @@ export type NearIntentsMetadata = {
|
|
|
11
11
|
};
|
|
12
12
|
export { QuoteRequest } from '@defuse-protocol/one-click-sdk-typescript';
|
|
13
13
|
export type { GetExecutionStatusResponse, QuoteResponse, TokenResponse, } from '@defuse-protocol/one-click-sdk-typescript';
|
|
14
|
-
export declare const nearIntentsSupportedChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.GnosisMainnet, KnownChainIds.BnbSmartChainMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BitcoinMainnet, KnownChainIds.BitcoinCashMainnet, KnownChainIds.DogecoinMainnet, KnownChainIds.ZcashMainnet, KnownChainIds.SolanaMainnet, KnownChainIds.TronMainnet, KnownChainIds.SuiMainnet, KnownChainIds.StarknetMainnet, KnownChainIds.MonadMainnet, KnownChainIds.NearMainnet, KnownChainIds.PlasmaMainnet, KnownChainIds.TonMainnet];
|
|
14
|
+
export declare const nearIntentsSupportedChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.GnosisMainnet, KnownChainIds.BnbSmartChainMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BitcoinMainnet, KnownChainIds.BitcoinCashMainnet, KnownChainIds.DogecoinMainnet, KnownChainIds.ZcashMainnet, KnownChainIds.SolanaMainnet, KnownChainIds.TronMainnet, KnownChainIds.SuiMainnet, KnownChainIds.StarknetMainnet, KnownChainIds.MonadMainnet, KnownChainIds.NearMainnet, KnownChainIds.PlasmaMainnet, KnownChainIds.TonMainnet, KnownChainIds.AptosMainnet];
|
|
15
15
|
export type NearIntentsSupportedChainId = (typeof nearIntentsSupportedChainIds)[number];
|
|
16
16
|
export declare const chainIdToNearIntentsChain: Record<NearIntentsSupportedChainId, string>;
|
|
@@ -25,6 +25,7 @@ exports.nearIntentsSupportedChainIds = [
|
|
|
25
25
|
types_1.KnownChainIds.NearMainnet,
|
|
26
26
|
types_1.KnownChainIds.PlasmaMainnet,
|
|
27
27
|
types_1.KnownChainIds.TonMainnet,
|
|
28
|
+
types_1.KnownChainIds.AptosMainnet,
|
|
28
29
|
];
|
|
29
30
|
exports.chainIdToNearIntentsChain = {
|
|
30
31
|
[types_1.KnownChainIds.EthereumMainnet]: 'eth',
|
|
@@ -47,4 +48,5 @@ exports.chainIdToNearIntentsChain = {
|
|
|
47
48
|
[types_1.KnownChainIds.MonadMainnet]: 'monad',
|
|
48
49
|
[types_1.KnownChainIds.NearMainnet]: 'near',
|
|
49
50
|
[types_1.KnownChainIds.TonMainnet]: 'ton',
|
|
51
|
+
[types_1.KnownChainIds.AptosMainnet]: 'aptos',
|
|
50
52
|
};
|
|
@@ -7,6 +7,7 @@ const utils_1 = require("@shapeshiftoss/utils");
|
|
|
7
7
|
const monads_1 = require("@sniptt/monads");
|
|
8
8
|
const types_1 = require("../../../types");
|
|
9
9
|
const utils_2 = require("../../../utils");
|
|
10
|
+
const aptos_1 = require("../../../utils/aptos");
|
|
10
11
|
const evm_1 = require("../../../utils/evm");
|
|
11
12
|
const helpers_1 = require("../../../utils/helpers");
|
|
12
13
|
const solana_1 = require("../../../utils/solana");
|
|
@@ -221,6 +222,33 @@ async function getNearIntentsStepData(args) {
|
|
|
221
222
|
const stepData = { networkFeeCryptoBaseUnit: fast.txFee };
|
|
222
223
|
return (0, monads_1.Ok)(stepData);
|
|
223
224
|
}
|
|
225
|
+
case caip_1.CHAIN_NAMESPACE.Aptos: {
|
|
226
|
+
const adapter = deps.assertGetAptosChainAdapter(sellAsset.chainId);
|
|
227
|
+
if (type === 'rate') {
|
|
228
|
+
const { fast } = await adapter.getFeeData({
|
|
229
|
+
to: depositAddress,
|
|
230
|
+
value: aptos_1.APTOS_RATE_SIMULATION_VALUE,
|
|
231
|
+
chainSpecific: { from: from ?? aptos_1.APTOS_PLACEHOLDER_ADDRESS, contractAddress },
|
|
232
|
+
});
|
|
233
|
+
const stepData = { networkFeeCryptoBaseUnit: fast.txFee };
|
|
234
|
+
return (0, monads_1.Ok)(stepData);
|
|
235
|
+
}
|
|
236
|
+
const { fast } = await adapter.getFeeData({
|
|
237
|
+
to: depositAddress,
|
|
238
|
+
value: sellAmountCryptoBaseUnit,
|
|
239
|
+
chainSpecific: { from, contractAddress },
|
|
240
|
+
});
|
|
241
|
+
const stepData = {
|
|
242
|
+
transactionData: {
|
|
243
|
+
type: 'aptos',
|
|
244
|
+
payload: chain_adapters_1.aptos.getSerializedTransferPayload(depositAddress, sellAmountCryptoBaseUnit, contractAddress),
|
|
245
|
+
gasUnitPrice: fast.chainSpecific.gasUnitPrice,
|
|
246
|
+
maxGasAmount: fast.chainSpecific.maxGasAmount,
|
|
247
|
+
},
|
|
248
|
+
networkFeeCryptoBaseUnit: fast.txFee,
|
|
249
|
+
};
|
|
250
|
+
return (0, monads_1.Ok)(stepData);
|
|
251
|
+
}
|
|
224
252
|
default:
|
|
225
253
|
return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
|
|
226
254
|
message: `[getNearIntentsStepData] unsupported chain namespace: ${chainNamespace}`,
|
|
@@ -40,7 +40,7 @@ const getNearIntentsAsset = ({ nearNetwork, contractAddress, }) => {
|
|
|
40
40
|
};
|
|
41
41
|
exports.getNearIntentsAsset = getNearIntentsAsset;
|
|
42
42
|
const NEP245_CHAINS = ['bsc', 'pol', 'avax', 'op', 'tron', 'monad', 'plasma'];
|
|
43
|
-
const TOKEN_LOOKUP_CHAINS = ['sui', 'starknet', 'ton'];
|
|
43
|
+
const TOKEN_LOOKUP_CHAINS = ['sui', 'starknet', 'ton', 'aptos'];
|
|
44
44
|
const NEAR_CHAIN = 'near';
|
|
45
45
|
const BTC_CHAIN = 'btc';
|
|
46
46
|
const WNEAR_CONTRACT_ADDRESS = 'wrap.near';
|
|
@@ -72,7 +72,7 @@ const assetToNearIntentsAsset = async (asset) => {
|
|
|
72
72
|
});
|
|
73
73
|
return match?.assetId ?? null;
|
|
74
74
|
}
|
|
75
|
-
// NEP-245 chains (BSC, Polygon, Avalanche, Optimism, TRON, Monad), Token lookup chains (Sui, Starknet), and Solana require token lookup
|
|
75
|
+
// NEP-245 chains (BSC, Polygon, Avalanche, Optimism, TRON, Monad), Token lookup chains (Sui, Starknet, TON, Aptos), and Solana require token lookup
|
|
76
76
|
// Asset IDs use hashed format that can't be generated from contract addresses
|
|
77
77
|
const requiresLookup = isNep245Chain(nearNetwork) || isTokenLookupChain(nearNetwork) || asset.chainId === caip_1.solanaChainId;
|
|
78
78
|
if (requiresLookup) {
|
|
@@ -2,89 +2,70 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPortalsStepData = void 0;
|
|
4
4
|
const caip_1 = require("@shapeshiftoss/caip");
|
|
5
|
-
const utils_1 = require("@shapeshiftoss/utils");
|
|
6
5
|
const monads_1 = require("@sniptt/monads");
|
|
7
|
-
const
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
8
7
|
const evm_1 = require("../../../utils/evm");
|
|
9
8
|
const fetchPortalsTradeOrder_1 = require("./fetchPortalsTradeOrder");
|
|
10
9
|
async function getPortalsStepData(args) {
|
|
11
10
|
const { tx, sellAsset, sellAmountCryptoBaseUnit, spenderAddress, input, deps } = args;
|
|
12
11
|
const adapter = deps.assertGetEvmChainAdapter(sellAsset.chainId);
|
|
13
12
|
const supportsEIP1559 = 'supportsEIP1559' in input ? input.supportsEIP1559 : false;
|
|
13
|
+
const transactionData = {
|
|
14
|
+
type: 'evm',
|
|
15
|
+
chainId: Number((0, caip_1.fromChainId)(sellAsset.chainId).chainReference),
|
|
16
|
+
to: tx.to,
|
|
17
|
+
data: tx.data,
|
|
18
|
+
value: tx.value,
|
|
19
|
+
};
|
|
20
|
+
const stateOverride = {
|
|
21
|
+
sellAsset,
|
|
22
|
+
sellAmountCryptoBaseUnit,
|
|
23
|
+
spenderAddress,
|
|
24
|
+
};
|
|
14
25
|
if (args.type === 'rate') {
|
|
26
|
+
const getEstimateEndpointGasLimit = async () => {
|
|
27
|
+
const quoteEstimateResponse = await (0, fetchPortalsTradeOrder_1.fetchPortalsTradeEstimate)({
|
|
28
|
+
inputToken: args.inputToken,
|
|
29
|
+
outputToken: args.outputToken,
|
|
30
|
+
inputAmount: args.inputAmount,
|
|
31
|
+
slippageTolerancePercentage: args.slippageTolerancePercentage,
|
|
32
|
+
swapperConfig: deps.config,
|
|
33
|
+
});
|
|
34
|
+
return quoteEstimateResponse.context.gasLimit.toString();
|
|
35
|
+
};
|
|
15
36
|
try {
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
const gasLimit = await (async () => {
|
|
19
|
-
try {
|
|
20
|
-
const gasLimit = await (0, evm_1.estimateGasWithStateOverride)({
|
|
21
|
-
sellAsset,
|
|
22
|
-
sellAmountCryptoBaseUnit,
|
|
23
|
-
from: tx.from,
|
|
24
|
-
spenderAddress,
|
|
25
|
-
to: tx.to,
|
|
26
|
-
data: tx.data,
|
|
27
|
-
value: tx.value,
|
|
28
|
-
});
|
|
29
|
-
return gasLimit;
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// Portals only carry a tx gas limit on the bridge routes their estimate endpoint zeroes
|
|
33
|
-
const { gasLimit: txGasLimit } = tx;
|
|
34
|
-
if (txGasLimit && (0, utils_1.bnOrZero)(txGasLimit).gt(0))
|
|
35
|
-
return txGasLimit;
|
|
36
|
-
const quoteEstimateResponse = await (0, fetchPortalsTradeOrder_1.fetchPortalsTradeEstimate)({
|
|
37
|
-
inputToken: args.inputToken,
|
|
38
|
-
outputToken: args.outputToken,
|
|
39
|
-
inputAmount: args.inputAmount,
|
|
40
|
-
slippageTolerancePercentage: args.slippageTolerancePercentage,
|
|
41
|
-
swapperConfig: deps.config,
|
|
42
|
-
});
|
|
43
|
-
const estimatedGasLimit = quoteEstimateResponse.context.gasLimit.toString();
|
|
44
|
-
if ((0, utils_1.bnOrZero)(estimatedGasLimit).lte(0))
|
|
45
|
-
throw new Error('no Portals gas limit');
|
|
46
|
-
return estimatedGasLimit;
|
|
47
|
-
}
|
|
48
|
-
})();
|
|
49
|
-
const networkFeeCryptoBaseUnit = await (0, evm_1.getEvmNetworkFeeCryptoBaseUnit)({
|
|
37
|
+
// Portals only set a tx gas limit on bridge routes, where their estimate endpoint is zero
|
|
38
|
+
const networkFeeCryptoBaseUnit = await (0, evm_1.getEvmRateNetworkFeeCryptoBaseUnit)({
|
|
50
39
|
adapter,
|
|
51
40
|
supportsEIP1559,
|
|
52
|
-
gasLimit,
|
|
53
|
-
|
|
41
|
+
providerGasLimit: tx.gasLimit,
|
|
42
|
+
simulation: { transactionData, from: tx.from, stateOverride },
|
|
43
|
+
}).catch(async () => (0, evm_1.getEvmRateNetworkFeeCryptoBaseUnit)({
|
|
44
|
+
adapter,
|
|
45
|
+
supportsEIP1559,
|
|
46
|
+
providerGasLimit: await getEstimateEndpointGasLimit(),
|
|
47
|
+
}));
|
|
54
48
|
const stepData = { networkFeeCryptoBaseUnit };
|
|
55
49
|
return (0, monads_1.Ok)(stepData);
|
|
56
50
|
}
|
|
57
51
|
catch (error) {
|
|
58
|
-
return (0, monads_1.Err)((0,
|
|
52
|
+
return (0, monads_1.Err)((0, utils_1.makeNetworkFeeEstimationFailedErr)('getPortalsStepData', error));
|
|
59
53
|
}
|
|
60
54
|
}
|
|
61
|
-
const transactionData = {
|
|
62
|
-
type: 'evm',
|
|
63
|
-
chainId: Number((0, caip_1.fromChainId)(sellAsset.chainId).chainReference),
|
|
64
|
-
to: tx.to,
|
|
65
|
-
data: tx.data,
|
|
66
|
-
value: tx.value,
|
|
67
|
-
// Portals simulate and pad their gas limit when the order was validated, so no additional
|
|
68
|
-
// buffer - an unvalidated order carries no gas limit and estimates below instead
|
|
69
|
-
gasLimit: tx.gasLimit,
|
|
70
|
-
};
|
|
71
55
|
try {
|
|
72
56
|
const networkFeeCryptoBaseUnit = await (0, evm_1.getEvmNetworkFeeCryptoBaseUnit)({
|
|
73
57
|
adapter,
|
|
74
58
|
transactionData,
|
|
75
59
|
from: args.from,
|
|
76
60
|
supportsEIP1559,
|
|
77
|
-
stateOverride
|
|
78
|
-
|
|
79
|
-
sellAmountCryptoBaseUnit,
|
|
80
|
-
spenderAddress,
|
|
81
|
-
},
|
|
61
|
+
stateOverride,
|
|
62
|
+
providerGasLimit: tx.gasLimit,
|
|
82
63
|
});
|
|
83
64
|
const stepData = { transactionData, networkFeeCryptoBaseUnit };
|
|
84
65
|
return (0, monads_1.Ok)(stepData);
|
|
85
66
|
}
|
|
86
67
|
catch (error) {
|
|
87
|
-
return (0, monads_1.Err)((0,
|
|
68
|
+
return (0, monads_1.Err)((0, utils_1.makeNetworkFeeEstimationFailedErr)('getPortalsStepData', error));
|
|
88
69
|
}
|
|
89
70
|
}
|
|
90
71
|
exports.getPortalsStepData = getPortalsStepData;
|
|
@@ -47,11 +47,11 @@ const estimateEndpointGasLimit = (gasLimit) => vitest_1.vi.mocked(fetchPortalsTr
|
|
|
47
47
|
});
|
|
48
48
|
(0, vitest_1.describe)('getPortalsStepData rate gas limit', () => {
|
|
49
49
|
(0, vitest_1.beforeEach)(() => vitest_1.vi.clearAllMocks());
|
|
50
|
-
(0, vitest_1.it)('
|
|
51
|
-
vitest_1.vi.mocked(evm_1.estimateGasWithStateOverride).mockRejectedValue(new Error('execution reverted'));
|
|
50
|
+
(0, vitest_1.it)('prices the order gas limit on bridge routes without simulating', async () => {
|
|
52
51
|
estimateEndpointGasLimit(0);
|
|
53
52
|
const actual = await rate(tx('76384'));
|
|
54
53
|
(0, vitest_1.expect)(actual.unwrap()).toEqual({ networkFeeCryptoBaseUnit: '76384000000000' });
|
|
54
|
+
(0, vitest_1.expect)(evm_1.estimateGasWithStateOverride).not.toHaveBeenCalled();
|
|
55
55
|
(0, vitest_1.expect)(fetchPortalsTradeOrder_1.fetchPortalsTradeEstimate).not.toHaveBeenCalled();
|
|
56
56
|
});
|
|
57
57
|
(0, vitest_1.it)('falls back to the estimate endpoint when the order carries no gas limit', async () => {
|
|
@@ -51,6 +51,7 @@ exports.chainIdToRelayChainId = {
|
|
|
51
51
|
[caip_1.seiChainId]: chains_1.sei.id,
|
|
52
52
|
[caip_1.abstractChainId]: chains_1.abstract.id,
|
|
53
53
|
[caip_1.robinhoodChainId]: chains_1.robinhood.id,
|
|
54
|
+
[caip_1.elysiumChainId]: 99901,
|
|
54
55
|
};
|
|
55
56
|
var RelayStatusMessage;
|
|
56
57
|
(function (RelayStatusMessage) {
|