@shapeshiftoss/swapper 20.4.0 → 20.5.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.
Files changed (169) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +6 -0
  3. package/dist/cjs/index.d.ts +1 -0
  4. package/dist/cjs/index.js +1 -0
  5. package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossStepData.js +7 -15
  6. package/dist/cjs/swappers/AvnuSwapper/endpoints.js +17 -12
  7. package/dist/cjs/swappers/BebopSwapper/utils/getBebopStepData.js +17 -22
  8. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  9. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
  10. package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.js +3 -4
  11. package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
  12. package/dist/cjs/swappers/CetusSwapper/endpoints.js +2 -3
  13. package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
  14. package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +1 -2
  15. package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +0 -1
  16. package/dist/cjs/swappers/CetusSwapper/utils/constants.js +1 -2
  17. package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
  18. package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +6 -17
  19. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
  20. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
  21. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
  22. package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.js +5 -7
  23. package/dist/cjs/swappers/KyberSwapper/KyberSwapper.d.ts +2 -0
  24. package/dist/cjs/swappers/KyberSwapper/KyberSwapper.js +5 -0
  25. package/dist/cjs/swappers/KyberSwapper/endpoints.d.ts +2 -0
  26. package/dist/cjs/swappers/KyberSwapper/endpoints.js +14 -0
  27. package/dist/cjs/swappers/KyberSwapper/index.d.ts +2 -0
  28. package/dist/cjs/swappers/KyberSwapper/index.js +7 -0
  29. package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
  30. package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +64 -0
  31. package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
  32. package/dist/cjs/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +31 -0
  33. package/dist/cjs/swappers/KyberSwapper/types.d.ts +62 -0
  34. package/dist/cjs/swappers/KyberSwapper/types.js +2 -0
  35. package/dist/cjs/swappers/KyberSwapper/utils/constants.d.ts +21 -0
  36. package/dist/cjs/swappers/KyberSwapper/utils/constants.js +24 -0
  37. package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
  38. package/dist/cjs/swappers/KyberSwapper/utils/fetchFromKyber.js +38 -0
  39. package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
  40. package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.js +47 -0
  41. package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
  42. package/dist/cjs/swappers/KyberSwapper/utils/getKyberStepData.test.js +92 -0
  43. package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
  44. package/dist/cjs/swappers/KyberSwapper/utils/getKyberTradeContext.js +63 -0
  45. package/dist/cjs/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
  46. package/dist/cjs/swappers/KyberSwapper/utils/helpers.js +172 -0
  47. package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
  48. package/dist/cjs/swappers/KyberSwapper/utils/helpers.test.js +110 -0
  49. package/dist/cjs/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
  50. package/dist/cjs/swappers/KyberSwapper/utils/kyberService.js +9 -0
  51. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
  52. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +13 -14
  53. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
  54. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +4 -4
  55. package/dist/cjs/swappers/NearIntentsSwapper/types.js +2 -0
  56. package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +28 -0
  57. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
  58. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.js +36 -55
  59. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
  60. package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.js +7 -15
  61. package/dist/cjs/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -2
  62. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +3 -1
  63. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
  64. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxStepData.js +29 -10
  65. package/dist/cjs/types.d.ts +36 -8
  66. package/dist/cjs/types.js +1 -0
  67. package/dist/cjs/utils/aptos/constants.d.ts +2 -0
  68. package/dist/cjs/utils/aptos/constants.js +7 -0
  69. package/dist/cjs/utils/aptos/getAptosTransactionFees.d.ts +2 -0
  70. package/dist/cjs/utils/aptos/getAptosTransactionFees.js +13 -0
  71. package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
  72. package/dist/cjs/utils/aptos/getUnsignedAptosTransaction.js +16 -0
  73. package/dist/cjs/utils/aptos/index.d.ts +3 -0
  74. package/dist/cjs/utils/aptos/index.js +19 -0
  75. package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
  76. package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +45 -35
  77. package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
  78. package/dist/cjs/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +103 -0
  79. package/dist/cjs/utils/evm/stateOverride.d.ts +3 -0
  80. package/dist/cjs/utils/evm/stateOverride.js +10 -4
  81. package/dist/cjs/utils/helpers.js +1 -0
  82. package/dist/cjs/utils/helpers.test.js +1 -0
  83. package/dist/cjs/utils/index.d.ts +3 -2
  84. package/dist/cjs/utils/index.js +11 -27
  85. package/dist/esm/.tsbuildinfo +1 -1
  86. package/dist/esm/constants.js +6 -0
  87. package/dist/esm/index.d.ts +1 -0
  88. package/dist/esm/index.js +1 -0
  89. package/dist/esm/swappers/AcrossSwapper/utils/getAcrossStepData.js +8 -16
  90. package/dist/esm/swappers/AvnuSwapper/endpoints.js +18 -13
  91. package/dist/esm/swappers/BebopSwapper/utils/getBebopStepData.js +18 -23
  92. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  93. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +1 -0
  94. package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.js +4 -5
  95. package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.test.js +2 -2
  96. package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -4
  97. package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusStepData.js +13 -8
  98. package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeContext.js +2 -3
  99. package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +0 -1
  100. package/dist/esm/swappers/CetusSwapper/utils/constants.js +0 -1
  101. package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +3 -3
  102. package/dist/esm/swappers/CetusSwapper/utils/helpers.js +4 -15
  103. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +0 -1
  104. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +9 -16
  105. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +0 -3
  106. package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.js +6 -8
  107. package/dist/esm/swappers/KyberSwapper/KyberSwapper.d.ts +2 -0
  108. package/dist/esm/swappers/KyberSwapper/KyberSwapper.js +2 -0
  109. package/dist/esm/swappers/KyberSwapper/endpoints.d.ts +2 -0
  110. package/dist/esm/swappers/KyberSwapper/endpoints.js +11 -0
  111. package/dist/esm/swappers/KyberSwapper/index.d.ts +2 -0
  112. package/dist/esm/swappers/KyberSwapper/index.js +2 -0
  113. package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.d.ts +4 -0
  114. package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeQuote.js +60 -0
  115. package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.d.ts +4 -0
  116. package/dist/esm/swappers/KyberSwapper/swapperApi/getKyberTradeRate.js +27 -0
  117. package/dist/esm/swappers/KyberSwapper/types.d.ts +62 -0
  118. package/dist/esm/swappers/KyberSwapper/types.js +1 -0
  119. package/dist/esm/swappers/KyberSwapper/utils/constants.d.ts +21 -0
  120. package/dist/esm/swappers/KyberSwapper/utils/constants.js +21 -0
  121. package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.d.ts +23 -0
  122. package/dist/esm/swappers/KyberSwapper/utils/fetchFromKyber.js +33 -0
  123. package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.d.ts +27 -0
  124. package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.js +43 -0
  125. package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.d.ts +1 -0
  126. package/dist/esm/swappers/KyberSwapper/utils/getKyberStepData.test.js +90 -0
  127. package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.d.ts +20 -0
  128. package/dist/esm/swappers/KyberSwapper/utils/getKyberTradeContext.js +59 -0
  129. package/dist/esm/swappers/KyberSwapper/utils/helpers.d.ts +27 -0
  130. package/dist/esm/swappers/KyberSwapper/utils/helpers.js +158 -0
  131. package/dist/esm/swappers/KyberSwapper/utils/helpers.test.d.ts +1 -0
  132. package/dist/esm/swappers/KyberSwapper/utils/helpers.test.js +108 -0
  133. package/dist/esm/swappers/KyberSwapper/utils/kyberService.d.ts +5 -0
  134. package/dist/esm/swappers/KyberSwapper/utils/kyberService.js +3 -0
  135. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
  136. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +13 -14
  137. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +1 -1
  138. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +4 -4
  139. package/dist/esm/swappers/NearIntentsSwapper/types.js +2 -0
  140. package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +29 -1
  141. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
  142. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.js +34 -53
  143. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.test.js +2 -2
  144. package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.js +9 -17
  145. package/dist/esm/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -2
  146. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +3 -1
  147. package/dist/esm/swappers/ZrxSwapper/utils/getZrxStepData.d.ts +3 -1
  148. package/dist/esm/swappers/ZrxSwapper/utils/getZrxStepData.js +31 -12
  149. package/dist/esm/types.d.ts +36 -8
  150. package/dist/esm/types.js +1 -0
  151. package/dist/esm/utils/aptos/constants.d.ts +2 -0
  152. package/dist/esm/utils/aptos/constants.js +4 -0
  153. package/dist/esm/utils/aptos/getAptosTransactionFees.d.ts +2 -0
  154. package/dist/esm/utils/aptos/getAptosTransactionFees.js +9 -0
  155. package/dist/esm/utils/aptos/getUnsignedAptosTransaction.d.ts +2 -0
  156. package/dist/esm/utils/aptos/getUnsignedAptosTransaction.js +12 -0
  157. package/dist/esm/utils/aptos/index.d.ts +3 -0
  158. package/dist/esm/utils/aptos/index.js +3 -0
  159. package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.d.ts +19 -6
  160. package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.js +42 -35
  161. package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
  162. package/dist/esm/utils/evm/getEvmNetworkFeeCryptoBaseUnit.test.js +101 -0
  163. package/dist/esm/utils/evm/stateOverride.d.ts +3 -0
  164. package/dist/esm/utils/evm/stateOverride.js +8 -3
  165. package/dist/esm/utils/helpers.js +2 -1
  166. package/dist/esm/utils/helpers.test.js +1 -0
  167. package/dist/esm/utils/index.d.ts +3 -2
  168. package/dist/esm/utils/index.js +9 -26
  169. package/package.json +10 -11
@@ -0,0 +1,60 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { assertQuoteAddresses } from '../../../utils/index.js';
3
+ import { KYBER_DEADLINE_SECONDS } from '../utils/constants.js';
4
+ import { fetchKyberBuild } from '../utils/fetchFromKyber.js';
5
+ import { getKyberStepData } from '../utils/getKyberStepData.js';
6
+ import { getKyberTradeContext } from '../utils/getKyberTradeContext.js';
7
+ import { getKyberTradeAmounts } from '../utils/helpers.js';
8
+ export const getKyberTradeQuote = async (input, deps) => {
9
+ const { accountNumber } = input;
10
+ const maybeAddresses = assertQuoteAddresses(input);
11
+ if (maybeAddresses.isErr())
12
+ return Err(maybeAddresses.unwrapErr());
13
+ const { sendAddress, receiveAddress } = maybeAddresses.unwrap();
14
+ const maybeContext = await getKyberTradeContext({ input, deps });
15
+ if (maybeContext.isErr())
16
+ return Err(maybeContext.unwrapErr());
17
+ const { tradeCommon, stepCommon, protocolFees, chainId, route, stepDataArgs } = maybeContext.unwrap();
18
+ const deadline = Math.floor(Date.now() / 1000) + KYBER_DEADLINE_SECONDS;
19
+ const maybeBuild = await fetchKyberBuild({
20
+ chainId,
21
+ route,
22
+ slippageTolerancePercentageDecimal: tradeCommon.slippageTolerancePercentageDecimal,
23
+ baseUrl: deps.config.VITE_KYBER_BASE_URL,
24
+ sendAddress,
25
+ receiveAddress,
26
+ deadline,
27
+ });
28
+ if (maybeBuild.isErr())
29
+ return Err(maybeBuild.unwrapErr());
30
+ const build = maybeBuild.unwrap();
31
+ // Kyber re-prices at build time and derives the calldata's minimum return from the built amount
32
+ const tradeAmounts = getKyberTradeAmounts({ input, amountOut: build.amountOut });
33
+ const maybeStepData = await getKyberStepData({
34
+ ...stepDataArgs,
35
+ type: 'quote',
36
+ input,
37
+ from: sendAddress,
38
+ build,
39
+ });
40
+ if (maybeStepData.isErr())
41
+ return Err(maybeStepData.unwrapErr());
42
+ const { transactionData, networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
43
+ const tradeQuote = {
44
+ ...tradeCommon,
45
+ rate: tradeAmounts.rate,
46
+ quoteOrRate: 'quote',
47
+ receiveAddress,
48
+ deadline: deadline * 1000,
49
+ steps: [
50
+ {
51
+ ...stepCommon,
52
+ ...tradeAmounts,
53
+ accountNumber,
54
+ transactionData,
55
+ feeData: { networkFeeCryptoBaseUnit, protocolFees },
56
+ },
57
+ ],
58
+ };
59
+ return Ok([tradeQuote]);
60
+ };
@@ -0,0 +1,4 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { SwapErrorRight, SwapperDeps, TradeRate } from '../../../types.js';
3
+ import type { KyberTradeRateInput } from '../types.js';
4
+ export declare const getKyberTradeRate: (input: KyberTradeRateInput, deps: SwapperDeps) => Promise<Result<TradeRate[], SwapErrorRight>>;
@@ -0,0 +1,27 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { getKyberStepData } from '../utils/getKyberStepData.js';
3
+ import { getKyberTradeContext } from '../utils/getKyberTradeContext.js';
4
+ export const getKyberTradeRate = async (input, deps) => {
5
+ const { accountNumber, receiveAddress } = input;
6
+ const maybeContext = await getKyberTradeContext({ input, deps });
7
+ if (maybeContext.isErr())
8
+ return Err(maybeContext.unwrapErr());
9
+ const { tradeCommon, stepCommon, protocolFees, stepDataArgs } = maybeContext.unwrap();
10
+ const maybeStepData = await getKyberStepData({ ...stepDataArgs, type: 'rate', input });
11
+ if (maybeStepData.isErr())
12
+ return Err(maybeStepData.unwrapErr());
13
+ const { networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
14
+ const tradeRate = {
15
+ ...tradeCommon,
16
+ quoteOrRate: 'rate',
17
+ receiveAddress,
18
+ steps: [
19
+ {
20
+ ...stepCommon,
21
+ accountNumber,
22
+ feeData: { networkFeeCryptoBaseUnit, protocolFees },
23
+ },
24
+ ],
25
+ };
26
+ return Ok([tradeRate]);
27
+ };
@@ -0,0 +1,62 @@
1
+ import type { Address, Hex } from 'viem';
2
+ import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput } from '../../types.js';
3
+ export type KyberTradeQuoteInput = GetEvmTradeQuoteInput;
4
+ export type KyberTradeRateInput = GetEvmTradeRateInput;
5
+ export type KyberExtraFee = {
6
+ feeAmount: string;
7
+ chargeFeeBy: '' | 'currency_in' | 'currency_out';
8
+ isInBps: boolean;
9
+ feeReceiver: string;
10
+ };
11
+ export type KyberFeeParams = {
12
+ feeAmount: string;
13
+ chargeFeeBy: 'currency_out';
14
+ isInBps: true;
15
+ feeReceiver: Address;
16
+ };
17
+ export type KyberRouteSummary = {
18
+ tokenIn: string;
19
+ amountIn: string;
20
+ amountInUsd: string;
21
+ tokenOut: string;
22
+ amountOut: string;
23
+ amountOutUsd: string;
24
+ gas: string;
25
+ gasPrice: string;
26
+ gasUsd: string;
27
+ l1FeeUsd: string;
28
+ extraFee: KyberExtraFee;
29
+ route: unknown;
30
+ routerAddress: Address;
31
+ routeID: string;
32
+ checksum: string;
33
+ timestamp: number;
34
+ };
35
+ export type KyberRouteData = {
36
+ routeSummary: KyberRouteSummary;
37
+ routerAddress: Address;
38
+ };
39
+ export type KyberRoutesResponse = {
40
+ code: number;
41
+ message: string;
42
+ data?: KyberRouteData;
43
+ requestId: string;
44
+ };
45
+ export type KyberBuildData = {
46
+ amountOut: string;
47
+ gas: string;
48
+ data: Hex;
49
+ routerAddress: Address;
50
+ transactionValue: string;
51
+ };
52
+ export type KyberBuildResponse = {
53
+ code: number;
54
+ message: string;
55
+ data?: KyberBuildData;
56
+ requestId: string;
57
+ };
58
+ export type KyberErrorResponse = {
59
+ code: number;
60
+ message: string;
61
+ requestId?: string;
62
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import type { Address } from 'viem';
2
+ export declare const KYBER_CLIENT_ID = "shapeshift";
3
+ export declare const KYBER_DEADLINE_SECONDS = 1200;
4
+ export declare const KYBER_CHAINS: {
5
+ readonly "eip155:1": "ethereum";
6
+ readonly "eip155:10": "optimism";
7
+ readonly "eip155:56": "bsc";
8
+ readonly "eip155:137": "polygon";
9
+ readonly "eip155:42161": "arbitrum";
10
+ readonly "eip155:8453": "base";
11
+ readonly "eip155:43114": "avalanche";
12
+ readonly "eip155:130": "unichain";
13
+ readonly "eip155:4663": "robinhood";
14
+ readonly "eip155:143": "monad";
15
+ readonly "eip155:999": "hyperevm";
16
+ readonly "eip155:4326": "megaeth";
17
+ readonly "eip155:9745": "plasma";
18
+ };
19
+ export type KyberSupportedChainId = keyof typeof KYBER_CHAINS;
20
+ export declare const KYBER_ROUTER_ADDRESS: Address;
21
+ export declare const KYBER_NATIVE_TOKEN: Address;
@@ -0,0 +1,21 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ export const KYBER_CLIENT_ID = 'shapeshift';
3
+ export const KYBER_DEADLINE_SECONDS = 1200;
4
+ export const KYBER_CHAINS = {
5
+ [KnownChainIds.EthereumMainnet]: 'ethereum',
6
+ [KnownChainIds.OptimismMainnet]: 'optimism',
7
+ [KnownChainIds.BnbSmartChainMainnet]: 'bsc',
8
+ [KnownChainIds.PolygonMainnet]: 'polygon',
9
+ [KnownChainIds.ArbitrumMainnet]: 'arbitrum',
10
+ [KnownChainIds.BaseMainnet]: 'base',
11
+ [KnownChainIds.AvalancheMainnet]: 'avalanche',
12
+ [KnownChainIds.UnichainMainnet]: 'unichain',
13
+ [KnownChainIds.RobinhoodMainnet]: 'robinhood',
14
+ [KnownChainIds.MonadMainnet]: 'monad',
15
+ [KnownChainIds.HyperEvmMainnet]: 'hyperevm',
16
+ [KnownChainIds.MegaEthMainnet]: 'megaeth',
17
+ [KnownChainIds.PlasmaMainnet]: 'plasma',
18
+ };
19
+ // MetaAggregationRouterV2, same address on every chain: https://docs.kyberswap.com/developer-guide/aggregator-api/contracts
20
+ export const KYBER_ROUTER_ADDRESS = '0x6131B5fae19EA4f9D964eAc0408E4408b66337b5';
21
+ export const KYBER_NATIVE_TOKEN = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
@@ -0,0 +1,23 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { Address } from 'viem';
3
+ import type { SwapErrorRight } from '../../../types.js';
4
+ import type { KyberBuildData, KyberFeeParams, KyberRouteSummary } from '../types.js';
5
+ import type { KyberSupportedChainId } from './constants.js';
6
+ export declare const fetchKyberRoute: ({ chainId, tokenIn, tokenOut, sellAmountCryptoBaseUnit, feeParams, sendAddress, baseUrl, }: {
7
+ chainId: KyberSupportedChainId;
8
+ tokenIn: Address;
9
+ tokenOut: Address;
10
+ sellAmountCryptoBaseUnit: string;
11
+ feeParams: KyberFeeParams | undefined;
12
+ sendAddress: string | undefined;
13
+ baseUrl: string;
14
+ }) => Promise<Result<KyberRouteSummary, SwapErrorRight>>;
15
+ export declare const fetchKyberBuild: ({ chainId, route, slippageTolerancePercentageDecimal, baseUrl, sendAddress, receiveAddress, deadline, }: {
16
+ chainId: KyberSupportedChainId;
17
+ route: KyberRouteSummary;
18
+ slippageTolerancePercentageDecimal: string;
19
+ baseUrl: string;
20
+ sendAddress: string;
21
+ receiveAddress: string;
22
+ deadline: number;
23
+ }) => Promise<Result<KyberBuildData, SwapErrorRight>>;
@@ -0,0 +1,33 @@
1
+ import { convertDecimalPercentageToBasisPoints } from '@shapeshiftoss/utils';
2
+ import { Err } from '@sniptt/monads';
3
+ import { KYBER_CHAINS, KYBER_CLIENT_ID } from './constants.js';
4
+ import { getKyberRequestError, validateKyberBuild, validateKyberRoute } from './helpers.js';
5
+ import { kyberService } from './kyberService.js';
6
+ export const fetchKyberRoute = async ({ chainId, tokenIn, tokenOut, sellAmountCryptoBaseUnit, feeParams, sendAddress, baseUrl, }) => {
7
+ const maybeResponse = await kyberService.get(`${baseUrl}/${KYBER_CHAINS[chainId]}/api/v1/routes`, {
8
+ params: {
9
+ tokenIn,
10
+ tokenOut,
11
+ amountIn: sellAmountCryptoBaseUnit,
12
+ ...(sendAddress ? { origin: sendAddress } : {}),
13
+ ...feeParams,
14
+ },
15
+ });
16
+ if (maybeResponse.isErr())
17
+ return Err(getKyberRequestError(maybeResponse.unwrapErr()));
18
+ return validateKyberRoute(maybeResponse.unwrap().data, feeParams);
19
+ };
20
+ export const fetchKyberBuild = async ({ chainId, route, slippageTolerancePercentageDecimal, baseUrl, sendAddress, receiveAddress, deadline, }) => {
21
+ const maybeResponse = await kyberService.post(`${baseUrl}/${KYBER_CHAINS[chainId]}/api/v1/route/build`, {
22
+ routeSummary: route,
23
+ sender: sendAddress,
24
+ recipient: receiveAddress,
25
+ origin: sendAddress,
26
+ slippageTolerance: convertDecimalPercentageToBasisPoints(slippageTolerancePercentageDecimal).toNumber(),
27
+ deadline,
28
+ source: KYBER_CLIENT_ID,
29
+ });
30
+ if (maybeResponse.isErr())
31
+ return Err(getKyberRequestError(maybeResponse.unwrapErr()));
32
+ return validateKyberBuild(maybeResponse.unwrap().data);
33
+ };
@@ -0,0 +1,27 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.js';
3
+ import type { KyberBuildData, KyberRouteSummary } from '../types.js';
4
+ type BaseArgs = {
5
+ sellAmountCryptoBaseUnit: string;
6
+ spenderAddress: string;
7
+ route: KyberRouteSummary;
8
+ };
9
+ export type GetKyberStepDataArgs = StepDataArgs<BaseArgs, {
10
+ build?: undefined;
11
+ }, {
12
+ build: KyberBuildData;
13
+ }>;
14
+ type KyberRateStepData = {
15
+ networkFeeCryptoBaseUnit: string;
16
+ };
17
+ type KyberQuoteStepData = {
18
+ transactionData: TxBuildData;
19
+ networkFeeCryptoBaseUnit: string;
20
+ };
21
+ export declare function getKyberStepData(args: Extract<GetKyberStepDataArgs, {
22
+ type: 'rate';
23
+ }>): Promise<Result<KyberRateStepData, SwapErrorRight>>;
24
+ export declare function getKyberStepData(args: Extract<GetKyberStepDataArgs, {
25
+ type: 'quote';
26
+ }>): Promise<Result<KyberQuoteStepData, SwapErrorRight>>;
27
+ export {};
@@ -0,0 +1,43 @@
1
+ import { fromChainId } from '@shapeshiftoss/caip';
2
+ import { bnOrZero } from '@shapeshiftoss/utils';
3
+ import { Err, Ok } from '@sniptt/monads';
4
+ import { makeNetworkFeeEstimationFailedErr } from '../../../utils/index.js';
5
+ import { getEvmNetworkFeeCryptoBaseUnit, getEvmRateNetworkFeeCryptoBaseUnit, } from '../../../utils/evm/index.js';
6
+ import { KYBER_ROUTER_ADDRESS } from './constants.js';
7
+ export async function getKyberStepData(args) {
8
+ const { sellAsset, sellAmountCryptoBaseUnit, spenderAddress, route, input, deps } = args;
9
+ const adapter = deps.assertGetEvmChainAdapter(sellAsset.chainId);
10
+ const supportsEIP1559 = 'supportsEIP1559' in input ? input.supportsEIP1559 : false;
11
+ if (args.type === 'rate') {
12
+ const networkFeeCryptoBaseUnit = await getEvmRateNetworkFeeCryptoBaseUnit({
13
+ adapter,
14
+ supportsEIP1559,
15
+ providerGasLimit: route.gas,
16
+ }).catch(() => bnOrZero(route.gas).times(bnOrZero(route.gasPrice)).toFixed(0));
17
+ const stepData = { networkFeeCryptoBaseUnit };
18
+ return Ok(stepData);
19
+ }
20
+ const { build, from } = args;
21
+ const transactionData = {
22
+ type: 'evm',
23
+ chainId: Number(fromChainId(sellAsset.chainId).chainReference),
24
+ to: KYBER_ROUTER_ADDRESS,
25
+ data: build.data,
26
+ value: build.transactionValue,
27
+ };
28
+ try {
29
+ const networkFeeCryptoBaseUnit = await getEvmNetworkFeeCryptoBaseUnit({
30
+ adapter,
31
+ supportsEIP1559,
32
+ transactionData,
33
+ from,
34
+ stateOverride: { sellAsset, sellAmountCryptoBaseUnit, spenderAddress },
35
+ providerGasLimit: build.gas,
36
+ });
37
+ const stepData = { transactionData, networkFeeCryptoBaseUnit };
38
+ return Ok(stepData);
39
+ }
40
+ catch (error) {
41
+ return Err(makeNetworkFeeEstimationFailedErr('getKyberStepData', error));
42
+ }
43
+ }
@@ -0,0 +1,90 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { ETH } from '../../../utils/test-data/assets.js';
4
+ import { KYBER_ROUTER_ADDRESS } from './constants.js';
5
+ import { getKyberStepData } from './getKyberStepData.js';
6
+ // The override path reads live chain state, so resolve to no override and hit the mocked adapter
7
+ vi.mock('../../../utils/evm/stateOverride', async (importOriginal) => ({
8
+ ...(await importOriginal()),
9
+ getMinimalStateOverride: vi.fn().mockResolvedValue(undefined),
10
+ }));
11
+ const HYPE = {
12
+ ...ETH,
13
+ assetId: 'eip155:999/slip44:60',
14
+ chainId: KnownChainIds.HyperEvmMainnet,
15
+ symbol: 'HYPE',
16
+ name: 'HYPE',
17
+ };
18
+ const build = {
19
+ amountOut: '255332539',
20
+ gas: '679101',
21
+ data: '0xe21fd0e9',
22
+ routerAddress: '0x6131B5fae19EA4f9D964eAc0408E4408b66337b5',
23
+ transactionValue: '3000000000000000000',
24
+ };
25
+ const makeDeps = (adapter) => ({ assertGetEvmChainAdapter: () => adapter });
26
+ const evmAdapter = ({ gasPrice = '1000000000', estimatedGasLimit = '500000', throwOnGasFeeData = false, throwOnFeeData = false, } = {}) => ({
27
+ getGasFeeData: () => {
28
+ if (throwOnGasFeeData)
29
+ return Promise.reject(new Error('rpc down'));
30
+ return Promise.resolve({ average: { gasPrice, maxFeePerGas: '0', maxPriorityFeePerGas: '0' } });
31
+ },
32
+ getFeeData: () => {
33
+ if (throwOnFeeData)
34
+ return Promise.reject(new Error('execution reverted'));
35
+ return Promise.resolve({
36
+ average: { chainSpecific: { gasLimit: estimatedGasLimit, gasPrice } },
37
+ });
38
+ },
39
+ });
40
+ const rateInput = { supportsEIP1559: false };
41
+ const quoteInput = { supportsEIP1559: false };
42
+ const baseArgs = {
43
+ sellAsset: HYPE,
44
+ sellAmountCryptoBaseUnit: '3000000000000000000',
45
+ spenderAddress: '',
46
+ route: { gas: '679101', gasPrice: '2000000000' },
47
+ };
48
+ describe('getKyberStepData', () => {
49
+ it('prices the provider gas limit for a rate', async () => {
50
+ const actual = await getKyberStepData({
51
+ ...baseArgs,
52
+ type: 'rate',
53
+ input: rateInput,
54
+ deps: makeDeps(evmAdapter()),
55
+ });
56
+ // gas 679101 * gasPrice 1000000000
57
+ expect(actual.unwrap()).toEqual({ networkFeeCryptoBaseUnit: '679101000000000' });
58
+ });
59
+ it('falls back to the provider gas price when rate pricing fails', async () => {
60
+ const actual = await getKyberStepData({
61
+ ...baseArgs,
62
+ type: 'rate',
63
+ input: rateInput,
64
+ deps: makeDeps(evmAdapter({ throwOnGasFeeData: true })),
65
+ });
66
+ // gas 679101 * provider gasPrice 2000000000
67
+ expect(actual.unwrap()).toEqual({ networkFeeCryptoBaseUnit: '1358202000000000' });
68
+ });
69
+ it('builds the router transaction and sets the buffered on chain estimate for a quote', async () => {
70
+ const actual = await getKyberStepData({
71
+ ...baseArgs,
72
+ type: 'quote',
73
+ input: quoteInput,
74
+ from: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
75
+ build,
76
+ deps: makeDeps(evmAdapter({ estimatedGasLimit: '500000' })),
77
+ });
78
+ expect(actual.unwrap()).toEqual({
79
+ networkFeeCryptoBaseUnit: '600000000000000',
80
+ transactionData: {
81
+ type: 'evm',
82
+ chainId: 999,
83
+ to: KYBER_ROUTER_ADDRESS,
84
+ data: build.data,
85
+ value: '3000000000000000000',
86
+ gasLimit: '600000',
87
+ },
88
+ });
89
+ });
90
+ });
@@ -0,0 +1,20 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { QuoteFeeData, SwapErrorRight, SwapperDeps, TradeCommon, TradeStepCommon } from '../../../types.js';
3
+ import type { KyberRouteSummary, KyberTradeQuoteInput, KyberTradeRateInput } from '../types.js';
4
+ import type { KyberSupportedChainId } from './constants.js';
5
+ import type { GetKyberStepDataArgs } from './getKyberStepData.js';
6
+ type KyberTradeContext = {
7
+ tradeCommon: TradeCommon & {
8
+ slippageTolerancePercentageDecimal: string;
9
+ };
10
+ stepCommon: Omit<TradeStepCommon, 'feeData'>;
11
+ protocolFees: QuoteFeeData['protocolFees'];
12
+ chainId: KyberSupportedChainId;
13
+ route: KyberRouteSummary;
14
+ stepDataArgs: Omit<GetKyberStepDataArgs, 'type' | 'input' | 'from' | 'build'>;
15
+ };
16
+ export declare const getKyberTradeContext: ({ input, deps, }: {
17
+ input: KyberTradeQuoteInput | KyberTradeRateInput;
18
+ deps: SwapperDeps;
19
+ }) => Promise<Result<KyberTradeContext, SwapErrorRight>>;
20
+ export {};
@@ -0,0 +1,59 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { v4 as uuid } from 'uuid';
3
+ import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
4
+ import { SwapperName } from '../../../types.js';
5
+ import { isNativeEvmAsset } from '../../../utils/helpers.js';
6
+ import { KYBER_ROUTER_ADDRESS } from './constants.js';
7
+ import { fetchKyberRoute } from './fetchFromKyber.js';
8
+ import { assertValidTrade, assetIdToKyberToken, getKyberFeeParams, getKyberTradeAmounts, } from './helpers.js';
9
+ export const getKyberTradeContext = async ({ input, deps, }) => {
10
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, affiliateBps, sendAddress, } = input;
11
+ const maybeChainId = assertValidTrade({ sellAsset, buyAsset });
12
+ if (maybeChainId.isErr())
13
+ return Err(maybeChainId.unwrapErr());
14
+ const chainId = maybeChainId.unwrap();
15
+ const slippageTolerancePercentageDecimal = input.slippageTolerancePercentageDecimal ??
16
+ getDefaultSlippageDecimalPercentageForSwapper(SwapperName.KyberSwap);
17
+ const maybeRoute = await fetchKyberRoute({
18
+ chainId,
19
+ tokenIn: assetIdToKyberToken(sellAsset.assetId),
20
+ tokenOut: assetIdToKyberToken(buyAsset.assetId),
21
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
22
+ feeParams: getKyberFeeParams({ chainId, affiliateBps }),
23
+ sendAddress,
24
+ baseUrl: deps.config.VITE_KYBER_BASE_URL,
25
+ });
26
+ if (maybeRoute.isErr())
27
+ return Err(maybeRoute.unwrapErr());
28
+ const route = maybeRoute.unwrap();
29
+ const tradeAmounts = getKyberTradeAmounts({ input, amountOut: route.amountOut });
30
+ const allowanceContract = isNativeEvmAsset(sellAsset.assetId) ? '' : KYBER_ROUTER_ADDRESS;
31
+ return Ok({
32
+ tradeCommon: {
33
+ id: uuid(),
34
+ rate: tradeAmounts.rate,
35
+ swapperName: SwapperName.KyberSwap,
36
+ affiliateBps,
37
+ slippageTolerancePercentageDecimal,
38
+ },
39
+ stepCommon: {
40
+ estimatedExecutionTimeMs: 0,
41
+ allowanceContract,
42
+ sellAsset,
43
+ buyAsset,
44
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
45
+ ...tradeAmounts,
46
+ source: SwapperName.KyberSwap,
47
+ },
48
+ protocolFees: {},
49
+ chainId,
50
+ route,
51
+ stepDataArgs: {
52
+ deps,
53
+ sellAsset,
54
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
55
+ spenderAddress: allowanceContract,
56
+ route,
57
+ },
58
+ });
59
+ };
@@ -0,0 +1,27 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ import type { Result } from '@sniptt/monads';
4
+ import type { Address } from 'viem';
5
+ import type { SwapErrorRight, TradeStepCommon } from '../../../types.js';
6
+ import type { KyberBuildData, KyberBuildResponse, KyberFeeParams, KyberRoutesResponse, KyberRouteSummary, KyberTradeQuoteInput, KyberTradeRateInput } from '../types.js';
7
+ import type { KyberSupportedChainId } from './constants.js';
8
+ export declare const assertValidTrade: ({ sellAsset, buyAsset, }: {
9
+ sellAsset: Asset;
10
+ buyAsset: Asset;
11
+ }) => Result<KyberSupportedChainId, SwapErrorRight>;
12
+ export declare const assetIdToKyberToken: (assetId: AssetId) => Address;
13
+ export declare const getKyberFeeParams: ({ chainId, affiliateBps, }: {
14
+ chainId: KyberSupportedChainId;
15
+ affiliateBps: string;
16
+ }) => KyberFeeParams | undefined;
17
+ export declare const getKyberBuyAmountBeforeFees: ({ buyAmountAfterFeesCryptoBaseUnit, affiliateBps, }: {
18
+ buyAmountAfterFeesCryptoBaseUnit: string;
19
+ affiliateBps: string;
20
+ }) => string;
21
+ export declare const getKyberTradeAmounts: ({ input, amountOut, }: {
22
+ input: KyberTradeQuoteInput | KyberTradeRateInput;
23
+ amountOut: string;
24
+ }) => Pick<TradeStepCommon, 'rate' | 'buyAmountBeforeFeesCryptoBaseUnit' | 'buyAmountAfterFeesCryptoBaseUnit' | 'affiliateFee'>;
25
+ export declare const getKyberRequestError: (error: SwapErrorRight) => SwapErrorRight;
26
+ export declare const validateKyberRoute: (response: KyberRoutesResponse, feeParams: KyberFeeParams | undefined) => Result<KyberRouteSummary, SwapErrorRight>;
27
+ export declare const validateKyberBuild: (response: KyberBuildResponse) => Result<KyberBuildData, SwapErrorRight>;