@ape.swap/bonds-sdk 7.0.2 → 7.0.4-test.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 (145) hide show
  1. package/dist/adapters/evm/index.d.ts +3 -2
  2. package/dist/adapters/evm/index.js +11 -2
  3. package/dist/adapters/evm/index.js.map +1 -1
  4. package/dist/adapters/evm/state/balances.js +1 -1
  5. package/dist/adapters/evm/state/balances.js.map +1 -1
  6. package/dist/adapters/evm/state/fetchBondsDataEVM.js +65 -2
  7. package/dist/adapters/evm/state/fetchBondsDataEVM.js.map +1 -1
  8. package/dist/adapters/evm/state/fetchUsersBondsEVM.js +234 -2
  9. package/dist/adapters/evm/state/fetchUsersBondsEVM.js.map +1 -1
  10. package/dist/adapters/evm/state/lpStaking/fetchLpStakingLimits.d.ts +24 -0
  11. package/dist/adapters/evm/state/lpStaking/fetchLpStakingLimits.js +118 -0
  12. package/dist/adapters/evm/state/lpStaking/fetchLpStakingLimits.js.map +1 -0
  13. package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.d.ts +4 -0
  14. package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js +140 -0
  15. package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js.map +1 -0
  16. package/dist/adapters/evm/state/useSoulZapBondQuote.js +1 -1
  17. package/dist/adapters/evm/views/BuyComponent.js +1 -1
  18. package/dist/adapters/evm/views/BuyComponent.js.map +1 -1
  19. package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.d.ts +4 -0
  20. package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js +212 -0
  21. package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js.map +1 -0
  22. package/dist/adapters/evm/views/lpStaking/LpBondModalHeader.d.ts +7 -0
  23. package/dist/adapters/evm/views/lpStaking/LpBondModalHeader.js +66 -0
  24. package/dist/adapters/evm/views/lpStaking/LpBondModalHeader.js.map +1 -0
  25. package/dist/adapters/evm/views/lpStaking/LpStakingEstimations.d.ts +23 -0
  26. package/dist/adapters/evm/views/lpStaking/LpStakingEstimations.js +40 -0
  27. package/dist/adapters/evm/views/lpStaking/LpStakingEstimations.js.map +1 -0
  28. package/dist/adapters/evm/views/lpStaking/ModalHandlerLpStaking.d.ts +3 -0
  29. package/dist/adapters/evm/views/lpStaking/ModalHandlerLpStaking.js +90 -0
  30. package/dist/adapters/evm/views/lpStaking/ModalHandlerLpStaking.js.map +1 -0
  31. package/dist/adapters/evm/views/lpStaking/UserLpStakingBondRow.d.ts +5 -0
  32. package/dist/adapters/evm/views/lpStaking/UserLpStakingBondRow.js +32 -0
  33. package/dist/adapters/evm/views/lpStaking/UserLpStakingBondRow.js.map +1 -0
  34. package/dist/adapters/evm/views/lpStaking/YourLpBondModalHeader.d.ts +7 -0
  35. package/dist/adapters/evm/views/lpStaking/YourLpBondModalHeader.js +20 -0
  36. package/dist/adapters/evm/views/lpStaking/YourLpBondModalHeader.js.map +1 -0
  37. package/dist/adapters/evm/views/lpStaking/YourLpStakingBondModal.d.ts +7 -0
  38. package/dist/adapters/evm/views/lpStaking/YourLpStakingBondModal.js +78 -0
  39. package/dist/adapters/evm/views/lpStaking/YourLpStakingBondModal.js.map +1 -0
  40. package/dist/adapters/solana/index.js +1 -1
  41. package/dist/adapters/solana/index.js.map +1 -1
  42. package/dist/adapters/solana/state/fetchUsersBondsSOL.d.ts +5 -1
  43. package/dist/adapters/solana/state/fetchUsersBondsSOL.js +152 -154
  44. package/dist/adapters/solana/state/fetchUsersBondsSOL.js.map +1 -1
  45. package/dist/adapters/solana/state/fetchUsersBondsSOLMulticall.d.ts +12 -0
  46. package/dist/adapters/solana/state/fetchUsersBondsSOLMulticall.js +162 -0
  47. package/dist/adapters/solana/state/fetchUsersBondsSOLMulticall.js.map +1 -0
  48. package/dist/adapters/solana/utils/calculatePendingRewards.d.ts +2 -0
  49. package/dist/adapters/solana/utils/calculatePendingRewards.js +53 -0
  50. package/dist/adapters/solana/utils/calculatePendingRewards.js.map +1 -0
  51. package/dist/adapters/solana/utils/fetchUserAssetsSOL.d.ts +3 -0
  52. package/dist/adapters/solana/utils/fetchUserAssetsSOL.js +49 -0
  53. package/dist/adapters/solana/utils/fetchUserAssetsSOL.js.map +1 -0
  54. package/dist/adapters/solana/utils/getSolanaAccount.d.ts +5 -0
  55. package/dist/adapters/solana/utils/getSolanaAccount.js +26 -23
  56. package/dist/adapters/solana/utils/getSolanaAccount.js.map +1 -1
  57. package/dist/adapters/solana/utils/solanaMulticall.js +4 -2
  58. package/dist/adapters/solana/utils/solanaMulticall.js.map +1 -1
  59. package/dist/adapters/types.d.ts +21 -6
  60. package/dist/components/TokenInfoAndName/index.js +4 -1
  61. package/dist/components/TokenInfoAndName/index.js.map +1 -1
  62. package/dist/components/Tooltip/ButtonsRow.js +1 -1
  63. package/dist/components/Tooltip/ButtonsRow.js.map +1 -1
  64. package/dist/components/Tooltip/Tooltip.js +3 -2
  65. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  66. package/dist/components/uikit-sdk/TokenImage/index.js +3 -1
  67. package/dist/components/uikit-sdk/TokenImage/index.js.map +1 -1
  68. package/dist/config/abi/apeBondPositionAdapter.json.js +1347 -0
  69. package/dist/config/abi/apeBondPositionAdapter.json.js.map +1 -0
  70. package/dist/config/abi/bonusEscrow.json.js +33 -0
  71. package/dist/config/abi/bonusEscrow.json.js.map +1 -0
  72. package/dist/config/abi/lpStakingVault.json.js +34 -0
  73. package/dist/config/abi/lpStakingVault.json.js.map +1 -0
  74. package/dist/config/abi/uniswapV3Pool.json.js +47 -0
  75. package/dist/config/abi/uniswapV3Pool.json.js.map +1 -0
  76. package/dist/config/abi/uniswapV3QuoterV2.json.js +66 -0
  77. package/dist/config/abi/uniswapV3QuoterV2.json.js.map +1 -0
  78. package/dist/config/constants/addresses.d.ts +1 -0
  79. package/dist/config/constants/addresses.js +7 -1
  80. package/dist/config/constants/addresses.js.map +1 -1
  81. package/dist/config/constants/chains.js +3 -1
  82. package/dist/config/constants/chains.js.map +1 -1
  83. package/dist/config/constants/networks.d.ts +1 -1
  84. package/dist/config/constants/networks.js +10 -8
  85. package/dist/config/constants/networks.js.map +1 -1
  86. package/dist/config/constants/variables.d.ts +2 -2
  87. package/dist/config/constants/variables.js +3 -1
  88. package/dist/config/constants/variables.js.map +1 -1
  89. package/dist/state/bonds/useBondsData.js +1 -0
  90. package/dist/state/bonds/useBondsData.js.map +1 -1
  91. package/dist/state/bonds/useUserBonds.d.ts +10 -1
  92. package/dist/state/bonds/useUserBonds.js +19 -12
  93. package/dist/state/bonds/useUserBonds.js.map +1 -1
  94. package/dist/state/useSDKConfig.js +2 -2
  95. package/dist/state/useSDKConfig.js.map +1 -1
  96. package/dist/state/zap/getChainParam.d.ts +1 -16
  97. package/dist/state/zap/getChainParam.js +16 -40
  98. package/dist/state/zap/getChainParam.js.map +1 -1
  99. package/dist/styles.css +1 -1
  100. package/dist/types/yourbonds.d.ts +24 -0
  101. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js +19 -2
  102. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js.map +1 -1
  103. package/dist/views/Bonds/components/BondRows/BondRow.d.ts +3 -2
  104. package/dist/views/Bonds/components/BondRows/BondRow.js +15 -10
  105. package/dist/views/Bonds/components/BondRows/BondRow.js.map +1 -1
  106. package/dist/views/Bonds/components/BondRows/ModalHandler.js +1 -1
  107. package/dist/views/Bonds/components/BondRows/ModalHandler.js.map +1 -1
  108. package/dist/views/Bonds/components/BondRows/SoldOutRows.js +1 -1
  109. package/dist/views/Bonds/components/BondRows/SoldOutRows.js.map +1 -1
  110. package/dist/views/Bonds/components/BondsMenu/BondsMenu.js +1 -1
  111. package/dist/views/Bonds/components/BondsMenu/BondsMenu.js.map +1 -1
  112. package/dist/views/Bonds/components/BonusComponents/BonusComponent.js +1 -1
  113. package/dist/views/Bonds/components/BonusComponents/BonusComponent.js.map +1 -1
  114. package/dist/views/Bonds/components/BuyAgainRow/index.js +1 -1
  115. package/dist/views/Bonds/components/BuyAgainRow/index.js.map +1 -1
  116. package/dist/views/Bonds/components/CheckURL/index.js +20 -15
  117. package/dist/views/Bonds/components/CheckURL/index.js.map +1 -1
  118. package/dist/views/BuyBond/ChainBuyComponent.d.ts +4 -1
  119. package/dist/views/BuyBond/ChainBuyComponent.js +14 -2
  120. package/dist/views/BuyBond/ChainBuyComponent.js.map +1 -1
  121. package/dist/views/BuyBond/components/BondCards/BondCards.js +1 -7
  122. package/dist/views/BuyBond/components/BondCards/BondCards.js.map +1 -1
  123. package/dist/views/BuyBond/components/BondModalHeader.d.ts +1 -2
  124. package/dist/views/BuyBond/components/BondModalHeader.js +13 -5
  125. package/dist/views/BuyBond/components/BondModalHeader.js.map +1 -1
  126. package/dist/views/BuyBond/components/Estimations.js +1 -1
  127. package/dist/views/BuyBond/components/Estimations.js.map +1 -1
  128. package/dist/views/BuyBond/components/ExpandedViewButton.d.ts +2 -2
  129. package/dist/views/BuyBond/components/ExpandedViewButton.js +2 -2
  130. package/dist/views/BuyBond/components/ExpandedViewButton.js.map +1 -1
  131. package/dist/views/FullBondsView/FullBondsView.js +2 -1
  132. package/dist/views/FullBondsView/FullBondsView.js.map +1 -1
  133. package/dist/views/FullBondsView/YourBondsStatus.d.ts +3 -0
  134. package/dist/views/FullBondsView/YourBondsStatus.js +54 -0
  135. package/dist/views/FullBondsView/YourBondsStatus.js.map +1 -0
  136. package/dist/views/SingleBond/SoldOutBuyBondPlaceholder.js +2 -5
  137. package/dist/views/SingleBond/SoldOutBuyBondPlaceholder.js.map +1 -1
  138. package/dist/views/YourBonds/YourBonds.js +6 -1
  139. package/dist/views/YourBonds/YourBonds.js.map +1 -1
  140. package/dist/views/YourBonds/components/YourBondsMenu/YourBondsMenu.js +2 -1
  141. package/dist/views/YourBonds/components/YourBondsMenu/YourBondsMenu.js.map +1 -1
  142. package/dist/views/YourBondsModal/components/YourBondModalHeader/YourBondModalHeader.d.ts +2 -1
  143. package/dist/views/YourBondsModal/components/YourBondModalHeader/YourBondModalHeader.js +2 -2
  144. package/dist/views/YourBondsModal/components/YourBondModalHeader/YourBondModalHeader.js.map +1 -1
  145. package/package.json +2 -2
@@ -0,0 +1,53 @@
1
+ import { TransactionInstruction, Transaction, PublicKey } from '@solana/web3.js';
2
+ import { getU64Codec } from '@solana/kit';
3
+ import { Buffer } from 'buffer';
4
+ import { CLAIMABLE_PAYOUT_DISCRIMINATOR, PROGRAM_ID } from '../constants/solanaConstants.js';
5
+
6
+ async function calculatePendingRewards(connection, bondPda, bondTermPda, bondIssuancePda, nftMint) {
7
+ try {
8
+ const u64Codec = getU64Codec();
9
+ const currentTimestamp = Math.floor(Date.now() / 1000);
10
+ const encodedTimestamp = u64Codec.encode(BigInt(currentTimestamp));
11
+ // Instruction data
12
+ const instructionData = Buffer.concat([CLAIMABLE_PAYOUT_DISCRIMINATOR, Buffer.from(encodedTimestamp)]);
13
+ // Accounts
14
+ const keys = [
15
+ { pubkey: bondPda, isSigner: false, isWritable: true },
16
+ { pubkey: bondTermPda, isSigner: false, isWritable: false },
17
+ { pubkey: bondIssuancePda, isSigner: false, isWritable: false },
18
+ { pubkey: nftMint, isSigner: false, isWritable: false },
19
+ ];
20
+ // Instruction
21
+ const instruction = new TransactionInstruction({
22
+ keys,
23
+ programId: PROGRAM_ID,
24
+ data: instructionData,
25
+ });
26
+ // Transaction
27
+ const transaction = new Transaction();
28
+ const userPublicKey = new PublicKey('11111111111111111111111111111112'); // Dummy public key for fee payer
29
+ transaction.feePayer = userPublicKey;
30
+ transaction.add(instruction);
31
+ // Simulate
32
+ const simulation = await connection.simulateTransaction(transaction);
33
+ // Extract return value
34
+ const returnData = simulation.value.returnData;
35
+ if (returnData) {
36
+ const [data, encoding] = returnData.data;
37
+ if (encoding !== 'base64') {
38
+ throw new Error(`Unexpected return data encoding: ${encoding}`);
39
+ }
40
+ const decodedData = Buffer.from(data, 'base64');
41
+ return decodedData.readBigUInt64LE(0).toString();
42
+ }
43
+ // Fallback
44
+ return '0';
45
+ }
46
+ catch (error) {
47
+ console.error('Error calculating pending rewards:', error);
48
+ return '0';
49
+ }
50
+ }
51
+
52
+ export { calculatePendingRewards };
53
+ //# sourceMappingURL=calculatePendingRewards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculatePendingRewards.js","sources":["../../../../src/adapters/solana/utils/calculatePendingRewards.ts"],"sourcesContent":["import { Connection, PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'\nimport { getU64Codec } from '@solana/kit'\nimport { Buffer } from 'buffer'\nimport { CLAIMABLE_PAYOUT_DISCRIMINATOR, PROGRAM_ID } from '../constants/solanaConstants'\n\nexport async function calculatePendingRewards(\n connection: Connection,\n bondPda: PublicKey,\n bondTermPda: PublicKey,\n bondIssuancePda: PublicKey,\n nftMint: PublicKey,\n): Promise<string> {\n try {\n const u64Codec = getU64Codec()\n\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n const encodedTimestamp = u64Codec.encode(BigInt(currentTimestamp))\n\n // Instruction data\n const instructionData = Buffer.concat([CLAIMABLE_PAYOUT_DISCRIMINATOR, Buffer.from(encodedTimestamp)])\n\n // Accounts\n const keys = [\n { pubkey: bondPda, isSigner: false, isWritable: true },\n { pubkey: bondTermPda, isSigner: false, isWritable: false },\n { pubkey: bondIssuancePda, isSigner: false, isWritable: false },\n { pubkey: nftMint, isSigner: false, isWritable: false },\n ]\n\n // Instruction\n const instruction = new TransactionInstruction({\n keys,\n programId: PROGRAM_ID,\n data: instructionData,\n })\n\n // Transaction\n const transaction = new Transaction()\n const userPublicKey = new PublicKey('11111111111111111111111111111112') // Dummy public key for fee payer\n transaction.feePayer = userPublicKey\n transaction.add(instruction)\n\n // Simulate\n const simulation = await connection.simulateTransaction(transaction)\n\n // Extract return value\n const returnData = simulation.value.returnData\n if (returnData) {\n const [data, encoding] = returnData.data\n if (encoding !== 'base64') {\n throw new Error(`Unexpected return data encoding: ${encoding}`)\n }\n\n const decodedData = Buffer.from(data, 'base64')\n return decodedData.readBigUInt64LE(0).toString()\n }\n\n // Fallback\n return '0'\n } catch (error) {\n console.error('Error calculating pending rewards:', error)\n return '0'\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,eAAe,uBAAuB,CAC3C,UAAsB,EACtB,OAAkB,EAClB,WAAsB,EACtB,eAA0B,EAC1B,OAAkB,EAAA;AAElB,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,WAAW,EAAE;AAE9B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAEtD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;;AAGlE,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;;AAGtG,QAAA,MAAM,IAAI,GAAG;YACX,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACtD,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YAC3D,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YAC/D,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;SACxD;;AAGD,QAAA,MAAM,WAAW,GAAG,IAAI,sBAAsB,CAAC;YAC7C,IAAI;AACJ,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,IAAI,EAAE,eAAe;AACtB,SAAA,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE;QACrC,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;AACvE,QAAA,WAAW,CAAC,QAAQ,GAAG,aAAa;AACpC,QAAA,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;;QAG5B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC;;AAGpE,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU;QAC9C,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,IAAI;AACxC,YAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAA,CAAE,CAAC;YACjE;YAEA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC/C,OAAO,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClD;;AAGA,QAAA,OAAO,GAAG;IACZ;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,QAAA,OAAO,GAAG;IACZ;AACF;;;;"}
@@ -0,0 +1,3 @@
1
+ import { HeliusAsset } from '../types/helius';
2
+ /** The user's bond NFTs (across the given collections) through Helius `searchAssets`, all pages. */
3
+ export declare function fetchUserAssetsSOL(user: string, collections: string[]): Promise<HeliusAsset[]>;
@@ -0,0 +1,49 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { getShuffledHeliusRPCs } from '../../../config/constants/networks.js';
3
+
4
+ const ASSETS_PER_PAGE = 1000;
5
+ // Safety net against a node that keeps returning full pages
6
+ const MAX_PAGES = 20;
7
+ /** One `searchAssets` page. A failed call (network, non-2xx, JSON-RPC error) is retried once on a different node. */
8
+ async function fetchAssetsPage(ownerAddress, collections, page) {
9
+ // Custom RPCs from the consumer are deliberately ignored: searchAssets is a Helius-only DAS method
10
+ const [primary, fallback] = getShuffledHeliusRPCs();
11
+ const body = JSON.stringify({
12
+ jsonrpc: '2.0',
13
+ id: '1',
14
+ method: 'searchAssets',
15
+ params: { ownerAddress, collections, page, limit: ASSETS_PER_PAGE },
16
+ });
17
+ const request = async (url) => {
18
+ const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body });
19
+ if (!response.ok)
20
+ throw new Error(`Helius searchAssets failed: HTTP ${response.status}`);
21
+ const data = await response.json();
22
+ if (data.error || !data.result?.items) {
23
+ throw new Error(`Helius searchAssets failed: ${data.error?.message ?? 'missing result'}`);
24
+ }
25
+ return data.result.items;
26
+ };
27
+ try {
28
+ return await request(primary);
29
+ }
30
+ catch (error) {
31
+ console.warn('Helius searchAssets failed, retrying with another node:', error);
32
+ return request(fallback ?? primary);
33
+ }
34
+ }
35
+ /** The user's bond NFTs (across the given collections) through Helius `searchAssets`, all pages. */
36
+ async function fetchUserAssetsSOL(user, collections) {
37
+ const ownerAddress = new PublicKey(user).toBase58();
38
+ const assets = [];
39
+ for (let page = 1; page <= MAX_PAGES; page++) {
40
+ const items = await fetchAssetsPage(ownerAddress, collections, page);
41
+ assets.push(...items);
42
+ if (items.length < ASSETS_PER_PAGE)
43
+ break;
44
+ }
45
+ return assets;
46
+ }
47
+
48
+ export { fetchUserAssetsSOL };
49
+ //# sourceMappingURL=fetchUserAssetsSOL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchUserAssetsSOL.js","sources":["../../../../src/adapters/solana/utils/fetchUserAssetsSOL.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport { getShuffledHeliusRPCs } from '../../../config/constants/networks'\nimport { HeliusApiResponse, HeliusAsset } from '../types/helius'\n\nconst ASSETS_PER_PAGE = 1000\n// Safety net against a node that keeps returning full pages\nconst MAX_PAGES = 20\n\n/** One `searchAssets` page. A failed call (network, non-2xx, JSON-RPC error) is retried once on a different node. */\nasync function fetchAssetsPage(ownerAddress: string, collections: string[], page: number): Promise<HeliusAsset[]> {\n // Custom RPCs from the consumer are deliberately ignored: searchAssets is a Helius-only DAS method\n const [primary, fallback] = getShuffledHeliusRPCs()\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: '1',\n method: 'searchAssets',\n params: { ownerAddress, collections, page, limit: ASSETS_PER_PAGE },\n })\n\n const request = async (url: string): Promise<HeliusAsset[]> => {\n const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body })\n if (!response.ok) throw new Error(`Helius searchAssets failed: HTTP ${response.status}`)\n const data: HeliusApiResponse & { error?: { message?: string } } = await response.json()\n if (data.error || !data.result?.items) {\n throw new Error(`Helius searchAssets failed: ${data.error?.message ?? 'missing result'}`)\n }\n return data.result.items\n }\n\n try {\n return await request(primary)\n } catch (error) {\n console.warn('Helius searchAssets failed, retrying with another node:', error)\n return request(fallback ?? primary)\n }\n}\n\n/** The user's bond NFTs (across the given collections) through Helius `searchAssets`, all pages. */\nexport async function fetchUserAssetsSOL(user: string, collections: string[]): Promise<HeliusAsset[]> {\n const ownerAddress = new PublicKey(user).toBase58()\n const assets: HeliusAsset[] = []\n for (let page = 1; page <= MAX_PAGES; page++) {\n const items = await fetchAssetsPage(ownerAddress, collections, page)\n assets.push(...items)\n if (items.length < ASSETS_PER_PAGE) break\n }\n return assets\n}\n"],"names":[],"mappings":";;;AAIA,MAAM,eAAe,GAAG,IAAI;AAC5B;AACA,MAAM,SAAS,GAAG,EAAE;AAEpB;AACA,eAAe,eAAe,CAAC,YAAoB,EAAE,WAAqB,EAAE,IAAY,EAAA;;IAEtF,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,qBAAqB,EAAE;AACnD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;AAC1B,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,EAAE,EAAE,GAAG;AACP,QAAA,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE;AACpE,KAAA,CAAC;AAEF,IAAA,MAAM,OAAO,GAAG,OAAO,GAAW,KAA4B;QAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC;QAC5G,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,CAAA,iCAAA,EAAoC,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;AACxF,QAAA,MAAM,IAAI,GAAyD,MAAM,QAAQ,CAAC,IAAI,EAAE;QACxF,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;AACrC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,gBAAgB,CAAA,CAAE,CAAC;QAC3F;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;AAC1B,IAAA,CAAC;AAED,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC;IAC/B;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,KAAK,CAAC;AAC9E,QAAA,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IACrC;AACF;AAEA;AACO,eAAe,kBAAkB,CAAC,IAAY,EAAE,WAAqB,EAAA;IAC1E,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACnD,MAAM,MAAM,GAAkB,EAAE;AAChC,IAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC;AACpE,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe;YAAE;IACtC;AACA,IAAA,OAAO,MAAM;AACf;;;;"}
@@ -1,5 +1,10 @@
1
1
  import { BondIssuanceAccount, BondAccount, BondTermAccount, BondPricingAccount } from './codecs';
2
2
  export declare function getBondIssuanceAccountSolana(accountAddresses: string[]): Promise<BondIssuanceAccount[] | undefined>;
3
3
  export declare function getBondAccountSolana(accountAddresses: string[]): Promise<BondAccount[] | undefined>;
4
+ /**
5
+ * Batched version of getBondAccountSolana: the result is aligned with `accountAddresses` (a missing account yields
6
+ * `null` instead of aborting the whole batch) and requests are chunked to the RPC limit and sent in parallel.
7
+ */
8
+ export declare function getBondAccountsSolanaAligned(accountAddresses: string[]): Promise<(BondAccount | null)[]>;
4
9
  export declare function getBondTermAccountSolana(accountAddresses: string[]): Promise<BondTermAccount[] | undefined>;
5
10
  export declare function getBondPricingAccountSolana(accountAddresses: string[]): Promise<BondPricingAccount[] | undefined>;
@@ -31,30 +31,33 @@ async function getBondIssuanceAccountSolana(accountAddresses) {
31
31
  }
32
32
  return bondIssuanceAccounts;
33
33
  }
34
- async function getBondAccountSolana(accountAddresses) {
34
+ // getMultipleAccounts accepts up to 100 addresses per request
35
+ const MAX_ACCOUNTS_PER_REQUEST = 100;
36
+ /**
37
+ * Batched version of getBondAccountSolana: the result is aligned with `accountAddresses` (a missing account yields
38
+ * `null` instead of aborting the whole batch) and requests are chunked to the RPC limit and sent in parallel.
39
+ */
40
+ async function getBondAccountsSolanaAligned(accountAddresses) {
35
41
  const rpc = getSolanaRpc();
36
- const bondAddresses = accountAddresses.map((a) => address(a));
37
- const { value } = await rpc
38
- .getMultipleAccounts(bondAddresses, {
39
- encoding: 'base64',
40
- commitment: 'confirmed',
41
- })
42
- .send();
43
- if (!value?.length) {
44
- throw new Error(`Accounts not found for: ${bondAddresses}`);
45
- }
46
- const bondAccounts = [];
47
- for (const account of value) {
48
- if (!account?.data?.[0])
49
- return;
50
- const accountDataBytes = Buffer.from(account?.data?.[0], 'base64');
51
- if (!verifyBondDiscriminator(accountDataBytes)) {
52
- throw new Error(`Invalid account type. Expected Bond account at ${account.owner}`);
53
- }
54
- const bondAccount = bondDecoder.decode(accountDataBytes);
55
- bondAccounts.push(bondAccount);
42
+ const chunks = [];
43
+ for (let i = 0; i < accountAddresses.length; i += MAX_ACCOUNTS_PER_REQUEST) {
44
+ chunks.push(accountAddresses.slice(i, i + MAX_ACCOUNTS_PER_REQUEST));
56
45
  }
57
- return bondAccounts;
46
+ const decodedChunks = await Promise.all(chunks.map(async (chunk) => {
47
+ const { value } = await rpc
48
+ .getMultipleAccounts(chunk.map((a) => address(a)), { encoding: 'base64', commitment: 'confirmed' })
49
+ .send();
50
+ return value.map((account, i) => {
51
+ if (!account?.data?.[0])
52
+ return null;
53
+ const accountDataBytes = Buffer.from(account.data[0], 'base64');
54
+ if (!verifyBondDiscriminator(accountDataBytes)) {
55
+ throw new Error(`Invalid account type. Expected Bond account at ${chunk[i]}`);
56
+ }
57
+ return bondDecoder.decode(accountDataBytes);
58
+ });
59
+ }));
60
+ return decodedChunks.flat();
58
61
  }
59
62
  async function getBondTermAccountSolana(accountAddresses) {
60
63
  const rpc = getSolanaRpc();
@@ -107,5 +110,5 @@ async function getBondPricingAccountSolana(accountAddresses) {
107
110
  return bondPricingAccounts;
108
111
  }
109
112
 
110
- export { getBondAccountSolana, getBondIssuanceAccountSolana, getBondPricingAccountSolana, getBondTermAccountSolana };
113
+ export { getBondAccountsSolanaAligned, getBondIssuanceAccountSolana, getBondPricingAccountSolana, getBondTermAccountSolana };
111
114
  //# sourceMappingURL=getSolanaAccount.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getSolanaAccount.js","sources":["../../../../src/adapters/solana/utils/getSolanaAccount.ts"],"sourcesContent":["import { getSolanaRpc } from './solanaRpc'\nimport { address } from '@solana/kit'\nimport {\n bondIssuanceDecoder,\n verifyBondIssuanceDiscriminator,\n bondDecoder,\n verifyBondDiscriminator,\n bondTermDecoder,\n verifyBondTermDiscriminator,\n bondPricingDecoder,\n verifyBondPricingDiscriminator,\n BondIssuanceAccount,\n BondAccount,\n BondTermAccount,\n BondPricingAccount,\n} from './codecs'\nimport { Buffer } from 'buffer'\n\nexport async function getBondIssuanceAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondIssuanceAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondIssuanceAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondIssuanceAddresses}`)\n }\n\n const bondIssuanceAccounts: BondIssuanceAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondIssuanceDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondIssuance account at ${account.owner}`)\n }\n\n const bondIssuanceAccount = bondIssuanceDecoder.decode(accountDataBytes)\n bondIssuanceAccounts.push(bondIssuanceAccount)\n }\n\n return bondIssuanceAccounts\n}\n\nexport async function getBondAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondAddresses}`)\n }\n\n const bondAccounts: BondAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected Bond account at ${account.owner}`)\n }\n\n const bondAccount = bondDecoder.decode(accountDataBytes)\n bondAccounts.push(bondAccount)\n }\n\n return bondAccounts\n}\n\nexport async function getBondTermAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondTermAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondTermAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondTermAddresses}`)\n }\n\n const bondTermAccounts: BondTermAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondTermDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondTerm account at ${account.owner}`)\n }\n\n const bondTermAccount = bondTermDecoder.decode(accountDataBytes)\n bondTermAccounts.push(bondTermAccount)\n }\n\n return bondTermAccounts\n}\n\nexport async function getBondPricingAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondPricingAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondPricingAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondPricingAddresses}`)\n }\n\n const bondPricingAccounts: BondPricingAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondPricingDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondPricing account at ${account.owner}`)\n }\n\n const bondPricingAccount = bondPricingDecoder.decode(accountDataBytes)\n bondPricingAccounts.push(bondPricingAccount)\n }\n\n return bondPricingAccounts\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSolanaAccount.js","sources":["../../../../src/adapters/solana/utils/getSolanaAccount.ts"],"sourcesContent":["import { getSolanaRpc } from './solanaRpc'\nimport { address } from '@solana/kit'\nimport {\n bondIssuanceDecoder,\n verifyBondIssuanceDiscriminator,\n bondDecoder,\n verifyBondDiscriminator,\n bondTermDecoder,\n verifyBondTermDiscriminator,\n bondPricingDecoder,\n verifyBondPricingDiscriminator,\n BondIssuanceAccount,\n BondAccount,\n BondTermAccount,\n BondPricingAccount,\n} from './codecs'\nimport { Buffer } from 'buffer'\n\nexport async function getBondIssuanceAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondIssuanceAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondIssuanceAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondIssuanceAddresses}`)\n }\n\n const bondIssuanceAccounts: BondIssuanceAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondIssuanceDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondIssuance account at ${account.owner}`)\n }\n\n const bondIssuanceAccount = bondIssuanceDecoder.decode(accountDataBytes)\n bondIssuanceAccounts.push(bondIssuanceAccount)\n }\n\n return bondIssuanceAccounts\n}\n\nexport async function getBondAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondAddresses}`)\n }\n\n const bondAccounts: BondAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected Bond account at ${account.owner}`)\n }\n\n const bondAccount = bondDecoder.decode(accountDataBytes)\n bondAccounts.push(bondAccount)\n }\n\n return bondAccounts\n}\n\n// getMultipleAccounts accepts up to 100 addresses per request\nconst MAX_ACCOUNTS_PER_REQUEST = 100\n\n/**\n * Batched version of getBondAccountSolana: the result is aligned with `accountAddresses` (a missing account yields\n * `null` instead of aborting the whole batch) and requests are chunked to the RPC limit and sent in parallel.\n */\nexport async function getBondAccountsSolanaAligned(accountAddresses: string[]): Promise<(BondAccount | null)[]> {\n const rpc = getSolanaRpc()\n const chunks: string[][] = []\n for (let i = 0; i < accountAddresses.length; i += MAX_ACCOUNTS_PER_REQUEST) {\n chunks.push(accountAddresses.slice(i, i + MAX_ACCOUNTS_PER_REQUEST))\n }\n\n const decodedChunks = await Promise.all(\n chunks.map(async (chunk) => {\n const { value } = await rpc\n .getMultipleAccounts(\n chunk.map((a) => address(a)),\n { encoding: 'base64', commitment: 'confirmed' },\n )\n .send()\n\n return value.map((account, i) => {\n if (!account?.data?.[0]) return null\n const accountDataBytes = Buffer.from(account.data[0], 'base64')\n if (!verifyBondDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected Bond account at ${chunk[i]}`)\n }\n return bondDecoder.decode(accountDataBytes)\n })\n }),\n )\n\n return decodedChunks.flat()\n}\n\nexport async function getBondTermAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondTermAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondTermAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondTermAddresses}`)\n }\n\n const bondTermAccounts: BondTermAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondTermDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondTerm account at ${account.owner}`)\n }\n\n const bondTermAccount = bondTermDecoder.decode(accountDataBytes)\n bondTermAccounts.push(bondTermAccount)\n }\n\n return bondTermAccounts\n}\n\nexport async function getBondPricingAccountSolana(accountAddresses: string[]) {\n const rpc = getSolanaRpc()\n const bondPricingAddresses = accountAddresses.map((a) => address(a))\n\n const { value } = await rpc\n .getMultipleAccounts(bondPricingAddresses, {\n encoding: 'base64',\n commitment: 'confirmed',\n })\n .send()\n\n if (!value?.length) {\n throw new Error(`Accounts not found for: ${bondPricingAddresses}`)\n }\n\n const bondPricingAccounts: BondPricingAccount[] = []\n\n for (const account of value) {\n if (!account?.data?.[0]) return\n const accountDataBytes = Buffer.from(account?.data?.[0], 'base64')\n\n if (!verifyBondPricingDiscriminator(accountDataBytes)) {\n throw new Error(`Invalid account type. Expected BondPricing account at ${account.owner}`)\n }\n\n const bondPricingAccount = bondPricingDecoder.decode(accountDataBytes)\n bondPricingAccounts.push(bondPricingAccount)\n }\n\n return bondPricingAccounts\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { PublicKey } from '@solana/web3.js';
2
- import { getBondIssuanceAccountSolana, getBondPricingAccountSolana, getBondTermAccountSolana } from './getSolanaAccount.js';
2
+ import { getBondAccountsSolanaAligned, getBondIssuanceAccountSolana, getBondPricingAccountSolana, getBondTermAccountSolana } from './getSolanaAccount.js';
3
3
 
4
4
  /**
5
5
  * Reads multiple Anchor accounts in one batch from multiple programs
@@ -16,7 +16,9 @@ async function solanaMulticall(calls) {
16
16
  }, {});
17
17
  for (const [accountType, callIds] of Object.entries(callIdsGroupedByAccountType)) {
18
18
  if (accountType === 'bond') {
19
- results[accountType] = await getBondIssuanceAccountSolana(callIds.map((id) => id.toBase58()));
19
+ // Aligned with the calls (null for a missing account), so it skips the `[0] === null` reset below
20
+ results[accountType] = await getBondAccountsSolanaAligned(callIds.map((id) => id.toBase58()));
21
+ continue;
20
22
  }
21
23
  if (accountType === 'bondIssuance') {
22
24
  results[accountType] = await getBondIssuanceAccountSolana(callIds.map((id) => id.toBase58()));
@@ -1 +1 @@
1
- {"version":3,"file":"solanaMulticall.js","sources":["../../../../src/adapters/solana/utils/solanaMulticall.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport { getBondIssuanceAccountSolana, getBondPricingAccountSolana, getBondTermAccountSolana } from './getSolanaAccount'\n\nexport interface SolanaCall {\n accountAddress: string\n accountType: 'bond' | 'bondIssuance' | 'bondPricing' | 'bondTerm'\n}\n\n/**\n * Reads multiple Anchor accounts in one batch from multiple programs\n */\nexport async function solanaMulticall(calls: SolanaCall[]): Promise<Record<string, any>> {\n try {\n const results: Record<string, any> = {}\n\n const callIdsGroupedByAccountType = calls.reduce(\n (acc, call) => {\n if (!acc[call.accountType]) {\n acc[call.accountType] = []\n }\n acc[call.accountType].push(new PublicKey(call.accountAddress))\n return acc\n },\n {} as Record<string, PublicKey[]>,\n )\n\n for (const [accountType, callIds] of Object.entries(callIdsGroupedByAccountType)) {\n if (accountType === 'bond') {\n results[accountType] = await getBondIssuanceAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (accountType === 'bondIssuance') {\n results[accountType] = await getBondIssuanceAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (accountType === 'bondPricing') {\n results[accountType] = await getBondPricingAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (accountType === 'bondTerm') {\n results[accountType] = await getBondTermAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (results?.[accountType]?.[0] === null) {\n results[accountType] = []\n }\n }\n\n return results\n } catch (e) {\n console.error(e)\n return {}\n }\n}\n"],"names":[],"mappings":";;;AAQA;;AAEG;AACI,eAAe,eAAe,CAAC,KAAmB,EAAA;AACvD,IAAA,IAAI;QACF,MAAM,OAAO,GAAwB,EAAE;QAEvC,MAAM,2BAA2B,GAAG,KAAK,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,IAAI,KAAI;YACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC1B,gBAAA,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5B;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC9D,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAiC,CAClC;AAED,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,EAAE;AAChF,YAAA,IAAI,WAAW,KAAK,MAAM,EAAE;gBAC1B,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/F;AACA,YAAA,IAAI,WAAW,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/F;AACA,YAAA,IAAI,WAAW,KAAK,aAAa,EAAE;gBACjC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9F;AACA,YAAA,IAAI,WAAW,KAAK,UAAU,EAAE;gBAC9B,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3F;AACA,YAAA,IAAI,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;AACxC,gBAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3B;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
1
+ {"version":3,"file":"solanaMulticall.js","sources":["../../../../src/adapters/solana/utils/solanaMulticall.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport {\n getBondAccountsSolanaAligned,\n getBondIssuanceAccountSolana,\n getBondPricingAccountSolana,\n getBondTermAccountSolana,\n} from './getSolanaAccount'\n\nexport interface SolanaCall {\n accountAddress: string\n accountType: 'bond' | 'bondIssuance' | 'bondPricing' | 'bondTerm'\n}\n\n/**\n * Reads multiple Anchor accounts in one batch from multiple programs\n */\nexport async function solanaMulticall(calls: SolanaCall[]): Promise<Record<string, any>> {\n try {\n const results: Record<string, any> = {}\n\n const callIdsGroupedByAccountType = calls.reduce(\n (acc, call) => {\n if (!acc[call.accountType]) {\n acc[call.accountType] = []\n }\n acc[call.accountType].push(new PublicKey(call.accountAddress))\n return acc\n },\n {} as Record<string, PublicKey[]>,\n )\n\n for (const [accountType, callIds] of Object.entries(callIdsGroupedByAccountType)) {\n if (accountType === 'bond') {\n // Aligned with the calls (null for a missing account), so it skips the `[0] === null` reset below\n results[accountType] = await getBondAccountsSolanaAligned(callIds.map((id) => id.toBase58()))\n continue\n }\n if (accountType === 'bondIssuance') {\n results[accountType] = await getBondIssuanceAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (accountType === 'bondPricing') {\n results[accountType] = await getBondPricingAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (accountType === 'bondTerm') {\n results[accountType] = await getBondTermAccountSolana(callIds.map((id) => id.toBase58()))\n }\n if (results?.[accountType]?.[0] === null) {\n results[accountType] = []\n }\n }\n\n return results\n } catch (e) {\n console.error(e)\n return {}\n }\n}\n"],"names":[],"mappings":";;;AAaA;;AAEG;AACI,eAAe,eAAe,CAAC,KAAmB,EAAA;AACvD,IAAA,IAAI;QACF,MAAM,OAAO,GAAwB,EAAE;QAEvC,MAAM,2BAA2B,GAAG,KAAK,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,IAAI,KAAI;YACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC1B,gBAAA,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5B;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC9D,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAiC,CAClC;AAED,QAAA,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,EAAE;AAChF,YAAA,IAAI,WAAW,KAAK,MAAM,EAAE;;gBAE1B,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7F;YACF;AACA,YAAA,IAAI,WAAW,KAAK,cAAc,EAAE;gBAClC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/F;AACA,YAAA,IAAI,WAAW,KAAK,aAAa,EAAE;gBACjC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9F;AACA,YAAA,IAAI,WAAW,KAAK,UAAU,EAAE;gBAC9B,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3F;AACA,YAAA,IAAI,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;AACxC,gBAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3B;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
@@ -37,17 +37,20 @@ export type TokenBalance = {
37
37
  address: string;
38
38
  balance: string;
39
39
  };
40
+ /** A bond type's own modal flow (buy, then what follows it), opened from the bond list and from URL params. */
41
+ export interface BondModalHandlerProps {
42
+ bondAddress: string;
43
+ bondChain: number;
44
+ onDismiss?: () => void;
45
+ isProjectView?: boolean;
46
+ }
40
47
  /** PreTGE / launch bonds and their Yield variant (EVM-only today). */
41
48
  export interface PreTGEAdapter {
42
49
  fetchBondsData(chainId: ChainId, tokenPrices: Partial<Record<ChainId, TokenPrices[]>>, bonds: PreTGEConfig[], apiUrl: string): Promise<BondsData[]>;
43
50
  /** Read by core's useUserBondsPreTGE; a plain function, so core owns the query (no adapter hooks in core). */
44
51
  fetchUserBonds(chains: number[], tokenPrices: Partial<Record<ChainId, TokenPrices[]>>, preTGEList: PreTGEConfig[], account: string, apiUrl: string): Promise<PreTGEUserBonds[]>;
45
52
  /** Buy flow of a PreTGE bond, opened from the bond list and from URL params. */
46
- ModalHandler: React.FC<{
47
- bondAddress: string;
48
- bondChain: number;
49
- onDismiss?: () => void;
50
- }>;
53
+ ModalHandler: React.FC<BondModalHandlerProps>;
51
54
  UserBondRow: React.FC<{
52
55
  userBond: PreTGEUserBonds;
53
56
  }>;
@@ -55,6 +58,17 @@ export interface PreTGEAdapter {
55
58
  userBond: PreTGEUserBonds;
56
59
  }>;
57
60
  }
61
+ /** LP staking bonds (`billType === 'lpStaking'`, EVM-only today), with their own buy flow apart from regular bonds. */
62
+ export interface LpStakingAdapter {
63
+ /** Buy flow opened from the bond list and from URL params; owns what is shown after a purchase. */
64
+ ModalHandler: React.FC<BondModalHandlerProps>;
65
+ /** The buy form alone, rendered by `ChainBuyComponent` (SingleBond, ProjectView, hot bonds, BuyBondModal). */
66
+ BuyComponent: React.FC<ChainBuyComponentProps>;
67
+ /** A purchased LP staking position in Your Bonds (with its own modal) */
68
+ UserBondRow: React.FC<{
69
+ bill: UserBill;
70
+ }>;
71
+ }
58
72
  /**
59
73
  * A chain family's integration (EVM, Solana, Aptos, Sui). Core code reaches chain-specific code only through
60
74
  * registered adapters, never by importing it, so a consumer only installs the libraries of the families it uses.
@@ -73,7 +87,7 @@ export interface ChainAdapter {
73
87
  usesRealtimeApi: boolean;
74
88
  /** For adapters that use the realtime API this is only the fallback path, used when that API fails. */
75
89
  fetchBondsData(chainId: ChainId, bonds: BillsConfig[], tokenPrices: TokenPrices[] | undefined, apiUrl: string): Promise<BondsData[]>;
76
- fetchUserBonds(chainId: ChainId, account: string, bonds: BillsConfig[], tokenPrices: Partial<Record<ChainId, TokenPrices[]>>): Promise<UserOwnedBillsData[]>;
90
+ fetchUserBonds(chainId: ChainId, account: string, bonds: BillsConfig[], tokenPrices: Partial<Record<ChainId, TokenPrices[]>>, apiUrl: string): Promise<UserOwnedBillsData[]>;
77
91
  /** false: skip the api-v2 /bills/multi-batch NFT metadata enrichment for this family's bills. */
78
92
  enrichUserBondsViaApi: boolean;
79
93
  getTokenBalance(chainId: ChainId, currency: 'NATIVE' | Token, account: string): Promise<string | null>;
@@ -94,6 +108,7 @@ export interface ChainAdapter {
94
108
  /** Tier points of an address. Tiers live on an EVM lens contract, so only the EVM adapter provides this. */
95
109
  getTierPoints?(account: string, apiUrl: string): Promise<TierPoints>;
96
110
  preTGE?: PreTGEAdapter;
111
+ lpStaking?: LpStakingAdapter;
97
112
  }
98
113
  export interface BridgeModalProps {
99
114
  bondChain: ChainId;
@@ -13,6 +13,7 @@ import Question from '../uikit-sdk/Svg/Icons/Question.js';
13
13
  const NETWORK_COLORS = {
14
14
  [ChainId.BSC]: '#F3BA2F4d',
15
15
  [ChainId.MAINNET]: '#627eea4d',
16
+ [ChainId.SEPOLIA]: '#627eea4d',
16
17
  [ChainId.MATIC]: '#8247e54d',
17
18
  [ChainId.LIGHTLINK]: '#6087ff4d',
18
19
  [ChainId.BASE]: '#0052ff4d',
@@ -22,6 +23,7 @@ const NETWORK_COLORS = {
22
23
  [ChainId.GRAPHLINQ]: '#ded2ff4d',
23
24
  [ChainId.AVAX]: '#e743444d',
24
25
  [ChainId.BLAST]: '#fcfc034d',
26
+ [ChainId.ROBINHOOD]: 'rgb(223 223 0 / 0.3)',
25
27
  [ChainId.CROSSFI]: '#7c80844d',
26
28
  [ChainId.MONAD_TESTNET]: '#836EF94d',
27
29
  [ChainId.MONAD]: '#836EF94d',
@@ -38,13 +40,14 @@ const NETWORK_COLORS = {
38
40
  };
39
41
  const TokenInfoAndName = ({ tokenSymbol, chain, tag, vestEnds, isHotBond, marketingCampaign, cardsView, }) => {
40
42
  const ChainIcon = (chain && NETWORK_ICONS[chain]) || Question;
43
+ const [tokenSymbol0, tokenSymbol1] = tokenSymbol?.split('-') ?? [];
41
44
  return (jsxs(Flex, { className: clsx('tokeninfoname container ape:w-full ape:relative ape:h-full ape:rounded-[10px]', cardsView
42
45
  ? 'ape:flex-col ape:items-start ape:gap-[10px] ape:pl-0 ape:pt-[5px] ape:justify-start'
43
46
  : 'ape:justify-start ape:items-center'), children: [jsx(Flex, { className: "ape:absolute ape:left-0 ape:top-0 ape:w-[125px] ape:h-full ape:rounded-normal", style: {
44
47
  background: isHotBond
45
48
  ? 'transparent'
46
49
  : `linear-gradient(90deg, ${chain ? NETWORK_COLORS[chain] : '#FFFFFF33'} 0%, rgba(0,0,0,0) 75%)`,
47
- } }), jsx(Flex, { className: clsx('tokeninfoname chain ape:absolute ape:left-0 ape:top-0 ape:overflow-hidden ape:rounded-tl-[10px] ape:rounded-br-[8px] ape:z-[5]', cardsView && 'ape:hidden'), children: jsx(ChainIcon, { width: 20, height: 20 }) }), jsxs(Flex, { className: clsx('tokeninfoname tokencontainer ape:w-full ape:items-center', cardsView ? 'ape:max-w-full ape:pl-0' : 'ape:sm:max-w-[190px]', !cardsView && (vestEnds ? 'ape:mt-[10px] ape:lg:mt-0' : 'ape:mt-0')), children: [jsxs(Flex, { className: "ape:relative ape:min-w-[33px] ape:ml-3.5 ape:sm:ml-5", children: [jsx(Flex, { style: MCTokenIconStyles[marketingCampaign] }), jsx(TokenImage, { symbol: tokenSymbol, size: 33 })] }), jsxs(Flex, { className: "tokeninfoname tokentext ape:ml-1 ape:sm:ml-2 ape:font-bold ape:w-full ape:flex-col", children: [jsx(Flex, { className: "ape:justify-between ape:w-full ape:items-center", children: jsx(Text, { className: "ape:text-[12px]! ape:sm:text-[16px]!", children: tokenSymbol }) }), vestEnds && (jsx(Flex, { className: "ape:text-[12px] ape:font-normal ape:opacity-60 ape:leading-[14px]", children: vestEnds }))] }), jsx(Flex, { className: "tokeninfofav ape:min-w-[25px] ape:p-[5px]", children: jsx(AddFavToken, { tokenSymbol: tokenSymbol, hotBond: !vestEnds && isHotBond }) })] }), jsx(Flex, { className: clsx('ape:items-center', isHotBond ? 'ape:justify-center' : 'ape:justify-start'), children: jsx(Flex, { className: isHotBond ? 'ape:flex' : 'ape:hidden ape:xl:flex', children: (tag || marketingCampaign) && (jsx(ListTag, { text: MCTagNameMapping[marketingCampaign] || tag, marketingCampaign: marketingCampaign })) }) })] }));
50
+ } }), jsx(Flex, { className: clsx('tokeninfoname chain ape:absolute ape:left-0 ape:top-0 ape:overflow-hidden ape:rounded-tl-[10px] ape:rounded-br-[8px] ape:z-[5]', cardsView && 'ape:hidden'), children: jsx(ChainIcon, { width: 20, height: 20 }) }), jsxs(Flex, { className: clsx('tokeninfoname tokencontainer ape:w-full ape:items-center', cardsView ? 'ape:max-w-full ape:pl-0' : 'ape:sm:max-w-[200px]', !cardsView && (vestEnds ? 'ape:mt-[10px] ape:lg:mt-0' : 'ape:mt-0')), children: [jsxs(Flex, { className: "ape:relative ape:min-w-[33px] ape:ml-3.5 ape:sm:ml-5", children: [jsx(Flex, { style: MCTokenIconStyles[marketingCampaign] }), jsx(TokenImage, { symbol: tokenSymbol0, symbol2: tokenSymbol1, size: tokenSymbol1 ? 24 : 33 })] }), jsxs(Flex, { className: "tokeninfoname tokentext ape:ml-1 ape:sm:ml-2 ape:font-bold ape:w-full ape:flex-col", children: [jsx(Flex, { className: "ape:justify-between ape:w-full ape:items-center", children: jsx(Text, { className: "ape:text-[12px]! ape:sm:text-[16px]!", children: tokenSymbol }) }), vestEnds && (jsx(Flex, { className: "ape:text-[12px] ape:font-normal ape:opacity-60 ape:leading-[14px]", children: vestEnds }))] }), jsx(Flex, { className: "tokeninfofav ape:min-w-[25px] ape:p-[5px]", children: jsx(AddFavToken, { tokenSymbol: tokenSymbol, hotBond: !vestEnds && isHotBond }) })] }), jsx(Flex, { className: clsx('ape:items-center', isHotBond ? 'ape:justify-center' : 'ape:justify-start'), children: jsx(Flex, { className: isHotBond ? 'ape:flex' : 'ape:hidden ape:xl:flex', children: (tag || marketingCampaign) && (jsx(ListTag, { text: MCTagNameMapping[marketingCampaign] || tag, marketingCampaign: marketingCampaign })) }) })] }));
48
51
  };
49
52
 
50
53
  export { TokenInfoAndName as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/TokenInfoAndName/index.tsx"],"sourcesContent":["import React from 'react'\nimport clsx from 'clsx'\nimport { NETWORK_ICONS } from '../../config/constants/chains'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport AddFavToken from '../FavIcons/AddFavToken'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { MCTagNameMapping, MCTokenIconStyles } from '../../utils/campaignStyles'\nimport Flex from '../uikit-sdk/Flex'\nimport Text from '../uikit-sdk/Text'\nimport ListTag from '../uikit-sdk/Tag/ListTag'\nimport Question from '../uikit-sdk/Svg/Icons/Question'\n\nconst NETWORK_COLORS: Partial<Record<number, string>> = {\n [ChainId.BSC]: '#F3BA2F4d',\n [ChainId.MAINNET]: '#627eea4d',\n [ChainId.MATIC]: '#8247e54d',\n [ChainId.LIGHTLINK]: '#6087ff4d',\n [ChainId.BASE]: '#0052ff4d',\n [ChainId.ARBITRUM]: '#289fef4d',\n [ChainId.LINEA]: '#ffffff4d',\n [ChainId.IOTA]: '#ffffff4d',\n [ChainId.GRAPHLINQ]: '#ded2ff4d',\n [ChainId.AVAX]: '#e743444d',\n [ChainId.BLAST]: '#fcfc034d',\n [ChainId.CROSSFI]: '#7c80844d',\n [ChainId.MONAD_TESTNET]: '#836EF94d',\n [ChainId.MONAD]: '#836EF94d',\n [ChainId.SOL]: '#836EF94d',\n [ChainId.SONIC]: '#fb9a4c4d',\n [ChainId.BERACHAIN]: '#783e244d',\n [ChainId.KATANA]: '#068be34d',\n [ChainId.UNICHAIN]: '#f50db44d',\n [ChainId.MEGAETH_TESTNET]: '#DFD9D94d',\n [ChainId.HYPEREVM]: '#ffffff4d',\n [ChainId.APTOS]: 'rgb(240 111 126 / 0.3)',\n [ChainId.SUI]: '#6fbcf04d',\n [ChainId.L1X]: '#e743444d',\n}\n\nconst TokenInfoAndName = ({\n tokenSymbol,\n chain,\n tag,\n vestEnds,\n isHotBond,\n marketingCampaign,\n cardsView,\n}: {\n tokenSymbol?: string\n chain?: number\n tag?: string\n vestEnds?: string\n isHotBond?: boolean\n marketingCampaign?: MarketingCampaign\n cardsView?: boolean\n}) => {\n const ChainIcon = (chain && NETWORK_ICONS[chain]) || Question\n return (\n <Flex\n className={clsx(\n 'tokeninfoname container ape:w-full ape:relative ape:h-full ape:rounded-[10px]',\n cardsView\n ? 'ape:flex-col ape:items-start ape:gap-[10px] ape:pl-0 ape:pt-[5px] ape:justify-start'\n : 'ape:justify-start ape:items-center',\n )}\n >\n <Flex\n className=\"ape:absolute ape:left-0 ape:top-0 ape:w-[125px] ape:h-full ape:rounded-normal\"\n style={{\n background: isHotBond\n ? 'transparent'\n : `linear-gradient(90deg, ${chain ? NETWORK_COLORS[chain] : '#FFFFFF33'} 0%, rgba(0,0,0,0) 75%)`,\n }}\n />\n <Flex\n className={clsx(\n 'tokeninfoname chain ape:absolute ape:left-0 ape:top-0 ape:overflow-hidden ape:rounded-tl-[10px] ape:rounded-br-[8px] ape:z-[5]',\n cardsView && 'ape:hidden',\n )}\n >\n <ChainIcon width={20} height={20} />\n </Flex>\n <Flex\n className={clsx(\n 'tokeninfoname tokencontainer ape:w-full ape:items-center',\n cardsView ? 'ape:max-w-full ape:pl-0' : 'ape:sm:max-w-[190px]',\n !cardsView && (vestEnds ? 'ape:mt-[10px] ape:lg:mt-0' : 'ape:mt-0'),\n )}\n >\n <Flex className=\"ape:relative ape:min-w-[33px] ape:ml-3.5 ape:sm:ml-5\">\n <Flex style={MCTokenIconStyles[marketingCampaign!]} />\n <TokenImage symbol={tokenSymbol} size={33} />\n </Flex>\n <Flex className=\"tokeninfoname tokentext ape:ml-1 ape:sm:ml-2 ape:font-bold ape:w-full ape:flex-col\">\n <Flex className=\"ape:justify-between ape:w-full ape:items-center\">\n <Text className=\"ape:text-[12px]! ape:sm:text-[16px]!\">{tokenSymbol}</Text>\n </Flex>\n {vestEnds && (\n <Flex className=\"ape:text-[12px] ape:font-normal ape:opacity-60 ape:leading-[14px]\">{vestEnds}</Flex>\n )}\n </Flex>\n <Flex className=\"tokeninfofav ape:min-w-[25px] ape:p-[5px]\">\n <AddFavToken tokenSymbol={tokenSymbol} hotBond={!vestEnds && isHotBond} />\n </Flex>\n </Flex>\n <Flex className={clsx('ape:items-center', isHotBond ? 'ape:justify-center' : 'ape:justify-start')}>\n <Flex className={isHotBond ? 'ape:flex' : 'ape:hidden ape:xl:flex'}>\n {(tag || marketingCampaign) && (\n <ListTag text={MCTagNameMapping[marketingCampaign!] || tag} marketingCampaign={marketingCampaign} />\n )}\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default TokenInfoAndName\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/TokenInfoAndName/index.tsx"],"sourcesContent":["import React from 'react'\nimport clsx from 'clsx'\nimport { NETWORK_ICONS } from '../../config/constants/chains'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport AddFavToken from '../FavIcons/AddFavToken'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { MCTagNameMapping, MCTokenIconStyles } from '../../utils/campaignStyles'\nimport Flex from '../uikit-sdk/Flex'\nimport Text from '../uikit-sdk/Text'\nimport ListTag from '../uikit-sdk/Tag/ListTag'\nimport Question from '../uikit-sdk/Svg/Icons/Question'\n\nconst NETWORK_COLORS: Partial<Record<number, string>> = {\n [ChainId.BSC]: '#F3BA2F4d',\n [ChainId.MAINNET]: '#627eea4d',\n [ChainId.SEPOLIA]: '#627eea4d',\n [ChainId.MATIC]: '#8247e54d',\n [ChainId.LIGHTLINK]: '#6087ff4d',\n [ChainId.BASE]: '#0052ff4d',\n [ChainId.ARBITRUM]: '#289fef4d',\n [ChainId.LINEA]: '#ffffff4d',\n [ChainId.IOTA]: '#ffffff4d',\n [ChainId.GRAPHLINQ]: '#ded2ff4d',\n [ChainId.AVAX]: '#e743444d',\n [ChainId.BLAST]: '#fcfc034d',\n [ChainId.ROBINHOOD]: 'rgb(223 223 0 / 0.3)',\n [ChainId.CROSSFI]: '#7c80844d',\n [ChainId.MONAD_TESTNET]: '#836EF94d',\n [ChainId.MONAD]: '#836EF94d',\n [ChainId.SOL]: '#836EF94d',\n [ChainId.SONIC]: '#fb9a4c4d',\n [ChainId.BERACHAIN]: '#783e244d',\n [ChainId.KATANA]: '#068be34d',\n [ChainId.UNICHAIN]: '#f50db44d',\n [ChainId.MEGAETH_TESTNET]: '#DFD9D94d',\n [ChainId.HYPEREVM]: '#ffffff4d',\n [ChainId.APTOS]: 'rgb(240 111 126 / 0.3)',\n [ChainId.SUI]: '#6fbcf04d',\n [ChainId.L1X]: '#e743444d',\n}\n\nconst TokenInfoAndName = ({\n tokenSymbol,\n chain,\n tag,\n vestEnds,\n isHotBond,\n marketingCampaign,\n cardsView,\n}: {\n tokenSymbol?: string\n chain?: number\n tag?: string\n vestEnds?: string\n isHotBond?: boolean\n marketingCampaign?: MarketingCampaign\n cardsView?: boolean\n}) => {\n const ChainIcon = (chain && NETWORK_ICONS[chain]) || Question\n const [tokenSymbol0, tokenSymbol1] = tokenSymbol?.split('-') ?? []\n\n return (\n <Flex\n className={clsx(\n 'tokeninfoname container ape:w-full ape:relative ape:h-full ape:rounded-[10px]',\n cardsView\n ? 'ape:flex-col ape:items-start ape:gap-[10px] ape:pl-0 ape:pt-[5px] ape:justify-start'\n : 'ape:justify-start ape:items-center',\n )}\n >\n <Flex\n className=\"ape:absolute ape:left-0 ape:top-0 ape:w-[125px] ape:h-full ape:rounded-normal\"\n style={{\n background: isHotBond\n ? 'transparent'\n : `linear-gradient(90deg, ${chain ? NETWORK_COLORS[chain] : '#FFFFFF33'} 0%, rgba(0,0,0,0) 75%)`,\n }}\n />\n <Flex\n className={clsx(\n 'tokeninfoname chain ape:absolute ape:left-0 ape:top-0 ape:overflow-hidden ape:rounded-tl-[10px] ape:rounded-br-[8px] ape:z-[5]',\n cardsView && 'ape:hidden',\n )}\n >\n <ChainIcon width={20} height={20} />\n </Flex>\n <Flex\n className={clsx(\n 'tokeninfoname tokencontainer ape:w-full ape:items-center',\n cardsView ? 'ape:max-w-full ape:pl-0' : 'ape:sm:max-w-[200px]',\n !cardsView && (vestEnds ? 'ape:mt-[10px] ape:lg:mt-0' : 'ape:mt-0'),\n )}\n >\n <Flex className=\"ape:relative ape:min-w-[33px] ape:ml-3.5 ape:sm:ml-5\">\n <Flex style={MCTokenIconStyles[marketingCampaign!]} />\n <TokenImage symbol={tokenSymbol0} symbol2={tokenSymbol1} size={tokenSymbol1 ? 24 : 33} />\n </Flex>\n <Flex className=\"tokeninfoname tokentext ape:ml-1 ape:sm:ml-2 ape:font-bold ape:w-full ape:flex-col\">\n <Flex className=\"ape:justify-between ape:w-full ape:items-center\">\n <Text className=\"ape:text-[12px]! ape:sm:text-[16px]!\">{tokenSymbol}</Text>\n </Flex>\n {vestEnds && (\n <Flex className=\"ape:text-[12px] ape:font-normal ape:opacity-60 ape:leading-[14px]\">{vestEnds}</Flex>\n )}\n </Flex>\n <Flex className=\"tokeninfofav ape:min-w-[25px] ape:p-[5px]\">\n <AddFavToken tokenSymbol={tokenSymbol} hotBond={!vestEnds && isHotBond} />\n </Flex>\n </Flex>\n <Flex className={clsx('ape:items-center', isHotBond ? 'ape:justify-center' : 'ape:justify-start')}>\n <Flex className={isHotBond ? 'ape:flex' : 'ape:hidden ape:xl:flex'}>\n {(tag || marketingCampaign) && (\n <ListTag text={MCTagNameMapping[marketingCampaign!] || tag} marketingCampaign={marketingCampaign} />\n )}\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default TokenInfoAndName\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -9,7 +9,7 @@ const iconButtonClasses = 'ape:bg-white3 ape:no-underline ape:items-center ape:j
9
9
  const ButtonsRow = ({ projectLink, twitter, earnTokenContract, cgId, dexscreener }) => {
10
10
  const dexscreenerURL = dexscreener || (earnTokenContract ? `https://dexscreener.com/search?q=${earnTokenContract}` : undefined);
11
11
  const coingeckoURL = cgId ? `https://www.coingecko.com/en/coins/${cgId}` : undefined;
12
- return (jsxs(Flex, { className: "ape:justify-center", children: [jsx(Flex, { className: iconButtonClasses, as: "a", href: projectLink, target: "_blank", children: jsx(URL, { width: 18 }) }), jsx(Flex, { className: iconButtonClasses, as: "a", href: twitter, target: "_blank", children: jsx(Twitter, { width: 18, color: "text" }) }), dexscreenerURL && (jsx(Flex, { className: iconButtonClasses, as: "a", href: dexscreenerURL, target: "_blank", children: jsx(DexScreener, { width: 18, color: "text" }) })), coingeckoURL && (jsx(Flex, { className: iconButtonClasses, as: "a", href: coingeckoURL, target: "_blank", children: jsx(CoinGecko, { width: 18, color: "text" }) }))] }));
12
+ return (jsxs(Flex, { className: "ape:justify-around", children: [jsx(Flex, { className: iconButtonClasses, as: "a", href: projectLink, target: "_blank", children: jsx(URL, { width: 18 }) }), jsx(Flex, { className: iconButtonClasses, as: "a", href: twitter, target: "_blank", children: jsx(Twitter, { width: 18, color: "text" }) }), dexscreenerURL && (jsx(Flex, { className: iconButtonClasses, as: "a", href: dexscreenerURL, target: "_blank", children: jsx(DexScreener, { width: 18, color: "text" }) })), coingeckoURL && (jsx(Flex, { className: iconButtonClasses, as: "a", href: coingeckoURL, target: "_blank", children: jsx(CoinGecko, { width: 18, color: "text" }) }))] }));
13
13
  };
14
14
 
15
15
  export { ButtonsRow as default };
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonsRow.js","sources":["../../../src/components/Tooltip/ButtonsRow.tsx"],"sourcesContent":["import React from 'react'\nimport Flex from '../uikit-sdk/Flex'\nimport URLIcon from '../uikit-sdk/Svg/Icons/URL'\nimport Twitter from '../uikit-sdk/Svg/Icons/Twitter'\nimport DexScreener from '../uikit-sdk/Svg/Icons/DexScreener'\nimport CoinGecko from '../uikit-sdk/Svg/Icons/CoinGecko'\n\nconst iconButtonClasses =\n 'ape:bg-white3 ape:no-underline ape:items-center ape:justify-center ape:w-fit ape:h-[30px] ape:p-[2px_5px] ape:rounded-[8px] ape:m-[0_5px_5px_0] ape:hover:cursor-pointer'\n\nconst ButtonsRow: React.FC<{\n projectLink?: string\n twitter?: string\n earnTokenContract?: string\n cgId?: string\n dexscreener?: string\n}> = ({ projectLink, twitter, earnTokenContract, cgId, dexscreener }) => {\n const dexscreenerURL =\n dexscreener || (earnTokenContract ? `https://dexscreener.com/search?q=${earnTokenContract}` : undefined)\n const coingeckoURL = cgId ? `https://www.coingecko.com/en/coins/${cgId}` : undefined\n\n return (\n <Flex className=\"ape:justify-center\">\n <Flex className={iconButtonClasses} as=\"a\" href={projectLink} target=\"_blank\">\n <URLIcon width={18} />\n </Flex>\n <Flex className={iconButtonClasses} as=\"a\" href={twitter} target=\"_blank\">\n <Twitter width={18} color=\"text\" />\n </Flex>\n {dexscreenerURL && (\n <Flex className={iconButtonClasses} as=\"a\" href={dexscreenerURL} target=\"_blank\">\n <DexScreener width={18} color=\"text\" />\n </Flex>\n )}\n {coingeckoURL && (\n <Flex className={iconButtonClasses} as=\"a\" href={coingeckoURL} target=\"_blank\">\n <CoinGecko width={18} color=\"text\" />\n </Flex>\n )}\n </Flex>\n )\n}\n\nexport default ButtonsRow\n"],"names":["_jsxs","_jsx","URLIcon"],"mappings":";;;;;;;AAOA,MAAM,iBAAiB,GACrB,0KAA0K;AAE5K,MAAM,UAAU,GAMX,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AACtE,IAAA,MAAM,cAAc,GAClB,WAAW,KAAK,iBAAiB,GAAG,CAAA,iCAAA,EAAoC,iBAAiB,CAAA,CAAE,GAAG,SAAS,CAAC;AAC1G,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAE,GAAG,SAAS;AAEpF,IAAA,QACEA,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CAClCC,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC3EA,GAAA,CAACC,GAAO,EAAA,EAAC,KAAK,EAAE,EAAE,EAAA,CAAI,EAAA,CACjB,EACPD,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EACvEA,GAAA,CAAC,OAAO,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAC9B,EACN,cAAc,KACbA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC9EA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAClC,CACR,EACA,YAAY,KACXA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC5EA,GAAA,CAAC,SAAS,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAChC,CACR,CAAA,EAAA,CACI;AAEX;;;;"}
1
+ {"version":3,"file":"ButtonsRow.js","sources":["../../../src/components/Tooltip/ButtonsRow.tsx"],"sourcesContent":["import React from 'react'\nimport Flex from '../uikit-sdk/Flex'\nimport URLIcon from '../uikit-sdk/Svg/Icons/URL'\nimport Twitter from '../uikit-sdk/Svg/Icons/Twitter'\nimport DexScreener from '../uikit-sdk/Svg/Icons/DexScreener'\nimport CoinGecko from '../uikit-sdk/Svg/Icons/CoinGecko'\n\nconst iconButtonClasses =\n 'ape:bg-white3 ape:no-underline ape:items-center ape:justify-center ape:w-fit ape:h-[30px] ape:p-[2px_5px] ape:rounded-[8px] ape:m-[0_5px_5px_0] ape:hover:cursor-pointer'\n\nconst ButtonsRow: React.FC<{\n projectLink?: string\n twitter?: string\n earnTokenContract?: string\n cgId?: string\n dexscreener?: string\n}> = ({ projectLink, twitter, earnTokenContract, cgId, dexscreener }) => {\n const dexscreenerURL =\n dexscreener || (earnTokenContract ? `https://dexscreener.com/search?q=${earnTokenContract}` : undefined)\n const coingeckoURL = cgId ? `https://www.coingecko.com/en/coins/${cgId}` : undefined\n\n return (\n <Flex className=\"ape:justify-around\">\n <Flex className={iconButtonClasses} as=\"a\" href={projectLink} target=\"_blank\">\n <URLIcon width={18} />\n </Flex>\n <Flex className={iconButtonClasses} as=\"a\" href={twitter} target=\"_blank\">\n <Twitter width={18} color=\"text\" />\n </Flex>\n {dexscreenerURL && (\n <Flex className={iconButtonClasses} as=\"a\" href={dexscreenerURL} target=\"_blank\">\n <DexScreener width={18} color=\"text\" />\n </Flex>\n )}\n {coingeckoURL && (\n <Flex className={iconButtonClasses} as=\"a\" href={coingeckoURL} target=\"_blank\">\n <CoinGecko width={18} color=\"text\" />\n </Flex>\n )}\n </Flex>\n )\n}\n\nexport default ButtonsRow\n"],"names":["_jsxs","_jsx","URLIcon"],"mappings":";;;;;;;AAOA,MAAM,iBAAiB,GACrB,0KAA0K;AAE5K,MAAM,UAAU,GAMX,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AACtE,IAAA,MAAM,cAAc,GAClB,WAAW,KAAK,iBAAiB,GAAG,CAAA,iCAAA,EAAoC,iBAAiB,CAAA,CAAE,GAAG,SAAS,CAAC;AAC1G,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAE,GAAG,SAAS;AAEpF,IAAA,QACEA,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CAClCC,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC3EA,GAAA,CAACC,GAAO,EAAA,EAAC,KAAK,EAAE,EAAE,EAAA,CAAI,EAAA,CACjB,EACPD,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EACvEA,GAAA,CAAC,OAAO,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAC9B,EACN,cAAc,KACbA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC9EA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAClC,CACR,EACA,YAAY,KACXA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAC,GAAG,EAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAC,QAAQ,EAAA,QAAA,EAC5EA,GAAA,CAAC,SAAS,EAAA,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,EAAA,CAAG,EAAA,CAChC,CACR,CAAA,EAAA,CACI;AAEX;;;;"}
@@ -25,7 +25,8 @@ const BondInfoTooltip = ({ earnTokenContract, earnTokenSymbol, bondContract, pro
25
25
  const tokenLink = `${explorerLink}/${urlPage}/${earnTokenContract}${aptosNetworkParam}`;
26
26
  const bondLink = `${explorerLink}/${urlPage}/${bondContract}${aptosNetworkParam}`;
27
27
  const bondDashboard = `https://dashboard.ape.bond/bond/${bondContract}`;
28
- const handleProjectViewNavigation = () => {
28
+ const handleProjectViewNavigation = (e) => {
29
+ e?.stopPropagation();
29
30
  window.location.href = `/bonds/${bondContract}/${chain}`;
30
31
  track({
31
32
  event: 'projectInfoClick',
@@ -37,7 +38,7 @@ const BondInfoTooltip = ({ earnTokenContract, earnTokenSymbol, bondContract, pro
37
38
  },
38
39
  });
39
40
  };
40
- return (jsxs(Flex, { className: "ape:flex-col ape:flex-wrap", children: [jsx(ButtonsRow, { twitter: twitter, projectLink: projectLink, earnTokenContract: earnTokenContract, cgId: cgId, dexscreener: dexscreener }), config?.referenceId === 'apebond' && !isSoldOut && billType !== 'fcfs' && (jsx(Flex, { className: "ape:w-full ape:my-[5px] ape:justify-center ape:relative ape:h-[25px]", children: jsx(ExpandedViewButton, { handleNavigation: handleProjectViewNavigation, rightPos: '-5px' }) })), jsx(Flex, { className: "ape:justify-center", children: jsxs(Flex, { className: "ape:w-[144px] ape:flex-col", children: [jsx(Flex, { className: linkRowClasses, children: tokenLink && (jsxs("a", { href: tokenLink, className: linkClasses, target: "_blank", rel: "noreferrer", children: ["View Token Contract", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) }), jsx(Flex, { className: linkRowClasses, children: bondLink && (jsxs("a", { href: bondLink, className: linkClasses, target: "_blank", rel: "noreferrer", children: ["View Bond Contract", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) }), jsx(Flex, { className: linkRowClasses, children: billType !== 'fcfs' && (jsxs("a", { href: bondDashboard, className: linkClasses, target: "_blank", rel: "noopener noreferrer", children: ["View Bond Insights", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) })] }) })] }));
41
+ return (jsxs(Flex, { className: "ape:flex-col ape:flex-wrap", children: [config?.referenceId === 'apebond' && !isSoldOut && billType !== 'fcfs' && (jsx(Flex, { className: "ape:w-full ape:mb-[10px] ape:justify-center ape:relative ape:h-[25px]", children: jsx(ExpandedViewButton, { handleNavigation: (e) => handleProjectViewNavigation(e), rightPos: '17px' }) })), jsx(ButtonsRow, { twitter: twitter, projectLink: projectLink, earnTokenContract: earnTokenContract, cgId: cgId, dexscreener: dexscreener }), jsx(Flex, { className: "ape:justify-center", children: jsxs(Flex, { className: "ape:w-[144px] ape:flex-col", children: [jsx(Flex, { className: linkRowClasses, children: tokenLink && (jsxs("a", { href: tokenLink, className: linkClasses, target: "_blank", rel: "noreferrer", children: ["View Token Contract", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) }), jsx(Flex, { className: linkRowClasses, children: bondLink && (jsxs("a", { href: bondLink, className: linkClasses, target: "_blank", rel: "noreferrer", children: ["View Bond Contract", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) }), jsx(Flex, { className: linkRowClasses, children: billType !== 'fcfs' && (jsxs("a", { href: bondDashboard, className: linkClasses, target: "_blank", rel: "noopener noreferrer", children: ["View Bond Insights", jsx(Flex, { className: "ape:ml-[5px]", children: jsx(External, { color: "text", width: 10 }) })] })) })] }) })] }));
41
42
  };
42
43
 
43
44
  export { BondInfoTooltip as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react'\nimport ButtonsRow from './ButtonsRow'\nimport { BLOCK_EXPLORER } from '../../config/constants/chains'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { IS_APTOS_MAINNET } from '../../constants/aptosConstants'\nimport Flex from '../uikit-sdk/Flex'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport ExpandedViewButton from '../../views/BuyBond/components/ExpandedViewButton'\nimport track from '../../utils/track'\nimport External from '../uikit-sdk/Svg/Icons/External'\n\ninterface TooltipProps {\n earnTokenContract: string\n earnTokenSymbol: string\n bondContract: string\n projectLink?: string\n twitter?: string\n chain: number\n isSoldOut?: boolean\n billType?: string\n cgId?: string\n dexscreener?: string\n}\n\nconst linkRowClasses = 'ape:w-full ape:mt-[5px] ape:justify-end ape:[&_svg]:w-[11px]'\nconst linkClasses = 'ape:text-[12px] ape:leading-[14px] ape:flex ape:no-underline ape:hover:underline'\n\nconst BondInfoTooltip: React.FunctionComponent<TooltipProps> = ({\n earnTokenContract,\n earnTokenSymbol,\n bondContract,\n projectLink,\n twitter,\n chain,\n isSoldOut = false,\n billType,\n cgId,\n dexscreener,\n}) => {\n const config = useSDKConfig()\n const explorerLink = BLOCK_EXPLORER[chain as ChainId]\n const urlPage =\n chain === ChainId.SOL\n ? 'account'\n : chain === ChainId.APTOS\n ? 'object'\n : chain === ChainId.SUI\n ? 'object'\n : 'address'\n const aptosNetworkParam = chain === ChainId.APTOS ? `?network=${IS_APTOS_MAINNET ? 'mainnet' : 'testnet'}` : ''\n const tokenLink = `${explorerLink}/${urlPage}/${earnTokenContract}${aptosNetworkParam}`\n const bondLink = `${explorerLink}/${urlPage}/${bondContract}${aptosNetworkParam}`\n const bondDashboard = `https://dashboard.ape.bond/bond/${bondContract}`\n\n const handleProjectViewNavigation = () => {\n window.location.href = `/bonds/${bondContract}/${chain}`\n track({\n event: 'projectInfoClick',\n chain: chain,\n data: {\n cat: 'Table',\n bond: earnTokenSymbol,\n bondChain: chain,\n },\n })\n }\n return (\n <Flex className=\"ape:flex-col ape:flex-wrap\">\n <ButtonsRow\n twitter={twitter}\n projectLink={projectLink}\n earnTokenContract={earnTokenContract}\n cgId={cgId}\n dexscreener={dexscreener}\n />\n {config?.referenceId === 'apebond' && !isSoldOut && billType !== 'fcfs' && (\n <Flex className=\"ape:w-full ape:my-[5px] ape:justify-center ape:relative ape:h-[25px]\">\n <ExpandedViewButton handleNavigation={handleProjectViewNavigation} rightPos={'-5px'} />\n </Flex>\n )}\n <Flex className=\"ape:justify-center\">\n <Flex className=\"ape:w-[144px] ape:flex-col\">\n <Flex className={linkRowClasses}>\n {tokenLink && (\n <a href={tokenLink} className={linkClasses} target=\"_blank\" rel=\"noreferrer\">\n View Token Contract\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n <Flex className={linkRowClasses}>\n {bondLink && (\n <a href={bondLink} className={linkClasses} target=\"_blank\" rel=\"noreferrer\">\n View Bond Contract\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n <Flex className={linkRowClasses}>\n {billType !== 'fcfs' && (\n <a href={bondDashboard} className={linkClasses} target=\"_blank\" rel=\"noopener noreferrer\">\n View Bond Insights\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default BondInfoTooltip\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from 'react'\nimport ButtonsRow from './ButtonsRow'\nimport { BLOCK_EXPLORER } from '../../config/constants/chains'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { IS_APTOS_MAINNET } from '../../constants/aptosConstants'\nimport Flex from '../uikit-sdk/Flex'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport ExpandedViewButton from '../../views/BuyBond/components/ExpandedViewButton'\nimport track from '../../utils/track'\nimport External from '../uikit-sdk/Svg/Icons/External'\n\ninterface TooltipProps {\n earnTokenContract: string\n earnTokenSymbol: string\n bondContract: string\n projectLink?: string\n twitter?: string\n chain: number\n isSoldOut?: boolean\n billType?: string\n cgId?: string\n dexscreener?: string\n}\n\nconst linkRowClasses = 'ape:w-full ape:mt-[5px] ape:justify-end ape:[&_svg]:w-[11px]'\nconst linkClasses = 'ape:text-[12px] ape:leading-[14px] ape:flex ape:no-underline ape:hover:underline'\n\nconst BondInfoTooltip: React.FunctionComponent<TooltipProps> = ({\n earnTokenContract,\n earnTokenSymbol,\n bondContract,\n projectLink,\n twitter,\n chain,\n isSoldOut = false,\n billType,\n cgId,\n dexscreener,\n}) => {\n const config = useSDKConfig()\n const explorerLink = BLOCK_EXPLORER[chain as ChainId]\n const urlPage =\n chain === ChainId.SOL\n ? 'account'\n : chain === ChainId.APTOS\n ? 'object'\n : chain === ChainId.SUI\n ? 'object'\n : 'address'\n const aptosNetworkParam = chain === ChainId.APTOS ? `?network=${IS_APTOS_MAINNET ? 'mainnet' : 'testnet'}` : ''\n const tokenLink = `${explorerLink}/${urlPage}/${earnTokenContract}${aptosNetworkParam}`\n const bondLink = `${explorerLink}/${urlPage}/${bondContract}${aptosNetworkParam}`\n const bondDashboard = `https://dashboard.ape.bond/bond/${bondContract}`\n\n const handleProjectViewNavigation = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e?.stopPropagation()\n window.location.href = `/bonds/${bondContract}/${chain}`\n track({\n event: 'projectInfoClick',\n chain: chain,\n data: {\n cat: 'Table',\n bond: earnTokenSymbol,\n bondChain: chain,\n },\n })\n }\n return (\n <Flex className=\"ape:flex-col ape:flex-wrap\">\n {config?.referenceId === 'apebond' && !isSoldOut && billType !== 'fcfs' && (\n <Flex className=\"ape:w-full ape:mb-[10px] ape:justify-center ape:relative ape:h-[25px]\">\n <ExpandedViewButton\n handleNavigation={(e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => handleProjectViewNavigation(e)}\n rightPos={'17px'}\n />\n </Flex>\n )}\n <ButtonsRow\n twitter={twitter}\n projectLink={projectLink}\n earnTokenContract={earnTokenContract}\n cgId={cgId}\n dexscreener={dexscreener}\n />\n <Flex className=\"ape:justify-center\">\n <Flex className=\"ape:w-[144px] ape:flex-col\">\n <Flex className={linkRowClasses}>\n {tokenLink && (\n <a href={tokenLink} className={linkClasses} target=\"_blank\" rel=\"noreferrer\">\n View Token Contract\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n <Flex className={linkRowClasses}>\n {bondLink && (\n <a href={bondLink} className={linkClasses} target=\"_blank\" rel=\"noreferrer\">\n View Bond Contract\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n <Flex className={linkRowClasses}>\n {billType !== 'fcfs' && (\n <a href={bondDashboard} className={linkClasses} target=\"_blank\" rel=\"noopener noreferrer\">\n View Bond Insights\n <Flex className=\"ape:ml-[5px]\">\n <External color=\"text\" width={10} />\n </Flex>\n </a>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default BondInfoTooltip\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -19,7 +19,9 @@ const TokenImage = ({ symbol, symbol2, size, chain, }) => {
19
19
  const url1 = token1 ? `${APEBOND}/tokenImages/${token1.toUpperCase()}.png` : '';
20
20
  const [error, setError] = useState(failedUrls.has(url1));
21
21
  const NetworkIcon = (chain && NETWORK_ICONS?.[chain]) || Question;
22
- return error || !token1 ? (jsx(Flex, { className: "ape:justify-center ape:items-center ape:relative", style: { width: size - 2, height: size - 2, borderRadius: '55px' }, children: jsx(Skeleton, { animation: "waves", style: { width: size - 2, height: size - 2, borderRadius: '55px', marginBottom: '5px' } }) })) : token2 ? (jsxs(Flex, { className: "ape:justify-center ape:items-center ape:relative", style: { minWidth: size * 1.5 - 2, height: size - 2, borderRadius: '55px' }, children: [jsx("img", { src: url1, alt: `tokenImgFor:${token1}`, width: size, height: size, style: { position: 'absolute', zIndex: 4001, left: 0 }, onLoad: () => loadedUrls.add(url1) }), jsx("img", { src: `${APEBOND}/tokenImages/${token2.toUpperCase()}.png`, alt: `tokenImgFor:${token2}`, width: size, height: size, style: { position: 'absolute', zIndex: 4000, left: '33%' } }), chain && (jsx(Flex, { className: "ape:absolute ape:overflow-hidden ape:rounded-[50px]", style: { zIndex: 4002, top: '-2px', right: `-${size / 5}px` }, children: jsx(NetworkIcon, { width: size / 2.5, height: size / 2.5 }) }))] })) : (jsxs(Flex, { className: "ape:justify-center ape:items-center ape:relative", style: { width: size - 2, height: size - 2, borderRadius: '55px' }, children: [jsx("img", { src: url1, alt: `tokenImgFor:${token1}`, width: size, height: token1 === 'BNB-ICHI' ? 19 : size, onLoad: () => loadedUrls.add(url1), onError: () => {
22
+ return error || !token1 ? (jsx(Flex, { className: "ape:justify-center ape:items-center ape:relative", style: { width: size - 2, height: size - 2, borderRadius: '55px' }, children: jsx(Skeleton, { animation: "waves", style: { width: size - 2, height: size - 2, borderRadius: '55px', marginBottom: '5px' } }) })) : token2 ? (jsxs(Flex, { className: "ape:justify-center ape:items-center ape:relative",
23
+ // isolate keeps the images' z-indexes inside this icon, so they never cover modals or the host page
24
+ style: { minWidth: size * 1.5 - 2, height: size - 2, borderRadius: '55px', isolation: 'isolate' }, children: [jsx("img", { src: url1, alt: `tokenImgFor:${token1}`, width: size, height: size, style: { position: 'absolute', zIndex: 2, left: 0 }, onLoad: () => loadedUrls.add(url1) }), jsx("img", { src: `${APEBOND}/tokenImages/${token2.toUpperCase()}.png`, alt: `tokenImgFor:${token2}`, width: size, height: size, style: { position: 'absolute', zIndex: 1, left: '33%' } }), chain && (jsx(Flex, { className: "ape:absolute ape:overflow-hidden ape:rounded-[50px]", style: { zIndex: 3, top: '-2px', right: `-${size / 5}px` }, children: jsx(NetworkIcon, { width: size / 2.5, height: size / 2.5 }) }))] })) : (jsxs(Flex, { className: "ape:justify-center ape:items-center ape:relative", style: { width: size - 2, height: size - 2, borderRadius: '55px' }, children: [jsx("img", { src: url1, alt: `tokenImgFor:${token1}`, width: size, height: token1 === 'BNB-ICHI' ? 19 : size, onLoad: () => loadedUrls.add(url1), onError: () => {
23
25
  if (!loadedUrls.has(url1)) {
24
26
  failedUrls.add(url1);
25
27
  setError(true);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/uikit-sdk/TokenImage/index.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport Flex from '../Flex'\nimport { NETWORK_ICONS } from '../../../config/constants/chains'\nimport { APEBOND } from '../../../config/constants/variables'\nimport Skeleton from '../Skeleton'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport Question from '../Svg/Icons/Question'\n\n// TODO(aptos): Upload Aptos token images to https://www.ape.bond/tokenImages/\n// Missing: APT.png, TAPE.png (tAPE). Without them the token selector shows a\n// skeleton loader instead of the token logo.\n\n// Module-level cache: once an image loads successfully, skip onError on re-mounts.\nconst loadedUrls = new Set<string>()\nconst failedUrls = new Set<string>()\n\nconst TokenImage = ({\n symbol,\n symbol2,\n size,\n chain,\n}: {\n symbol?: string\n symbol2?: string\n size: number\n chain?: number\n}) => {\n const token1 = symbol === 'USDC.e' ? 'USDC' : symbol === 'AIX' && chain === ChainId.SOL ? 'SOLAIX' : symbol\n const token2 = symbol2 === 'USDC.e' ? 'USDC' : symbol2 === 'AIX' && chain === ChainId.SOL ? 'SOLAIX' : symbol2\n const url1 = token1 ? `${APEBOND}/tokenImages/${token1.toUpperCase()}.png` : ''\n const [error, setError] = useState(failedUrls.has(url1))\n const NetworkIcon = (chain && NETWORK_ICONS?.[chain]) || Question\n\n return error || !token1 ? (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px' }}\n >\n <Skeleton\n animation=\"waves\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px', marginBottom: '5px' }}\n />\n </Flex>\n ) : token2 ? (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n style={{ minWidth: size * 1.5 - 2, height: size - 2, borderRadius: '55px' }}\n >\n <img\n src={url1}\n alt={`tokenImgFor:${token1}`}\n width={size}\n height={size}\n style={{ position: 'absolute', zIndex: 4001, left: 0 }}\n onLoad={() => loadedUrls.add(url1)}\n />\n <img\n src={`${APEBOND}/tokenImages/${token2.toUpperCase()}.png`}\n alt={`tokenImgFor:${token2}`}\n width={size}\n height={size}\n style={{ position: 'absolute', zIndex: 4000, left: '33%' }}\n />\n {chain && (\n <Flex\n className=\"ape:absolute ape:overflow-hidden ape:rounded-[50px]\"\n style={{ zIndex: 4002, top: '-2px', right: `-${size / 5}px` }}\n >\n <NetworkIcon width={size / 2.5} height={size / 2.5} />\n </Flex>\n )}\n </Flex>\n ) : (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px' }}\n >\n <img\n src={url1}\n alt={`tokenImgFor:${token1}`}\n width={size}\n height={token1 === 'BNB-ICHI' ? 19 : size}\n onLoad={() => loadedUrls.add(url1)}\n onError={() => {\n if (!loadedUrls.has(url1)) {\n failedUrls.add(url1)\n setError(true)\n }\n }}\n />\n {chain && (\n <Flex\n className=\"ape:absolute ape:overflow-hidden ape:rounded-[50px]\"\n style={{ zIndex: 5, top: '-2px', right: '-4px', width: `${size / 2.5}px`, height: `${size / 2.5}px` }}\n >\n <NetworkIcon width={size / 2.5} height={size / 2.5} />\n </Flex>\n )}\n </Flex>\n )\n}\n\nexport default TokenImage\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/uikit-sdk/TokenImage/index.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport Flex from '../Flex'\nimport { NETWORK_ICONS } from '../../../config/constants/chains'\nimport { APEBOND } from '../../../config/constants/variables'\nimport Skeleton from '../Skeleton'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport Question from '../Svg/Icons/Question'\n\n// TODO(aptos): Upload Aptos token images to https://www.ape.bond/tokenImages/\n// Missing: APT.png, TAPE.png (tAPE). Without them the token selector shows a\n// skeleton loader instead of the token logo.\n\n// Module-level cache: once an image loads successfully, skip onError on re-mounts.\nconst loadedUrls = new Set<string>()\nconst failedUrls = new Set<string>()\n\nconst TokenImage = ({\n symbol,\n symbol2,\n size,\n chain,\n}: {\n symbol?: string\n symbol2?: string\n size: number\n chain?: number\n}) => {\n const token1 = symbol === 'USDC.e' ? 'USDC' : symbol === 'AIX' && chain === ChainId.SOL ? 'SOLAIX' : symbol\n const token2 = symbol2 === 'USDC.e' ? 'USDC' : symbol2 === 'AIX' && chain === ChainId.SOL ? 'SOLAIX' : symbol2\n const url1 = token1 ? `${APEBOND}/tokenImages/${token1.toUpperCase()}.png` : ''\n const [error, setError] = useState(failedUrls.has(url1))\n const NetworkIcon = (chain && NETWORK_ICONS?.[chain]) || Question\n\n return error || !token1 ? (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px' }}\n >\n <Skeleton\n animation=\"waves\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px', marginBottom: '5px' }}\n />\n </Flex>\n ) : token2 ? (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n // isolate keeps the images' z-indexes inside this icon, so they never cover modals or the host page\n style={{ minWidth: size * 1.5 - 2, height: size - 2, borderRadius: '55px', isolation: 'isolate' }}\n >\n <img\n src={url1}\n alt={`tokenImgFor:${token1}`}\n width={size}\n height={size}\n style={{ position: 'absolute', zIndex: 2, left: 0 }}\n onLoad={() => loadedUrls.add(url1)}\n />\n <img\n src={`${APEBOND}/tokenImages/${token2.toUpperCase()}.png`}\n alt={`tokenImgFor:${token2}`}\n width={size}\n height={size}\n style={{ position: 'absolute', zIndex: 1, left: '33%' }}\n />\n {chain && (\n <Flex\n className=\"ape:absolute ape:overflow-hidden ape:rounded-[50px]\"\n style={{ zIndex: 3, top: '-2px', right: `-${size / 5}px` }}\n >\n <NetworkIcon width={size / 2.5} height={size / 2.5} />\n </Flex>\n )}\n </Flex>\n ) : (\n <Flex\n className=\"ape:justify-center ape:items-center ape:relative\"\n style={{ width: size - 2, height: size - 2, borderRadius: '55px' }}\n >\n <img\n src={url1}\n alt={`tokenImgFor:${token1}`}\n width={size}\n height={token1 === 'BNB-ICHI' ? 19 : size}\n onLoad={() => loadedUrls.add(url1)}\n onError={() => {\n if (!loadedUrls.has(url1)) {\n failedUrls.add(url1)\n setError(true)\n }\n }}\n />\n {chain && (\n <Flex\n className=\"ape:absolute ape:overflow-hidden ape:rounded-[50px]\"\n style={{ zIndex: 5, top: '-2px', right: '-4px', width: `${size / 2.5}px`, height: `${size / 2.5}px` }}\n >\n <NetworkIcon width={size / 2.5} height={size / 2.5} />\n </Flex>\n )}\n </Flex>\n )\n}\n\nexport default TokenImage\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;AAQA;AACA;AACA;AAEA;AACA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU;AACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU;AAEpC,MAAM,UAAU,GAAG,CAAC,EAClB,MAAM,EACN,OAAO,EACP,IAAI,EACJ,KAAK,GAMN,KAAI;AACH,IAAA,MAAM,MAAM,GAAG,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,GAAG,GAAG,QAAQ,GAAG,MAAM;AAC3G,IAAA,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,MAAM,GAAG,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,GAAG,GAAG,QAAQ,GAAG,OAAO;AAC9G,IAAA,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAC,WAAW,EAAE,CAAA,IAAA,CAAM,GAAG,EAAE;AAC/E,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxD,IAAA,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,QAAQ;AAEjE,IAAA,OAAO,KAAK,IAAI,CAAC,MAAM,IACrBA,GAAA,CAAC,IAAI,IACH,SAAS,EAAC,kDAAkD,EAC5D,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,YAElEA,GAAA,CAAC,QAAQ,IACP,SAAS,EAAC,OAAO,EACjB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAA,CACvF,GACG,IACL,MAAM,IACRC,IAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,kDAAkD;;QAE5D,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAA,QAAA,EAAA,CAEjGD,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,EAC5B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EACnD,MAAM,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAA,CAClC,EACFA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAC,WAAW,EAAE,CAAA,IAAA,CAAM,EACzD,GAAG,EAAE,CAAA,YAAA,EAAe,MAAM,EAAE,EAC5B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAA,CACvD,EACD,KAAK,KACJA,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,qDAAqD,EAC/D,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA,CAAA,EAAI,IAAI,GAAG,CAAC,CAAA,EAAA,CAAI,EAAE,EAAA,QAAA,EAE1DA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,GAAG,EAAA,CAAI,EAAA,CACjD,CACR,CAAA,EAAA,CACI,KAEPC,IAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,kDAAkD,EAC5D,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAA,QAAA,EAAA,CAElED,aACE,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,EAC5B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,EAAE,GAAG,IAAI,EACzC,MAAM,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAClC,OAAO,EAAE,MAAK;oBACZ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACzB,wBAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;wBACpB,QAAQ,CAAC,IAAI,CAAC;oBAChB;AACF,gBAAA,CAAC,EAAA,CACD,EACD,KAAK,KACJA,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,qDAAqD,EAC/D,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA,EAAG,IAAI,GAAG,GAAG,CAAA,EAAA,CAAI,EAAE,MAAM,EAAE,CAAA,EAAG,IAAI,GAAG,GAAG,CAAA,EAAA,CAAI,EAAE,EAAA,QAAA,EAErGA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,GAAG,EAAA,CAAI,EAAA,CACjD,CACR,CAAA,EAAA,CACI,CACR;AACH;;;;"}