@ape.swap/bonds-sdk 5.1.49-test.1 → 5.1.49-test.2

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.
@@ -18,57 +18,126 @@ import { APTOS_ZAP_TOKENS } from '../../config/constants/aptosZapTokens.js';
18
18
  // - useBondsList.ts → getAptosBondsList()
19
19
  // - useTokenPrices.ts → getAptosFallbackPrices()
20
20
  const APTOS_KEY = ChainId.APTOS;
21
- // TODO(aptos): For mainnet launch, update these addresses:
22
- // 1. APTOS_BOND_MARKET_ADDRESSES → mainnet bond market object addresses
21
+ // TODO(aptos): For mainnet launch, update these three addresses:
22
+ // 1. APTOS_BOND_MARKET_ADDRESS → mainnet bond market object address
23
23
  // 2. APTOS_PAYOUT_TOKEN_ADDRESS → mainnet payout token FA address (real token, not tAPE)
24
- // 3. APTOS_PRINCIPAL_TOKEN_ADDRESS if principal differs per market
24
+ // 3. Add additional bond entries to APTOS_BONDS_CONFIG for each mainnet market
25
25
  // Also update APTOS_CONTRACT_ADDRESS_MAINNET in aptosConstants.ts.
26
- /** Testnet bond market object addresses (bond::market_info). */
27
- const APTOS_BOND_MARKET_ADDRESSES = [
28
- '0x9902fa5b2fac9d6665f1f94b66ac72709d63d38b494973089f55de5f11af12da',
29
- '0xd5b8002990de9cb9de9a6104d51f1d142c66604d7fdc2f38afc01cccc269076f',
30
- '0xb85b06e858eda8e01cfcebab7fda0dd24e987f41595d94417fdce64ce41e222d',
31
- '0x5b17d6b52258601f6bc34f46195947a8de4ec21104c77341a0983f6a8249128b',
32
- ];
33
26
  // tAPE payout token metadata
34
27
  const APTOS_PAYOUT_TOKEN_ADDRESS = '0xff27a471b7d44e2a8eae1b8693190d4322f4e28cd9a4dd9d8fff7ed74a47556e';
35
28
  // APT principal token metadata
36
29
  const APTOS_PRINCIPAL_TOKEN_ADDRESS = '0xa';
37
- const APTOS_BONDS_CONFIG = APTOS_BOND_MARKET_ADDRESSES.map((marketAddress, i) => ({
38
- index: 99001 + i,
39
- version: '2.0.0',
40
- chainId: APTOS_KEY,
41
- billVersion: BillVersion.V2,
42
- billType: 'reserve',
43
- soldOut: false,
44
- contractAddress: {
45
- [APTOS_KEY]: marketAddress,
46
- },
47
- billNnftAddress: {
48
- [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,
30
+ // Bond market addresses from testnet deploy (fee-formula-fix verification, 5%/5% fees)
31
+ const APTOS_BOND_10PCT = '0x7ef38a4a4a2205c6efca8c279931f01bbbe27dbd7149a9d1733e7da4d9bbd68';
32
+ const APTOS_BOND_5PCT = '0xecf8c233149e617b323335788370ae49878e0a8a5aadeaa6523ff93df6b8661c';
33
+ const APTOS_BOND_35PCT = '0xcb28b74a3b458d6f9e8a570767928fd2e2d5ac8b9039003597cdab8d008df2a3';
34
+ const APTOS_BONDS_CONFIG = [
35
+ {
36
+ index: 99001,
37
+ version: '2.0.0',
38
+ chainId: APTOS_KEY,
39
+ billVersion: BillVersion.V2,
40
+ billType: 'reserve',
41
+ soldOut: false,
42
+ contractAddress: {
43
+ [APTOS_KEY]: APTOS_BOND_10PCT,
44
+ },
45
+ billNnftAddress: {
46
+ [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,
47
+ },
48
+ lpToken: {
49
+ symbol: 'APT',
50
+ address: {
51
+ [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,
52
+ },
53
+ decimals: { [APTOS_KEY]: 8 },
54
+ active: true,
55
+ },
56
+ earnToken: {
57
+ symbol: 'tAPE',
58
+ address: {
59
+ [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,
60
+ },
61
+ decimals: { [APTOS_KEY]: 8 },
62
+ active: true,
63
+ },
64
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
65
+ shortDescription: '10% discount bond — CV=812, fee 5%/5%',
66
+ fullDescription: 'Aptos bond with 10% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~11.11%.',
67
+ vestingTerm: 172800,
68
+ tags: ['Aptos'],
49
69
  },
50
- lpToken: {
51
- symbol: 'APT',
52
- address: {
53
- [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,
70
+ {
71
+ index: 99002,
72
+ version: '2.0.0',
73
+ chainId: APTOS_KEY,
74
+ billVersion: BillVersion.V2,
75
+ billType: 'reserve',
76
+ soldOut: false,
77
+ contractAddress: {
78
+ [APTOS_KEY]: APTOS_BOND_5PCT,
54
79
  },
55
- decimals: { [APTOS_KEY]: 8 },
56
- active: true,
80
+ billNnftAddress: {
81
+ [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,
82
+ },
83
+ lpToken: {
84
+ symbol: 'APT',
85
+ address: {
86
+ [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,
87
+ },
88
+ decimals: { [APTOS_KEY]: 8 },
89
+ active: true,
90
+ },
91
+ earnToken: {
92
+ symbol: 'tAPE',
93
+ address: {
94
+ [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,
95
+ },
96
+ decimals: { [APTOS_KEY]: 8 },
97
+ active: true,
98
+ },
99
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
100
+ shortDescription: '5% discount bond — CV=857, fee 5%/5%',
101
+ fullDescription: 'Aptos bond with 5% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~5.26%.',
102
+ vestingTerm: 172800,
103
+ tags: ['Aptos'],
57
104
  },
58
- earnToken: {
59
- symbol: 'tAPE',
60
- address: {
61
- [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,
105
+ {
106
+ index: 99003,
107
+ version: '2.0.0',
108
+ chainId: APTOS_KEY,
109
+ billVersion: BillVersion.V2,
110
+ billType: 'reserve',
111
+ soldOut: false,
112
+ contractAddress: {
113
+ [APTOS_KEY]: APTOS_BOND_35PCT,
62
114
  },
63
- decimals: { [APTOS_KEY]: 8 },
64
- active: true,
115
+ billNnftAddress: {
116
+ [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,
117
+ },
118
+ lpToken: {
119
+ symbol: 'APT',
120
+ address: {
121
+ [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,
122
+ },
123
+ decimals: { [APTOS_KEY]: 8 },
124
+ active: true,
125
+ },
126
+ earnToken: {
127
+ symbol: 'tAPE',
128
+ address: {
129
+ [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,
130
+ },
131
+ decimals: { [APTOS_KEY]: 8 },
132
+ active: true,
133
+ },
134
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
135
+ shortDescription: '35% discount bond — CV=587, fee 5%/5%',
136
+ fullDescription: 'Aptos bond with 35% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~53.85%.',
137
+ vestingTerm: 172800,
138
+ tags: ['Aptos'],
65
139
  },
66
- billArt: { collection: BillArtCollection.ApeBond_Collection1 },
67
- shortDescription: 'Aptos bond — on-chain first, no backend dependency.',
68
- fullDescription: 'Aptos bond operating in on-chain first mode. All market data (prices, discounts, vesting) is read directly from Move view functions. No api-v2 or realtime-api dependency.',
69
- vestingTerm: 172800, // placeholder; enrichAptosBonds overwrites from market_info
70
- tags: ['Aptos'],
71
- }));
140
+ ];
72
141
  // Fallback prices used until price-api.ape.bond supports Aptos tokens.
73
142
  // TODO(aptos): Remove fallback prices when price-api returns Aptos token prices.
74
143
  // Update APT and payout token prices to current values before mainnet launch.
@@ -90,7 +159,7 @@ const APTOS_BONDS_CONFIG = APTOS_BOND_MARKET_ADDRESSES.map((marketAddress, i) =>
90
159
  tokenAddress: APTOS_PAYOUT_TOKEN_ADDRESS,
91
160
  name: 'Test APE',
92
161
  symbol: 'tAPE',
93
- price: 0.6,
162
+ price: 0.60,
94
163
  priceSource: 'fallback',
95
164
  updatedAt: 0,
96
165
  secondsAgoUpdated: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"aptosBondsConfig.js","sources":["../../../src/state/bonds/aptosBondsConfig.ts"],"sourcesContent":["// =============================================================================\n// Aptos bonds config — static bond listing for on-chain first architecture\n// =============================================================================\n//\n// api-v2 and realtime-api do NOT support Aptos. Bond listing comes from this\n// static config. Enrichment (prices, discounts, vesting) is read on-chain via\n// bond::market_info view function.\n//\n// TODO(aptos): Replace placeholder addresses with real deployed market addresses.\n// TODO(aptos): Consider indexing BondMarketCreatedEvent for automatic market\n// discovery instead of maintaining this static list.\n//\n// Call sites:\n// - useBondsList.ts → getAptosBondsList()\n// - useTokenPrices.ts → getAptosFallbackPrices()\n\nimport { BillArtCollection, BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { APTOS_CONTRACT_ADDRESS } from '../../constants/aptosConstants'\nimport { APTOS_ZAP_TOKENS } from '../../config/constants/aptosZapTokens'\nimport type { TokenPrices } from '../tokenPrices/useTokenPrices'\n\nconst APTOS_KEY = ChainId.APTOS\n\n// TODO(aptos): For mainnet launch, update these addresses:\n// 1. APTOS_BOND_MARKET_ADDRESSES → mainnet bond market object addresses\n// 2. APTOS_PAYOUT_TOKEN_ADDRESS → mainnet payout token FA address (real token, not tAPE)\n// 3. APTOS_PRINCIPAL_TOKEN_ADDRESS if principal differs per market\n// Also update APTOS_CONTRACT_ADDRESS_MAINNET in aptosConstants.ts.\n\n/** Testnet bond market object addresses (bond::market_info). */\nconst APTOS_BOND_MARKET_ADDRESSES = [\n '0x9902fa5b2fac9d6665f1f94b66ac72709d63d38b494973089f55de5f11af12da',\n '0xd5b8002990de9cb9de9a6104d51f1d142c66604d7fdc2f38afc01cccc269076f',\n '0xb85b06e858eda8e01cfcebab7fda0dd24e987f41595d94417fdce64ce41e222d',\n '0x5b17d6b52258601f6bc34f46195947a8de4ec21104c77341a0983f6a8249128b',\n] as const\n\n// tAPE payout token metadata\nconst APTOS_PAYOUT_TOKEN_ADDRESS = '0xff27a471b7d44e2a8eae1b8693190d4322f4e28cd9a4dd9d8fff7ed74a47556e'\n// APT principal token metadata\nconst APTOS_PRINCIPAL_TOKEN_ADDRESS = '0xa'\n\nconst APTOS_BONDS_CONFIG: BillsConfig[] = APTOS_BOND_MARKET_ADDRESSES.map((marketAddress, i) => ({\n index: 99001 + i,\n version: '2.0.0',\n chainId: APTOS_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [APTOS_KEY]: marketAddress,\n },\n billNnftAddress: {\n [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'APT',\n address: {\n [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: 'Aptos bond — on-chain first, no backend dependency.',\n fullDescription:\n 'Aptos bond operating in on-chain first mode. All market data (prices, discounts, vesting) is read directly from Move view functions. No api-v2 or realtime-api dependency.',\n vestingTerm: 172800, // placeholder; enrichAptosBonds overwrites from market_info\n tags: ['Aptos'],\n}))\n\n// Fallback prices used until price-api.ape.bond supports Aptos tokens.\n// TODO(aptos): Remove fallback prices when price-api returns Aptos token prices.\n// Update APT and payout token prices to current values before mainnet launch.\nconst APTOS_FALLBACK_PRICES: TokenPrices[] = [\n {\n chainId: ChainId.APTOS,\n chainName: 'Aptos',\n tokenAddress: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n name: 'Aptos Coin',\n symbol: 'APT',\n price: 5.5,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.APTOS,\n chainName: 'Aptos',\n tokenAddress: APTOS_PAYOUT_TOKEN_ADDRESS,\n name: 'Test APE',\n symbol: 'tAPE',\n price: 0.6,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n // Zap tokens — addresses come from aptosZapTokens.ts (testnet/mainnet aware)\n ...APTOS_ZAP_TOKENS.map((t) => ({\n chainId: ChainId.APTOS as ChainId,\n chainName: 'Aptos',\n tokenAddress: t.faAddress,\n name: t.name,\n symbol: t.symbol,\n price: t.symbol === 'USDC' || t.symbol === 'USDt' ? 1.0 : 0,\n priceSource: 'fallback' as const,\n updatedAt: 0,\n secondsAgoUpdated: 0,\n })),\n]\n\nexport const getAptosBondsList = (): BillsConfig[] => APTOS_BONDS_CONFIG\n\nexport const getAptosFallbackPrices = (): TokenPrices[] => APTOS_FALLBACK_PRICES\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aptosBondsConfig.js","sources":["../../../src/state/bonds/aptosBondsConfig.ts"],"sourcesContent":["// =============================================================================\n// Aptos bonds config — static bond listing for on-chain first architecture\n// =============================================================================\n//\n// api-v2 and realtime-api do NOT support Aptos. Bond listing comes from this\n// static config. Enrichment (prices, discounts, vesting) is read on-chain via\n// bond::market_info view function.\n//\n// TODO(aptos): Replace placeholder addresses with real deployed market addresses.\n// TODO(aptos): Consider indexing BondMarketCreatedEvent for automatic market\n// discovery instead of maintaining this static list.\n//\n// Call sites:\n// - useBondsList.ts → getAptosBondsList()\n// - useTokenPrices.ts → getAptosFallbackPrices()\n\nimport { BillArtCollection, BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { APTOS_CONTRACT_ADDRESS } from '../../constants/aptosConstants'\nimport { APTOS_ZAP_TOKENS } from '../../config/constants/aptosZapTokens'\nimport type { TokenPrices } from '../tokenPrices/useTokenPrices'\n\nconst APTOS_KEY = ChainId.APTOS\n\n// TODO(aptos): For mainnet launch, update these three addresses:\n// 1. APTOS_BOND_MARKET_ADDRESS → mainnet bond market object address\n// 2. APTOS_PAYOUT_TOKEN_ADDRESS → mainnet payout token FA address (real token, not tAPE)\n// 3. Add additional bond entries to APTOS_BONDS_CONFIG for each mainnet market\n// Also update APTOS_CONTRACT_ADDRESS_MAINNET in aptosConstants.ts.\n\n// tAPE payout token metadata\nconst APTOS_PAYOUT_TOKEN_ADDRESS = '0xff27a471b7d44e2a8eae1b8693190d4322f4e28cd9a4dd9d8fff7ed74a47556e'\n// APT principal token metadata\nconst APTOS_PRINCIPAL_TOKEN_ADDRESS = '0xa'\n\n// Bond market addresses from testnet deploy (fee-formula-fix verification, 5%/5% fees)\nconst APTOS_BOND_10PCT = '0x7ef38a4a4a2205c6efca8c279931f01bbbe27dbd7149a9d1733e7da4d9bbd68'\nconst APTOS_BOND_5PCT = '0xecf8c233149e617b323335788370ae49878e0a8a5aadeaa6523ff93df6b8661c'\nconst APTOS_BOND_35PCT = '0xcb28b74a3b458d6f9e8a570767928fd2e2d5ac8b9039003597cdab8d008df2a3'\n\nconst APTOS_BONDS_CONFIG: BillsConfig[] = [\n {\n index: 99001,\n version: '2.0.0',\n chainId: APTOS_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [APTOS_KEY]: APTOS_BOND_10PCT,\n },\n billNnftAddress: {\n [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'APT',\n address: {\n [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '10% discount bond — CV=812, fee 5%/5%',\n fullDescription:\n 'Aptos bond with 10% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~11.11%.',\n vestingTerm: 172800,\n tags: ['Aptos'],\n },\n {\n index: 99002,\n version: '2.0.0',\n chainId: APTOS_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [APTOS_KEY]: APTOS_BOND_5PCT,\n },\n billNnftAddress: {\n [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'APT',\n address: {\n [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '5% discount bond — CV=857, fee 5%/5%',\n fullDescription:\n 'Aptos bond with 5% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~5.26%.',\n vestingTerm: 172800,\n tags: ['Aptos'],\n },\n {\n index: 99003,\n version: '2.0.0',\n chainId: APTOS_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [APTOS_KEY]: APTOS_BOND_35PCT,\n },\n billNnftAddress: {\n [APTOS_KEY]: `${APTOS_CONTRACT_ADDRESS}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'APT',\n address: {\n [APTOS_KEY]: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [APTOS_KEY]: APTOS_PAYOUT_TOKEN_ADDRESS,\n },\n decimals: { [APTOS_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '35% discount bond — CV=587, fee 5%/5%',\n fullDescription:\n 'Aptos bond with 35% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~53.85%.',\n vestingTerm: 172800,\n tags: ['Aptos'],\n },\n]\n\n// Fallback prices used until price-api.ape.bond supports Aptos tokens.\n// TODO(aptos): Remove fallback prices when price-api returns Aptos token prices.\n// Update APT and payout token prices to current values before mainnet launch.\nconst APTOS_FALLBACK_PRICES: TokenPrices[] = [\n {\n chainId: ChainId.APTOS,\n chainName: 'Aptos',\n tokenAddress: APTOS_PRINCIPAL_TOKEN_ADDRESS,\n name: 'Aptos Coin',\n symbol: 'APT',\n price: 5.5,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.APTOS,\n chainName: 'Aptos',\n tokenAddress: APTOS_PAYOUT_TOKEN_ADDRESS,\n name: 'Test APE',\n symbol: 'tAPE',\n price: 0.60,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n // Zap tokens — addresses come from aptosZapTokens.ts (testnet/mainnet aware)\n ...APTOS_ZAP_TOKENS.map((t) => ({\n chainId: ChainId.APTOS as ChainId,\n chainName: 'Aptos',\n tokenAddress: t.faAddress,\n name: t.name,\n symbol: t.symbol,\n price: t.symbol === 'USDC' || t.symbol === 'USDt' ? 1.0 : 0,\n priceSource: 'fallback' as const,\n updatedAt: 0,\n secondsAgoUpdated: 0,\n })),\n]\n\nexport const getAptosBondsList = (): BillsConfig[] => APTOS_BONDS_CONFIG\n\nexport const getAptosFallbackPrices = (): TokenPrices[] => APTOS_FALLBACK_PRICES\n"],"names":[],"mappings":"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"}
@@ -32,11 +32,9 @@ const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
32
32
  if (principalPrice === undefined) {
33
33
  try {
34
34
  const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
35
- console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.data.price);
36
35
  principalPrice = res.data.price ?? 0;
37
36
  }
38
37
  catch {
39
- console.error('Failed to fetch price for: ', bond.lpToken.symbol);
40
38
  principalPrice = 0;
41
39
  }
42
40
  }
@@ -45,11 +43,9 @@ const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
45
43
  try {
46
44
  // Missing token price, therefor make a single call to api to fetch it
47
45
  const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
48
- console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.data.price);
49
46
  payoutPrice = res.data.price ?? 0;
50
47
  }
51
48
  catch {
52
- console.error('Failed to fetch price for: ', bond.earnToken.symbol);
53
49
  payoutPrice = 0;
54
50
  }
55
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetchBondsDataAptos.js","sources":["../../../src/state/bonds/fetchBondsDataAptos.ts"],"sourcesContent":["// =============================================================================\n// Aptos bond enrichment — builds BondsData[] from BillsConfig[] + prices\n// =============================================================================\n//\n// On-chain first: reads bond::market_info via view function for each config\n// and projects the tuple onto BondsData. No backend dependency (realtime-api\n// does not support Aptos).\n\nimport BigNumber from 'bignumber.js'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../types/bonds'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { readAptosMarketInfo } from '../../utils/aptosHelpers'\nimport axios from 'axios'\n\nconst APTOS_KEY = ChainId.APTOS\n\n/**\n * Enrich Aptos bond configs into full BondsData objects.\n *\n * Calls `bond::market_info(market)` for each config and projects the tuple\n * onto BondsData. Scale conversion: contract returns `true_bill_price` as u64\n * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled by\n * 1e18 (legacy EVM format) → multiply by 1e10.\n */\nexport const enrichAptosBonds = async (\n aptosConfigs?: BillsConfig[],\n aptosPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n if (!aptosConfigs || aptosConfigs?.length === 0) return []\n\n const enriched = await Promise.all(\n aptosConfigs.map(async (bond): Promise<BondsData | null> => {\n const marketAddr = bond.contractAddress[APTOS_KEY]\n if (!marketAddr) return null\n try {\n // Firstly we fetch prices\n let principalPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price!\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.data.price)\n principalPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.lpToken.symbol)\n principalPrice = 0\n }\n }\n\n let payoutPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price!\n if (payoutPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.data.price)\n payoutPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.earnToken.symbol)\n payoutPrice = 0\n }\n }\n\n const info = await readAptosMarketInfo(marketAddr)\n const principalAddr = bond.lpToken.address[APTOS_KEY]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[APTOS_KEY]?.toLowerCase()\n\n // Convert on-chain u64 (scaled 1e8) to the SDK's legacy 1e18 scale\n const trueBillPriceU64 = info[17]\n const trueBondPriceScaled = (BigInt(trueBillPriceU64) * 10n ** 10n).toString()\n const trueBondPriceHuman = Number(trueBillPriceU64) / 1e8\n\n // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts\n const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0\n const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0\n\n // Fees: u64 in PERCENTAGE_BASE (1e6) → divide by 10_000 for human %\n const feeInPayout = Number(info[14]) / 10_000\n const feeInPrincipal = Number(info[13]) / 10_000\n const trueBondPriceWithFee =\n feeInPayout < 100 ? trueBondPriceHuman * (1 / ((100 - feeInPayout) / 100)) : trueBondPriceHuman\n const discountWithFee =\n payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceWithFee) / payoutPrice) * 100 : 0\n const bonusWithFee =\n discountWithFee > 0 && discountWithFee < 100 ? (discountWithFee / (100 - discountWithFee)) * 100 : 0\n\n const payoutDecimals = bond.earnToken.decimals[APTOS_KEY] ?? 8\n const tokensRemaining = new BigNumber(info[23])\n .minus(new BigNumber(info[5]))\n .div(new BigNumber(10).pow(payoutDecimals))\n .toString()\n\n return {\n ...bond,\n soldOut: info[2] || info[3] ? true : bond.soldOut,\n maxTotalPayout: String(info[23]),\n totalPayoutGiven: String(info[5]),\n maxPayout: String(info[21]),\n tokensRemaining,\n showcaseTokenName: bond.earnToken.symbol,\n vestingTerm: Number(info[19]),\n feeInPayout,\n feeInPrincipal,\n trueBondPrices: [\n {\n trueBondPrice: trueBondPriceScaled,\n points: '0',\n discount,\n discountWithFee,\n bonus,\n bonusWithFee,\n boost: 0,\n },\n ],\n principalTokenPrice: principalPrice.toString(),\n payoutTokenPrice: payoutPrice.toString(),\n }\n } catch (e) {\n console.warn(`[Aptos] Failed to read market_info for ${marketAddr}`, e)\n // Hide the bond from the list when on-chain data is unavailable —\n // showing a card with all zeros is confusing for users.\n return null\n }\n }),\n )\n return enriched.filter((b): b is BondsData => b !== null)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetchBondsDataAptos.js","sources":["../../../src/state/bonds/fetchBondsDataAptos.ts"],"sourcesContent":["// =============================================================================\n// Aptos bond enrichment — builds BondsData[] from BillsConfig[] + prices\n// =============================================================================\n//\n// On-chain first: reads bond::market_info via view function for each config\n// and projects the tuple onto BondsData. No backend dependency (realtime-api\n// does not support Aptos).\n\nimport BigNumber from 'bignumber.js'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../types/bonds'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { readAptosMarketInfo } from '../../utils/aptosHelpers'\nimport axios from 'axios'\n\nconst APTOS_KEY = ChainId.APTOS\n\n/**\n * Enrich Aptos bond configs into full BondsData objects.\n *\n * Calls `bond::market_info(market)` for each config and projects the tuple\n * onto BondsData. Scale conversion: contract returns `true_bill_price` as u64\n * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled by\n * 1e18 (legacy EVM format) → multiply by 1e10.\n */\nexport const enrichAptosBonds = async (\n aptosConfigs?: BillsConfig[],\n aptosPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n if (!aptosConfigs || aptosConfigs?.length === 0) return []\n\n const enriched = await Promise.all(\n aptosConfigs.map(async (bond): Promise<BondsData | null> => {\n const marketAddr = bond.contractAddress[APTOS_KEY]\n if (!marketAddr) return null\n try {\n // Firstly we fetch prices\n let principalPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price!\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n principalPrice = res.data.price ?? 0\n } catch {\n principalPrice = 0\n }\n }\n\n let payoutPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price!\n if (payoutPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n payoutPrice = res.data.price ?? 0\n } catch {\n payoutPrice = 0\n }\n }\n\n const info = await readAptosMarketInfo(marketAddr)\n const principalAddr = bond.lpToken.address[APTOS_KEY]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[APTOS_KEY]?.toLowerCase()\n\n // Convert on-chain u64 (scaled 1e8) to the SDK's legacy 1e18 scale\n const trueBillPriceU64 = info[17]\n const trueBondPriceScaled = (BigInt(trueBillPriceU64) * 10n ** 10n).toString()\n const trueBondPriceHuman = Number(trueBillPriceU64) / 1e8\n\n // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts\n const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0\n const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0\n\n // Fees: u64 in PERCENTAGE_BASE (1e6) → divide by 10_000 for human %\n const feeInPayout = Number(info[14]) / 10_000\n const feeInPrincipal = Number(info[13]) / 10_000\n const trueBondPriceWithFee =\n feeInPayout < 100 ? trueBondPriceHuman * (1 / ((100 - feeInPayout) / 100)) : trueBondPriceHuman\n const discountWithFee =\n payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceWithFee) / payoutPrice) * 100 : 0\n const bonusWithFee =\n discountWithFee > 0 && discountWithFee < 100 ? (discountWithFee / (100 - discountWithFee)) * 100 : 0\n\n const payoutDecimals = bond.earnToken.decimals[APTOS_KEY] ?? 8\n const tokensRemaining = new BigNumber(info[23])\n .minus(new BigNumber(info[5]))\n .div(new BigNumber(10).pow(payoutDecimals))\n .toString()\n\n return {\n ...bond,\n soldOut: info[2] || info[3] ? true : bond.soldOut,\n maxTotalPayout: String(info[23]),\n totalPayoutGiven: String(info[5]),\n maxPayout: String(info[21]),\n tokensRemaining,\n showcaseTokenName: bond.earnToken.symbol,\n vestingTerm: Number(info[19]),\n feeInPayout,\n feeInPrincipal,\n trueBondPrices: [\n {\n trueBondPrice: trueBondPriceScaled,\n points: '0',\n discount,\n discountWithFee,\n bonus,\n bonusWithFee,\n boost: 0,\n },\n ],\n principalTokenPrice: principalPrice.toString(),\n payoutTokenPrice: payoutPrice.toString(),\n }\n } catch (e) {\n console.warn(`[Aptos] Failed to read market_info for ${marketAddr}`, e)\n // Hide the bond from the list when on-chain data is unavailable —\n // showing a card with all zeros is confusing for users.\n return null\n }\n }),\n )\n return enriched.filter((b): b is BondsData => b !== null)\n}\n"],"names":[],"mappings":"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"}
@@ -55,6 +55,7 @@ const extractMarketFields = (content) => {
55
55
  return {
56
56
  paused: Boolean(f.paused),
57
57
  emergency_paused: Boolean(f.emergency_paused),
58
+ treasury_id: String(f.treasury_id ?? ''),
58
59
  total_principal_billed: String(f.total_principal_billed ?? '0'),
59
60
  total_payout_given: String(f.total_payout_given ?? '0'),
60
61
  total_debt: String(f.total_debt ?? '0'),
@@ -106,11 +107,12 @@ const enrichSuiBonds = async (bonds, prices, priceApiUrl) => {
106
107
  console.warn(`[Sui] No content fields for market ${marketAddr}`);
107
108
  return null;
108
109
  }
110
+ const principalAddr = bond.lpToken.address[SUI_KEY]?.toLowerCase();
111
+ const payoutAddr = bond.earnToken.address[SUI_KEY]?.toLowerCase();
109
112
  let principalPrice = prices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price;
110
113
  if (principalPrice === undefined) {
111
114
  try {
112
115
  const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
113
- console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.data.price);
114
116
  principalPrice = res.data.price ?? 0;
115
117
  }
116
118
  catch {
@@ -123,7 +125,6 @@ const enrichSuiBonds = async (bonds, prices, priceApiUrl) => {
123
125
  try {
124
126
  // Missing token price, therefor make a single call to api to fetch it
125
127
  const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
126
- console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.data.price);
127
128
  payoutPrice = res.data.price ?? 0;
128
129
  }
129
130
  catch {
@@ -131,8 +132,6 @@ const enrichSuiBonds = async (bonds, prices, priceApiUrl) => {
131
132
  payoutPrice = 0;
132
133
  }
133
134
  }
134
- const principalAddr = bond.lpToken.address[SUI_KEY]?.toLowerCase();
135
- const payoutAddr = bond.earnToken.address[SUI_KEY]?.toLowerCase();
136
135
  // ---------- Compute true_bill_price client-side ----------
137
136
  const payoutDecimals = bond.earnToken.decimals[SUI_KEY] ?? fields.payout_decimals;
138
137
  const principalDecimals = bond.lpToken.decimals?.[SUI_KEY] ?? fields.principal_decimals;
@@ -148,9 +147,12 @@ const enrichSuiBonds = async (bonds, prices, priceApiUrl) => {
148
147
  const debtRatio = calculateDebtRatio(currentDebtPayout, payoutInitialSupply, payoutScale);
149
148
  const basePrice = calculateBondPrice(controlVariable, debtRatio, principalScale);
150
149
  const trueBillPriceU64 = calculateTruePrice(basePrice, feeInPrincipalRaw, minimumPrice);
151
- // Convert on-chain u64 (scaled 1e8) to the SDK's legacy 1e18 scale
152
- const trueBondPriceScaled = (trueBillPriceU64 * 10n ** 10n).toString();
153
- const trueBondPriceHuman = Number(trueBillPriceU64) / 1e8;
150
+ // Convert on-chain u64 to SDK formats.
151
+ // The on-chain price is used as: payout = value * 10^payoutDec / price
152
+ // So "principal per payout" in human terms = price / 10^payoutDec.
153
+ // The SDK's legacy format scales to 1e18: trueBondPriceScaled = price * 10^(18-payoutDec).
154
+ const trueBondPriceScaled = (trueBillPriceU64 * pow10(18 - payoutDecimals)).toString();
155
+ const trueBondPriceHuman = Number(trueBillPriceU64) / Math.pow(10, payoutDecimals);
154
156
  // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts
155
157
  const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0;
156
158
  const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0;
@@ -166,6 +168,7 @@ const enrichSuiBonds = async (bonds, prices, priceApiUrl) => {
166
168
  .toString();
167
169
  return {
168
170
  ...bond,
171
+ suiTreasuryId: fields.treasury_id || undefined,
169
172
  soldOut: fields.paused || fields.emergency_paused ? true : bond.soldOut,
170
173
  maxTotalPayout: fields.terms.fields.max_total_payout,
171
174
  totalPayoutGiven: fields.total_payout_given,
@@ -1 +1 @@
1
- {"version":3,"file":"fetchBondsDataSui.js","sources":["../../../src/state/bonds/fetchBondsDataSui.ts"],"sourcesContent":["// =============================================================================\n// Sui bond enrichment — builds BondsData[] from BillsConfig[] + prices\n// =============================================================================\n//\n// On-chain first: reads BondMarket objects directly via getObject for each\n// config and projects the fields onto BondsData. No backend dependency\n// (realtime-api does not support Sui).\n\nimport BigNumber from 'bignumber.js'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../types/bonds'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { getSuiClient } from '../../utils/suiHelpers'\nimport axios from 'axios'\n\nconst SUI_KEY = ChainId.SUI\n\n// Contract constants — must match the Move source\nconst PRICE_DECIMALS = 100_000_000n // 1e8\nconst PERCENTAGE_BASE = 1_000_000n // 1e6\n\n// ---------------------------------------------------------------------------\n// Helpers — replicate bond_math on the client so we can compute true_price\n// from the raw object fields without needing a view function call.\n// ---------------------------------------------------------------------------\n\nconst pow10 = (n: number): bigint => 10n ** BigInt(n)\n\n/** debt_ratio = (current_debt * payout_scale) / payout_initial_supply */\nconst calculateDebtRatio = (currentDebt: bigint, payoutInitialSupply: bigint, payoutScale: bigint): bigint => {\n if (payoutInitialSupply === 0n) return 0n\n return (currentDebt * payoutScale) / payoutInitialSupply\n}\n\n/** value_of_token — convert amount from one decimal basis to another */\nconst valueOfToken = (fromDecimals: number, toDecimals: number, amount: bigint): bigint => {\n if (toDecimals >= fromDecimals) {\n return amount * pow10(toDecimals - fromDecimals)\n }\n return amount / pow10(fromDecimals - toDecimals)\n}\n\n/** bond_price = (control_variable * debt_ratio * token_scale) / PRICE_DECIMALS */\nconst calculateBondPrice = (controlVariable: bigint, debtRatio: bigint, tokenScale: bigint): bigint => {\n const temp = controlVariable * debtRatio\n return (temp * tokenScale) / PRICE_DECIMALS\n}\n\n/** true_price = (base_price * PERCENTAGE_BASE) / (PERCENTAGE_BASE - fee_in_principal) */\nconst calculateTruePrice = (basePrice: bigint, feeInPrincipal: bigint, minimumPrice: bigint): bigint => {\n const denominator = PERCENTAGE_BASE - feeInPrincipal\n if (denominator === 0n) return basePrice\n const truePrice = (basePrice * PERCENTAGE_BASE) / denominator\n return truePrice < minimumPrice ? minimumPrice : truePrice\n}\n\n// ---------------------------------------------------------------------------\n// Object field extraction — Sui getObject returns nested content.fields\n// ---------------------------------------------------------------------------\n\ninterface SuiMarketFields {\n paused: boolean\n emergency_paused: boolean\n total_principal_billed: string\n total_payout_given: string\n total_debt: string\n payout_token_initial_supply: string\n payout_decimals: number\n principal_decimals: number\n fee_in_principal: string\n fee_in_payout: string\n cliff_period: number\n terms: {\n fields: {\n control_variable: string\n vesting_term: string\n minimum_price: string\n max_payout: string\n max_debt: string\n max_total_payout: string\n }\n }\n}\n\nconst extractMarketFields = (content: any): SuiMarketFields | null => {\n if (!content?.fields) return null\n const f = content.fields\n const terms = f.terms?.fields ?? f.terms\n if (!terms) return null\n return {\n paused: Boolean(f.paused),\n emergency_paused: Boolean(f.emergency_paused),\n total_principal_billed: String(f.total_principal_billed ?? '0'),\n total_payout_given: String(f.total_payout_given ?? '0'),\n total_debt: String(f.total_debt ?? '0'),\n payout_token_initial_supply: String(f.payout_token_initial_supply ?? '0'),\n payout_decimals: Number(f.payout_decimals ?? 9),\n principal_decimals: Number(f.principal_decimals ?? 9),\n fee_in_principal: String(f.fee_in_principal ?? '0'),\n fee_in_payout: String(f.fee_in_payout ?? '0'),\n cliff_period: f.vesting_config?.variant === 'CliffLinear' ? Number(f.vesting_config?.fields?.cliff_period ?? 0) : 0,\n terms: {\n fields: {\n control_variable: String(terms.control_variable ?? '0'),\n vesting_term: String(terms.vesting_term ?? '0'),\n minimum_price: String(terms.minimum_price ?? '0'),\n max_payout: String(terms.max_payout ?? '0'),\n max_debt: String(terms.max_debt ?? '0'),\n max_total_payout: String(terms.max_total_payout ?? '0'),\n },\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main enrichment function\n// ---------------------------------------------------------------------------\n\n/**\n * Enrich Sui bond configs into full BondsData objects.\n *\n * Reads each BondMarket object directly via `getObject` and computes\n * true_bill_price client-side using the same bond_math formulas as the\n * Move contract. Scale conversion: computed `true_bill_price` is u64\n * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled\n * by 1e18 (legacy EVM format) → multiply by 1e10.\n */\nexport const enrichSuiBonds = async (\n bonds?: BillsConfig[],\n prices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n if (!bonds || bonds?.length === 0) return []\n\n const client = getSuiClient()\n\n const enriched = await Promise.all(\n bonds.map(async (bond): Promise<BondsData | null> => {\n const marketAddr = bond.contractAddress[SUI_KEY]\n if (!marketAddr) return null\n try {\n const obj = await client.getObject({\n id: marketAddr,\n options: { showContent: true },\n })\n\n const fields = extractMarketFields(obj.data?.content)\n if (!fields) {\n console.warn(`[Sui] No content fields for market ${marketAddr}`)\n return null\n }\n\n let principalPrice = prices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price!\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.data.price)\n principalPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.lpToken.symbol)\n principalPrice = 0\n }\n }\n\n let payoutPrice = prices?.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price!\n if (payoutPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.data.price)\n payoutPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.earnToken.symbol)\n payoutPrice = 0\n }\n }\n\n const principalAddr = bond.lpToken.address[SUI_KEY]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[SUI_KEY]?.toLowerCase()\n\n // ---------- Compute true_bill_price client-side ----------\n const payoutDecimals = bond.earnToken.decimals[SUI_KEY] ?? fields.payout_decimals\n const principalDecimals = bond.lpToken.decimals?.[SUI_KEY] ?? fields.principal_decimals\n\n const totalDebt = BigInt(fields.total_debt)\n const payoutInitialSupply = BigInt(fields.payout_token_initial_supply)\n const controlVariable = BigInt(fields.terms.fields.control_variable)\n const minimumPrice = BigInt(fields.terms.fields.minimum_price)\n const feeInPrincipalRaw = BigInt(fields.fee_in_principal)\n\n // Replicate calculate_current_debt → calculate_price → calculate_true_price\n const currentDebtPayout = valueOfToken(principalDecimals, payoutDecimals, totalDebt)\n const payoutScale = pow10(payoutDecimals)\n const principalScale = pow10(principalDecimals)\n\n const debtRatio = calculateDebtRatio(currentDebtPayout, payoutInitialSupply, payoutScale)\n const basePrice = calculateBondPrice(controlVariable, debtRatio, principalScale)\n const trueBillPriceU64 = calculateTruePrice(basePrice, feeInPrincipalRaw, minimumPrice)\n\n // Convert on-chain u64 (scaled 1e8) to the SDK's legacy 1e18 scale\n const trueBondPriceScaled = (trueBillPriceU64 * 10n ** 10n).toString()\n const trueBondPriceHuman = Number(trueBillPriceU64) / 1e8\n\n // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts\n const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0\n const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0\n\n // Fees: u64 in PERCENTAGE_BASE (1e6) → divide by 10_000 for human %\n const feeInPayout = Number(fields.fee_in_payout) / 10_000\n const feeInPrincipal = Number(fields.fee_in_principal) / 10_000\n const trueBondPriceWithFee =\n feeInPayout < 100 ? trueBondPriceHuman * (1 / ((100 - feeInPayout) / 100)) : trueBondPriceHuman\n const discountWithFee =\n payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceWithFee) / payoutPrice) * 100 : 0\n const bonusWithFee =\n discountWithFee > 0 && discountWithFee < 100 ? (discountWithFee / (100 - discountWithFee)) * 100 : 0\n\n const tokensRemaining = new BigNumber(fields.terms.fields.max_total_payout)\n .minus(new BigNumber(fields.total_payout_given))\n .div(new BigNumber(10).pow(payoutDecimals))\n .toString()\n\n return {\n ...bond,\n soldOut: fields.paused || fields.emergency_paused ? true : bond.soldOut,\n maxTotalPayout: fields.terms.fields.max_total_payout,\n totalPayoutGiven: fields.total_payout_given,\n maxPayout: fields.terms.fields.max_payout,\n tokensRemaining,\n showcaseTokenName: bond.earnToken.symbol,\n vestingTerm: Number(fields.terms.fields.vesting_term),\n vestingCliff: fields.cliff_period || undefined,\n feeInPayout,\n feeInPrincipal,\n trueBondPrices: [\n {\n trueBondPrice: trueBondPriceScaled,\n points: '0',\n discount,\n discountWithFee,\n bonus,\n bonusWithFee,\n boost: 0,\n },\n ],\n principalTokenPrice: principalPrice.toString(),\n payoutTokenPrice: payoutPrice.toString(),\n }\n } catch (e) {\n console.warn(`[Sui] Failed to read BondMarket for ${marketAddr}`, e)\n // Hide the bond from the list when on-chain data is unavailable —\n // showing a card with all zeros is confusing for users.\n return null\n }\n }),\n )\n return enriched.filter((b): b is BondsData => b !== null)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetchBondsDataSui.js","sources":["../../../src/state/bonds/fetchBondsDataSui.ts"],"sourcesContent":["// =============================================================================\n// Sui bond enrichment — builds BondsData[] from BillsConfig[] + prices\n// =============================================================================\n//\n// On-chain first: reads BondMarket objects directly via getObject for each\n// config and projects the fields onto BondsData. No backend dependency\n// (realtime-api does not support Sui).\n\nimport BigNumber from 'bignumber.js'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../types/bonds'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { getSuiClient } from '../../utils/suiHelpers'\nimport axios from 'axios'\n\nconst SUI_KEY = ChainId.SUI\n\n// Contract constants — must match the Move source\nconst PRICE_DECIMALS = 100_000_000n // 1e8\nconst PERCENTAGE_BASE = 1_000_000n // 1e6\n\n// ---------------------------------------------------------------------------\n// Helpers — replicate bond_math on the client so we can compute true_price\n// from the raw object fields without needing a view function call.\n// ---------------------------------------------------------------------------\n\nconst pow10 = (n: number): bigint => 10n ** BigInt(n)\n\n/** debt_ratio = (current_debt * payout_scale) / payout_initial_supply */\nconst calculateDebtRatio = (currentDebt: bigint, payoutInitialSupply: bigint, payoutScale: bigint): bigint => {\n if (payoutInitialSupply === 0n) return 0n\n return (currentDebt * payoutScale) / payoutInitialSupply\n}\n\n/** value_of_token — convert amount from one decimal basis to another */\nconst valueOfToken = (fromDecimals: number, toDecimals: number, amount: bigint): bigint => {\n if (toDecimals >= fromDecimals) {\n return amount * pow10(toDecimals - fromDecimals)\n }\n return amount / pow10(fromDecimals - toDecimals)\n}\n\n/** bond_price = (control_variable * debt_ratio * token_scale) / PRICE_DECIMALS */\nconst calculateBondPrice = (controlVariable: bigint, debtRatio: bigint, tokenScale: bigint): bigint => {\n const temp = controlVariable * debtRatio\n return (temp * tokenScale) / PRICE_DECIMALS\n}\n\n/** true_price = (base_price * PERCENTAGE_BASE) / (PERCENTAGE_BASE - fee_in_principal) */\nconst calculateTruePrice = (basePrice: bigint, feeInPrincipal: bigint, minimumPrice: bigint): bigint => {\n const denominator = PERCENTAGE_BASE - feeInPrincipal\n if (denominator === 0n) return basePrice\n const truePrice = (basePrice * PERCENTAGE_BASE) / denominator\n return truePrice < minimumPrice ? minimumPrice : truePrice\n}\n\n// ---------------------------------------------------------------------------\n// Object field extraction — Sui getObject returns nested content.fields\n// ---------------------------------------------------------------------------\n\ninterface SuiMarketFields {\n paused: boolean\n emergency_paused: boolean\n treasury_id: string\n total_principal_billed: string\n total_payout_given: string\n total_debt: string\n payout_token_initial_supply: string\n payout_decimals: number\n principal_decimals: number\n fee_in_principal: string\n fee_in_payout: string\n cliff_period: number\n terms: {\n fields: {\n control_variable: string\n vesting_term: string\n minimum_price: string\n max_payout: string\n max_debt: string\n max_total_payout: string\n }\n }\n}\n\nconst extractMarketFields = (content: any): SuiMarketFields | null => {\n if (!content?.fields) return null\n const f = content.fields\n const terms = f.terms?.fields ?? f.terms\n if (!terms) return null\n return {\n paused: Boolean(f.paused),\n emergency_paused: Boolean(f.emergency_paused),\n treasury_id: String(f.treasury_id ?? ''),\n total_principal_billed: String(f.total_principal_billed ?? '0'),\n total_payout_given: String(f.total_payout_given ?? '0'),\n total_debt: String(f.total_debt ?? '0'),\n payout_token_initial_supply: String(f.payout_token_initial_supply ?? '0'),\n payout_decimals: Number(f.payout_decimals ?? 9),\n principal_decimals: Number(f.principal_decimals ?? 9),\n fee_in_principal: String(f.fee_in_principal ?? '0'),\n fee_in_payout: String(f.fee_in_payout ?? '0'),\n cliff_period: f.vesting_config?.variant === 'CliffLinear' ? Number(f.vesting_config?.fields?.cliff_period ?? 0) : 0,\n terms: {\n fields: {\n control_variable: String(terms.control_variable ?? '0'),\n vesting_term: String(terms.vesting_term ?? '0'),\n minimum_price: String(terms.minimum_price ?? '0'),\n max_payout: String(terms.max_payout ?? '0'),\n max_debt: String(terms.max_debt ?? '0'),\n max_total_payout: String(terms.max_total_payout ?? '0'),\n },\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main enrichment function\n// ---------------------------------------------------------------------------\n\n/**\n * Enrich Sui bond configs into full BondsData objects.\n *\n * Reads each BondMarket object directly via `getObject` and computes\n * true_bill_price client-side using the same bond_math formulas as the\n * Move contract. Scale conversion: computed `true_bill_price` is u64\n * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled\n * by 1e18 (legacy EVM format) → multiply by 1e10.\n */\nexport const enrichSuiBonds = async (\n bonds?: BillsConfig[],\n prices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n if (!bonds || bonds?.length === 0) return []\n\n const client = getSuiClient()\n\n const enriched = await Promise.all(\n bonds.map(async (bond): Promise<BondsData | null> => {\n const marketAddr = bond.contractAddress[SUI_KEY]\n if (!marketAddr) return null\n try {\n const obj = await client.getObject({\n id: marketAddr,\n options: { showContent: true },\n })\n\n const fields = extractMarketFields(obj.data?.content)\n if (!fields) {\n console.warn(`[Sui] No content fields for market ${marketAddr}`)\n return null\n }\n\n const principalAddr = bond.lpToken.address[SUI_KEY]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[SUI_KEY]?.toLowerCase()\n\n let principalPrice = prices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price!\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n principalPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.lpToken.symbol)\n principalPrice = 0\n }\n }\n\n let payoutPrice = prices?.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price!\n if (payoutPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n payoutPrice = res.data.price ?? 0\n } catch {\n console.error('Failed to fetch price for: ', bond.earnToken.symbol)\n payoutPrice = 0\n }\n }\n\n // ---------- Compute true_bill_price client-side ----------\n const payoutDecimals = bond.earnToken.decimals[SUI_KEY] ?? fields.payout_decimals\n const principalDecimals = bond.lpToken.decimals?.[SUI_KEY] ?? fields.principal_decimals\n\n const totalDebt = BigInt(fields.total_debt)\n const payoutInitialSupply = BigInt(fields.payout_token_initial_supply)\n const controlVariable = BigInt(fields.terms.fields.control_variable)\n const minimumPrice = BigInt(fields.terms.fields.minimum_price)\n const feeInPrincipalRaw = BigInt(fields.fee_in_principal)\n\n // Replicate calculate_current_debt → calculate_price → calculate_true_price\n const currentDebtPayout = valueOfToken(principalDecimals, payoutDecimals, totalDebt)\n const payoutScale = pow10(payoutDecimals)\n const principalScale = pow10(principalDecimals)\n\n const debtRatio = calculateDebtRatio(currentDebtPayout, payoutInitialSupply, payoutScale)\n const basePrice = calculateBondPrice(controlVariable, debtRatio, principalScale)\n const trueBillPriceU64 = calculateTruePrice(basePrice, feeInPrincipalRaw, minimumPrice)\n\n // Convert on-chain u64 to SDK formats.\n // The on-chain price is used as: payout = value * 10^payoutDec / price\n // So \"principal per payout\" in human terms = price / 10^payoutDec.\n // The SDK's legacy format scales to 1e18: trueBondPriceScaled = price * 10^(18-payoutDec).\n const trueBondPriceScaled = (trueBillPriceU64 * pow10(18 - payoutDecimals)).toString()\n const trueBondPriceHuman = Number(trueBillPriceU64) / Math.pow(10, payoutDecimals)\n\n // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts\n const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0\n const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0\n\n // Fees: u64 in PERCENTAGE_BASE (1e6) → divide by 10_000 for human %\n const feeInPayout = Number(fields.fee_in_payout) / 10_000\n const feeInPrincipal = Number(fields.fee_in_principal) / 10_000\n const trueBondPriceWithFee =\n feeInPayout < 100 ? trueBondPriceHuman * (1 / ((100 - feeInPayout) / 100)) : trueBondPriceHuman\n const discountWithFee =\n payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceWithFee) / payoutPrice) * 100 : 0\n const bonusWithFee =\n discountWithFee > 0 && discountWithFee < 100 ? (discountWithFee / (100 - discountWithFee)) * 100 : 0\n\n const tokensRemaining = new BigNumber(fields.terms.fields.max_total_payout)\n .minus(new BigNumber(fields.total_payout_given))\n .div(new BigNumber(10).pow(payoutDecimals))\n .toString()\n\n return {\n ...bond,\n suiTreasuryId: fields.treasury_id || undefined,\n soldOut: fields.paused || fields.emergency_paused ? true : bond.soldOut,\n maxTotalPayout: fields.terms.fields.max_total_payout,\n totalPayoutGiven: fields.total_payout_given,\n maxPayout: fields.terms.fields.max_payout,\n tokensRemaining,\n showcaseTokenName: bond.earnToken.symbol,\n vestingTerm: Number(fields.terms.fields.vesting_term),\n vestingCliff: fields.cliff_period || undefined,\n feeInPayout,\n feeInPrincipal,\n trueBondPrices: [\n {\n trueBondPrice: trueBondPriceScaled,\n points: '0',\n discount,\n discountWithFee,\n bonus,\n bonusWithFee,\n boost: 0,\n },\n ],\n principalTokenPrice: principalPrice.toString(),\n payoutTokenPrice: payoutPrice.toString(),\n }\n } catch (e) {\n console.warn(`[Sui] Failed to read BondMarket for ${marketAddr}`, e)\n // Hide the bond from the list when on-chain data is unavailable —\n // showing a card with all zeros is confusing for users.\n return null\n }\n }),\n )\n return enriched.filter((b): b is BondsData => b !== null)\n}\n"],"names":[],"mappings":"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"}
@@ -22,14 +22,19 @@ const SUI_KEY = ChainId.SUI;
22
22
  // 2. SUI_PAYOUT_TOKEN_COIN_TYPE → mainnet payout token coin type (real token, not tAPE)
23
23
  // 3. Add additional bond entries to SUI_BONDS_CONFIG for each mainnet market
24
24
  // Also update SUI_PACKAGE_ID_MAINNET in suiConstants.ts.
25
- // Bond market shared object address from testnet deploy (bond-id2, correct CV=89100 + 10% discount)
26
- const SUI_BOND_MARKET_ADDRESS = '0x09b35be15cf3567d9a19a7aa35de08264549dc84d81fe30c5953c9d7fa5abaa3';
27
25
  // tAPE payout token coin type
28
26
  const SUI_PAYOUT_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_payout_token::TEST_PAYOUT_TOKEN`;
29
27
  // tUSDC principal token coin type
30
28
  const SUI_PRINCIPAL_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_principal_token::TEST_PRINCIPAL_TOKEN`;
31
29
  // SUI native token
32
30
  const SUI_NATIVE_TOKEN_ADDRESS = '0x2::sui::SUI';
31
+ // Bond market addresses from testnet deploy (fee-formula-fix verification, 5%/5% fees)
32
+ const SUI_BOND_10PCT = '0x4d089b56e47eaf892bf7be3f1cbc1348047a9c8722b864d566d42e2268de2e5d';
33
+ const SUI_BOND_5PCT = '0x1296c566ea44ab0a2482c0e43a64dfaea4856486b3825722d55ffcd3ff1c9d5d';
34
+ const SUI_BOND_35PCT = '0x6aadcfce1d8ee9ff29af6b5d4733942ec8f31d0ee871a85015809b8ecd0e3dfc';
35
+ // SUI-payout (9-dec) test bonds — CV uses PRICE_DECIMALS=1e8 (not 10^payoutDec)
36
+ // Old bonds with wrong CV (10x too small): 0x68ae322a..., 0xce07b3b4... — show spinner, kept for reference
37
+ const SUI_9DEC_CORRECT_CV = '0x49aaf697a4136aae4640bb63b26a4640a0313394b0bf1357dd0f3c4f2393e795';
33
38
  const SUI_BONDS_CONFIG = [
34
39
  {
35
40
  index: 99101,
@@ -39,7 +44,7 @@ const SUI_BONDS_CONFIG = [
39
44
  billType: 'reserve',
40
45
  soldOut: false,
41
46
  contractAddress: {
42
- [SUI_KEY]: SUI_BOND_MARKET_ADDRESS,
47
+ [SUI_KEY]: SUI_BOND_10PCT,
43
48
  },
44
49
  billNnftAddress: {
45
50
  [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,
@@ -61,10 +66,119 @@ const SUI_BONDS_CONFIG = [
61
66
  active: true,
62
67
  },
63
68
  billArt: { collection: BillArtCollection.ApeBond_Collection1 },
64
- shortDescription: 'Sui bond — on-chain first, no backend dependency.',
65
- fullDescription: 'Sui bond operating in on-chain first mode. All market data (prices, discounts, vesting) is read directly from Move view functions. No api-v2 or realtime-api dependency.',
66
- vestingTerm: 172800, // 48h (matching deployed contract)
67
- vestingCliff: 300, // 5-minute cliff (CliffLinear vesting, matching deployed contract)
69
+ shortDescription: '10% discount bond — CV=81225, fee 5%/5%',
70
+ fullDescription: 'Sui bond with 10% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~11.11%.',
71
+ vestingTerm: 172800,
72
+ vestingCliff: 300,
73
+ tags: ['Sui'],
74
+ },
75
+ {
76
+ index: 99102,
77
+ version: '2.0.0',
78
+ chainId: SUI_KEY,
79
+ billVersion: BillVersion.V2,
80
+ billType: 'reserve',
81
+ soldOut: false,
82
+ contractAddress: {
83
+ [SUI_KEY]: SUI_BOND_5PCT,
84
+ },
85
+ billNnftAddress: {
86
+ [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,
87
+ },
88
+ lpToken: {
89
+ symbol: 'tUSDC',
90
+ address: {
91
+ [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,
92
+ },
93
+ decimals: { [SUI_KEY]: 6 },
94
+ active: true,
95
+ },
96
+ earnToken: {
97
+ symbol: 'tAPE',
98
+ address: {
99
+ [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,
100
+ },
101
+ decimals: { [SUI_KEY]: 8 },
102
+ active: true,
103
+ },
104
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
105
+ shortDescription: '5% discount bond — CV=85738, fee 5%/5%',
106
+ fullDescription: 'Sui bond with 5% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~5.26%.',
107
+ vestingTerm: 172800,
108
+ vestingCliff: 300,
109
+ tags: ['Sui'],
110
+ },
111
+ {
112
+ index: 99103,
113
+ version: '2.0.0',
114
+ chainId: SUI_KEY,
115
+ billVersion: BillVersion.V2,
116
+ billType: 'reserve',
117
+ soldOut: false,
118
+ contractAddress: {
119
+ [SUI_KEY]: SUI_BOND_35PCT,
120
+ },
121
+ billNnftAddress: {
122
+ [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,
123
+ },
124
+ lpToken: {
125
+ symbol: 'tUSDC',
126
+ address: {
127
+ [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,
128
+ },
129
+ decimals: { [SUI_KEY]: 6 },
130
+ active: true,
131
+ },
132
+ earnToken: {
133
+ symbol: 'tAPE',
134
+ address: {
135
+ [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,
136
+ },
137
+ decimals: { [SUI_KEY]: 8 },
138
+ active: true,
139
+ },
140
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
141
+ shortDescription: '35% discount bond — CV=58662, fee 5%/5%',
142
+ fullDescription: 'Sui bond with 35% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~53.85%.',
143
+ vestingTerm: 172800,
144
+ vestingCliff: 300,
145
+ tags: ['Sui'],
146
+ },
147
+ // --- SUI-payout (9-dec) bond with correct CV (PRICE_DECIMALS=1e8) ---
148
+ {
149
+ index: 99201,
150
+ version: '2.0.0',
151
+ chainId: SUI_KEY,
152
+ billVersion: BillVersion.V2,
153
+ billType: 'reserve',
154
+ soldOut: false,
155
+ contractAddress: {
156
+ [SUI_KEY]: SUI_9DEC_CORRECT_CV,
157
+ },
158
+ billNnftAddress: {
159
+ [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,
160
+ },
161
+ lpToken: {
162
+ symbol: 'tUSDC',
163
+ address: {
164
+ [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,
165
+ },
166
+ decimals: { [SUI_KEY]: 6 },
167
+ active: true,
168
+ },
169
+ earnToken: {
170
+ symbol: 'SUI',
171
+ address: {
172
+ [SUI_KEY]: SUI_NATIVE_TOKEN_ADDRESS,
173
+ },
174
+ decimals: { [SUI_KEY]: 9 },
175
+ active: true,
176
+ },
177
+ billArt: { collection: BillArtCollection.ApeBond_Collection1 },
178
+ shortDescription: '10% discount SUI bond (9-dec) — CV=4061250, fee 5%/5%',
179
+ fullDescription: 'SUI-payout bond with 9 decimals. CV calculated using PRICE_DECIMALS=1e8. Expected SDK bonus: ~11.11%.',
180
+ vestingTerm: 172800,
181
+ vestingCliff: 300,
68
182
  tags: ['Sui'],
69
183
  },
70
184
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"suiBondsConfig.js","sources":["../../../src/state/bonds/suiBondsConfig.ts"],"sourcesContent":["// =============================================================================\n// Sui bonds config — static bond listing for on-chain first architecture\n// =============================================================================\n//\n// api-v2 and realtime-api do NOT support Sui. Bond listing comes from this\n// static config. Enrichment (prices, discounts, vesting) is read on-chain via\n// bond::market_info view function.\n//\n// TODO(sui): Replace placeholder addresses with real deployed market addresses.\n// TODO(sui): Consider indexing BondMarketCreatedEvent for automatic market\n// discovery instead of maintaining this static list.\n//\n// Call sites:\n// - useBondsList.ts → getSuiBondsList()\n// - useTokenPrices.ts → getSuiFallbackPrices()\n\nimport { BillArtCollection, BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { SUI_PACKAGE_ID } from '../../constants/suiConstants'\nimport type { TokenPrices } from '../tokenPrices/useTokenPrices'\n\nconst SUI_KEY = ChainId.SUI\n\n// TODO(sui): For mainnet launch, update these addresses:\n// 1. SUI_BOND_MARKET_ADDRESS → mainnet bond market object address\n// 2. SUI_PAYOUT_TOKEN_COIN_TYPE → mainnet payout token coin type (real token, not tAPE)\n// 3. Add additional bond entries to SUI_BONDS_CONFIG for each mainnet market\n// Also update SUI_PACKAGE_ID_MAINNET in suiConstants.ts.\n\n// Bond market shared object address from testnet deploy (bond-id2, correct CV=89100 + 10% discount)\nconst SUI_BOND_MARKET_ADDRESS = '0x09b35be15cf3567d9a19a7aa35de08264549dc84d81fe30c5953c9d7fa5abaa3'\n// tAPE payout token coin type\nconst SUI_PAYOUT_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_payout_token::TEST_PAYOUT_TOKEN`\n// tUSDC principal token coin type\nconst SUI_PRINCIPAL_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_principal_token::TEST_PRINCIPAL_TOKEN`\n// SUI native token\nconst SUI_NATIVE_TOKEN_ADDRESS = '0x2::sui::SUI'\n\nconst SUI_BONDS_CONFIG: BillsConfig[] = [\n {\n index: 99101,\n version: '2.0.0',\n chainId: SUI_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [SUI_KEY]: SUI_BOND_MARKET_ADDRESS,\n },\n billNnftAddress: {\n [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'tUSDC',\n address: {\n [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 6 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: 'Sui bond — on-chain first, no backend dependency.',\n fullDescription:\n 'Sui bond operating in on-chain first mode. All market data (prices, discounts, vesting) is read directly from Move view functions. No api-v2 or realtime-api dependency.',\n vestingTerm: 172800, // 48h (matching deployed contract)\n vestingCliff: 300, // 5-minute cliff (CliffLinear vesting, matching deployed contract)\n tags: ['Sui'],\n },\n]\n\n// Fallback prices used until price-api.ape.bond supports Sui tokens.\n// TODO(sui): Remove fallback prices when price-api returns Sui token prices.\n// Update SUI and payout token prices to current values before mainnet launch.\nconst SUI_FALLBACK_PRICES: TokenPrices[] = [\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n name: 'Test USDC',\n symbol: 'tUSDC',\n price: 1.0,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_PAYOUT_TOKEN_COIN_TYPE,\n name: 'Test APE',\n symbol: 'tAPE',\n price: 50.0, // testnet: inflated so bond shows a positive bonus\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_NATIVE_TOKEN_ADDRESS,\n name: 'Sui',\n symbol: 'SUI',\n price: 3.5,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n]\n\nexport const getSuiBondsList = (): BillsConfig[] => SUI_BONDS_CONFIG\n\nexport const getSuiFallbackPrices = (): TokenPrices[] => SUI_FALLBACK_PRICES\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suiBondsConfig.js","sources":["../../../src/state/bonds/suiBondsConfig.ts"],"sourcesContent":["// =============================================================================\n// Sui bonds config — static bond listing for on-chain first architecture\n// =============================================================================\n//\n// api-v2 and realtime-api do NOT support Sui. Bond listing comes from this\n// static config. Enrichment (prices, discounts, vesting) is read on-chain via\n// bond::market_info view function.\n//\n// TODO(sui): Replace placeholder addresses with real deployed market addresses.\n// TODO(sui): Consider indexing BondMarketCreatedEvent for automatic market\n// discovery instead of maintaining this static list.\n//\n// Call sites:\n// - useBondsList.ts → getSuiBondsList()\n// - useTokenPrices.ts → getSuiFallbackPrices()\n\nimport { BillArtCollection, BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { SUI_PACKAGE_ID } from '../../constants/suiConstants'\nimport type { TokenPrices } from '../tokenPrices/useTokenPrices'\n\nconst SUI_KEY = ChainId.SUI\n\n// TODO(sui): For mainnet launch, update these addresses:\n// 1. SUI_BOND_MARKET_ADDRESS → mainnet bond market object address\n// 2. SUI_PAYOUT_TOKEN_COIN_TYPE → mainnet payout token coin type (real token, not tAPE)\n// 3. Add additional bond entries to SUI_BONDS_CONFIG for each mainnet market\n// Also update SUI_PACKAGE_ID_MAINNET in suiConstants.ts.\n\n// tAPE payout token coin type\nconst SUI_PAYOUT_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_payout_token::TEST_PAYOUT_TOKEN`\n// tUSDC principal token coin type\nconst SUI_PRINCIPAL_TOKEN_COIN_TYPE = `${SUI_PACKAGE_ID}::test_principal_token::TEST_PRINCIPAL_TOKEN`\n// SUI native token\nconst SUI_NATIVE_TOKEN_ADDRESS = '0x2::sui::SUI'\n\n// Bond market addresses from testnet deploy (fee-formula-fix verification, 5%/5% fees)\nconst SUI_BOND_10PCT = '0x4d089b56e47eaf892bf7be3f1cbc1348047a9c8722b864d566d42e2268de2e5d'\nconst SUI_BOND_5PCT = '0x1296c566ea44ab0a2482c0e43a64dfaea4856486b3825722d55ffcd3ff1c9d5d'\nconst SUI_BOND_35PCT = '0x6aadcfce1d8ee9ff29af6b5d4733942ec8f31d0ee871a85015809b8ecd0e3dfc'\n\n// SUI-payout (9-dec) test bonds — CV uses PRICE_DECIMALS=1e8 (not 10^payoutDec)\n// Old bonds with wrong CV (10x too small): 0x68ae322a..., 0xce07b3b4... — show spinner, kept for reference\nconst SUI_9DEC_CORRECT_CV = '0x49aaf697a4136aae4640bb63b26a4640a0313394b0bf1357dd0f3c4f2393e795'\n\nconst SUI_BONDS_CONFIG: BillsConfig[] = [\n {\n index: 99101,\n version: '2.0.0',\n chainId: SUI_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [SUI_KEY]: SUI_BOND_10PCT,\n },\n billNnftAddress: {\n [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'tUSDC',\n address: {\n [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 6 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '10% discount bond — CV=81225, fee 5%/5%',\n fullDescription:\n 'Sui bond with 10% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~11.11%.',\n vestingTerm: 172800,\n vestingCliff: 300,\n tags: ['Sui'],\n },\n {\n index: 99102,\n version: '2.0.0',\n chainId: SUI_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [SUI_KEY]: SUI_BOND_5PCT,\n },\n billNnftAddress: {\n [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'tUSDC',\n address: {\n [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 6 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '5% discount bond — CV=85738, fee 5%/5%',\n fullDescription:\n 'Sui bond with 5% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~5.26%.',\n vestingTerm: 172800,\n vestingCliff: 300,\n tags: ['Sui'],\n },\n {\n index: 99103,\n version: '2.0.0',\n chainId: SUI_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [SUI_KEY]: SUI_BOND_35PCT,\n },\n billNnftAddress: {\n [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'tUSDC',\n address: {\n [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 6 },\n active: true,\n },\n earnToken: {\n symbol: 'tAPE',\n address: {\n [SUI_KEY]: SUI_PAYOUT_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 8 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '35% discount bond — CV=58662, fee 5%/5%',\n fullDescription:\n 'Sui bond with 35% target discount and 5% fee in principal + 5% fee in payout. Expected SDK bonus: ~53.85%.',\n vestingTerm: 172800,\n vestingCliff: 300,\n tags: ['Sui'],\n },\n // --- SUI-payout (9-dec) bond with correct CV (PRICE_DECIMALS=1e8) ---\n {\n index: 99201,\n version: '2.0.0',\n chainId: SUI_KEY,\n billVersion: BillVersion.V2,\n billType: 'reserve',\n soldOut: false,\n contractAddress: {\n [SUI_KEY]: SUI_9DEC_CORRECT_CV,\n },\n billNnftAddress: {\n [SUI_KEY]: `${SUI_PACKAGE_ID}::bond_nft::COLLECTION`,\n },\n lpToken: {\n symbol: 'tUSDC',\n address: {\n [SUI_KEY]: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n },\n decimals: { [SUI_KEY]: 6 },\n active: true,\n },\n earnToken: {\n symbol: 'SUI',\n address: {\n [SUI_KEY]: SUI_NATIVE_TOKEN_ADDRESS,\n },\n decimals: { [SUI_KEY]: 9 },\n active: true,\n },\n billArt: { collection: BillArtCollection.ApeBond_Collection1 },\n shortDescription: '10% discount SUI bond (9-dec) — CV=4061250, fee 5%/5%',\n fullDescription:\n 'SUI-payout bond with 9 decimals. CV calculated using PRICE_DECIMALS=1e8. Expected SDK bonus: ~11.11%.',\n vestingTerm: 172800,\n vestingCliff: 300,\n tags: ['Sui'],\n },\n]\n\n// Fallback prices used until price-api.ape.bond supports Sui tokens.\n// TODO(sui): Remove fallback prices when price-api returns Sui token prices.\n// Update SUI and payout token prices to current values before mainnet launch.\nconst SUI_FALLBACK_PRICES: TokenPrices[] = [\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_PRINCIPAL_TOKEN_COIN_TYPE,\n name: 'Test USDC',\n symbol: 'tUSDC',\n price: 1.0,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_PAYOUT_TOKEN_COIN_TYPE,\n name: 'Test APE',\n symbol: 'tAPE',\n price: 50.0, // testnet: inflated so bond shows a positive bonus\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n {\n chainId: ChainId.SUI,\n chainName: 'Sui',\n tokenAddress: SUI_NATIVE_TOKEN_ADDRESS,\n name: 'Sui',\n symbol: 'SUI',\n price: 3.5,\n priceSource: 'fallback',\n updatedAt: 0,\n secondsAgoUpdated: 0,\n },\n]\n\nexport const getSuiBondsList = (): BillsConfig[] => SUI_BONDS_CONFIG\n\nexport const getSuiFallbackPrices = (): TokenPrices[] => SUI_FALLBACK_PRICES\n"],"names":[],"mappings":"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"}
@@ -23,16 +23,11 @@ const getBondsList = async (queryClient) => {
23
23
  try {
24
24
  const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`);
25
25
  // TODO remove this fallback, from now on bonds should be fetched from list repo 'feat/sui-aptos' branch. Also remove try-catch
26
- // Aptos bonds come from static config (on-chain first). realtime-api won't
27
- // support Aptos. To add new markets, update aptosBondsConfig.ts.
26
+ // Always include static Aptos + Sui configs alongside API bonds
28
27
  const apiData = response.data ?? [];
29
- if (apiData.some((b) => b.chainId === ChainId.APTOS)) {
30
- return apiData;
31
- }
32
- // Sui bonds come from static config (on-chain first). realtime-api won't
33
- // support Sui. To add new markets, update suiBondsConfig.ts.
34
- const suiBonds = apiData.some((b) => b.chainId === ChainId.SUI) ? [] : getSuiBondsList();
35
- return [...apiData, ...getAptosBondsList(), ...suiBonds];
28
+ const aptosBonds = apiData.some((b) => b.chainId === ChainId.APTOS) ? [] : getAptosBondsList();
29
+ const suiBonds = getSuiBondsList();
30
+ return [...apiData, ...aptosBonds, ...suiBonds];
36
31
  }
37
32
  catch (e) {
38
33
  reportError({
@@ -1 +1 @@
1
- {"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport { SDKProps } from '../useSDKConfig'\nimport { getAptosBondsList } from './aptosBondsConfig'\nimport { getSuiBondsList } from './suiBondsConfig'\n\nexport default function useBondsList(): UseQueryResult<BillsConfig[]> {\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST],\n queryFn: () => getBondsList(queryClient),\n staleTime: Infinity,\n refetchInterval: 300000, // 5 min\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getBondsList = async (queryClient: QueryClient): Promise<BillsConfig[]> => {\n const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n try {\n const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`)\n // TODO remove this fallback, from now on bonds should be fetched from list repo 'feat/sui-aptos' branch. Also remove try-catch\n\n // Aptos bonds come from static config (on-chain first). realtime-api won't\n // support Aptos. To add new markets, update aptosBondsConfig.ts.\n const apiData: BillsConfig[] = response.data ?? []\n if (apiData.some((b) => b.chainId === ChainId.APTOS)) {\n return apiData\n }\n // Sui bonds come from static config (on-chain first). realtime-api won't\n // support Sui. To add new markets, update suiBondsConfig.ts.\n const suiBonds = apiData.some((b) => b.chainId === ChainId.SUI) ? [] : getSuiBondsList()\n return [...apiData, ...getAptosBondsList(), ...suiBonds]\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsList', e },\n })\n return [...getAptosBondsList(), ...getSuiBondsList()]\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASc,SAAU,YAAY,GAAA;AAClC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACjC,QAAA,OAAO,EAAE,MAAM,YAAY,CAAC,WAAW,CAAC;AACxC,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;MAEa,YAAY,GAAG,OAAO,WAAwB,KAA4B;AACrF,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AAC7F,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAE5B,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,cAAc,CAAA,YAAA,EAAe,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAAC;;;;AAKjH,QAAA,MAAM,OAAO,GAAkB,QAAQ,CAAC,IAAI,IAAI,EAAE;AAClD,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,OAAO,OAAO;QAChB;;;AAGA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE;QACxF,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,iBAAiB,EAAE,EAAE,GAAG,QAAQ,CAAC;IAC1D;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;AACvC,SAAA,CAAC;QACF,OAAO,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IACvD;AACF;;;;"}
1
+ {"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport { SDKProps } from '../useSDKConfig'\nimport { getAptosBondsList } from './aptosBondsConfig'\nimport { getSuiBondsList } from './suiBondsConfig'\n\nexport default function useBondsList(): UseQueryResult<BillsConfig[]> {\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST],\n queryFn: () => getBondsList(queryClient),\n staleTime: Infinity,\n refetchInterval: 300000, // 5 min\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getBondsList = async (queryClient: QueryClient): Promise<BillsConfig[]> => {\n const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n try {\n const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`)\n // TODO remove this fallback, from now on bonds should be fetched from list repo 'feat/sui-aptos' branch. Also remove try-catch\n\n // Always include static Aptos + Sui configs alongside API bonds\n const apiData: BillsConfig[] = response.data ?? []\n const aptosBonds = apiData.some((b) => b.chainId === ChainId.APTOS) ? [] : getAptosBondsList()\n const suiBonds = getSuiBondsList()\n return [...apiData, ...aptosBonds, ...suiBonds]\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsList', e },\n })\n return [...getAptosBondsList(), ...getSuiBondsList()]\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASc,SAAU,YAAY,GAAA;AAClC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACjC,QAAA,OAAO,EAAE,MAAM,YAAY,CAAC,WAAW,CAAC;AACxC,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;MAEa,YAAY,GAAG,OAAO,WAAwB,KAA4B;AACrF,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AAC7F,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAE5B,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,cAAc,CAAA,YAAA,EAAe,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAAC;;;AAIjH,QAAA,MAAM,OAAO,GAAkB,QAAQ,CAAC,IAAI,IAAI,EAAE;AAClD,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,iBAAiB,EAAE;AAC9F,QAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;QAClC,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC;IACjD;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;AACvC,SAAA,CAAC;QACF,OAAO,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IACvD;AACF;;;;"}
@@ -1,8 +1,10 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import axios from 'axios';
3
+ import { ChainId } from '@ape.swap/apeswap-lists';
3
4
  import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
4
5
  import { useSDKConfig } from '../useSDKConfig.js';
5
6
  import { reportError } from '../../utils/reportError.js';
7
+ import { getSuiFallbackPrices } from '../bonds/suiBondsConfig.js';
6
8
 
7
9
  function useTokenPrices() {
8
10
  const SDKConfig = useSDKConfig();
@@ -20,20 +22,15 @@ const getTokenPrices = async (priceApi, apiv2) => {
20
22
  try {
21
23
  const response = await axios.get(`${priceApi}/realtime/prices`);
22
24
  const data = response.data ?? {};
23
- // // Fallback prices until price-api supports Aptos tokens.
24
- // // TODO(aptos): Remove when price-api returns Aptos token prices.
25
- // const aptosKey = ChainId.APTOS
26
- // if (!data[aptosKey] || data[aptosKey]?.length === 0) {
27
- // console.log('useAptosFallbackPrices')
28
- // data[aptosKey] = getAptosFallbackPrices()
29
- // }
30
- // // Fallback prices until price-api supports Sui tokens.
31
- // // TODO(sui): Remove when price-api returns Sui token prices.
32
- // const suiKey = ChainId.SUI
33
- // if (!data[suiKey] || data[suiKey]?.length === 0) {
34
- // console.log('useSuiFallbackPrices')
35
- // data[suiKey] = getSuiFallbackPrices()
36
- // }
25
+ // Merge fallback prices for Sui tokens not returned by price-api (e.g. testnet tokens)
26
+ const suiKey = ChainId.SUI;
27
+ const suiFallback = getSuiFallbackPrices();
28
+ const suiApiPrices = data[suiKey] ?? [];
29
+ const suiApiAddresses = new Set(suiApiPrices.map((p) => p.tokenAddress.toLowerCase()));
30
+ const missingSuiPrices = suiFallback.filter((p) => !suiApiAddresses.has(p.tokenAddress.toLowerCase()));
31
+ if (missingSuiPrices.length > 0) {
32
+ data[suiKey] = [...suiApiPrices, ...missingSuiPrices];
33
+ }
37
34
  return data;
38
35
  }
39
36
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenPrices.js","sources":["../../../src/state/tokenPrices/useTokenPrices.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport axios from 'axios'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\n\nexport interface TokenPrices {\n chainId: ChainId\n chainName: string\n tokenAddress: string\n name: string\n symbol: string\n price: number\n priceSource: string\n updatedAt: number\n secondsAgoUpdated: number\n error?: string\n}\n\nexport default function useTokenPrices(): UseQueryResult<Partial<Record<ChainId, TokenPrices[]>>> {\n const SDKConfig = useSDKConfig()\n const priceApi = SDKConfig?.urls?.priceApi\n const apiv2 = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TOKEN_PRICES],\n queryFn: () => getTokenPrices(priceApi, apiv2),\n refetchInterval: 30000, // 30 sec\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getTokenPrices = async (\n priceApi: string,\n apiv2: string,\n): Promise<Partial<Record<ChainId, TokenPrices[]>>> => {\n try {\n const response = await axios.get(`${priceApi}/realtime/prices`)\n const data: Partial<Record<ChainId, TokenPrices[]>> = response.data ?? {}\n // // Fallback prices until price-api supports Aptos tokens.\n // // TODO(aptos): Remove when price-api returns Aptos token prices.\n // const aptosKey = ChainId.APTOS\n // if (!data[aptosKey] || data[aptosKey]?.length === 0) {\n // console.log('useAptosFallbackPrices')\n // data[aptosKey] = getAptosFallbackPrices()\n // }\n // // Fallback prices until price-api supports Sui tokens.\n // // TODO(sui): Remove when price-api returns Sui token prices.\n // const suiKey = ChainId.SUI\n // if (!data[suiKey] || data[suiKey]?.length === 0) {\n // console.log('useSuiFallbackPrices')\n // data[suiKey] = getSuiFallbackPrices()\n // }\n return data\n } catch (error) {\n reportError({\n apiUrl: apiv2,\n error,\n extraInfo: { type: 'getTokenPrices', error },\n })\n throw new Error('Error getting tokens')\n }\n}\n"],"names":[],"mappings":";;;;;;AAoBc,SAAU,cAAc,GAAA;AACpC,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC9C,eAAe,EAAE,KAAK;AACtB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEO,MAAM,cAAc,GAAG,OAC5B,QAAgB,EAChB,KAAa,KACuC;AACpD,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,gBAAA,CAAkB,CAAC;AAC/D,QAAA,MAAM,IAAI,GAA4C,QAAQ,CAAC,IAAI,IAAI,EAAE;;;;;;;;;;;;;;;AAezE,QAAA,OAAO,IAAI;IACb;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,KAAK;YACb,KAAK;AACL,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAC7C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACzC;AACF;;;;"}
1
+ {"version":3,"file":"useTokenPrices.js","sources":["../../../src/state/tokenPrices/useTokenPrices.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport axios from 'axios'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\nimport { getSuiFallbackPrices } from '../bonds/suiBondsConfig'\n\nexport interface TokenPrices {\n chainId: ChainId\n chainName: string\n tokenAddress: string\n name: string\n symbol: string\n price: number\n priceSource: string\n updatedAt: number\n secondsAgoUpdated: number\n error?: string\n}\n\nexport default function useTokenPrices(): UseQueryResult<Partial<Record<ChainId, TokenPrices[]>>> {\n const SDKConfig = useSDKConfig()\n const priceApi = SDKConfig?.urls?.priceApi\n const apiv2 = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TOKEN_PRICES],\n queryFn: () => getTokenPrices(priceApi, apiv2),\n refetchInterval: 30000, // 30 sec\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getTokenPrices = async (\n priceApi: string,\n apiv2: string,\n): Promise<Partial<Record<ChainId, TokenPrices[]>>> => {\n try {\n const response = await axios.get(`${priceApi}/realtime/prices`)\n const data: Partial<Record<ChainId, TokenPrices[]>> = response.data ?? {}\n\n // Merge fallback prices for Sui tokens not returned by price-api (e.g. testnet tokens)\n const suiKey = ChainId.SUI\n const suiFallback = getSuiFallbackPrices()\n const suiApiPrices = data[suiKey] ?? []\n const suiApiAddresses = new Set(suiApiPrices.map((p) => p.tokenAddress.toLowerCase()))\n const missingSuiPrices = suiFallback.filter((p) => !suiApiAddresses.has(p.tokenAddress.toLowerCase()))\n if (missingSuiPrices.length > 0) {\n data[suiKey] = [...suiApiPrices, ...missingSuiPrices]\n }\n\n return data\n } catch (error) {\n reportError({\n apiUrl: apiv2,\n error,\n extraInfo: { type: 'getTokenPrices', error },\n })\n throw new Error('Error getting tokens')\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAqBc,SAAU,cAAc,GAAA;AACpC,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC9C,eAAe,EAAE,KAAK;AACtB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEO,MAAM,cAAc,GAAG,OAC5B,QAAgB,EAChB,KAAa,KACuC;AACpD,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,gBAAA,CAAkB,CAAC;AAC/D,QAAA,MAAM,IAAI,GAA4C,QAAQ,CAAC,IAAI,IAAI,EAAE;;AAGzE,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG;AAC1B,QAAA,MAAM,WAAW,GAAG,oBAAoB,EAAE;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACvC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;AACtG,QAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,gBAAgB,CAAC;QACvD;AAEA,QAAA,OAAO,IAAI;IACb;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,KAAK;YACb,KAAK;AACL,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAC7C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACzC;AACF;;;;"}
@@ -19,6 +19,7 @@ export interface BondsData extends PreTGEConfig, BillsConfig {
19
19
  trueBondPrices?: TrueBondPrices[];
20
20
  payoutTokenPrice?: string;
21
21
  principalTokenPrice?: string;
22
+ suiTreasuryId?: string;
22
23
  initialRelease?: number;
23
24
  totalPrincipalBilled?: string;
24
25
  totalRaise?: string;
@@ -162,7 +162,7 @@ const BuyComponentSui = ({ onDismiss, bondAddress, bondChain, isProjectView, set
162
162
  typeArguments: [payoutCoinType, principalCoinType],
163
163
  arguments: [
164
164
  tx.object(market),
165
- tx.object(SUI_TREASURY),
165
+ tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),
166
166
  tx.object(SUI_BOND_NFT_REGISTRY),
167
167
  principalCoin,
168
168
  tx.pure.u64(atomicMaxPrice),
@@ -327,7 +327,7 @@ const BuyComponentSui = ({ onDismiss, bondAddress, bondChain, isProjectView, set
327
327
  typeArguments: [payoutCoinType, principalCoinType],
328
328
  arguments: [
329
329
  tx.object(market),
330
- tx.object(SUI_TREASURY),
330
+ tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),
331
331
  tx.object(SUI_BOND_NFT_REGISTRY),
332
332
  principalCoin,
333
333
  tx.pure.u64(atomicMaxPrice),
@@ -1 +1 @@
1
- {"version":3,"file":"BuyComponentSui.js","sources":["../../../src/views/BuyBond/BuyComponentSui.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react'\nimport BigNumber from 'bignumber.js'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport useSuiZapQuote, { AFTERMATH_TX_API_URL } from '../../state/zap/useSuiZapQuote'\nimport { findSuiZapToken } from '../../config/constants/suiZapTokens'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { usePopups } from '../../state/popups/usePopups'\nimport { useSlippage } from '../../state/slippage/useSlippage'\nimport { BondsData } from '../../types/bonds'\nimport { formatUSDNumber, getMaxBuy, getPayoutAmount, getPrincipalAmount } from '../../utils/displayHelpers'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { reportError } from '../../utils/reportError'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport { getSymbol } from '../../utils/getNativeTicker'\n\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport BondModalHeader from './components/BondModalHeader'\nimport BondCards from './components/BondCards/BondCards'\nimport Estimations from './components/Estimations'\nimport ProjectDescription from './components/ProjectDescription'\n\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\n\nimport {\n SUI_DEPOSIT_FUNCTION,\n SUI_BOND_MARKET,\n SUI_TREASURY,\n SUI_BOND_NFT_REGISTRY,\n IS_SUI_MAINNET,\n SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET,\n SUI_MINT_PRINCIPAL_FUNCTION,\n} from '../../constants/suiConstants'\nimport { getSuiClient, readFreshTrueBondPrice, verifySuiTxSuccess } from '../../utils/suiHelpers'\nimport { MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\n\nexport interface BuyComponentSuiProps {\n onDismiss?: () => void\n bondAddress?: string\n bondChain?: number\n setBillId?: (id: string) => void\n isProjectView?: boolean\n}\n\nconst BuyComponentSui: React.FC<BuyComponentSuiProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n isProjectView,\n setBillId,\n}) => {\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n\n // Hooks\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { data: bonds } = useBondsData()\n const { addToastError, addToastSuccess } = usePopups()\n const { solSlippage: slippage } = useSlippage() // reuse Sol slippage bucket for Sui\n\n const bondData: BondsData | undefined = bonds?.find(\n (bond) => bond?.contractAddress?.[bond?.chainId]?.toLowerCase() === bondAddress?.toLowerCase(),\n )\n\n // Derived pricing (same path the Solana no-tier branch uses).\n const trueBondPriceData = findHighestTrueBondPrice('0', bondData?.trueBondPrices)\n\n // State\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData?.chainId])\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Token selection — reuses the same infrastructure as Solana\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const principalAddress = bondData?.lpToken?.address?.[bondData?.chainId]\n // Detect zap: selected token differs from the bond principal\n const SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\n const isNativeMatchingPrincipal =\n (inputTokenString === 'NATIVE' || inputTokenString?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()) &&\n principalAddress?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n const isZap =\n !!inputTokenString &&\n !!principalAddress &&\n !isNativeMatchingPrincipal &&\n inputTokenString.toLowerCase() !== principalAddress.toLowerCase()\n\n // Zap quote from Aftermath DEX aggregator\n const suiZapToken = findSuiZapToken(\n inputToken && inputToken !== 'NATIVE'\n ? inputToken?.address?.[ChainId.SUI]\n : inputToken === 'NATIVE'\n ? '0x2::sui::SUI'\n : undefined,\n )\n const [fetchingZapQuote, aftermathQuote, zapDepositAmount, zapError] = useSuiZapQuote(\n inputValue,\n suiZapToken,\n bondData,\n suiAccount ?? undefined,\n slippage,\n )\n\n // Sorted zap list (balances + prices)\n const { sortedZapList, isFetched: zapListFetched } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n const inputTokenPrice = enrichedTokenData?.price\n\n // Estimations — use zapDepositAmount if swapping\n const depositAmount = isZap ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = $${formatUSDNumber(\n (parseFloat(inputValue || '0') * (inputTokenPrice ?? 0)).toString(),\n )}`\n\n const exceedsRealMaxBuy = getMaxBuy(bondData, true).lte(getPayoutAmount(bondData, depositAmount, '0'))\n const exceedsSafeMaxBuy = getMaxBuy(bondData, false)\n .times(isZap ? 0.995 : 0.9995)\n .lte(getPayoutAmount(bondData, depositAmount, '0'))\n const exceedsBalance = new BigNumber(inputCurrencyBalance ?? '0').lt(inputValue)\n\n const load = loadingTx || (fetchingZapQuote && !!inputValue)\n\n // Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = () => {\n const balance = new BigNumber(inputCurrencyBalance ?? '0')\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 9\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), '0')\n if (maxPossibleUserPurchase > maxBuyAmount.toNumber()) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0')\n setInputValue(new BigNumber(principalForMaxBuy).toFixed(principalDecimals))\n } else {\n setInputValue(balance.toFixed(principalDecimals))\n }\n }\n\n const handleBuyCallback = async () => {\n if (!suiAccount || !bondData || !inputValue || !signAndExecuteTransaction) return\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n setLoadingTx(true)\n\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 9\n const atomicAmount = new BigNumber(inputValue)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache after previous purchases\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n // Build Sui transaction\n const tx = new Transaction()\n const isPrincipalNativeSui =\n !principalCoinType || principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(atomicAmount)])\n } else {\n const suiClient = getSuiClient()\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found in wallet`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(atomicAmount)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [tx.pure.u64(atomicAmount)])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n // Pre-build the transaction so the wallet receives fully-resolved bytes.\n // Some wallets (e.g. Phantom) fail with \"Unexpected error\" when they have\n // to build/simulate a Transaction object themselves.\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000) // 0.05 SUI — generous for a bond deposit\n const builtBytes = await tx.build({ client: getSuiClient() })\n const prebuiltTx = Transaction.from(builtBytes)\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n const suiClient = getSuiClient()\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui's indexer has a short lag — getOwnedObjects may not return the\n // new BondNFT immediately. Schedule re-invalidations so the Your Bonds\n // view picks up the new bond once the indexer catches up.\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(digest, bondChain as ChainId)\n // Sui does not return a bill_id from the tx response easily —\n // the frontend will pick it up on the next query refresh.\n setBillId?.('')\n } catch (error: any) {\n console.error('[SUI DEBUG] Error during Sui bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleZapCallback = async () => {\n if (loadingTx || !suiAccount || !bondData || !aftermathQuote || !signAndExecuteTransaction) return\n\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n try {\n setLoadingTx(true)\n const suiClient = getSuiClient()\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6\n const depositAmountAtomic = new BigNumber(zapDepositAmount)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n // TX1: Acquire principal tokens\n if (IS_SUI_MAINNET) {\n // Mainnet: swap via Aftermath DEX aggregator\n const txResponse = await axios.post(AFTERMATH_TX_API_URL, {\n walletAddress: suiAccount,\n completeRoute: aftermathQuote,\n slippage: slippage / 100,\n })\n\n const swapTxBytes = txResponse.data\n if (!swapTxBytes) throw new Error('Aftermath returned no transaction data')\n\n const swapTx = Transaction.from(swapTxBytes)\n const swapResponse = await signAndExecuteTransaction({ transaction: swapTx })\n const swapDigest = swapResponse?.digest\n if (!swapDigest) throw new Error('No tx digest returned for swap')\n await suiClient.waitForTransaction({ digest: swapDigest })\n } else {\n // Testnet: mint principal tokens via test_principal_token::mint\n // No DEX aggregator supports Sui testnet or custom test tokens.\n const mintTx = new Transaction()\n mintTx.moveCall({\n target: SUI_MINT_PRINCIPAL_FUNCTION,\n arguments: [\n mintTx.object(SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET),\n mintTx.pure.u64(depositAmountAtomic),\n mintTx.pure.address(suiAccount),\n ],\n })\n\n mintTx.setSender(suiAccount)\n mintTx.setGasBudget(50_000_000)\n const builtMint = await mintTx.build({ client: suiClient })\n const prebuiltMint = Transaction.from(builtMint)\n\n const mintResponse = await signAndExecuteTransaction({ transaction: prebuiltMint })\n const mintDigest = mintResponse?.digest\n if (!mintDigest) throw new Error('No tx digest returned for testnet mint')\n await suiClient.waitForTransaction({ digest: mintDigest })\n }\n\n // TX2: Deposit into bond with principal tokens\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const isPrincipalNativeSui = principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(depositAmountAtomic)])\n } else {\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found after swap`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(depositAmountAtomic)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [\n tx.pure.u64(depositAmountAtomic),\n ])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const builtDeposit = await tx.build({ client: suiClient })\n const prebuiltDeposit = Transaction.from(builtDeposit)\n\n const depositResponse = await signAndExecuteTransaction({ transaction: prebuiltDeposit })\n const depositDigest = depositResponse?.digest\n if (!depositDigest) throw new Error('No tx digest returned for deposit')\n await suiClient.waitForTransaction({ digest: depositDigest })\n await verifySuiTxSuccess(depositDigest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui indexer lag — schedule delayed re-invalidations for user bonds\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bond',\n token1: getSymbol(inputToken, bondData?.chainId),\n token2: bondData?.lpToken.symbol ?? '',\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(depositDigest, bondChain as ChainId)\n setBillId?.('')\n } catch (error: any) {\n console.error('Error during Sui zap bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiZapBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleBuy = () => {\n if (loadingTx) return\n if (isZap) {\n handleZapCallback()\n } else {\n handleBuyCallback()\n }\n }\n\n // Sync inputTokenString when bondData loads after initial render\n useEffect(() => {\n const addr = bondData?.lpToken?.address?.[bondData?.chainId]\n if (addr && !inputTokenString) {\n setInputTokenString(addr)\n }\n }, [bondData?.lpToken?.address, bondData?.chainId]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select highest balance token when zap list loads\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0]?.token === 'NATIVE' ? 'NATIVE' : sortedZapList[0]?.token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n const hasPositiveBonus = (trueBondPriceData?.bonusWithFee ?? 0) > 0\n\n const canBuy =\n !load &&\n !!suiAccount &&\n !bondData?.soldOut &&\n !!inputValue &&\n parseFloat(inputValue) > 0 &&\n !exceedsRealMaxBuy &&\n !exceedsBalance &&\n hasPositiveBonus &&\n !SDKConfig.blockSales &&\n !zapError &&\n !(isZap && !aftermathQuote)\n\n return bondData ? (\n <Flex className=\"modal-content\" sx={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}>\n <Flex className=\"modaltable-container\">\n <BondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex sx={{ width: '100%', display: isProjectView ? ['flex', 'flex', 'flex', 'none'] : 'flex' }}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZap}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={ChainId.SUI}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance ?? undefined}\n selectedTokenPrice={inputTokenPrice}\n />\n {bondData?.warningCard && (\n <Flex\n sx={{\n width: '100%',\n background: '#DE62F366',\n justifyContent: 'center',\n mt: '10px',\n borderRadius: 'normal',\n p: '2px 10px',\n }}\n >\n <Text sx={{ fontSize: '12px', fontWeight: 400, display: 'flex', alignItems: 'center', gap: '10px' }}>\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container\">\n <Flex className=\"button-container buy\">\n {!suiAccount ? (\n <Button\n className=\"action-button\"\n onClick={() => {\n // Sui dapp-kit ConnectModal is managed by the provider —\n // consumers should wrap the app in SuiWalletProvider.\n // This button is a fallback prompt.\n }}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n Connect to Sui\n </Button>\n ) : (\n <Button\n className=\"action-button\"\n load={load}\n disabled={!canBuy}\n onClick={handleBuy}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : zapError\n ? 'Swap quote failed'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Insufficient balance'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : 'buy'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default BuyComponentSui\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,MAAM,eAAe,GAAmC,CAAC,EACvD,SAAS,EACT,WAAW,EACX,SAAS,EACT,aAAa,EACb,SAAS,GACV,KAAI;AACH,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;;IAGpC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAE,GAAG,aAAa,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE;IACtC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE;IACtD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAA;AAE/C,IAAA,MAAM,QAAQ,GAA0B,KAAK,EAAE,IAAI,CACjD,CAAC,IAAI,KAAK,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,CAC/F;;IAGD,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC;;IAGjF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;;AAGjD,IAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC9F,IAAA,MAAM,gBAAgB,GAAG,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC;;IAExE,MAAM,oBAAoB,GAAG,eAAe;AAC5C,IAAA,MAAM,yBAAyB,GAC7B,CAAC,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,EAAE,WAAW,EAAE,KAAK,oBAAoB,CAAC,WAAW,EAAE;QACxG,gBAAgB,EAAE,WAAW,EAAE,KAAK,oBAAoB,CAAC,WAAW,EAAE;AACxE,IAAA,MAAM,KAAK,GACT,CAAC,CAAC,gBAAgB;AAClB,QAAA,CAAC,CAAC,gBAAgB;AAClB,QAAA,CAAC,yBAAyB;QAC1B,gBAAgB,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,WAAW,EAAE;;IAGnE,MAAM,WAAW,GAAG,eAAe,CACjC,UAAU,IAAI,UAAU,KAAK;UACzB,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG;UACjC,UAAU,KAAK;AACf,cAAE;cACA,SAAS,CAChB;IACD,MAAM,CAAC,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,cAAc,CACnF,UAAU,EACV,WAAW,EACX,QAAQ,EACR,UAAU,IAAI,SAAS,EACvB,QAAQ,CACT;;AAGD,IAAA,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AACnG,IAAA,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAChD,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK;AACxC,UAAE,IAAI,CAAC,KAAK,KAAK;AACjB,UAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE;YAC3D,UAAU,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE,CAC/D;AACD,IAAA,MAAM,oBAAoB,GAAG,iBAAiB,EAAE,OAAO;AACvD,IAAA,MAAM,eAAe,GAAG,iBAAiB,EAAE,KAAK;;IAGhD,MAAM,aAAa,GAAG,KAAK,GAAG,gBAAgB,GAAG,UAAU;AAC3D,IAAA,MAAM,cAAc,GAAG,CAAA,EAAG,cAAc,CAAC,UAAU,CAAC,CAAA,CAAA,EAAI,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,eAAe,CACpH,CAAC,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,CACpE,EAAE;IAEH,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;AACtG,IAAA,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK;SAChD,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,MAAM;SAC5B,GAAG,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;AACrD,IAAA,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;IAEhF,MAAM,IAAI,GAAG,SAAS,KAAK,gBAAgB,IAAI,CAAC,CAAC,UAAU,CAAC;;AAG5D,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,aAAqB,KAAI;QACjE,aAAa,CAAC,EAAE,CAAC;QACjB,mBAAmB,CAAC,aAAa,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC;IAEN,MAAM,eAAe,GAAG,MAAK;QAC3B,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,oBAAoB,IAAI,GAAG,CAAC;AAC1D,QAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC;QAC/E,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC;AAErE,QAAA,MAAM,uBAAuB,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;AAClF,QAAA,IAAI,uBAAuB,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE;AACrD,YAAA,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;AACrF,YAAA,aAAa,CAAC,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC7E;aAAO;YACL,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnD;AACF,IAAA,CAAC;AAED,IAAA,MAAM,iBAAiB,GAAG,YAAW;QACnC,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,CAAC,yBAAyB;YAAE;AAC3E,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;gBACJ,GAAG,EAAE,QAAQ,EAAE,QAAQ;AACvB,gBAAA,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM;gBAChC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AACvD,aAAA;AACF,SAAA,CAAC;AACF,QAAA,IAAI;YACF,YAAY,CAAC,IAAI,CAAC;AAElB,YAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1E,YAAA,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,UAAU;iBAC1C,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC9C,iBAAA,YAAY,CAAC,SAAS,CAAC,WAAW;iBAClC,OAAO,CAAC,CAAC,CAAC;AAEb,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe;;AAG5E,YAAA,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE;iBAC3D,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC;AACnC,iBAAA,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC;AAC5B,iBAAA,YAAY,CAAC,SAAS,CAAC,UAAU;iBACjC,OAAO,CAAC,CAAC,CAAC;AACb,YAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;AACpE,YAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnE,YAAA,IAAI,CAAC,iBAAiB,IAAI,CAAC,cAAc;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;;AAGrF,YAAA,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE;AAC5B,YAAA,MAAM,oBAAoB,GACxB,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,WAAW,EAAE,KAAK,oBAAoB,CAAC,WAAW,EAAE;AAE9F,YAAA,IAAI,aAAa;YACjB,IAAI,oBAAoB,EAAE;gBACxB;gBAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACvE;iBAAO;AACL,gBAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,gBAAA,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAC9F,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAA,sBAAA,CAAwB,CAAC;gBAClG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC/E,oBAAA,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;oBAC3B,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;gBACxE;qBAAO;oBACL;AAAC,oBAAA,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC1G;YACF;YAEA,EAAE,CAAC,QAAQ,CAAC;AACV,gBAAA,MAAM,EAAE,oBAAoB;AAC5B,gBAAA,aAAa,EAAE,CAAC,cAAc,EAAE,iBAAiB,CAAC;AAClD,gBAAA,SAAS,EAAE;AACT,oBAAA,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;AACjB,oBAAA,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AACvB,oBAAA,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBAChC,aAAa;AACb,oBAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;AAC3B,oBAAA,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC3B,oBAAA,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;AACjB,iBAAA;AACF,aAAA,CAAC;;;;AAKF,YAAA,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,YAAA,EAAE,CAAC,YAAY,CAAC,QAAU,CAAC,CAAA;AAC3B,YAAA,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC;YAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/C,YAAA,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;AAC/C,gBAAA,WAAW,EAAE,UAAU;AACxB,aAAA,CAAC;AAEF,YAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM;AAC/B,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;AAE/D,YAAA,MAAM,SAAS,GAAG,YAAY,EAAE;YAChC,MAAM,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;AAC9C,YAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC;;AAGhC,YAAA,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;;;;YAK1E,UAAU,CAAC,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;YAC5F,UAAU,CAAC,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAE5F,YAAA,KAAK,CAAC;AACJ,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,IAAI,EAAE;AACJ,oBAAA,GAAG,EAAE,QAAQ;AACb,oBAAA,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE;AAC9B,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;AAC9C,oBAAA,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;AAC3C,oBAAA,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC;oBAC/B,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AAC3D,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,eAAe,CAAC,MAAM,EAAE,SAAoB,CAAC;;;AAG7C,YAAA,SAAS,GAAG,EAAE,CAAC;QACjB;QAAE,OAAO,KAAU,EAAE;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC;AACnE,YAAA,aAAa,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC;AAChD,YAAA,WAAW,CAAC;AACV,gBAAA,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK;gBAC9B,KAAK,EAAE,KAAK,EAAE,OAAO;gBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;AACxD,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,OAAO,EAAE,UAAU;AACpB,aAAA,CAAC;QACJ;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,iBAAiB,GAAG,YAAW;AACnC,QAAA,IAAI,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,IAAI,CAAC,yBAAyB;YAAE;AAE5F,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;gBACJ,GAAG,EAAE,QAAQ,EAAE,QAAQ;AACvB,gBAAA,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM;gBAChC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AACvD,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,IAAI;YACF,YAAY,CAAC,IAAI,CAAC;AAClB,YAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,YAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1E,YAAA,MAAM,mBAAmB,GAAG,IAAI,SAAS,CAAC,gBAAgB;iBACvD,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC9C,iBAAA,YAAY,CAAC,SAAS,CAAC,WAAW;iBAClC,OAAO,CAAC,CAAC,CAAC;;YAGb,IAAI,cAAc,EAAE;;gBAElB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE;AACxD,oBAAA,aAAa,EAAE,UAAU;AACzB,oBAAA,aAAa,EAAE,cAAc;oBAC7B,QAAQ,EAAE,QAAQ,GAAG,GAAG;AACzB,iBAAA,CAAC;AAEF,gBAAA,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI;AACnC,gBAAA,IAAI,CAAC,WAAW;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;gBAE3E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC5C,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC7E,gBAAA,MAAM,UAAU,GAAG,YAAY,EAAE,MAAM;AACvC,gBAAA,IAAI,CAAC,UAAU;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;gBAClE,MAAM,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D;iBAAO;;;AAGL,gBAAA,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE;gBAChC,MAAM,CAAC,QAAQ,CAAC;AACd,oBAAA,MAAM,EAAE,2BAA2B;AACnC,oBAAA,SAAS,EAAE;AACT,wBAAA,MAAM,CAAC,MAAM,CAAC,iCAAiC,CAAC;AAChD,wBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACpC,wBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAChC,qBAAA;AACF,iBAAA,CAAC;AAEF,gBAAA,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,gBAAA,MAAM,CAAC,YAAY,CAAC,QAAU,CAAC;AAC/B,gBAAA,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC3D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;gBAEhD,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACnF,gBAAA,MAAM,UAAU,GAAG,YAAY,EAAE,MAAM;AACvC,gBAAA,IAAI,CAAC,UAAU;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;gBAC1E,MAAM,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D;;AAGA,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe;;AAG5E,YAAA,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE;iBAC3D,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC;AACnC,iBAAA,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC;AAC5B,iBAAA,YAAY,CAAC,SAAS,CAAC,UAAU;iBACjC,OAAO,CAAC,CAAC,CAAC;AAEb,YAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;AACpE,YAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnE,YAAA,IAAI,CAAC,iBAAiB,IAAI,CAAC,cAAc;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;AAErF,YAAA,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE;YAC5B,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,oBAAoB,CAAC,WAAW,EAAE;AAEnG,YAAA,IAAI,aAAa;YACjB,IAAI,oBAAoB,EAAE;gBACxB;gBAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC9E;iBAAO;AACL,gBAAA,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAC9F,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAA,uBAAA,CAAyB,CAAC;gBACnG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC/E,oBAAA,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;oBAC3B,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC/E;qBAAO;oBACL;oBAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;AAC1E,wBAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACjC,qBAAA,CAAC;gBACJ;YACF;YAEA,EAAE,CAAC,QAAQ,CAAC;AACV,gBAAA,MAAM,EAAE,oBAAoB;AAC5B,gBAAA,aAAa,EAAE,CAAC,cAAc,EAAE,iBAAiB,CAAC;AAClD,gBAAA,SAAS,EAAE;AACT,oBAAA,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;AACjB,oBAAA,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AACvB,oBAAA,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBAChC,aAAa;AACb,oBAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;AAC3B,oBAAA,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC3B,oBAAA,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;AACjB,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,YAAA,EAAE,CAAC,YAAY,CAAC,QAAU,CAAC;AAC3B,YAAA,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC1D,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;YAEtD,MAAM,eAAe,GAAG,MAAM,yBAAyB,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACzF,YAAA,MAAM,aAAa,GAAG,eAAe,EAAE,MAAM;AAC7C,YAAA,IAAI,CAAC,aAAa;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;YACxE,MAAM,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAC7D,YAAA,MAAM,kBAAkB,CAAC,aAAa,CAAC;;AAGvC,YAAA,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;;YAG1E,UAAU,CAAC,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;YAC5F,UAAU,CAAC,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAE5F,YAAA,KAAK,CAAC;AACJ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,IAAI,EAAE;AACJ,oBAAA,GAAG,EAAE,MAAM;oBACX,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC;AAChD,oBAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;oBACtC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AACxD,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,KAAK,CAAC;AACJ,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,IAAI,EAAE;AACJ,oBAAA,GAAG,EAAE,QAAQ;AACb,oBAAA,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE;AAC9B,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;AAC9C,oBAAA,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;AAC3C,oBAAA,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC;oBAC/B,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AAC3D,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,eAAe,CAAC,aAAa,EAAE,SAAoB,CAAC;AACpD,YAAA,SAAS,GAAG,EAAE,CAAC;QACjB;QAAE,OAAO,KAAU,EAAE;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;AAC3D,YAAA,aAAa,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC;AAChD,YAAA,WAAW,CAAC;AACV,gBAAA,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK;gBAC9B,KAAK,EAAE,KAAK,EAAE,OAAO;gBACrB,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;AAC3D,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,OAAO,EAAE,UAAU;AACpB,aAAA,CAAC;QACJ;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;AACrB,QAAA,IAAI,SAAS;YAAE;QACf,IAAI,KAAK,EAAE;AACT,YAAA,iBAAiB,EAAE;QACrB;aAAO;AACL,YAAA,iBAAiB,EAAE;QACrB;AACF,IAAA,CAAC;;IAGD,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,IAAI,GAAG,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC;AAC5D,QAAA,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAC7B,mBAAmB,CAAC,IAAI,CAAC;QAC3B;AACF,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;;IAGnD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnD,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,cAAc,IAAI,CAAC,UAAU,EAAE;YACjC,IAAI,UAAU,CAAC,oBAAoB,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE;AACpD,gBAAA,mBAAmB,CACjB,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,SAAoB,CAAC,CACxG;YACH;YACA,aAAa,CAAC,IAAI,CAAC;QACrB;;AAEF,IAAA,CAAC,EAAE,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAE1C,MAAM,gBAAgB,GAAG,CAAC,iBAAiB,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC;IAEnE,MAAM,MAAM,GACV,CAAC,IAAI;AACL,QAAA,CAAC,CAAC,UAAU;QACZ,CAAC,QAAQ,EAAE,OAAO;AAClB,QAAA,CAAC,CAAC,UAAU;AACZ,QAAA,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;AAC1B,QAAA,CAAC,iBAAiB;AAClB,QAAA,CAAC,cAAc;QACf,gBAAgB;QAChB,CAAC,SAAS,CAAC,UAAU;AACrB,QAAA,CAAC,QAAQ;AACT,QAAA,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC;IAE7B,OAAO,QAAQ,IACbA,GAAA,CAAC,IAAI,IAAC,SAAS,EAAC,eAAe,EAAC,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,QAAQ,EAAE,iBAAsC,CAAC,EAAE,YAC/GC,IAAA,CAAC,IAAI,IAAC,SAAS,EAAC,sBAAsB,EAAA,QAAA,EAAA,CACpCD,GAAA,CAAC,eAAe,EAAA,EAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAI,EAC7DA,GAAA,CAAC,kBAAkB,EAAA,EAAC,WAAW,EAAE,QAAQ,CAAC,gBAAgB,EAAE,aAAa,EAAA,IAAA,EAAA,CAAG,EAC5EA,GAAA,CAAC,IAAI,IAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,YAC7FA,GAAA,CAAC,SAAS,IAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,IAAI,CAAC,iBAAiB,EAAA,CAAI,EAAA,CACpF,EACPA,GAAA,CAAC,WAAW,IACV,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,QAAQ,EAAE,QAAQ,EAAA,CAClB,EACFA,IAAC,kBAAkB,EAAA,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,eAAe,EAC/B,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,EACxB,SAAS,EAAE,IAAI,EACf,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EACrC,YAAY,EAAE,oBAAoB,IAAI,SAAS,EAC/C,kBAAkB,EAAE,eAAe,GACnC,EACD,QAAQ,EAAE,WAAW,KACpBA,GAAA,CAAC,IAAI,EAAA,EACH,EAAE,EAAE;AACF,wBAAA,KAAK,EAAE,MAAM;AACb,wBAAA,UAAU,EAAE,WAAW;AACvB,wBAAA,cAAc,EAAE,QAAQ;AACxB,wBAAA,EAAE,EAAE,MAAM;AACV,wBAAA,YAAY,EAAE,QAAQ;AACtB,wBAAA,CAAC,EAAE,UAAU;AACd,qBAAA,EAAA,QAAA,EAEDA,GAAA,CAAC,IAAI,EAAA,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAA,QAAA,EACjGA,IAAC,iBAAiB,EAAA,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAA,CAAI,EAAA,CAC7C,EAAA,CACF,CACR,EACDA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACrDA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,sBAAsB,EAAA,QAAA,EACnC,CAAC,UAAU,IACVA,GAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAC,eAAe,EACzB,OAAO,EAAE,MAAK;;;;AAId,4BAAA,CAAC,EACD,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAA,QAAA,EAAA,gBAAA,EAAA,CAG1D,KAETA,GAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAC,eAAe,EACzB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,MAAM,EACjB,OAAO,EAAE,SAAS,EAClB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAA,QAAA,EAEhE,SAAS,CAAC;AACT,kCAAE;AACF,kCAAE;AACA,sCAAE;AACF,sCAAE;AACA,0CAAE;AACF,0CAAE;AACA,8CAAE;8CACA,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK;AAC1C,kDAAE;AACF,kDAAE,KAAK,EAAA,CACV,CACV,GACI,EAAA,CACF,CAAA,EAAA,CACF,EAAA,CACF,KAEPA,GAAA,CAAAE,QAAA,EAAA,EAAA,CAAK,CACN;AACH;;;;"}
1
+ {"version":3,"file":"BuyComponentSui.js","sources":["../../../src/views/BuyBond/BuyComponentSui.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react'\nimport BigNumber from 'bignumber.js'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport useSuiZapQuote, { AFTERMATH_TX_API_URL } from '../../state/zap/useSuiZapQuote'\nimport { findSuiZapToken } from '../../config/constants/suiZapTokens'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { usePopups } from '../../state/popups/usePopups'\nimport { useSlippage } from '../../state/slippage/useSlippage'\nimport { BondsData } from '../../types/bonds'\nimport { formatUSDNumber, getMaxBuy, getPayoutAmount, getPrincipalAmount } from '../../utils/displayHelpers'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { reportError } from '../../utils/reportError'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport { getSymbol } from '../../utils/getNativeTicker'\n\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport BondModalHeader from './components/BondModalHeader'\nimport BondCards from './components/BondCards/BondCards'\nimport Estimations from './components/Estimations'\nimport ProjectDescription from './components/ProjectDescription'\n\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\n\nimport {\n SUI_DEPOSIT_FUNCTION,\n SUI_BOND_MARKET,\n SUI_TREASURY,\n SUI_BOND_NFT_REGISTRY,\n IS_SUI_MAINNET,\n SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET,\n SUI_MINT_PRINCIPAL_FUNCTION,\n} from '../../constants/suiConstants'\nimport { getSuiClient, readFreshTrueBondPrice, verifySuiTxSuccess } from '../../utils/suiHelpers'\nimport { MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\n\nexport interface BuyComponentSuiProps {\n onDismiss?: () => void\n bondAddress?: string\n bondChain?: number\n setBillId?: (id: string) => void\n isProjectView?: boolean\n}\n\nconst BuyComponentSui: React.FC<BuyComponentSuiProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n isProjectView,\n setBillId,\n}) => {\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n\n // Hooks\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { data: bonds } = useBondsData()\n const { addToastError, addToastSuccess } = usePopups()\n const { solSlippage: slippage } = useSlippage() // reuse Sol slippage bucket for Sui\n\n const bondData: BondsData | undefined = bonds?.find(\n (bond) => bond?.contractAddress?.[bond?.chainId]?.toLowerCase() === bondAddress?.toLowerCase(),\n )\n\n // Derived pricing (same path the Solana no-tier branch uses).\n const trueBondPriceData = findHighestTrueBondPrice('0', bondData?.trueBondPrices)\n\n // State\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData?.chainId])\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Token selection — reuses the same infrastructure as Solana\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const principalAddress = bondData?.lpToken?.address?.[bondData?.chainId]\n // Detect zap: selected token differs from the bond principal\n const SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\n const isNativeMatchingPrincipal =\n (inputTokenString === 'NATIVE' || inputTokenString?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()) &&\n principalAddress?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n const isZap =\n !!inputTokenString &&\n !!principalAddress &&\n !isNativeMatchingPrincipal &&\n inputTokenString.toLowerCase() !== principalAddress.toLowerCase()\n\n // Zap quote from Aftermath DEX aggregator\n const suiZapToken = findSuiZapToken(\n inputToken && inputToken !== 'NATIVE'\n ? inputToken?.address?.[ChainId.SUI]\n : inputToken === 'NATIVE'\n ? '0x2::sui::SUI'\n : undefined,\n )\n const [fetchingZapQuote, aftermathQuote, zapDepositAmount, zapError] = useSuiZapQuote(\n inputValue,\n suiZapToken,\n bondData,\n suiAccount ?? undefined,\n slippage,\n )\n\n // Sorted zap list (balances + prices)\n const { sortedZapList, isFetched: zapListFetched } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n const inputTokenPrice = enrichedTokenData?.price\n\n // Estimations — use zapDepositAmount if swapping\n const depositAmount = isZap ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = $${formatUSDNumber(\n (parseFloat(inputValue || '0') * (inputTokenPrice ?? 0)).toString(),\n )}`\n\n const exceedsRealMaxBuy = getMaxBuy(bondData, true).lte(getPayoutAmount(bondData, depositAmount, '0'))\n const exceedsSafeMaxBuy = getMaxBuy(bondData, false)\n .times(isZap ? 0.995 : 0.9995)\n .lte(getPayoutAmount(bondData, depositAmount, '0'))\n\n const exceedsBalance = new BigNumber(inputCurrencyBalance ?? '0').lt(inputValue)\n\n const load = loadingTx || (fetchingZapQuote && !!inputValue)\n\n // Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = () => {\n const balance = new BigNumber(inputCurrencyBalance ?? '0')\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 9\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), '0')\n if (maxPossibleUserPurchase > maxBuyAmount.toNumber()) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0')\n setInputValue(new BigNumber(principalForMaxBuy).toFixed(principalDecimals))\n } else {\n setInputValue(balance.toFixed(principalDecimals))\n }\n }\n\n const handleBuyCallback = async () => {\n if (!suiAccount || !bondData || !inputValue || !signAndExecuteTransaction) return\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n setLoadingTx(true)\n\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 9\n const atomicAmount = new BigNumber(inputValue)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache after previous purchases\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n // Build Sui transaction\n const tx = new Transaction()\n const isPrincipalNativeSui =\n !principalCoinType || principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(atomicAmount)])\n } else {\n const suiClient = getSuiClient()\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found in wallet`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(atomicAmount)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [tx.pure.u64(atomicAmount)])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n // Pre-build the transaction so the wallet receives fully-resolved bytes.\n // Some wallets (e.g. Phantom) fail with \"Unexpected error\" when they have\n // to build/simulate a Transaction object themselves.\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000) // 0.05 SUI — generous for a bond deposit\n const builtBytes = await tx.build({ client: getSuiClient() })\n const prebuiltTx = Transaction.from(builtBytes)\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n const suiClient = getSuiClient()\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui's indexer has a short lag — getOwnedObjects may not return the\n // new BondNFT immediately. Schedule re-invalidations so the Your Bonds\n // view picks up the new bond once the indexer catches up.\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(digest, bondChain as ChainId)\n // Sui does not return a bill_id from the tx response easily —\n // the frontend will pick it up on the next query refresh.\n setBillId?.('')\n } catch (error: any) {\n console.error('[SUI DEBUG] Error during Sui bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleZapCallback = async () => {\n if (loadingTx || !suiAccount || !bondData || !aftermathQuote || !signAndExecuteTransaction) return\n\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n try {\n setLoadingTx(true)\n const suiClient = getSuiClient()\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6\n const depositAmountAtomic = new BigNumber(zapDepositAmount)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n // TX1: Acquire principal tokens\n if (IS_SUI_MAINNET) {\n // Mainnet: swap via Aftermath DEX aggregator\n const txResponse = await axios.post(AFTERMATH_TX_API_URL, {\n walletAddress: suiAccount,\n completeRoute: aftermathQuote,\n slippage: slippage / 100,\n })\n\n const swapTxBytes = txResponse.data\n if (!swapTxBytes) throw new Error('Aftermath returned no transaction data')\n\n const swapTx = Transaction.from(swapTxBytes)\n const swapResponse = await signAndExecuteTransaction({ transaction: swapTx })\n const swapDigest = swapResponse?.digest\n if (!swapDigest) throw new Error('No tx digest returned for swap')\n await suiClient.waitForTransaction({ digest: swapDigest })\n } else {\n // Testnet: mint principal tokens via test_principal_token::mint\n // No DEX aggregator supports Sui testnet or custom test tokens.\n const mintTx = new Transaction()\n mintTx.moveCall({\n target: SUI_MINT_PRINCIPAL_FUNCTION,\n arguments: [\n mintTx.object(SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET),\n mintTx.pure.u64(depositAmountAtomic),\n mintTx.pure.address(suiAccount),\n ],\n })\n\n mintTx.setSender(suiAccount)\n mintTx.setGasBudget(50_000_000)\n const builtMint = await mintTx.build({ client: suiClient })\n const prebuiltMint = Transaction.from(builtMint)\n\n const mintResponse = await signAndExecuteTransaction({ transaction: prebuiltMint })\n const mintDigest = mintResponse?.digest\n if (!mintDigest) throw new Error('No tx digest returned for testnet mint')\n await suiClient.waitForTransaction({ digest: mintDigest })\n }\n\n // TX2: Deposit into bond with principal tokens\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const isPrincipalNativeSui = principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(depositAmountAtomic)])\n } else {\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found after swap`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(depositAmountAtomic)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [\n tx.pure.u64(depositAmountAtomic),\n ])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const builtDeposit = await tx.build({ client: suiClient })\n const prebuiltDeposit = Transaction.from(builtDeposit)\n\n const depositResponse = await signAndExecuteTransaction({ transaction: prebuiltDeposit })\n const depositDigest = depositResponse?.digest\n if (!depositDigest) throw new Error('No tx digest returned for deposit')\n await suiClient.waitForTransaction({ digest: depositDigest })\n await verifySuiTxSuccess(depositDigest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui indexer lag — schedule delayed re-invalidations for user bonds\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bond',\n token1: getSymbol(inputToken, bondData?.chainId),\n token2: bondData?.lpToken.symbol ?? '',\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(depositDigest, bondChain as ChainId)\n setBillId?.('')\n } catch (error: any) {\n console.error('Error during Sui zap bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiZapBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleBuy = () => {\n if (loadingTx) return\n if (isZap) {\n handleZapCallback()\n } else {\n handleBuyCallback()\n }\n }\n\n // Sync inputTokenString when bondData loads after initial render\n useEffect(() => {\n const addr = bondData?.lpToken?.address?.[bondData?.chainId]\n if (addr && !inputTokenString) {\n setInputTokenString(addr)\n }\n }, [bondData?.lpToken?.address, bondData?.chainId]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select highest balance token when zap list loads\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0]?.token === 'NATIVE' ? 'NATIVE' : sortedZapList[0]?.token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n const hasPositiveBonus = (trueBondPriceData?.bonusWithFee ?? 0) > 0\n\n const canBuy =\n !load &&\n !!suiAccount &&\n !bondData?.soldOut &&\n !!inputValue &&\n parseFloat(inputValue) > 0 &&\n !exceedsRealMaxBuy &&\n !exceedsBalance &&\n hasPositiveBonus &&\n !SDKConfig.blockSales &&\n !zapError &&\n !(isZap && !aftermathQuote)\n\n return bondData ? (\n <Flex className=\"modal-content\" sx={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}>\n <Flex className=\"modaltable-container\">\n <BondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex sx={{ width: '100%', display: isProjectView ? ['flex', 'flex', 'flex', 'none'] : 'flex' }}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZap}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={ChainId.SUI}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance ?? undefined}\n selectedTokenPrice={inputTokenPrice}\n />\n {bondData?.warningCard && (\n <Flex\n sx={{\n width: '100%',\n background: '#DE62F366',\n justifyContent: 'center',\n mt: '10px',\n borderRadius: 'normal',\n p: '2px 10px',\n }}\n >\n <Text sx={{ fontSize: '12px', fontWeight: 400, display: 'flex', alignItems: 'center', gap: '10px' }}>\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container\">\n <Flex className=\"button-container buy\">\n {!suiAccount ? (\n <Button\n className=\"action-button\"\n onClick={() => {\n // Sui dapp-kit ConnectModal is managed by the provider —\n // consumers should wrap the app in SuiWalletProvider.\n // This button is a fallback prompt.\n }}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n Connect to Sui\n </Button>\n ) : (\n <Button\n className=\"action-button\"\n load={load}\n disabled={!canBuy}\n onClick={handleBuy}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : zapError\n ? 'Swap quote failed'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Insufficient balance'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : 'buy'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default BuyComponentSui\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Ape Bond SDK",
4
4
  "author": "Ape Bond",
5
5
  "license": "MIT",
6
- "version": "5.1.49-test.1",
6
+ "version": "5.1.49-test.2",
7
7
  "module": "dist/main.js",
8
8
  "type": "module",
9
9
  "types": "dist/main.d.ts",