@shogun-sdk/intents-sdk 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/_esm/chains.js +5 -0
  2. package/dist/_esm/chains.js.map +1 -1
  3. package/dist/_esm/constants.js +7 -0
  4. package/dist/_esm/constants.js.map +1 -1
  5. package/dist/_esm/core/sdk.js +24 -3
  6. package/dist/_esm/core/sdk.js.map +1 -1
  7. package/dist/_esm/errors/index.js +6 -0
  8. package/dist/_esm/errors/index.js.map +1 -1
  9. package/dist/_esm/index.js +1 -0
  10. package/dist/_esm/index.js.map +1 -1
  11. package/dist/_esm/utils/defillama.js +115 -0
  12. package/dist/_esm/utils/defillama.js.map +1 -0
  13. package/dist/_esm/utils/parsers.js +41 -0
  14. package/dist/_esm/utils/parsers.js.map +1 -1
  15. package/dist/_types/chains.d.ts +1 -0
  16. package/dist/_types/chains.d.ts.map +1 -1
  17. package/dist/_types/constants.d.ts +3 -0
  18. package/dist/_types/constants.d.ts.map +1 -1
  19. package/dist/_types/core/sdk.d.ts.map +1 -1
  20. package/dist/_types/errors/index.d.ts +3 -0
  21. package/dist/_types/errors/index.d.ts.map +1 -1
  22. package/dist/_types/index.d.ts +2 -0
  23. package/dist/_types/index.d.ts.map +1 -1
  24. package/dist/_types/types/intent.d.ts +2 -2
  25. package/dist/_types/types/intent.d.ts.map +1 -1
  26. package/dist/_types/utils/defillama.d.ts +61 -0
  27. package/dist/_types/utils/defillama.d.ts.map +1 -0
  28. package/dist/_types/utils/parsers.d.ts +15 -0
  29. package/dist/_types/utils/parsers.d.ts.map +1 -1
  30. package/package.json +3 -3
  31. package/src/chains.ts +7 -0
  32. package/src/constants.ts +9 -0
  33. package/src/core/sdk.ts +28 -4
  34. package/src/errors/index.ts +7 -0
  35. package/src/index.ts +2 -0
  36. package/src/types/intent.ts +2 -2
  37. package/src/utils/defillama.ts +173 -0
  38. package/src/utils/parsers.ts +48 -0
@@ -1,3 +1,4 @@
1
+ import { NATIVE_EVM_ETH_ADDRESSES } from './constants.js';
1
2
  /**
2
3
  * Represents the blockchain platform type
3
4
  * Used to distinguish between different blockchain ecosystems
@@ -43,4 +44,8 @@ export const chainIdToChainTypeMap = {
43
44
  [ChainID.Solana]: ChainType.Solana,
44
45
  [ChainID.Sui]: ChainType.Sui,
45
46
  };
47
+ export function isNativeTokenEvmAddress(tokenAddress) {
48
+ const normalizedAddress = tokenAddress.toLowerCase();
49
+ return NATIVE_EVM_ETH_ADDRESSES.some((addr) => addr.toLowerCase() === normalizedAddress);
50
+ }
46
51
  //# sourceMappingURL=chains.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,8BAAiB,CAAA;IACjB,wBAAW,CAAA;AACb,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,iDAAgB,CAAA;IAChB,8CAAa,CAAA;IACb,wCAAW,CAAA;IACX,+CAAgB,CAAA;IAChB,qCAAS,CAAA;AACX,CAAC,EANW,OAAO,KAAP,OAAO,QAMlB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAU,CAAC;AA8BxH;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA2B,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC;AAEvH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG;IAC7B,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM;IAClC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG;CACpB,CAAC"}
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D;;;GAGG;AACH,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,8BAAiB,CAAA;IACjB,wBAAW,CAAA;AACb,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED;;;;GAIG;AACH,MAAM,CAAN,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,iDAAgB,CAAA;IAChB,8CAAa,CAAA;IACb,wCAAW,CAAA;IACX,+CAAgB,CAAA;IAChB,qCAAS,CAAA;AACX,CAAC,EANW,OAAO,KAAP,OAAO,QAMlB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAU,CAAC;AA8BxH;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA2B,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC;AAEvH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG;IAC7B,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG;IACjC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM;IAClC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG;CACpB,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IAC1D,MAAM,iBAAiB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAErD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC,CAAC;AAC3F,CAAC"}
@@ -29,6 +29,10 @@ export const SRC_CHAIN_GUARD = {
29
29
  // [ChainID.Sui]:
30
30
  // '0xd5057237ba5fe3d9aa00bb2a1555c3d3de77fd5653e72ce70f4aa0561fa9f04d',
31
31
  // }
32
+ export const NATIVE_EVM_ETH_ADDRESSES = [
33
+ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
34
+ '0x0000000000000000000000000000000000000000',
35
+ ];
32
36
  export const NATIVE_SOLANA_TOKEN_ADDRESS = address('So11111111111111111111111111111111111111111');
33
37
  export const WRAPPED_SOL_MINT_ADDRESS = address('So11111111111111111111111111111111111111112');
34
38
  export const SUI_PACKAGE_ID = '0x6273e29f803ff5851f89ec17d40d5b1f367476e1677ad0a52ca408f64c4473fe';
@@ -43,4 +47,7 @@ export const AUCTIONEER_URL = 'http://127.0.0.1:8080';
43
47
  export const MAX_UINT_64 = 2n ** 64n - 1n;
44
48
  export const MAX_UINT_128 = 2n ** 128n - 1n;
45
49
  export const MAX_UINT_256 = 2n ** 256n - 1n;
50
+ // Amount Calculation constants
51
+ export const REDUCTION_FACTOR = 0.8; // 80% of the input value
52
+ export const STABLECOIN_DECIMALS = 6; // USDC/USDT typically use 6 decimals
46
53
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;CACxE,CAAC;AAEF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,mBAAmB;AACnB,4EAA4E;AAC5E,IAAI;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAgD;IAC1E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;IACvE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,8CAA8C,CAAC;IACzE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,oEAAoE;CACpF,CAAC;AAEF,mFAAmF;AACnF,MAAM;AACN,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,iFAAiF;AACjF,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM;AAEN,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAEnG,0GAA0G;AAE1G,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF;;GAEG;AACH,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;CACxE,CAAC;AAEF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,mBAAmB;AACnB,4EAA4E;AAC5E,IAAI;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAgD;IAC1E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAAuD;IAC3E,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAAuD;IACvE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,8CAA8C,CAAC;IACzE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,oEAAoE;CACpF,CAAC;AAEF,mFAAmF;AACnF,MAAM;AACN,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,iFAAiF;AACjF,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM;AAEN,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,4CAA4C;IAC5C,4CAA4C;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAEnG,0GAA0G;AAE1G,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF;;GAEG;AACH,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAE5C,+BAA+B;AAC/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,yBAAyB;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,qCAAqC"}
@@ -1,6 +1,7 @@
1
1
  import { chainIdToChainTypeMap } from '../chains.js';
2
- import { AUCTIONEER_URL } from '../constants.js';
2
+ import { AUCTIONEER_URL, } from '../constants.js';
3
3
  import { NetworkError } from '../errors/index.js';
4
+ import { calculateAmounts } from '../utils/defillama.js';
4
5
  import { Parsers } from '../utils/parsers.js';
5
6
  import { Order } from './order.js';
6
7
  /**
@@ -26,18 +27,38 @@ export class BaseSDK {
26
27
  */
27
28
  async createOrder(params) {
28
29
  const userAddress = await this.getUserAddress();
30
+ let minStablecoinAmount;
31
+ let destinationTokenMinAmount;
32
+ if (!params.minStablecoinAmount || !params.destinationTokenMinAmount) {
33
+ // Calculate missing values using DefiLlama
34
+ const { amountOut: calculatedAmountOut, minStablecoinsAmount: calculatedMinStablecoins } = await calculateAmounts({
35
+ srcChainId: params.sourceChainId,
36
+ tokenIn: params.sourceTokenAddress,
37
+ amountIn: params.sourceTokenAmount,
38
+ destChainId: params.destinationChainId,
39
+ tokenOut: params.destinationTokenAddress,
40
+ });
41
+ // Use provided values if available, otherwise use calculated ones
42
+ minStablecoinAmount = params.minStablecoinAmount ?? calculatedMinStablecoins;
43
+ destinationTokenMinAmount = params.destinationTokenMinAmount ?? calculatedAmountOut;
44
+ }
45
+ else {
46
+ // Both values provided, use them directly
47
+ minStablecoinAmount = params.minStablecoinAmount;
48
+ destinationTokenMinAmount = params.destinationTokenMinAmount;
49
+ }
29
50
  // Order is validated upon creation
30
51
  const order = await Order.create({
31
52
  user: userAddress,
32
53
  sourceChainId: params.sourceChainId,
33
54
  sourceTokenAddress: params.sourceTokenAddress,
34
55
  sourceTokenAmount: params.sourceTokenAmount,
35
- minStablecoinAmount: params.minStablecoinAmount,
56
+ minStablecoinAmount: minStablecoinAmount,
36
57
  deadline: params.deadline,
37
58
  destinationAddress: params.destinationAddress,
38
59
  destinationChainId: params.destinationChainId,
39
60
  destinationTokenAddress: params.destinationTokenAddress,
40
- destinationTokenMinAmount: params.destinationTokenMinAmount,
61
+ destinationTokenMinAmount: destinationTokenMinAmount,
41
62
  extraTransfers: params.extraTransfers,
42
63
  });
43
64
  return this.prepareOrder(order);
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"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"}
@@ -76,6 +76,12 @@ export class InsufficientBalanceError extends BaseError {
76
76
  Object.setPrototypeOf(this, InsufficientBalanceError.prototype);
77
77
  }
78
78
  }
79
+ export class CalculateAmountError extends BaseError {
80
+ constructor(message, cause) {
81
+ super(message, cause);
82
+ Object.setPrototypeOf(this, CalculateAmountError.prototype);
83
+ }
84
+ }
79
85
  export class InsufficientAllowanceError extends BaseError {
80
86
  constructor(message, cause) {
81
87
  super(message, cause);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export { Order } from './core/order.js';
4
4
  export { SolanaSDK } from './core/solana/sdk.js';
5
5
  export { SuiSDK } from './core/sui/sdk.js';
6
6
  export { ValidationError } from './errors/index.js';
7
+ export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { ChainID, isNativeTokenEvmAddress } from '../chains';
2
+ import { NATIVE_SOLANA_TOKEN_ADDRESS, REDUCTION_FACTOR, STABLECOIN_DECIMALS, WRAPPED_SOL_MINT_ADDRESS } from '../constants';
3
+ import { CalculateAmountError } from '../errors';
4
+ import { Parsers } from './parsers';
5
+ const TOKEN_PRICE_BASE_URL = 'https://coins.llama.fi/prices/current/';
6
+ /**
7
+ * Maps chain IDs to their corresponding chain types
8
+ * Used to determine which SDK implementation to use for a given chain
9
+ */
10
+ export const chainIdToDefiLlamaChainMap = {
11
+ [ChainID.Arbitrum]: 'arbitrum',
12
+ [ChainID.Base]: 'base',
13
+ [ChainID.Optimism]: 'optimism',
14
+ [ChainID.Solana]: 'solana',
15
+ [ChainID.Sui]: 'sui',
16
+ };
17
+ /**
18
+ * Creates DefiLlama coin key from chain ID and token address
19
+ * Format: "chainName:tokenAddress"
20
+ */
21
+ export const createDefiLlamaCoinKey = (chainId, tokenAddress) => {
22
+ const chainName = chainIdToDefiLlamaChainMap[chainId];
23
+ if (!chainName) {
24
+ throw new CalculateAmountError(`Unsupported chain ID for DefiLlama: ${chainId}`);
25
+ }
26
+ return `${chainName}:${toDefiLlamaToken(tokenAddress)}`;
27
+ };
28
+ /**
29
+ * Retrieves token data from DefiLlama response by chain and address
30
+ */
31
+ export const getCoinFromResponse = (response, chainId, tokenAddress) => {
32
+ const key = createDefiLlamaCoinKey(chainId, tokenAddress);
33
+ const coin = response.coins[key];
34
+ if (!coin) {
35
+ throw new CalculateAmountError(`DefiLlama coin not found for ${key}`);
36
+ }
37
+ return coin;
38
+ };
39
+ /**
40
+ * Converts Solana native token address to wrapped SOL mint address
41
+ * DefiLlama uses wrapped SOL mint address for native SOL
42
+ *
43
+ * @param tokenAddress The token address to convert
44
+ * @returns The DefiLlama-compatible token address
45
+ */
46
+ function toDefiLlamaToken(tokenAddress) {
47
+ if (isNativeTokenEvmAddress(tokenAddress)) {
48
+ return '0x0000000000000000000000000000000000000000';
49
+ }
50
+ if (tokenAddress === NATIVE_SOLANA_TOKEN_ADDRESS) {
51
+ return WRAPPED_SOL_MINT_ADDRESS;
52
+ }
53
+ return tokenAddress;
54
+ }
55
+ /**
56
+ * Builds a comma-separated query string for DefiLlama API token requests
57
+ *
58
+ * Converts an array of chain/token pairs into the format expected by DefiLlama's
59
+ * bulk price endpoint: "chain1:token1,chain2:token2,..."
60
+ *
61
+ * @param tokens - Array of [ChainID, token address] tuples to query
62
+ * @returns Comma-separated string of DefiLlama coin keys
63
+ *
64
+ * @throws {CalculateAmountError} When any chain ID is not supported by DefiLlama
65
+ */
66
+ function buildTokensQueryString(tokens) {
67
+ return tokens.map(([chainId, tokenAddress]) => createDefiLlamaCoinKey(chainId, tokenAddress)).join(',');
68
+ }
69
+ /**
70
+ * Fetch tokens data for array of coins
71
+ *
72
+ * @param tokens Array of [ChainID, Token Address] tuples
73
+ * @returns Promise resolving to DefiLlama tokens response
74
+ * @throws {CalculateAmountError} If the request fails or response is invalid
75
+ */
76
+ export async function getTokensData(tokens) {
77
+ const tokensStr = buildTokensQueryString(tokens);
78
+ const url = `${TOKEN_PRICE_BASE_URL}${tokensStr}`;
79
+ const response = await fetch(url, {
80
+ method: 'GET',
81
+ headers: {
82
+ 'Content-Type': 'application/json',
83
+ },
84
+ });
85
+ if (!response.ok) {
86
+ throw new CalculateAmountError(`Failed to fetch token prices: ${response.status} ${response.statusText}`);
87
+ }
88
+ const data = await response.json();
89
+ return data;
90
+ }
91
+ export async function calculateAmounts({ srcChainId, tokenIn, amountIn, destChainId, tokenOut, }) {
92
+ // Fetch token data from DefiLlama
93
+ const tokensResponse = await getTokensData([
94
+ [srcChainId, tokenIn],
95
+ [destChainId, tokenOut],
96
+ ]);
97
+ // Get token data for input token
98
+ const tokenInData = getCoinFromResponse(tokensResponse, srcChainId, tokenIn);
99
+ if (!tokenInData) {
100
+ throw new CalculateAmountError(`Token ${tokenIn} for chain ${srcChainId} not found in DefiLlama response`);
101
+ }
102
+ // Get token data for output token
103
+ const tokenOutData = getCoinFromResponse(tokensResponse, destChainId, tokenOut);
104
+ if (!tokenOutData) {
105
+ throw new CalculateAmountError(`Token ${tokenOut} for chain ${destChainId} not found in DefiLlama response`);
106
+ }
107
+ // Calculate 80% of the amount_in value as amount_out_min and min_stablecoins_amount
108
+ const tokenInUsdAmount = Parsers.bigintToFloat(amountIn, tokenInData.decimals) * tokenInData.price;
109
+ const amountInUsdReduced = tokenInUsdAmount * REDUCTION_FACTOR;
110
+ const amountOutReduced = amountInUsdReduced / tokenOutData.price;
111
+ const amountOut = Parsers.floatToBigint(amountOutReduced, tokenOutData.decimals);
112
+ const minStablecoinsAmount = Parsers.floatToBigint(amountInUsdReduced, STABLECOIN_DECIMALS);
113
+ return { amountOut, minStablecoinsAmount };
114
+ }
115
+ //# sourceMappingURL=defillama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defillama.js","sourceRoot":"","sources":["../../../src/utils/defillama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAuB,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,oBAAoB,GAAW,wCAAwC,CAAC;AAyB9E;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC9B,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM;IACtB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC9B,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC1B,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK;CACZ,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAE,YAAoB,EAAU,EAAE;IACvF,MAAM,SAAS,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,GAAG,SAAS,IAAI,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAiC,EACjC,OAAgB,EAChB,YAAoB,EACD,EAAE;IACrB,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,oBAAoB,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,YAAoB;IAC5C,IAAI,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAED,IAAI,YAAY,KAAK,2BAA2B,EAAE,CAAC;QACjD,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,sBAAsB,CAAC,MAAgC;IAC9D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAgC;IAClE,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG,GAAG,oBAAoB,GAAG,SAAS,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,oBAAoB,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,IAAI,GAA4B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EACnC,UAAU,EACV,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,GAOT;IACC,kCAAkC;IAClC,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;QACzC,CAAC,UAAU,EAAE,OAAO,CAAC;QACrB,CAAC,WAAW,EAAE,QAAQ,CAAC;KACxB,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,WAAW,GAAG,mBAAmB,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,oBAAoB,CAAC,SAAS,OAAO,cAAc,UAAU,kCAAkC,CAAC,CAAC;IAC7G,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAChF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,oBAAoB,CAAC,SAAS,QAAQ,cAAc,WAAW,kCAAkC,CAAC,CAAC;IAC/G,CAAC;IAED,oFAAoF;IACpF,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IACnG,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IAC/D,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,YAAY,CAAC,KAAK,CAAC;IAEjE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjF,MAAM,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IAE5F,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAC7C,CAAC"}
@@ -1,4 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-namespace */
2
+ import { formatUnits, parseUnits } from 'viem';
3
+ import { CalculateAmountError } from '../errors';
2
4
  export var Parsers;
3
5
  (function (Parsers) {
4
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -6,5 +8,44 @@ export var Parsers;
6
8
  return typeof value === 'bigint' ? value.toString() : value;
7
9
  }
8
10
  Parsers.bigIntReplacer = bigIntReplacer;
11
+ /**
12
+ * Converts a bigint amount to a floating point USD value
13
+ * @param amount Amount in token's smallest unit
14
+ * @param decimals Number of decimal places for the token
15
+ * @returns USD value as number
16
+ */
17
+ function bigintToFloat(amount, decimals) {
18
+ const formatted = formatUnits(amount, decimals);
19
+ const result = parseFloat(formatted);
20
+ if (!Number.isFinite(result)) {
21
+ throw new CalculateAmountError(`Conversion resulted in invalid number: ${formatted}`);
22
+ }
23
+ return result;
24
+ }
25
+ Parsers.bigintToFloat = bigintToFloat;
26
+ /**
27
+ * Converts a floating point USD value to bigint amount
28
+ * Uses viem's parseUnits for consistency and reliability
29
+ * @param usdValue USD value as number
30
+ * @param decimals Number of decimal places for the token
31
+ * @returns Amount in token's smallest unit
32
+ */
33
+ function floatToBigint(usdValue, decimals) {
34
+ if (!Number.isFinite(usdValue) || usdValue < 0) {
35
+ throw new CalculateAmountError(`Invalid USD value: ${usdValue}`);
36
+ }
37
+ if (decimals < 0 || decimals > 77) {
38
+ throw new CalculateAmountError(`Invalid decimals: ${decimals}`);
39
+ }
40
+ // Convert to fixed-precision string to avoid floating point issues
41
+ const valueString = usdValue.toFixed(decimals);
42
+ try {
43
+ return parseUnits(valueString, decimals);
44
+ }
45
+ catch (error) {
46
+ throw new CalculateAmountError(`Failed to convert ${usdValue} to bigint with ${decimals} decimals: ${error instanceof Error ? error.message : 'Unknown error'}`);
47
+ }
48
+ }
49
+ Parsers.floatToBigint = floatToBigint;
9
50
  })(Parsers || (Parsers = {}));
10
51
  //# sourceMappingURL=parsers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,MAAM,KAAW,OAAO,CAKvB;AALD,WAAiB,OAAO;IACtB,8DAA8D;IAC9D,SAAgB,cAAc,CAAC,IAAY,EAAE,KAAU;QACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;IAFe,sBAAc,iBAE7B,CAAA;AACH,CAAC,EALgB,OAAO,KAAP,OAAO,QAKvB"}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,KAAW,OAAO,CAkDvB;AAlDD,WAAiB,OAAO;IACtB,8DAA8D;IAC9D,SAAgB,cAAc,CAAC,IAAY,EAAE,KAAU;QACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;IAFe,sBAAc,iBAE7B,CAAA;IAED;;;;;OAKG;IACH,SAAgB,aAAa,CAAC,MAAc,EAAE,QAAgB;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,oBAAoB,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IATe,qBAAa,gBAS5B,CAAA;IAED;;;;;;OAMG;IACH,SAAgB,aAAa,CAAC,QAAgB,EAAE,QAAgB;QAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAoB,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,mEAAmE;QACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAC5B,qBAAqB,QAAQ,mBAAmB,QAAQ,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACjI,CAAC;QACJ,CAAC;IACH,CAAC;IAnBe,qBAAa,gBAmB5B,CAAA;AACH,CAAC,EAlDgB,OAAO,KAAP,OAAO,QAkDvB"}
@@ -65,5 +65,6 @@ export declare const chainIdToChainTypeMap: {
65
65
  readonly 7565164: ChainType.Solana;
66
66
  readonly 101: ChainType.Sui;
67
67
  };
68
+ export declare function isNativeTokenEvmAddress(tokenAddress: string): boolean;
68
69
  export {};
69
70
  //# sourceMappingURL=chains.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAED;;;;GAIG;AACH,oBAAY,OAAO;IACjB,QAAQ,QAAQ;IAChB,QAAQ,KAAK;IACb,IAAI,OAAO;IACX,MAAM,UAAU;IAChB,GAAG,MAAM;CACV;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,0FAA2F,CAAC;AAExH;;;GAGG;AACH,KAAK,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,cAA2D,CAAC;AAEvH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC"}
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chains.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAED;;;;GAIG;AACH,oBAAY,OAAO;IACjB,QAAQ,QAAQ;IAChB,QAAQ,KAAK;IACb,IAAI,OAAO;IACX,MAAM,UAAU;IAChB,GAAG,MAAM;CACV;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,0FAA2F,CAAC;AAExH;;;GAGG;AACH,KAAK,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,cAA2D,CAAC;AAEvH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAIrE"}
@@ -3,6 +3,7 @@ import type { Address, Hex } from 'viem';
3
3
  import type { SupportedChain, SupportedEvmChain } from './chains.js';
4
4
  export declare const PERMIT2_ADDRESS: Record<SupportedEvmChain, Address>;
5
5
  export declare const SRC_CHAIN_GUARD: Record<SupportedChain, SolanaAddress | Hex>;
6
+ export declare const NATIVE_EVM_ETH_ADDRESSES: string[];
6
7
  export declare const NATIVE_SOLANA_TOKEN_ADDRESS: SolanaAddress<"So11111111111111111111111111111111111111111">;
7
8
  export declare const WRAPPED_SOL_MINT_ADDRESS: SolanaAddress<"So11111111111111111111111111111111111111112">;
8
9
  export declare const SUI_PACKAGE_ID = "0x6273e29f803ff5851f89ec17d40d5b1f367476e1677ad0a52ca408f64c4473fe";
@@ -15,4 +16,6 @@ export declare const AUCTIONEER_URL = "http://127.0.0.1:8080";
15
16
  export declare const MAX_UINT_64: bigint;
16
17
  export declare const MAX_UINT_128: bigint;
17
18
  export declare const MAX_UINT_256: bigint;
19
+ export declare const REDUCTION_FACTOR = 0.8;
20
+ export declare const STABLECOIN_DECIMALS = 6;
18
21
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAI9D,CAAC;AAWF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,GAAG,GAAG,CAMvE,CAAC;AAYF,eAAO,MAAM,2BAA2B,8DAAyD,CAAC;AAElG,eAAO,MAAM,wBAAwB,8DAAyD,CAAC;AAE/F,eAAO,MAAM,cAAc,uEAAuE,CAAC;AAInG,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF;;GAEG;AAEH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,eAAO,MAAM,WAAW,QAAiB,CAAC;AAC1C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,QAAkB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAI9D,CAAC;AAWF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,GAAG,GAAG,CAMvE,CAAC;AAYF,eAAO,MAAM,wBAAwB,UAGpC,CAAC;AAEF,eAAO,MAAM,2BAA2B,8DAAyD,CAAC;AAElG,eAAO,MAAM,wBAAwB,8DAAyD,CAAC;AAE/F,eAAO,MAAM,cAAc,uEAAuE,CAAC;AAInG,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAEnF;;GAEG;AAEH,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,eAAO,MAAM,WAAW,QAAiB,CAAC;AAC1C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,QAAkB,CAAC;AAG5C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,mBAAmB,IAAI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,8BAAsB,OAAO;IAC3B;;;;;OAKG;aACa,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAEjD;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;IAErE;;;;;;;;;;;;OAYG;IACU,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAqB3E;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK7E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;;;;;;;;;;OAYG;IACU,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA0BxE"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/core/sdk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAG9F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,8BAAsB,OAAO;IAC3B;;;;;OAKG;aACa,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAEjD;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;IAErE;;;;;;;;;;;;OAYG;IACU,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C3E;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK7E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;;;;;;;;;;OAYG;IACU,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA0BxE"}
@@ -25,6 +25,9 @@ export declare class NetworkError extends BaseError {
25
25
  export declare class InsufficientBalanceError extends BaseError {
26
26
  constructor(message: string, cause?: unknown);
27
27
  }
28
+ export declare class CalculateAmountError extends BaseError {
29
+ constructor(message: string, cause?: unknown);
30
+ }
28
31
  export declare class InsufficientAllowanceError extends BaseError {
29
32
  constructor(message: string, cause?: unknown);
30
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;aAGP,KAAK,CAAC,EAAE,OAAO;gBADxC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,OAAO,YAAA;IAQnC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC,OAAO,CAAC,WAAW;CAapB;AAGD,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAGD,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,0BAA2B,SAAQ,SAAS;gBAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAcrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;aAGP,KAAK,CAAC,EAAE,OAAO;gBADxC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,OAAO,YAAA;IAQnC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC,OAAO,CAAC,WAAW;CAapB;AAGD,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,QAAS,SAAQ,SAAS;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAGD,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,oBAAqB,SAAQ,SAAS;gBACrC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,qBAAa,0BAA2B,SAAQ,SAAS;gBAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAcrD"}
@@ -6,5 +6,7 @@ export { Order } from './core/order.js';
6
6
  export { SolanaSDK } from './core/solana/sdk.js';
7
7
  export { SuiSDK } from './core/sui/sdk.js';
8
8
  export { ValidationError } from './errors/index.js';
9
+ export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
10
+ export type { DefiLlamaCoinData, DefiLlamaTokensResponse } from './utils/defillama.js';
9
11
  export type { CreateOrderParams } from './types/intent.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChJ,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACvF,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -16,11 +16,11 @@ export type CreateOrderParams = {
16
16
  /** Token address on the destination chain to receive */
17
17
  destinationTokenAddress: string;
18
18
  /** Minimum amount of destination tokens to receive, in smallest units */
19
- destinationTokenMinAmount: bigint;
19
+ destinationTokenMinAmount?: bigint;
20
20
  /** Recipient wallet address on the destination chain */
21
21
  destinationAddress: string;
22
22
  /** Minimum amount of stablecoins in the intermediate swap, in smallest units */
23
- minStablecoinAmount: bigint;
23
+ minStablecoinAmount?: bigint;
24
24
  /** Timestamp (in seconds) after which the order expires */
25
25
  deadline: number;
26
26
  /** Extra Transfers */
@@ -1 +1 @@
1
- {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/types/intent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/types/intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { ChainID, type SupportedChain } from '../chains';
2
+ /**
3
+ * Response structure from DefiLlama API for token prices
4
+ */
5
+ export interface DefiLlamaTokensResponse {
6
+ coins: Record<string, DefiLlamaCoinData>;
7
+ }
8
+ /**
9
+ * Individual token data from DefiLlama API
10
+ */
11
+ export interface DefiLlamaCoinData {
12
+ /** Number of decimal places for the token */
13
+ decimals: number;
14
+ /** Token symbol (e.g., "ETH", "USDC") */
15
+ symbol: string;
16
+ /** Current price in USD */
17
+ price: number;
18
+ /** Unix timestamp of the price data */
19
+ timestamp: number;
20
+ /** Confidence level of the price data (0-1) */
21
+ confidence: number;
22
+ }
23
+ /**
24
+ * Maps chain IDs to their corresponding chain types
25
+ * Used to determine which SDK implementation to use for a given chain
26
+ */
27
+ export declare const chainIdToDefiLlamaChainMap: {
28
+ readonly 42161: "arbitrum";
29
+ readonly 8453: "base";
30
+ readonly 10: "optimism";
31
+ readonly 7565164: "solana";
32
+ readonly 101: "sui";
33
+ };
34
+ /**
35
+ * Creates DefiLlama coin key from chain ID and token address
36
+ * Format: "chainName:tokenAddress"
37
+ */
38
+ export declare const createDefiLlamaCoinKey: (chainId: ChainID, tokenAddress: string) => string;
39
+ /**
40
+ * Retrieves token data from DefiLlama response by chain and address
41
+ */
42
+ export declare const getCoinFromResponse: (response: DefiLlamaTokensResponse, chainId: ChainID, tokenAddress: string) => DefiLlamaCoinData;
43
+ /**
44
+ * Fetch tokens data for array of coins
45
+ *
46
+ * @param tokens Array of [ChainID, Token Address] tuples
47
+ * @returns Promise resolving to DefiLlama tokens response
48
+ * @throws {CalculateAmountError} If the request fails or response is invalid
49
+ */
50
+ export declare function getTokensData(tokens: Array<[ChainID, string]>): Promise<DefiLlamaTokensResponse>;
51
+ export declare function calculateAmounts({ srcChainId, tokenIn, amountIn, destChainId, tokenOut, }: {
52
+ srcChainId: SupportedChain;
53
+ tokenIn: string;
54
+ amountIn: bigint;
55
+ destChainId: SupportedChain;
56
+ tokenOut: string;
57
+ }): Promise<{
58
+ amountOut: bigint;
59
+ minStablecoinsAmount: bigint;
60
+ }>;
61
+ //# sourceMappingURL=defillama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defillama.d.ts","sourceRoot":"","sources":["../../../src/utils/defillama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAOlF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;CAM7B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,EAAE,cAAc,MAAM,KAAG,MAO/E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,uBAAuB,EACjC,SAAS,OAAO,EAChB,cAAc,MAAM,KACnB,iBASF,CAAC;AAoCF;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAiBtG;AACD,wBAAsB,gBAAgB,CAAC,EACnC,UAAU,EACV,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B/D"}
@@ -1,4 +1,19 @@
1
1
  export declare namespace Parsers {
2
2
  function bigIntReplacer(_key: string, value: any): any;
3
+ /**
4
+ * Converts a bigint amount to a floating point USD value
5
+ * @param amount Amount in token's smallest unit
6
+ * @param decimals Number of decimal places for the token
7
+ * @returns USD value as number
8
+ */
9
+ function bigintToFloat(amount: bigint, decimals: number): number;
10
+ /**
11
+ * Converts a floating point USD value to bigint amount
12
+ * Uses viem's parseUnits for consistency and reliability
13
+ * @param usdValue USD value as number
14
+ * @param decimals Number of decimal places for the token
15
+ * @returns Amount in token's smallest unit
16
+ */
17
+ function floatToBigint(usdValue: number, decimals: number): bigint;
3
18
  }
4
19
  //# sourceMappingURL=parsers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAEA,yBAAiB,OAAO,CAAC;IAEvB,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAE5D;CACF"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../src/utils/parsers.ts"],"names":[],"mappings":"AAKA,yBAAiB,OAAO,CAAC;IAEvB,SAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAE5D;IAED;;;;;OAKG;IACH,SAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStE;IAED;;;;;;OAMG;IACH,SAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBxE;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shogun-sdk/intents-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
5
  "description": "Shogun Network Intent-based cross-chain swaps SDK",
6
6
  "author": "Shogun network",
@@ -47,10 +47,10 @@
47
47
  "@solana-program/system": "^0.7.0",
48
48
  "@solana-program/token": "^0.5.1",
49
49
  "@solana/kit": "^2.1.0",
50
- "viem": "^2.26.2"
50
+ "viem": "2.31.0"
51
51
  },
52
52
  "scripts": {
53
- "build": "pnpm clean && pnpm build:esm && pnpm build:types",
53
+ "build": "pnpm clean && pnpm build:types && pnpm build:esm",
54
54
  "build:esm": "tsc --project ./tsconfig.build.json --module es2015 --outDir ./dist/_esm && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./dist/_esm/package.json",
55
55
  "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./dist/_types --emitDeclarationOnly --declaration --declarationMap",
56
56
  "clean": "rm -rf ./dist",
package/src/chains.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { NATIVE_EVM_ETH_ADDRESSES } from './constants.js';
1
2
  import type { TupleToUnion } from './utils/type-utils.js';
2
3
 
3
4
  /**
@@ -75,3 +76,9 @@ export const chainIdToChainTypeMap = {
75
76
  [ChainID.Solana]: ChainType.Solana,
76
77
  [ChainID.Sui]: ChainType.Sui,
77
78
  } as const;
79
+
80
+ export function isNativeTokenEvmAddress(tokenAddress: string): boolean {
81
+ const normalizedAddress = tokenAddress.toLowerCase();
82
+
83
+ return NATIVE_EVM_ETH_ADDRESSES.some((addr) => addr.toLowerCase() === normalizedAddress);
84
+ }
package/src/constants.ts CHANGED
@@ -36,6 +36,11 @@ export const SRC_CHAIN_GUARD: Record<SupportedChain, SolanaAddress | Hex> = {
36
36
  // '0xd5057237ba5fe3d9aa00bb2a1555c3d3de77fd5653e72ce70f4aa0561fa9f04d',
37
37
  // }
38
38
 
39
+ export const NATIVE_EVM_ETH_ADDRESSES = [
40
+ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
41
+ '0x0000000000000000000000000000000000000000',
42
+ ];
43
+
39
44
  export const NATIVE_SOLANA_TOKEN_ADDRESS = address('So11111111111111111111111111111111111111111');
40
45
 
41
46
  export const WRAPPED_SOL_MINT_ADDRESS = address('So11111111111111111111111111111111111111112');
@@ -59,3 +64,7 @@ export const AUCTIONEER_URL = 'http://127.0.0.1:8080';
59
64
  export const MAX_UINT_64 = 2n ** 64n - 1n;
60
65
  export const MAX_UINT_128 = 2n ** 128n - 1n;
61
66
  export const MAX_UINT_256 = 2n ** 256n - 1n;
67
+
68
+ // Amount Calculation constants
69
+ export const REDUCTION_FACTOR = 0.8; // 80% of the input value
70
+ export const STABLECOIN_DECIMALS = 6; // USDC/USDT typically use 6 decimals
package/src/core/sdk.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { chainIdToChainTypeMap } from '../chains.js';
2
- import { AUCTIONEER_URL } from '../constants.js';
3
- import { NetworkError } from '../errors/index.js';
2
+ import { AUCTIONEER_URL, } from '../constants.js';
3
+ import { NetworkError } from '../errors/index.js';
4
4
  import type { CreateOrderParams, PreparedOrder, UserIntentRequest } from '../types/intent.js';
5
+ import { calculateAmounts } from '../utils/defillama.js';
5
6
  import { Parsers } from '../utils/parsers.js';
6
7
  import { Order } from './order.js';
7
8
 
@@ -52,18 +53,41 @@ export abstract class BaseSDK {
52
53
  public async createOrder(params: CreateOrderParams): Promise<PreparedOrder> {
53
54
  const userAddress = await this.getUserAddress();
54
55
 
56
+ let minStablecoinAmount: bigint;
57
+ let destinationTokenMinAmount: bigint;
58
+
59
+ if (!params.minStablecoinAmount || !params.destinationTokenMinAmount) {
60
+ // Calculate missing values using DefiLlama
61
+ const { amountOut: calculatedAmountOut, minStablecoinsAmount: calculatedMinStablecoins } =
62
+ await calculateAmounts({
63
+ srcChainId: params.sourceChainId,
64
+ tokenIn: params.sourceTokenAddress,
65
+ amountIn: params.sourceTokenAmount,
66
+ destChainId: params.destinationChainId,
67
+ tokenOut: params.destinationTokenAddress,
68
+ });
69
+
70
+ // Use provided values if available, otherwise use calculated ones
71
+ minStablecoinAmount = params.minStablecoinAmount ?? calculatedMinStablecoins;
72
+ destinationTokenMinAmount = params.destinationTokenMinAmount ?? calculatedAmountOut;
73
+ } else {
74
+ // Both values provided, use them directly
75
+ minStablecoinAmount = params.minStablecoinAmount;
76
+ destinationTokenMinAmount = params.destinationTokenMinAmount;
77
+ }
78
+
55
79
  // Order is validated upon creation
56
80
  const order = await Order.create({
57
81
  user: userAddress,
58
82
  sourceChainId: params.sourceChainId,
59
83
  sourceTokenAddress: params.sourceTokenAddress,
60
84
  sourceTokenAmount: params.sourceTokenAmount,
61
- minStablecoinAmount: params.minStablecoinAmount,
85
+ minStablecoinAmount: minStablecoinAmount,
62
86
  deadline: params.deadline,
63
87
  destinationAddress: params.destinationAddress,
64
88
  destinationChainId: params.destinationChainId,
65
89
  destinationTokenAddress: params.destinationTokenAddress,
66
- destinationTokenMinAmount: params.destinationTokenMinAmount,
90
+ destinationTokenMinAmount: destinationTokenMinAmount,
67
91
  extraTransfers: params.extraTransfers,
68
92
  });
69
93
 
@@ -83,6 +83,13 @@ export class InsufficientBalanceError extends BaseError {
83
83
  }
84
84
  }
85
85
 
86
+ export class CalculateAmountError extends BaseError {
87
+ constructor(message: string, cause?: unknown) {
88
+ super(message, cause);
89
+ Object.setPrototypeOf(this, CalculateAmountError.prototype);
90
+ }
91
+ }
92
+
86
93
  export class InsufficientAllowanceError extends BaseError {
87
94
  constructor(message: string, cause?: unknown) {
88
95
  super(message, cause);
package/src/index.ts CHANGED
@@ -7,4 +7,6 @@ export { Order } from './core/order.js';
7
7
  export { SolanaSDK } from './core/solana/sdk.js';
8
8
  export { SuiSDK } from './core/sui/sdk.js';
9
9
  export { ValidationError } from './errors/index.js';
10
+ export { calculateAmounts, chainIdToDefiLlamaChainMap, createDefiLlamaCoinKey, getCoinFromResponse, getTokensData } from './utils/defillama.js';
11
+ export type { DefiLlamaCoinData, DefiLlamaTokensResponse } from './utils/defillama.js';
10
12
  export type { CreateOrderParams } from './types/intent.js';
@@ -18,12 +18,12 @@ export type CreateOrderParams = {
18
18
  /** Token address on the destination chain to receive */
19
19
  destinationTokenAddress: string;
20
20
  /** Minimum amount of destination tokens to receive, in smallest units */
21
- destinationTokenMinAmount: bigint;
21
+ destinationTokenMinAmount?: bigint;
22
22
  /** Recipient wallet address on the destination chain */
23
23
  destinationAddress: string;
24
24
 
25
25
  /** Minimum amount of stablecoins in the intermediate swap, in smallest units */
26
- minStablecoinAmount: bigint;
26
+ minStablecoinAmount?: bigint;
27
27
  /** Timestamp (in seconds) after which the order expires */
28
28
  deadline: number;
29
29
 
@@ -0,0 +1,173 @@
1
+ import { ChainID, isNativeTokenEvmAddress, type SupportedChain } from '../chains';
2
+ import { NATIVE_SOLANA_TOKEN_ADDRESS, REDUCTION_FACTOR, STABLECOIN_DECIMALS, WRAPPED_SOL_MINT_ADDRESS } from '../constants';
3
+ import { CalculateAmountError } from '../errors';
4
+ import { Parsers } from './parsers';
5
+
6
+ const TOKEN_PRICE_BASE_URL: string = 'https://coins.llama.fi/prices/current/';
7
+
8
+ /**
9
+ * Response structure from DefiLlama API for token prices
10
+ */
11
+ export interface DefiLlamaTokensResponse {
12
+ coins: Record<string, DefiLlamaCoinData>;
13
+ }
14
+
15
+ /**
16
+ * Individual token data from DefiLlama API
17
+ */
18
+ export interface DefiLlamaCoinData {
19
+ /** Number of decimal places for the token */
20
+ decimals: number;
21
+ /** Token symbol (e.g., "ETH", "USDC") */
22
+ symbol: string;
23
+ /** Current price in USD */
24
+ price: number;
25
+ /** Unix timestamp of the price data */
26
+ timestamp: number;
27
+ /** Confidence level of the price data (0-1) */
28
+ confidence: number;
29
+ }
30
+
31
+ /**
32
+ * Maps chain IDs to their corresponding chain types
33
+ * Used to determine which SDK implementation to use for a given chain
34
+ */
35
+ export const chainIdToDefiLlamaChainMap = {
36
+ [ChainID.Arbitrum]: 'arbitrum',
37
+ [ChainID.Base]: 'base',
38
+ [ChainID.Optimism]: 'optimism',
39
+ [ChainID.Solana]: 'solana',
40
+ [ChainID.Sui]: 'sui',
41
+ } as const;
42
+
43
+ /**
44
+ * Creates DefiLlama coin key from chain ID and token address
45
+ * Format: "chainName:tokenAddress"
46
+ */
47
+ export const createDefiLlamaCoinKey = (chainId: ChainID, tokenAddress: string): string => {
48
+ const chainName = chainIdToDefiLlamaChainMap[chainId];
49
+ if (!chainName) {
50
+ throw new CalculateAmountError(`Unsupported chain ID for DefiLlama: ${chainId}`);
51
+ }
52
+
53
+ return `${chainName}:${toDefiLlamaToken(tokenAddress)}`;
54
+ };
55
+
56
+ /**
57
+ * Retrieves token data from DefiLlama response by chain and address
58
+ */
59
+ export const getCoinFromResponse = (
60
+ response: DefiLlamaTokensResponse,
61
+ chainId: ChainID,
62
+ tokenAddress: string,
63
+ ): DefiLlamaCoinData => {
64
+ const key = createDefiLlamaCoinKey(chainId, tokenAddress);
65
+ const coin = response.coins[key];
66
+
67
+ if (!coin) {
68
+ throw new CalculateAmountError(`DefiLlama coin not found for ${key}`);
69
+ }
70
+
71
+ return coin;
72
+ };
73
+
74
+ /**
75
+ * Converts Solana native token address to wrapped SOL mint address
76
+ * DefiLlama uses wrapped SOL mint address for native SOL
77
+ *
78
+ * @param tokenAddress The token address to convert
79
+ * @returns The DefiLlama-compatible token address
80
+ */
81
+ function toDefiLlamaToken(tokenAddress: string): string {
82
+ if (isNativeTokenEvmAddress(tokenAddress)) {
83
+ return '0x0000000000000000000000000000000000000000';
84
+ }
85
+
86
+ if (tokenAddress === NATIVE_SOLANA_TOKEN_ADDRESS) {
87
+ return WRAPPED_SOL_MINT_ADDRESS;
88
+ }
89
+
90
+ return tokenAddress;
91
+ }
92
+
93
+ /**
94
+ * Builds a comma-separated query string for DefiLlama API token requests
95
+ *
96
+ * Converts an array of chain/token pairs into the format expected by DefiLlama's
97
+ * bulk price endpoint: "chain1:token1,chain2:token2,..."
98
+ *
99
+ * @param tokens - Array of [ChainID, token address] tuples to query
100
+ * @returns Comma-separated string of DefiLlama coin keys
101
+ *
102
+ * @throws {CalculateAmountError} When any chain ID is not supported by DefiLlama
103
+ */
104
+ function buildTokensQueryString(tokens: Array<[ChainID, string]>): string {
105
+ return tokens.map(([chainId, tokenAddress]) => createDefiLlamaCoinKey(chainId, tokenAddress)).join(',');
106
+ }
107
+
108
+ /**
109
+ * Fetch tokens data for array of coins
110
+ *
111
+ * @param tokens Array of [ChainID, Token Address] tuples
112
+ * @returns Promise resolving to DefiLlama tokens response
113
+ * @throws {CalculateAmountError} If the request fails or response is invalid
114
+ */
115
+ export async function getTokensData(tokens: Array<[ChainID, string]>): Promise<DefiLlamaTokensResponse> {
116
+ const tokensStr = buildTokensQueryString(tokens);
117
+
118
+ const url = `${TOKEN_PRICE_BASE_URL}${tokensStr}`;
119
+ const response = await fetch(url, {
120
+ method: 'GET',
121
+ headers: {
122
+ 'Content-Type': 'application/json',
123
+ },
124
+ });
125
+
126
+ if (!response.ok) {
127
+ throw new CalculateAmountError(`Failed to fetch token prices: ${response.status} ${response.statusText}`);
128
+ }
129
+
130
+ const data: DefiLlamaTokensResponse = await response.json();
131
+ return data;
132
+ }
133
+ export async function calculateAmounts({
134
+ srcChainId,
135
+ tokenIn,
136
+ amountIn,
137
+ destChainId,
138
+ tokenOut,
139
+ }: {
140
+ srcChainId: SupportedChain;
141
+ tokenIn: string;
142
+ amountIn: bigint;
143
+ destChainId: SupportedChain;
144
+ tokenOut: string;
145
+ }): Promise<{ amountOut: bigint; minStablecoinsAmount: bigint }> {
146
+ // Fetch token data from DefiLlama
147
+ const tokensResponse = await getTokensData([
148
+ [srcChainId, tokenIn],
149
+ [destChainId, tokenOut],
150
+ ]);
151
+
152
+ // Get token data for input token
153
+ const tokenInData = getCoinFromResponse(tokensResponse, srcChainId, tokenIn);
154
+ if (!tokenInData) {
155
+ throw new CalculateAmountError(`Token ${tokenIn} for chain ${srcChainId} not found in DefiLlama response`);
156
+ }
157
+
158
+ // Get token data for output token
159
+ const tokenOutData = getCoinFromResponse(tokensResponse, destChainId, tokenOut);
160
+ if (!tokenOutData) {
161
+ throw new CalculateAmountError(`Token ${tokenOut} for chain ${destChainId} not found in DefiLlama response`);
162
+ }
163
+
164
+ // Calculate 80% of the amount_in value as amount_out_min and min_stablecoins_amount
165
+ const tokenInUsdAmount = Parsers.bigintToFloat(amountIn, tokenInData.decimals) * tokenInData.price;
166
+ const amountInUsdReduced = tokenInUsdAmount * REDUCTION_FACTOR;
167
+ const amountOutReduced = amountInUsdReduced / tokenOutData.price;
168
+
169
+ const amountOut = Parsers.floatToBigint(amountOutReduced, tokenOutData.decimals);
170
+ const minStablecoinsAmount = Parsers.floatToBigint(amountInUsdReduced, STABLECOIN_DECIMALS);
171
+
172
+ return { amountOut, minStablecoinsAmount };
173
+ }
@@ -1,8 +1,56 @@
1
1
  /* eslint-disable @typescript-eslint/no-namespace */
2
+ import { formatUnits, parseUnits } from 'viem';
3
+
4
+ import { CalculateAmountError } from '../errors';
2
5
 
3
6
  export namespace Parsers {
4
7
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
8
  export function bigIntReplacer(_key: string, value: any): any {
6
9
  return typeof value === 'bigint' ? value.toString() : value;
7
10
  }
11
+
12
+ /**
13
+ * Converts a bigint amount to a floating point USD value
14
+ * @param amount Amount in token's smallest unit
15
+ * @param decimals Number of decimal places for the token
16
+ * @returns USD value as number
17
+ */
18
+ export function bigintToFloat(amount: bigint, decimals: number): number {
19
+ const formatted = formatUnits(amount, decimals);
20
+ const result = parseFloat(formatted);
21
+
22
+ if (!Number.isFinite(result)) {
23
+ throw new CalculateAmountError(`Conversion resulted in invalid number: ${formatted}`);
24
+ }
25
+
26
+ return result;
27
+ }
28
+
29
+ /**
30
+ * Converts a floating point USD value to bigint amount
31
+ * Uses viem's parseUnits for consistency and reliability
32
+ * @param usdValue USD value as number
33
+ * @param decimals Number of decimal places for the token
34
+ * @returns Amount in token's smallest unit
35
+ */
36
+ export function floatToBigint(usdValue: number, decimals: number): bigint {
37
+ if (!Number.isFinite(usdValue) || usdValue < 0) {
38
+ throw new CalculateAmountError(`Invalid USD value: ${usdValue}`);
39
+ }
40
+
41
+ if (decimals < 0 || decimals > 77) {
42
+ throw new CalculateAmountError(`Invalid decimals: ${decimals}`);
43
+ }
44
+
45
+ // Convert to fixed-precision string to avoid floating point issues
46
+ const valueString = usdValue.toFixed(decimals);
47
+
48
+ try {
49
+ return parseUnits(valueString, decimals);
50
+ } catch (error) {
51
+ throw new CalculateAmountError(
52
+ `Failed to convert ${usdValue} to bigint with ${decimals} decimals: ${error instanceof Error ? error.message : 'Unknown error'}`,
53
+ );
54
+ }
55
+ }
8
56
  }