@kasarlabs/ekubo-mcp 0.1.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 (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/bin/ekubo-mcp.js +2 -0
  4. package/build/index.d.ts +2 -0
  5. package/build/index.js +119 -0
  6. package/build/index.js.map +1 -0
  7. package/build/interfaces/index.d.ts +21 -0
  8. package/build/interfaces/index.js +2 -0
  9. package/build/interfaces/index.js.map +1 -0
  10. package/build/lib/constants/abis/core.d.ts +92 -0
  11. package/build/lib/constants/abis/core.js +1341 -0
  12. package/build/lib/constants/abis/core.js.map +1 -0
  13. package/build/lib/constants/abis/erc20.d.ts +214 -0
  14. package/build/lib/constants/abis/erc20.js +1256 -0
  15. package/build/lib/constants/abis/erc20.js.map +1 -0
  16. package/build/lib/constants/abis/index.d.ts +5 -0
  17. package/build/lib/constants/abis/index.js +6 -0
  18. package/build/lib/constants/abis/index.js.map +1 -0
  19. package/build/lib/constants/abis/nft.d.ts +92 -0
  20. package/build/lib/constants/abis/nft.js +1227 -0
  21. package/build/lib/constants/abis/nft.js.map +1 -0
  22. package/build/lib/constants/abis/positions.d.ts +92 -0
  23. package/build/lib/constants/abis/positions.js +1595 -0
  24. package/build/lib/constants/abis/positions.js.map +1 -0
  25. package/build/lib/constants/abis/router.d.ts +76 -0
  26. package/build/lib/constants/abis/router.js +524 -0
  27. package/build/lib/constants/abis/router.js.map +1 -0
  28. package/build/lib/constants/addresses.d.ts +21 -0
  29. package/build/lib/constants/addresses.js +52 -0
  30. package/build/lib/constants/addresses.js.map +1 -0
  31. package/build/lib/utils/contracts.d.ts +8 -0
  32. package/build/lib/utils/contracts.js +26 -0
  33. package/build/lib/utils/contracts.js.map +1 -0
  34. package/build/lib/utils/events.d.ts +2 -0
  35. package/build/lib/utils/events.js +21 -0
  36. package/build/lib/utils/events.js.map +1 -0
  37. package/build/lib/utils/liquidity.d.ts +14 -0
  38. package/build/lib/utils/liquidity.js +19 -0
  39. package/build/lib/utils/liquidity.js.map +1 -0
  40. package/build/lib/utils/math.d.ts +4 -0
  41. package/build/lib/utils/math.js +25 -0
  42. package/build/lib/utils/math.js.map +1 -0
  43. package/build/lib/utils/pools.d.ts +9 -0
  44. package/build/lib/utils/pools.js +18 -0
  45. package/build/lib/utils/pools.js.map +1 -0
  46. package/build/lib/utils/quote.d.ts +5 -0
  47. package/build/lib/utils/quote.js +17 -0
  48. package/build/lib/utils/quote.js.map +1 -0
  49. package/build/lib/utils/swap.d.ts +13 -0
  50. package/build/lib/utils/swap.js +37 -0
  51. package/build/lib/utils/swap.js.map +1 -0
  52. package/build/lib/utils/token.d.ts +127 -0
  53. package/build/lib/utils/token.js +150 -0
  54. package/build/lib/utils/token.js.map +1 -0
  55. package/build/schemas/index.d.ts +388 -0
  56. package/build/schemas/index.js +119 -0
  57. package/build/schemas/index.js.map +1 -0
  58. package/build/tools/read/getPoolFeesPerLiquidity.d.ts +14 -0
  59. package/build/tools/read/getPoolFeesPerLiquidity.js +31 -0
  60. package/build/tools/read/getPoolFeesPerLiquidity.js.map +1 -0
  61. package/build/tools/read/getPoolInfo.d.ts +22 -0
  62. package/build/tools/read/getPoolInfo.js +45 -0
  63. package/build/tools/read/getPoolInfo.js.map +1 -0
  64. package/build/tools/read/getPoolLiquidity.d.ts +13 -0
  65. package/build/tools/read/getPoolLiquidity.js +30 -0
  66. package/build/tools/read/getPoolLiquidity.js.map +1 -0
  67. package/build/tools/read/getTokenPrice.d.ts +16 -0
  68. package/build/tools/read/getTokenPrice.js +42 -0
  69. package/build/tools/read/getTokenPrice.js.map +1 -0
  70. package/build/tools/write/addLiquidity.d.ts +21 -0
  71. package/build/tools/write/addLiquidity.js +77 -0
  72. package/build/tools/write/addLiquidity.js.map +1 -0
  73. package/build/tools/write/createPosition.d.ts +21 -0
  74. package/build/tools/write/createPosition.js +67 -0
  75. package/build/tools/write/createPosition.js.map +1 -0
  76. package/build/tools/write/swap.d.ts +19 -0
  77. package/build/tools/write/swap.js +76 -0
  78. package/build/tools/write/swap.js.map +1 -0
  79. package/build/tools/write/transferPosition.d.ts +16 -0
  80. package/build/tools/write/transferPosition.js +35 -0
  81. package/build/tools/write/transferPosition.js.map +1 -0
  82. package/build/tools/write/withdrawLiquidity.d.ts +19 -0
  83. package/build/tools/write/withdrawLiquidity.js +65 -0
  84. package/build/tools/write/withdrawLiquidity.js.map +1 -0
  85. package/package.json +42 -0
@@ -0,0 +1,52 @@
1
+ export const ekuboAddress = {
2
+ core: {
3
+ sepolia: '0x0444a09d96389aa7148f1aada508e30b71299ffe650d9c97fdaae38cb9a23384',
4
+ mainnet: '0x00000005dd3D2F4429AF886cD1a3b08289DBcEa99A294197E9eB43b0e0325b4b',
5
+ },
6
+ positions: {
7
+ sepolia: '0x06a2aee84bb0ed5dded4384ddd0e40e9c1372b818668375ab8e3ec08807417e5',
8
+ mainnet: '0x02e0af29598b407c8716b17f6d2795eca1b471413fa03fb145a5e33722184067',
9
+ },
10
+ routerV3: {
11
+ sepolia: '0x0045f933adf0607292468ad1c1dedaa74d5ad166392590e72676a34d01d7b763',
12
+ mainnet: '0x0199741822c2dc722f6f605204f35e56dbc23bceed54818168c4c49e4fb8737e',
13
+ },
14
+ positionsNFT: {
15
+ sepolia: '0x04afc78d6fec3b122fc1f60276f074e557749df1a77a93416451be72c435120f',
16
+ mainnet: '0x07b696af58c967c1b14c9dde0ace001720635a660a8e90c565ea459345318b30',
17
+ },
18
+ };
19
+ export const erc20Addresses = {
20
+ AKU: '0x137dfca7d96cdd526d13a63176454f35c691f55837497448fad352643cfe4d4',
21
+ ALF: '0x78d7dfcddb44667153513bd837ff534ef395484f4b6cf28faa25b2c46e063d9',
22
+ BROTHER: '0x3b405a98c9e795d427fe82cdeeeed803f221b52471e3a757574a2b4180793ee',
23
+ CASH: '0x498edfaf50ca5855666a700c25dd629d577eb9afccdf3b5977aec79aee55ada',
24
+ DAI: '0x5574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad',
25
+ DAIv0: '0xda114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3',
26
+ DICK: '0x388588584bd8c651151f6baf241a85827e7ff0574101f2a8194a3df68a7e2fe',
27
+ EKUBO: '0x75afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87',
28
+ ETH: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',
29
+ LORDS: '0x124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49',
30
+ LUSD: '0x70a76fd48ca0ef910631754d77dd822147fe98a569b826ec85e3c33fde586ac',
31
+ NSTR: '0xc530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007',
32
+ PAL: '0x49201f03a0f0a9e70e28dcd74cbf44931174dbe3cc4b2ff488898339959e559',
33
+ SCHIZODIO: '0xacc2fa3bb7f6a6726c14d9e142d51fe3984dbfa32b5907e1e76425177875e2',
34
+ SLAY: '0x2ab526354a39e7f5d272f327fa94e757df3688188d4a92c6dc3623ab79894e2',
35
+ SLINK: '0x13ff4e86fa3e7286cc5c64b62f4099cf41e7918d727d22a5109ecfd00274d19',
36
+ SSTR: '0x102d5e124c51b936ee87302e0f938165aec96fb6c2027ae7f3a5ed46c77573b',
37
+ STRK: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
38
+ SWAY: '0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b',
39
+ UNI: '0x49210ffc442172463f3177147c1aeaa36c51d152c1b0630f2364c300d4f48ee',
40
+ UNO: '0x719b5092403233201aa822ce928bd4b551d0cdb071a724edd7dc5e5f57b7f34',
41
+ USDC: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8',
42
+ USDT: '0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8',
43
+ WBTC: '0x3fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac',
44
+ WIZ: '0x6e987f1e703c549991e1c13b8f1b8e1e6f8bba068a0715b9aacb51dba2800f',
45
+ ZEND: '0x585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34',
46
+ kSTRK: '0x45cd05ee2caaac3459b87e5e2480099d201be2f62243f839f00e10dde7f500c',
47
+ rETH: '0x319111a5037cbec2b3e638cc34a3474e2d2608299f3e62866e9cc683208c610',
48
+ sSTRK: '0x356f304b154d29d2a8fe22f1cb9107a9b564a733cf6b4cc47fd121ac1af90c9',
49
+ wstETH: '0x42b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2',
50
+ xSTRK: '0x28d709c875c0ceac3dce7065bec5328186dc89fe254527084d1689910954b0a',
51
+ };
52
+ //# sourceMappingURL=addresses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../src/lib/constants/addresses.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE;QACJ,OAAO,EACL,oEAAoE;QACtE,OAAO,EACL,oEAAoE;KACvE;IACD,SAAS,EAAE;QACT,OAAO,EACL,oEAAoE;QACtE,OAAO,EACL,oEAAoE;KACvE;IACD,QAAQ,EAAE;QACR,OAAO,EACL,oEAAoE;QACtE,OAAO,EACL,oEAAoE;KACvE;IACD,YAAY,EAAE;QACZ,OAAO,EACL,oEAAoE;QACtE,OAAO,EACL,oEAAoE;KACvE;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,GAAG,EAAE,mEAAmE;IACxE,GAAG,EAAE,mEAAmE;IACxE,OAAO,EAAE,mEAAmE;IAC5E,IAAI,EAAE,mEAAmE;IACzE,GAAG,EAAE,mEAAmE;IACxE,KAAK,EAAE,kEAAkE;IACzE,IAAI,EAAE,mEAAmE;IACzE,KAAK,EAAE,mEAAmE;IAC1E,GAAG,EAAE,mEAAmE;IACxE,KAAK,EAAE,mEAAmE;IAC1E,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,kEAAkE;IACxE,GAAG,EAAE,mEAAmE;IACxE,SAAS,EAAE,kEAAkE;IAC7E,IAAI,EAAE,mEAAmE;IACzE,KAAK,EAAE,mEAAmE;IAC1E,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,kEAAkE;IACxE,GAAG,EAAE,mEAAmE;IACxE,GAAG,EAAE,mEAAmE;IACxE,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,mEAAmE;IACzE,GAAG,EAAE,kEAAkE;IACvE,IAAI,EAAE,kEAAkE;IACxE,KAAK,EAAE,mEAAmE;IAC1E,IAAI,EAAE,mEAAmE;IACzE,KAAK,EAAE,mEAAmE;IAC1E,MAAM,EAAE,mEAAmE;IAC3E,KAAK,EAAE,mEAAmE;CAC3E,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { RpcProvider, Contract } from 'starknet';
2
+ import { ekuboAddress } from '../constants/addresses.js';
3
+ export type Network = 'sepolia' | 'mainnet';
4
+ export type EkuboContract = keyof typeof ekuboAddress;
5
+ export declare function getChain(provider: RpcProvider): Promise<Network>;
6
+ export declare function getEkuboAddress(contract: EkuboContract, network: Network): string;
7
+ export declare function getContract(provider: RpcProvider, contractType: EkuboContract): Promise<Contract>;
8
+ export declare function getERC20Contract(tokenAddress: string, provider: RpcProvider): Contract;
@@ -0,0 +1,26 @@
1
+ import { shortString, Contract } from 'starknet';
2
+ import { ekuboAddress } from '../constants/addresses.js';
3
+ import { CORE_ABI, POSITIONS_ABI, NFT_POSITIONS_CONTRACT_ABI, NEW_ERC20_ABI, ROUTER_ABI, } from '../constants/abis/index.js';
4
+ const CONTRACT_ABIS = {
5
+ core: CORE_ABI,
6
+ positions: POSITIONS_ABI,
7
+ positionsNFT: NFT_POSITIONS_CONTRACT_ABI,
8
+ routerV3: ROUTER_ABI,
9
+ };
10
+ export async function getChain(provider) {
11
+ const chainId = shortString.decodeShortString(await provider.getChainId());
12
+ return chainId === 'SN_MAIN' ? 'mainnet' : 'sepolia';
13
+ }
14
+ export function getEkuboAddress(contract, network) {
15
+ return ekuboAddress[contract][network];
16
+ }
17
+ export async function getContract(provider, contractType) {
18
+ const chain = await getChain(provider);
19
+ const address = getEkuboAddress(contractType, chain);
20
+ const abi = CONTRACT_ABIS[contractType];
21
+ return new Contract(abi, address, provider);
22
+ }
23
+ export function getERC20Contract(tokenAddress, provider) {
24
+ return new Contract(NEW_ERC20_ABI, tokenAddress, provider);
25
+ }
26
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/lib/utils/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,0BAA0B,EAC1B,aAAa,EACb,UAAU,GACX,MAAM,4BAA4B,CAAC;AAMpC,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,aAAa;IACxB,YAAY,EAAE,0BAA0B;IACxC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAKX,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAqB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAQD,MAAM,UAAU,eAAe,CAC7B,QAAuB,EACvB,OAAgB;IAEhB,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAqB,EACrB,YAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAExC,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAC9B,YAAoB,EACpB,QAAqB;IAErB,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { GetTransactionReceiptResponse } from 'starknet';
2
+ export declare function extractPositionIdFromReceipt(receipt: GetTransactionReceiptResponse, nftContractAddress: string): string | undefined;
@@ -0,0 +1,21 @@
1
+ const TRANSFER_EVENT_KEY = '0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9';
2
+ export function extractPositionIdFromReceipt(receipt, nftContractAddress) {
3
+ if (!('events' in receipt) || !Array.isArray(receipt.events)) {
4
+ return undefined;
5
+ }
6
+ const normalizedNftAddress = nftContractAddress
7
+ .toLowerCase()
8
+ .replace(/^0x0*/, '0x');
9
+ for (const event of receipt.events) {
10
+ if (event.from_address === normalizedNftAddress &&
11
+ event.keys?.[0] === TRANSFER_EVENT_KEY) {
12
+ const fromAddress = event.data?.[0];
13
+ if (fromAddress === '0x0') {
14
+ const positionId = event.data?.[2];
15
+ return positionId ? BigInt(positionId).toString() : undefined;
16
+ }
17
+ }
18
+ }
19
+ return undefined;
20
+ }
21
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/lib/utils/events.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GACtB,kEAAkE,CAAC;AAUrE,MAAM,UAAU,4BAA4B,CAC1C,OAAsC,EACtC,kBAA0B;IAE1B,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,MAAM,oBAAoB,GAAG,kBAAkB;SAC5C,WAAW,EAAE;SACb,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IACE,KAAK,CAAC,YAAY,KAAK,oBAAoB;YAC3C,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,kBAAkB,EACtC,CAAC;YACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function buildBounds(lowerTick: number, upperTick: number): {
2
+ lower: {
3
+ mag: bigint;
4
+ sign: boolean;
5
+ };
6
+ upper: {
7
+ mag: bigint;
8
+ sign: boolean;
9
+ };
10
+ };
11
+ export declare function sortAmounts(amount0Input: string, amount1Input: string, isTokenALower: boolean): {
12
+ amount0: string;
13
+ amount1: string;
14
+ };
@@ -0,0 +1,19 @@
1
+ export function buildBounds(lowerTick, upperTick) {
2
+ return {
3
+ lower: {
4
+ mag: BigInt(Math.abs(lowerTick)),
5
+ sign: lowerTick < 0,
6
+ },
7
+ upper: {
8
+ mag: BigInt(Math.abs(upperTick)),
9
+ sign: upperTick < 0,
10
+ },
11
+ };
12
+ }
13
+ export function sortAmounts(amount0Input, amount1Input, isTokenALower) {
14
+ return {
15
+ amount0: isTokenALower ? amount0Input : amount1Input,
16
+ amount1: isTokenALower ? amount1Input : amount0Input,
17
+ };
18
+ }
19
+ //# sourceMappingURL=liquidity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquidity.js","sourceRoot":"","sources":["../../../src/lib/utils/liquidity.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,SAAiB;IAC9D,OAAO;QACL,KAAK,EAAE;YACL,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,EAAE,SAAS,GAAG,CAAC;SACpB;QACD,KAAK,EAAE;YACL,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,EAAE,SAAS,GAAG,CAAC;SACpB;KACF,CAAC;AACJ,CAAC;AAKD,MAAM,UAAU,WAAW,CACzB,YAAoB,EACpB,YAAoB,EACpB,aAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;QACpD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function calculateActualPrice(sqrtPrice: bigint, token0Decimals: number, token1Decimals: number): number;
2
+ export declare function calculateTickFromSqrtPrice(sqrtPrice: bigint): number;
3
+ export declare function convertFeePercentToU128(feePercent: number): string;
4
+ export declare function convertTickSpacingPercentToExponent(tickSpacingPercent: number): number;
@@ -0,0 +1,25 @@
1
+ export function calculateActualPrice(sqrtPrice, token0Decimals, token1Decimals) {
2
+ const Q128 = BigInt(2) ** BigInt(128);
3
+ const sqrtPriceFloat = Number(sqrtPrice) / Number(Q128);
4
+ const rawPrice = sqrtPriceFloat * sqrtPriceFloat;
5
+ const decimalAdjustment = 10 ** (token0Decimals - token1Decimals);
6
+ return rawPrice * decimalAdjustment;
7
+ }
8
+ export function calculateTickFromSqrtPrice(sqrtPrice) {
9
+ const Q128 = BigInt(2) ** BigInt(128);
10
+ const sqrtPriceFloat = Number(sqrtPrice) / Number(Q128);
11
+ const price = sqrtPriceFloat * sqrtPriceFloat;
12
+ return Math.floor(Math.log(price) / Math.log(1.0001));
13
+ }
14
+ export function convertFeePercentToU128(feePercent) {
15
+ const feeDecimal = feePercent / 100;
16
+ const TWO_POW_128 = BigInt(2) ** BigInt(128);
17
+ const feeU128 = BigInt(Math.floor(feeDecimal * Number(TWO_POW_128)));
18
+ return feeU128.toString();
19
+ }
20
+ export function convertTickSpacingPercentToExponent(tickSpacingPercent) {
21
+ const spacingDecimal = tickSpacingPercent / 100;
22
+ const tickSpacing = Math.log(1 + spacingDecimal) / Math.log(1.000001);
23
+ return Math.round(tickSpacing);
24
+ }
25
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/lib/utils/math.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,cAAsB,EACtB,cAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;IAIjD,MAAM,iBAAiB,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;IAClE,OAAO,QAAQ,GAAG,iBAAiB,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,SAAiB;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,cAAc,GAAG,cAAc,CAAC;IAE9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC;AAcD,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IAExD,MAAM,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC;IAIpC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAkBD,MAAM,UAAU,mCAAmC,CACjD,kBAA0B;IAG1B,MAAM,cAAc,GAAG,kBAAkB,GAAG,GAAG,CAAC;IAIhD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { RpcProvider } from 'starknet';
2
+ import { PoolKey } from '../../schemas/index.js';
3
+ import { validToken } from './token.js';
4
+ export declare function preparePoolKeyFromParams(provider: RpcProvider, params: PoolKey): Promise<{
5
+ poolKey: any;
6
+ token0: validToken;
7
+ token1: validToken;
8
+ isTokenALower: boolean;
9
+ }>;
@@ -0,0 +1,18 @@
1
+ import { extractAssetInfo, validateToken } from './token.js';
2
+ import { convertFeePercentToU128, convertTickSpacingPercentToExponent, } from './math.js';
3
+ export async function preparePoolKeyFromParams(provider, params) {
4
+ const { assetSymbol: symbolToken0, assetAddress: addressToken0 } = extractAssetInfo(params.token0);
5
+ const { assetSymbol: symbolToken1, assetAddress: addressToken1 } = extractAssetInfo(params.token1);
6
+ const token0 = await validateToken(provider, symbolToken0, addressToken0);
7
+ const token1 = await validateToken(provider, symbolToken1, addressToken1);
8
+ const poolKey = {
9
+ ...params,
10
+ token0: token0.address < token1.address ? token0.address : token1.address,
11
+ token1: token0.address < token1.address ? token1.address : token0.address,
12
+ fee: convertFeePercentToU128(params.fee),
13
+ tick_spacing: convertTickSpacingPercentToExponent(params.tick_spacing),
14
+ };
15
+ const isTokenALower = token0.address < token1.address ? true : false;
16
+ return { poolKey, token0, token1, isTokenALower };
17
+ }
18
+ //# sourceMappingURL=pools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pools.js","sourceRoot":"","sources":["../../../src/lib/utils/pools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACzE,OAAO,EACL,uBAAuB,EACvB,mCAAmC,GACpC,MAAM,WAAW,CAAC;AAEnB,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAqB,EACrB,MAAe;IAOf,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,GAC9D,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,GAC9D,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG;QACd,GAAG,MAAM;QACT,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;QACzE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;QACzE,GAAG,EAAE,uBAAuB,CAAC,MAAM,CAAC,GAAG,CAAC;QACxC,YAAY,EAAE,mCAAmC,CAAC,MAAM,CAAC,YAAY,CAAC;KACvE,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Contract } from 'starknet';
2
+ export declare function getSwapQuote(routerContract: Contract, routeNode: any, tokenAmount: any): Promise<any>;
3
+ export declare function extractExpectedOutput(quote: any, isTokenALower: boolean): bigint;
4
+ export declare function calculateMinimumOutput(expectedOutput: bigint, slippageTolerance: number): string;
5
+ export declare function calculateMinimumOutputU256(expectedOutput: bigint, slippageTolerance: number): import("starknet").Uint256;
@@ -0,0 +1,17 @@
1
+ import { cairo } from 'starknet';
2
+ export async function getSwapQuote(routerContract, routeNode, tokenAmount) {
3
+ return await routerContract.quote_swap(routeNode, tokenAmount);
4
+ }
5
+ export function extractExpectedOutput(quote, isTokenALower) {
6
+ return isTokenALower ? quote.amount1.mag : quote.amount0.mag;
7
+ }
8
+ export function calculateMinimumOutput(expectedOutput, slippageTolerance) {
9
+ const slippageMultiplier = 1 - slippageTolerance / 100;
10
+ const minimumAmount = BigInt(Math.floor(Number(expectedOutput) * slippageMultiplier));
11
+ return minimumAmount.toString();
12
+ }
13
+ export function calculateMinimumOutputU256(expectedOutput, slippageTolerance) {
14
+ const minimumAmountStr = calculateMinimumOutput(expectedOutput, slippageTolerance);
15
+ return cairo.uint256(minimumAmountStr);
16
+ }
17
+ //# sourceMappingURL=quote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/lib/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,UAAU,CAAC;AAK3C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAAwB,EACxB,SAAc,EACd,WAAgB;IAEhB,OAAO,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACjE,CAAC;AAKD,MAAM,UAAU,qBAAqB,CACnC,KAAU,EACV,aAAsB;IAItB,OAAO,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/D,CAAC;AAKD,MAAM,UAAU,sBAAsB,CACpC,cAAsB,EACtB,iBAAyB;IAEzB,MAAM,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC,CACxD,CAAC;IACF,OAAO,aAAa,CAAC,QAAQ,EAAE,CAAC;AAClC,CAAC;AAKD,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,iBAAyB;IAEzB,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,cAAc,EACd,iBAAiB,CAClB,CAAC;IACF,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function buildRouteNode(poolKey: any, sqrtRatioLimit: string): {
2
+ pool_key: any;
3
+ sqrt_ratio_limit: import("starknet").Uint256;
4
+ skip_ahead: number;
5
+ };
6
+ export declare function buildTokenAmount(tokenAddress: string, amount: string, isAmountIn: boolean): {
7
+ token: string;
8
+ amount: {
9
+ mag: bigint;
10
+ sign: boolean;
11
+ };
12
+ };
13
+ export declare function calculateSqrtRatioLimit(currentSqrtPrice: bigint, slippageTolerance: number, isTokenALower: boolean): string;
@@ -0,0 +1,37 @@
1
+ import { cairo } from 'starknet';
2
+ import { MIN_SQRT_RATIO, MAX_SQRT_RATIO } from '@ekubo/starknet-sdk';
3
+ export function buildRouteNode(poolKey, sqrtRatioLimit) {
4
+ return {
5
+ pool_key: poolKey,
6
+ sqrt_ratio_limit: cairo.uint256(sqrtRatioLimit),
7
+ skip_ahead: 0,
8
+ };
9
+ }
10
+ export function buildTokenAmount(tokenAddress, amount, isAmountIn) {
11
+ return {
12
+ token: tokenAddress,
13
+ amount: {
14
+ mag: BigInt(amount),
15
+ sign: !isAmountIn,
16
+ },
17
+ };
18
+ }
19
+ export function calculateSqrtRatioLimit(currentSqrtPrice, slippageTolerance, isTokenALower) {
20
+ if (isTokenALower) {
21
+ const slippageMultiplier = 1 - slippageTolerance / 100;
22
+ const calculatedLimit = BigInt(Math.floor(Number(currentSqrtPrice) * Math.sqrt(slippageMultiplier)));
23
+ return calculatedLimit < currentSqrtPrice &&
24
+ calculatedLimit >= MIN_SQRT_RATIO
25
+ ? calculatedLimit.toString()
26
+ : MIN_SQRT_RATIO.toString();
27
+ }
28
+ else {
29
+ const slippageMultiplier = 1 + slippageTolerance / 100;
30
+ const calculatedLimit = BigInt(Math.floor(Number(currentSqrtPrice) * Math.sqrt(slippageMultiplier)));
31
+ return calculatedLimit > currentSqrtPrice &&
32
+ calculatedLimit <= MAX_SQRT_RATIO
33
+ ? calculatedLimit.toString()
34
+ : MAX_SQRT_RATIO.toString();
35
+ }
36
+ }
37
+ //# sourceMappingURL=swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../../src/lib/utils/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrE,MAAM,UAAU,cAAc,CAAC,OAAY,EAAE,cAAsB;IACjE,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/C,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AAKD,MAAM,UAAU,gBAAgB,CAC9B,YAAoB,EACpB,MAAc,EACd,UAAmB;IAEnB,OAAO;QACL,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC,UAAU;SAClB;KACF,CAAC;AACJ,CAAC;AAKD,MAAM,UAAU,uBAAuB,CACrC,gBAAwB,EACxB,iBAAyB,EACzB,aAAsB;IAEtB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,CAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CACrE,CAAC;QACF,OAAO,eAAe,GAAG,gBAAgB;YACvC,eAAe,IAAI,cAAc;YACjC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,CAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CACrE,CAAC;QACF,OAAO,eAAe,GAAG,gBAAgB;YACvC,eAAe,IAAI,cAAc;YACjC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { Provider, Uint256, Call, Account } from 'starknet';
2
+ export declare const DECIMALS: {
3
+ USDC: number;
4
+ USDT: number;
5
+ DEFAULT: number;
6
+ };
7
+ export interface validToken {
8
+ address: string;
9
+ symbol: string;
10
+ decimals: number;
11
+ }
12
+ export interface ParamsValidationResult {
13
+ address: string;
14
+ amount: Uint256;
15
+ }
16
+ export interface ExecuteV3Args {
17
+ call: Call;
18
+ account: Account;
19
+ }
20
+ export declare function detectAbiType(address: string, provider: Provider): Promise<({
21
+ type: string;
22
+ name: string;
23
+ interface_name: string;
24
+ members?: undefined;
25
+ variants?: undefined;
26
+ items?: undefined;
27
+ inputs?: undefined;
28
+ kind?: undefined;
29
+ } | {
30
+ type: string;
31
+ name: string;
32
+ members: {
33
+ name: string;
34
+ type: string;
35
+ }[];
36
+ interface_name?: undefined;
37
+ variants?: undefined;
38
+ items?: undefined;
39
+ inputs?: undefined;
40
+ kind?: undefined;
41
+ } | {
42
+ type: string;
43
+ name: string;
44
+ variants: {
45
+ name: string;
46
+ type: string;
47
+ }[];
48
+ interface_name?: undefined;
49
+ members?: undefined;
50
+ items?: undefined;
51
+ inputs?: undefined;
52
+ kind?: undefined;
53
+ } | {
54
+ type: string;
55
+ name: string;
56
+ items: {
57
+ type: string;
58
+ name: string;
59
+ inputs: {
60
+ name: string;
61
+ type: string;
62
+ }[];
63
+ outputs: {
64
+ type: string;
65
+ }[];
66
+ state_mutability: string;
67
+ }[];
68
+ interface_name?: undefined;
69
+ members?: undefined;
70
+ variants?: undefined;
71
+ inputs?: undefined;
72
+ kind?: undefined;
73
+ } | {
74
+ type: string;
75
+ name: string;
76
+ inputs: {
77
+ name: string;
78
+ type: string;
79
+ }[];
80
+ interface_name?: undefined;
81
+ members?: undefined;
82
+ variants?: undefined;
83
+ items?: undefined;
84
+ kind?: undefined;
85
+ } | {
86
+ type: string;
87
+ name: string;
88
+ kind: string;
89
+ members: {
90
+ name: string;
91
+ type: string;
92
+ kind: string;
93
+ }[];
94
+ interface_name?: undefined;
95
+ variants?: undefined;
96
+ items?: undefined;
97
+ inputs?: undefined;
98
+ } | {
99
+ type: string;
100
+ name: string;
101
+ kind: string;
102
+ variants: {
103
+ name: string;
104
+ type: string;
105
+ kind: string;
106
+ }[];
107
+ interface_name?: undefined;
108
+ members?: undefined;
109
+ items?: undefined;
110
+ inputs?: undefined;
111
+ })[]>;
112
+ export declare const getTokenDecimals: (symbol: string) => number;
113
+ export declare const formatBalance: (rawBalance: bigint | string | number, decimals: number) => string;
114
+ export declare const validateTokenAddress: (symbol: string) => string;
115
+ export declare const formatTokenAmount: (amount: string, decimals: number) => string;
116
+ export declare const validateAndFormatParams: (address: string, amount: string, decimals: number) => ParamsValidationResult;
117
+ export declare function validateToken(provider: Provider, assetSymbol?: string, assetAddress?: string): Promise<validToken>;
118
+ export declare function extractAssetInfo(asset: {
119
+ assetType: 'SYMBOL' | 'ADDRESS';
120
+ assetValue: string;
121
+ }): {
122
+ assetSymbol: string;
123
+ assetAddress: undefined;
124
+ } | {
125
+ assetSymbol: undefined;
126
+ assetAddress: string;
127
+ };
@@ -0,0 +1,150 @@
1
+ import { validateAndParseAddress, Contract, shortString, cairo, } from 'starknet';
2
+ import { erc20Addresses } from '../constants/addresses.js';
3
+ import { NEW_ERC20_ABI, OLD_ERC20_ABI } from '../constants/abis/index.js';
4
+ export const DECIMALS = {
5
+ USDC: 6,
6
+ USDT: 6,
7
+ DEFAULT: 18,
8
+ };
9
+ export async function detectAbiType(address, provider) {
10
+ try {
11
+ const contract = new Contract(OLD_ERC20_ABI, address, provider);
12
+ const symbol = await contract.symbol();
13
+ if (symbol == 0n) {
14
+ return NEW_ERC20_ABI;
15
+ }
16
+ return OLD_ERC20_ABI;
17
+ }
18
+ catch (error) {
19
+ console.warn(`Couldn't detect ABI type, defaulting to NEW_ERC20_ABI: ${error.message}`);
20
+ return NEW_ERC20_ABI;
21
+ }
22
+ }
23
+ export const getTokenDecimals = (symbol) => {
24
+ const stablecoinSymbols = ['USDC', 'USDT'];
25
+ const decimals = stablecoinSymbols.includes(symbol.toUpperCase()) ? 6 : 18;
26
+ return decimals;
27
+ };
28
+ export const formatBalance = (rawBalance, decimals) => {
29
+ try {
30
+ const balanceStr = typeof rawBalance === 'bigint'
31
+ ? rawBalance.toString()
32
+ : String(rawBalance);
33
+ if (!balanceStr || balanceStr === '0') {
34
+ return '0';
35
+ }
36
+ if (balanceStr.length <= decimals) {
37
+ const zeros = '0'.repeat(decimals - balanceStr.length);
38
+ const formattedBalance = `0.${zeros}${balanceStr}`;
39
+ return formattedBalance;
40
+ }
41
+ const decimalPosition = balanceStr.length - decimals;
42
+ const wholePart = balanceStr.slice(0, decimalPosition) || '0';
43
+ const fractionalPart = balanceStr.slice(decimalPosition);
44
+ const formattedBalance = `${wholePart}.${fractionalPart}`;
45
+ return formattedBalance;
46
+ }
47
+ catch (error) {
48
+ return '0';
49
+ }
50
+ };
51
+ export const validateTokenAddress = (symbol) => {
52
+ const tokenAddress = erc20Addresses[symbol];
53
+ if (!tokenAddress) {
54
+ throw new Error(`Token ${symbol} not supported. Available tokens: ${Object.keys(erc20Addresses).join(', ')}`);
55
+ }
56
+ return tokenAddress;
57
+ };
58
+ export const formatTokenAmount = (amount, decimals) => {
59
+ const [whole, fraction = ''] = amount.split('.');
60
+ const paddedFraction = fraction.padEnd(decimals, '0');
61
+ return whole + paddedFraction;
62
+ };
63
+ export const validateAndFormatParams = (address, amount, decimals) => {
64
+ try {
65
+ if (!address) {
66
+ throw new Error('Address is required');
67
+ }
68
+ const formattedAddress = validateAndParseAddress(address);
69
+ if (!amount) {
70
+ throw new Error('Amount is required');
71
+ }
72
+ const formattedAmount = formatTokenAmount(amount, decimals);
73
+ const formattedAmountUint256 = cairo.uint256(formattedAmount);
74
+ return {
75
+ address: formattedAddress,
76
+ amount: formattedAmountUint256,
77
+ };
78
+ }
79
+ catch (error) {
80
+ throw new Error(`Parameter validation failed: ${error.message}`);
81
+ }
82
+ };
83
+ export async function validateToken(provider, assetSymbol, assetAddress) {
84
+ if (!assetSymbol && !assetAddress) {
85
+ throw new Error('Either asset symbol or asset address is required');
86
+ }
87
+ let address = '', symbol = '', decimals = 0;
88
+ if (assetSymbol) {
89
+ symbol = assetSymbol.toUpperCase();
90
+ address = validateTokenAddress(symbol);
91
+ if (!address) {
92
+ throw new Error(`Token ${symbol} not supported`);
93
+ }
94
+ decimals = DECIMALS[symbol] || DECIMALS.DEFAULT;
95
+ }
96
+ else if (assetAddress) {
97
+ address = validateAndParseAddress(assetAddress);
98
+ try {
99
+ const abi = await detectAbiType(address, provider);
100
+ const contract = new Contract(abi, address, provider);
101
+ try {
102
+ const rawSymbol = await contract.symbol();
103
+ symbol =
104
+ abi == OLD_ERC20_ABI
105
+ ? shortString.decodeShortString(rawSymbol)
106
+ : rawSymbol.toUpperCase();
107
+ }
108
+ catch (error) {
109
+ console.warn(`Error getting symbol: ${error.message}`);
110
+ symbol = 'UNKNOWN';
111
+ }
112
+ try {
113
+ const decimalsBigInt = await contract.decimals();
114
+ decimals =
115
+ typeof decimalsBigInt === 'bigint'
116
+ ? Number(decimalsBigInt)
117
+ : decimalsBigInt;
118
+ }
119
+ catch (error) {
120
+ console.warn(`Error getting decimals: ${error.message}`);
121
+ decimals = DECIMALS.DEFAULT;
122
+ }
123
+ }
124
+ catch (error) {
125
+ console.warn(`Error retrieving token info: ${error.message}`);
126
+ symbol = 'UNKNOWN';
127
+ decimals = DECIMALS.DEFAULT;
128
+ }
129
+ }
130
+ return {
131
+ address,
132
+ symbol,
133
+ decimals,
134
+ };
135
+ }
136
+ export function extractAssetInfo(asset) {
137
+ if (asset.assetType === 'SYMBOL') {
138
+ return {
139
+ assetSymbol: asset.assetValue,
140
+ assetAddress: undefined,
141
+ };
142
+ }
143
+ else {
144
+ return {
145
+ assetSymbol: undefined,
146
+ assetAddress: asset.assetValue,
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/lib/utils/token.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAGvB,QAAQ,EAER,WAAW,EACX,KAAK,GAIN,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK1E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,EAAE;CACZ,CAAC;AAwCF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,QAAkB;IACrE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEf,OAAO,CAAC,IAAI,CACV,0DAA0D,KAAK,CAAC,OAAO,EAAE,CAC1E,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAU,EAAE;IACzD,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAoC,EACpC,QAAgB,EACR,EAAE;IACV,IAAI,CAAC;QACH,MAAM,UAAU,GACd,OAAO,UAAU,KAAK,QAAQ;YAC5B,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE;YACvB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEzB,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,gBAAgB,GAAG,KAAK,KAAK,GAAG,UAAU,EAAE,CAAC;YACnD,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC;QACrD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,GAAG,CAAC;QAC9D,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,gBAAgB,GAAG,GAAG,SAAS,IAAI,cAAc,EAAE,CAAC;QAE1D,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAU,EAAE;IAC7D,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,SAAS,MAAM,qCAAqC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IAC5E,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,KAAK,GAAG,cAAc,CAAC;AAChC,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAe,EACf,MAAc,EACd,QAAgB,EACQ,EAAE;IAC1B,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE9D,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,MAAM,EAAE,sBAAsB;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC,CAAC;AAUF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAkB,EAClB,WAAoB,EACpB,YAAqB;IAErB,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,GAAW,EAAE,EACtB,MAAM,GAAW,EAAE,EACnB,QAAQ,GAAW,CAAC,CAAC;IACvB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,gBAAgB,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,GAAG,QAAQ,CAAC,MAA+B,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;IAC3E,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,OAAO,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC1C,MAAM;oBACJ,GAAG,IAAI,aAAa;wBAClB,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC;wBAC1C,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACjD,QAAQ;oBACN,OAAO,cAAc,KAAK,QAAQ;wBAChC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;wBACxB,CAAC,CAAC,cAAc,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,MAAM,GAAG,SAAS,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO;QACL,OAAO;QACP,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,YAAY,EAAE,SAAS;SACxB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO;YACL,WAAW,EAAE,SAAS;YACtB,YAAY,EAAE,KAAK,CAAC,UAAU;SAC/B,CAAC;IACJ,CAAC;AACH,CAAC"}