@ape.swap/bonds-sdk 6.2.28 → 7.0.0-test.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +205 -114
- package/dist/adapters/all/index.d.ts +13 -0
- package/dist/adapters/all/index.js +15 -0
- package/dist/adapters/all/index.js.map +1 -0
- package/dist/{views/YourBondsModal/components/Actions → adapters/aptos}/ActionsAptos.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/Actions → adapters/aptos}/ActionsAptos.js +11 -11
- package/dist/adapters/aptos/ActionsAptos.js.map +1 -0
- package/dist/adapters/aptos/AptosAccountBridge.d.ts +3 -0
- package/dist/adapters/aptos/AptosAccountBridge.js +12 -0
- package/dist/adapters/aptos/AptosAccountBridge.js.map +1 -0
- package/dist/{views/BuyBond → adapters/aptos}/BuyComponentAptos.js +8 -8
- package/dist/adapters/aptos/BuyComponentAptos.js.map +1 -0
- package/dist/adapters/aptos/ClaimAllActionAptos.d.ts +5 -0
- package/dist/adapters/aptos/ClaimAllActionAptos.js +73 -0
- package/dist/adapters/aptos/ClaimAllActionAptos.js.map +1 -0
- package/dist/{components/ConnectAptosWalletButton → adapters/aptos}/ConnectAptosWalletButton.js +2 -2
- package/dist/adapters/aptos/ConnectAptosWalletButton.js.map +1 -0
- package/dist/{components/ConnectoToVmBanners → adapters/aptos}/ConnectToAptosBanner.js +4 -4
- package/dist/adapters/aptos/ConnectToAptosBanner.js.map +1 -0
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/aptos}/TransferActionAptos.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/aptos}/TransferActionAptos.js +1 -1
- package/dist/adapters/aptos/TransferActionAptos.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/aptos}/UserBondRowAptos.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/aptos}/UserBondRowAptos.js +22 -22
- package/dist/adapters/aptos/UserBondRowAptos.js.map +1 -0
- package/dist/{utils → adapters/aptos}/aptosHelpers.d.ts +1 -1
- package/dist/{utils → adapters/aptos}/aptosHelpers.js +1 -1
- package/dist/adapters/aptos/aptosHelpers.js.map +1 -0
- package/dist/{state/bonds/fetchBondsData → adapters/aptos}/fetchBondsDataAptos.d.ts +2 -2
- package/dist/{state/bonds/fetchBondsData → adapters/aptos}/fetchBondsDataAptos.js +3 -3
- package/dist/adapters/aptos/fetchBondsDataAptos.js.map +1 -0
- package/dist/{state/bonds/fetchUsersBonds → adapters/aptos}/fetchUsersBondsAptos.d.ts +2 -2
- package/dist/{state/bonds/fetchUsersBonds → adapters/aptos}/fetchUsersBondsAptos.js +4 -4
- package/dist/adapters/aptos/fetchUsersBondsAptos.js.map +1 -0
- package/dist/adapters/aptos/index.d.ts +6 -0
- package/dist/adapters/aptos/index.js +37 -0
- package/dist/adapters/aptos/index.js.map +1 -0
- package/dist/{hooks/accounts → adapters/aptos}/useAPTAccount.js +1 -1
- package/dist/{hooks/accounts → adapters/aptos}/useAPTAccount.js.map +1 -1
- package/dist/adapters/aptos/useAptosZapQuote.js.map +1 -0
- package/dist/{state/balance → adapters/aptos}/useCurrencyBalanceAptos.js +1 -1
- package/dist/adapters/aptos/useCurrencyBalanceAptos.js.map +1 -0
- package/dist/{views/YourBondsModal/components/Actions → adapters/evm}/Actions.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/Actions → adapters/evm}/Actions.js +18 -18
- package/dist/adapters/evm/Actions.js.map +1 -0
- package/dist/adapters/evm/BuyComponent.d.ts +5 -0
- package/dist/{views/BuyBond → adapters/evm}/BuyComponent.js +44 -27
- package/dist/adapters/evm/BuyComponent.js.map +1 -0
- package/dist/adapters/evm/ClaimAllActionEVM.d.ts +5 -0
- package/dist/adapters/evm/ClaimAllActionEVM.js +60 -0
- package/dist/adapters/evm/ClaimAllActionEVM.js.map +1 -0
- package/dist/{components/ConnectoToVmBanners → adapters/evm}/ConnectToEvmBanner.js +3 -3
- package/dist/adapters/evm/ConnectToEvmBanner.js.map +1 -0
- package/dist/adapters/evm/EvmAccountBridge.d.ts +6 -0
- package/dist/adapters/evm/EvmAccountBridge.js +15 -0
- package/dist/adapters/evm/EvmAccountBridge.js.map +1 -0
- package/dist/{views/TransactionModal → adapters/evm}/TransactionModal.d.ts +1 -1
- package/dist/{views/TransactionModal → adapters/evm}/TransactionModal.js +5 -4
- package/dist/adapters/evm/TransactionModal.js.map +1 -0
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/evm}/TransferAction.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/evm}/TransferAction.js +8 -8
- package/dist/adapters/evm/TransferAction.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm}/UserBondRow.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm}/UserBondRow.js +27 -27
- package/dist/adapters/evm/UserBondRow.js.map +1 -0
- package/dist/adapters/evm/balances.d.ts +6 -0
- package/dist/adapters/evm/balances.js +61 -0
- package/dist/adapters/evm/balances.js.map +1 -0
- package/dist/{state/bonds/fetchBondsData → adapters/evm}/fetchBondsDataEVM.d.ts +2 -2
- package/dist/{state/bonds/fetchBondsData → adapters/evm}/fetchBondsDataEVM.js +8 -8
- package/dist/adapters/evm/fetchBondsDataEVM.js.map +1 -0
- package/dist/{state/bonds/fetchUsersBonds → adapters/evm}/fetchUsersBondsEVM.d.ts +2 -2
- package/dist/{state/bonds/fetchUsersBonds → adapters/evm}/fetchUsersBondsEVM.js +4 -4
- package/dist/adapters/evm/fetchUsersBondsEVM.js.map +1 -0
- package/dist/adapters/evm/getTierPoints.d.ts +3 -0
- package/dist/adapters/evm/getTierPoints.js +48 -0
- package/dist/adapters/evm/getTierPoints.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +6 -0
- package/dist/adapters/evm/index.js +53 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/{utils → adapters/evm}/multicall.js +3 -3
- package/dist/adapters/evm/multicall.js.map +1 -0
- package/dist/{views/BuyBond → adapters/evm/preTGE}/BuyComponentPreTGE.js +27 -27
- package/dist/adapters/evm/preTGE/BuyComponentPreTGE.js.map +1 -0
- package/dist/{views/Bonds/components/BondRows → adapters/evm/preTGE}/ModalHandlerPreTGE.js +4 -4
- package/dist/adapters/evm/preTGE/ModalHandlerPreTGE.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/PreTGEActions.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/PreTGEActions.js +9 -9
- package/dist/adapters/evm/preTGE/PreTGEActions.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/UserBondRowPreTGE.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/UserBondRowPreTGE.js +9 -9
- package/dist/adapters/evm/preTGE/UserBondRowPreTGE.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/UserBondRowYield.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/evm/preTGE}/UserBondRowYield.js +11 -11
- package/dist/adapters/evm/preTGE/UserBondRowYield.js.map +1 -0
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/YourBondsModalYield.d.ts +1 -1
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/YourBondsModalYield.js +22 -22
- package/dist/adapters/evm/preTGE/YourBondsModalYield/YourBondsModalYield.js.map +1 -0
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/components/UnstakeModalYield/UnstakeModalYield.d.ts +1 -1
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/components/UnstakeModalYield/UnstakeModalYield.js +10 -10
- package/dist/adapters/evm/preTGE/YourBondsModalYield/components/UnstakeModalYield/UnstakeModalYield.js.map +1 -0
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/components/YourBondModalHeader/YourBondModalHeader.d.ts +1 -1
- package/dist/{views → adapters/evm/preTGE}/YourBondsModalYield/components/YourBondModalHeader/YourBondModalHeader.js +5 -5
- package/dist/adapters/evm/preTGE/YourBondsModalYield/components/YourBondModalHeader/YourBondModalHeader.js.map +1 -0
- package/dist/{state/bonds/fetchBondsData → adapters/evm/preTGE}/fetchBondsDataPreTGE.d.ts +1 -1
- package/dist/{state/bonds/fetchBondsData → adapters/evm/preTGE}/fetchBondsDataPreTGE.js +1 -1
- package/dist/adapters/evm/preTGE/fetchBondsDataPreTGE.js.map +1 -0
- package/dist/adapters/evm/preTGE/fetchUserBondsPreTGE.d.ts +5 -0
- package/dist/adapters/evm/preTGE/fetchUserBondsPreTGE.js +204 -0
- package/dist/adapters/evm/preTGE/fetchUserBondsPreTGE.js.map +1 -0
- package/dist/{state/allowance → adapters/evm}/useAllowance.js +4 -4
- package/dist/adapters/evm/useAllowance.js.map +1 -0
- package/dist/adapters/evm/useEVMAccount.js.map +1 -0
- package/dist/{hooks → adapters/evm}/useMonitorTx.js +1 -1
- package/dist/adapters/evm/useMonitorTx.js.map +1 -0
- package/dist/{state/zap → adapters/evm}/useSoulZapBondQuote.js +5 -14
- package/dist/adapters/evm/useSoulZapBondQuote.js.map +1 -0
- package/dist/{state/bonds → adapters/evm}/useTierProofSignature.js +2 -2
- package/dist/adapters/evm/useTierProofSignature.js.map +1 -0
- package/dist/adapters/lifi/LifiModal.d.ts +4 -0
- package/dist/{views/LifiModal → adapters/lifi}/LifiModal.js +9 -5
- package/dist/adapters/lifi/LifiModal.js.map +1 -0
- package/dist/adapters/lifi/index.d.ts +6 -0
- package/dist/adapters/lifi/index.js +34 -0
- package/dist/adapters/lifi/index.js.map +1 -0
- package/dist/adapters/registry.d.ts +8 -0
- package/dist/adapters/registry.js +24 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/{views/YourBondsModal/components/Actions → adapters/solana}/ActionsSolana.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/Actions → adapters/solana}/ActionsSolana.js +13 -13
- package/dist/adapters/solana/ActionsSolana.js.map +1 -0
- package/dist/{views/BuyBond → adapters/solana}/BuyComponentSolana.js +18 -15
- package/dist/adapters/solana/BuyComponentSolana.js.map +1 -0
- package/dist/{components/ConnectSolanaWalletButton → adapters/solana}/ConnectSolanaWalletButton.js +2 -2
- package/dist/adapters/solana/ConnectSolanaWalletButton.js.map +1 -0
- package/dist/{components/ConnectoToVmBanners → adapters/solana}/ConnectToSolanaBanner.js +3 -3
- package/dist/adapters/solana/ConnectToSolanaBanner.js.map +1 -0
- package/dist/adapters/solana/SolanaAccountBridge.d.ts +3 -0
- package/dist/adapters/solana/SolanaAccountBridge.js +13 -0
- package/dist/adapters/solana/SolanaAccountBridge.js.map +1 -0
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/solana}/TransferActionSolana.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/solana}/TransferActionSolana.js +6 -6
- package/dist/adapters/solana/TransferActionSolana.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/solana}/UserBondRowSolana.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/solana}/UserBondRowSolana.js +23 -23
- package/dist/adapters/solana/UserBondRowSolana.js.map +1 -0
- package/dist/{utils → adapters/solana}/calculateSolanaTrueBillPrice.js +1 -1
- package/dist/adapters/solana/calculateSolanaTrueBillPrice.js.map +1 -0
- package/dist/{types → adapters/solana/codecs}/bondCodec.d.ts +2 -2
- package/dist/{types → adapters/solana/codecs}/bondCodec.js +2 -3
- package/dist/adapters/solana/codecs/bondCodec.js.map +1 -0
- package/dist/{types → adapters/solana/codecs}/bondIssuanceCodec.d.ts +2 -2
- package/dist/{types → adapters/solana/codecs}/bondIssuanceCodec.js +2 -3
- package/dist/adapters/solana/codecs/bondIssuanceCodec.js.map +1 -0
- package/dist/{types → adapters/solana/codecs}/bondPricingCodec.d.ts +1 -1
- package/dist/{types → adapters/solana/codecs}/bondPricingCodec.js +2 -2
- package/dist/adapters/solana/codecs/bondPricingCodec.js.map +1 -0
- package/dist/{types → adapters/solana/codecs}/bondTermCodec.d.ts +1 -1
- package/dist/{types → adapters/solana/codecs}/bondTermCodec.js +2 -2
- package/dist/adapters/solana/codecs/bondTermCodec.js.map +1 -0
- package/dist/adapters/solana/derivePda.js.map +1 -0
- package/dist/{state/bonds/fetchBondsData → adapters/solana}/fetchBondsDataSOL.d.ts +2 -2
- package/dist/{state/bonds/fetchBondsData → adapters/solana}/fetchBondsDataSOL.js +8 -8
- package/dist/adapters/solana/fetchBondsDataSOL.js.map +1 -0
- package/dist/{state/bonds/fetchUsersBonds → adapters/solana}/fetchUsersBondsSOL.d.ts +2 -2
- package/dist/{state/bonds/fetchUsersBonds → adapters/solana}/fetchUsersBondsSOL.js +5 -5
- package/dist/{state/bonds/fetchUsersBonds → adapters/solana}/fetchUsersBondsSOL.js.map +1 -1
- package/dist/{utils → adapters/solana}/getSolanaAccount.d.ts +1 -1
- package/dist/{utils → adapters/solana}/getSolanaAccount.js +4 -4
- package/dist/adapters/solana/getSolanaAccount.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +8 -0
- package/dist/adapters/solana/index.js +40 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/polyfills.d.ts +1 -0
- package/dist/adapters/solana/polyfills.js +7 -0
- package/dist/adapters/solana/polyfills.js.map +1 -0
- package/dist/adapters/solana/solanaAtaHelper.js.map +1 -0
- package/dist/{constants → adapters/solana}/solanaConstants.js +1 -1
- package/dist/adapters/solana/solanaConstants.js.map +1 -0
- package/dist/adapters/solana/solanaMulticall.js.map +1 -0
- package/dist/{utils → adapters/solana}/solanaRpc.js +2 -2
- package/dist/adapters/solana/solanaRpc.js.map +1 -0
- package/dist/{state/balance → adapters/solana}/useCurrencyBalanceSolana.d.ts +4 -0
- package/dist/{state/balance → adapters/solana}/useCurrencyBalanceSolana.js +9 -2
- package/dist/adapters/solana/useCurrencyBalanceSolana.js.map +1 -0
- package/dist/adapters/solana/useJupiterSolanaQuote.js.map +1 -0
- package/dist/adapters/solana/useSOLAccount.js.map +1 -0
- package/dist/{views/YourBondsModal/components/Actions → adapters/sui}/ActionsSui.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/Actions → adapters/sui}/ActionsSui.js +11 -11
- package/dist/adapters/sui/ActionsSui.js.map +1 -0
- package/dist/{views/BuyBond → adapters/sui}/BuyComponentSui.js +9 -9
- package/dist/adapters/sui/BuyComponentSui.js.map +1 -0
- package/dist/adapters/sui/ClaimAllActionSui.d.ts +5 -0
- package/dist/adapters/sui/ClaimAllActionSui.js +89 -0
- package/dist/adapters/sui/ClaimAllActionSui.js.map +1 -0
- package/dist/{components/ConnectoToVmBanners → adapters/sui}/ConnectToSuiBanner.js +4 -4
- package/dist/adapters/sui/ConnectToSuiBanner.js.map +1 -0
- package/dist/adapters/sui/SuiAccountBridge.d.ts +3 -0
- package/dist/adapters/sui/SuiAccountBridge.js +12 -0
- package/dist/adapters/sui/SuiAccountBridge.js.map +1 -0
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/sui}/TransferActionSui.d.ts +1 -1
- package/dist/{views/YourBondsModal/components/TransferBondModal → adapters/sui}/TransferActionSui.js +7 -7
- package/dist/adapters/sui/TransferActionSui.js.map +1 -0
- package/dist/{views/YourBonds/components/UserBondRow → adapters/sui}/UserBondRowSui.d.ts +1 -1
- package/dist/{views/YourBonds/components/UserBondRow → adapters/sui}/UserBondRowSui.js +22 -22
- package/dist/adapters/sui/UserBondRowSui.js.map +1 -0
- package/dist/{state/bonds/fetchBondsData → adapters/sui}/fetchBondsDataSui.d.ts +2 -2
- package/dist/{state/bonds/fetchBondsData → adapters/sui}/fetchBondsDataSui.js +3 -3
- package/dist/adapters/sui/fetchBondsDataSui.js.map +1 -0
- package/dist/{state/bonds/fetchUsersBonds → adapters/sui}/fetchUsersBondsSUI.d.ts +2 -2
- package/dist/{state/bonds/fetchUsersBonds → adapters/sui}/fetchUsersBondsSUI.js +4 -4
- package/dist/adapters/sui/fetchUsersBondsSUI.js.map +1 -0
- package/dist/adapters/sui/index.d.ts +6 -0
- package/dist/adapters/sui/index.js +37 -0
- package/dist/adapters/sui/index.js.map +1 -0
- package/dist/adapters/sui/suiConstants.js.map +1 -0
- package/dist/{utils → adapters/sui}/suiHelpers.js +1 -1
- package/dist/adapters/sui/suiHelpers.js.map +1 -0
- package/dist/adapters/sui/suiZapTokens.js.map +1 -0
- package/dist/{state/balance → adapters/sui}/useCurrencyBalanceSui.js +1 -1
- package/dist/adapters/sui/useCurrencyBalanceSui.js.map +1 -0
- package/dist/adapters/sui/useSUIAccount.js.map +1 -0
- package/dist/{state/zap → adapters/sui}/useSuiZapQuote.js +1 -1
- package/dist/adapters/sui/useSuiZapQuote.js.map +1 -0
- package/dist/adapters/types.d.ts +110 -0
- package/dist/components/TokenSelectorPanel/index.js +6 -16
- package/dist/components/TokenSelectorPanel/index.js.map +1 -1
- package/dist/config/constants/chains.d.ts +0 -2
- package/dist/config/constants/chains.js +0 -2
- package/dist/config/constants/chains.js.map +1 -1
- package/dist/config/constants/queryKeys.d.ts +1 -0
- package/dist/config/constants/queryKeys.js +1 -0
- package/dist/config/constants/queryKeys.js.map +1 -1
- package/dist/config/constants/variables.d.ts +0 -1
- package/dist/config/constants/variables.js +1 -19
- package/dist/config/constants/variables.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/providers/index.js +3 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/state/balance/useCurrencyBalance.js +3 -23
- package/dist/state/balance/useCurrencyBalance.js.map +1 -1
- package/dist/state/balance/useUserTokensBalance.js +8 -78
- package/dist/state/balance/useUserTokensBalance.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/{cleanBillsData.js → bondPricing.js} +1 -1
- package/dist/state/bonds/fetchBondsData/bondPricing.js.map +1 -0
- package/dist/state/bonds/useBondsData.js +23 -35
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/state/bonds/useUserBonds.d.ts +3 -1
- package/dist/state/bonds/useUserBonds.js +21 -33
- package/dist/state/bonds/useUserBonds.js.map +1 -1
- package/dist/state/bonds/useUserBondsPreTGE.d.ts +1 -2
- package/dist/state/bonds/useUserBondsPreTGE.js +7 -203
- package/dist/state/bonds/useUserBondsPreTGE.js.map +1 -1
- package/dist/state/chainAccount/useChainAccount.d.ts +13 -0
- package/dist/state/chainAccount/useChainAccount.js +30 -0
- package/dist/state/chainAccount/useChainAccount.js.map +1 -0
- package/dist/state/hotBonds/useHotBonds.js +1 -1
- package/dist/state/hotBonds/useHotBonds.js.map +1 -1
- package/dist/state/tiers/tiers.d.ts +66 -0
- package/dist/state/tiers/tiers.js +97 -0
- package/dist/state/tiers/tiers.js.map +1 -0
- package/dist/state/tiers/useTierPoints.d.ts +2 -66
- package/dist/state/tiers/useTierPoints.js +13 -145
- package/dist/state/tiers/useTierPoints.js.map +1 -1
- package/dist/state/useSDKConfig.d.ts +3 -0
- package/dist/state/useSDKConfig.js +53 -6
- package/dist/state/useSDKConfig.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/displayHelpers.js +1 -1
- package/dist/utils/displayHelpers.js.map +1 -1
- package/dist/views/Bonds/components/BondRows/BondRow.js +6 -2
- package/dist/views/Bonds/components/BondRows/BondRow.js.map +1 -1
- package/dist/views/Bonds/components/BondRows/ModalHandler.js +8 -35
- package/dist/views/Bonds/components/BondRows/ModalHandler.js.map +1 -1
- package/dist/views/Bonds/components/BonusComponents/BonusTable.js +2 -1
- package/dist/views/Bonds/components/BonusComponents/BonusTable.js.map +1 -1
- package/dist/views/Bonds/components/CheckURL/index.js +8 -4
- package/dist/views/Bonds/components/CheckURL/index.js.map +1 -1
- package/dist/views/Bonds/components/RecommendationCards/index.js +3 -3
- package/dist/views/Bonds/components/RecommendationCards/index.js.map +1 -1
- package/dist/views/Bonds/utils.js +1 -1
- package/dist/views/Bonds/utils.js.map +1 -1
- package/dist/views/BuyBond/BuyBondModal.js +2 -7
- package/dist/views/BuyBond/BuyBondModal.js.map +1 -1
- package/dist/views/BuyBond/ChainBuyComponent.d.ts +5 -0
- package/dist/views/BuyBond/ChainBuyComponent.js +11 -0
- package/dist/views/BuyBond/ChainBuyComponent.js.map +1 -0
- package/dist/views/BuyBond/components/BondModalHeader.js +2 -1
- package/dist/views/BuyBond/components/BondModalHeader.js.map +1 -1
- package/dist/views/BuyBond/components/BondModalMinTierHeader.js +1 -1
- package/dist/views/BuyBond/components/BondModalMinTierHeader.js.map +1 -1
- package/dist/views/BuyBond/components/Estimations.js +2 -1
- package/dist/views/BuyBond/components/Estimations.js.map +1 -1
- package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js +2 -1
- package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js.map +1 -1
- package/dist/views/BuyBond/index.d.ts +2 -2
- package/dist/views/BuyBond/index.js.map +1 -1
- package/dist/views/BuyBond/utils.js +1 -1
- package/dist/views/BuyBond/utils.js.map +1 -1
- package/dist/views/ProjectView/ProjectView.js +2 -2
- package/dist/views/ProjectView/ProjectView.js.map +1 -1
- package/dist/views/ProjectView/components/BondLeaderboard/components/SalesTable.js +2 -2
- package/dist/views/ProjectView/components/BondLeaderboard/components/SalesTable.js.map +1 -1
- package/dist/views/ProjectView/components/BondLeaderboard/components/TopSaleCard.js +2 -2
- package/dist/views/ProjectView/components/BondLeaderboard/components/TopSaleCard.js.map +1 -1
- package/dist/views/ProjectView/components/PriceChart/index.js +1 -1
- package/dist/views/ProjectView/components/PriceChart/index.js.map +1 -1
- package/dist/views/ProjectView/components/RecommendationCards/index.js +4 -4
- package/dist/views/ProjectView/components/RecommendationCards/index.js.map +1 -1
- package/dist/views/SingleBond/SingleBond.js +2 -2
- package/dist/views/SingleBond/SingleBond.js.map +1 -1
- package/dist/views/SingleBond/SoldOutBuyBondPlaceholder.js +4 -3
- package/dist/views/SingleBond/SoldOutBuyBondPlaceholder.js.map +1 -1
- package/dist/views/YourBonds/YourBonds.js +25 -28
- package/dist/views/YourBonds/YourBonds.js.map +1 -1
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js +8 -175
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js.map +1 -1
- package/dist/views/YourBonds/components/ClaimAll/index.js +4 -6
- package/dist/views/YourBonds/components/ClaimAll/index.js.map +1 -1
- package/dist/views/YourBondsModal/YourBondsModal.js +3 -5
- package/dist/views/YourBondsModal/YourBondsModal.js.map +1 -1
- package/dist/views/YourBondsModal/components/Recommendations/Recommendations.js +3 -3
- package/dist/views/YourBondsModal/components/Recommendations/Recommendations.js.map +1 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js +3 -6
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js.map +1 -1
- package/package.json +88 -5
- package/dist/components/ConnectAptosWalletButton/ConnectAptosWalletButton.js.map +0 -1
- package/dist/components/ConnectSolanaWalletButton/ConnectSolanaWalletButton.js.map +0 -1
- package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.js.map +0 -1
- package/dist/components/ConnectoToVmBanners/ConnectToEvmBanner.js.map +0 -1
- package/dist/components/ConnectoToVmBanners/ConnectToSolanaBanner.js.map +0 -1
- package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.js.map +0 -1
- package/dist/config/constants/suiZapTokens.js.map +0 -1
- package/dist/constants/solanaConstants.js.map +0 -1
- package/dist/constants/suiConstants.js.map +0 -1
- package/dist/hooks/accounts/useEVMAccount.js.map +0 -1
- package/dist/hooks/accounts/useSOLAccount.js.map +0 -1
- package/dist/hooks/accounts/useSUIAccount.js.map +0 -1
- package/dist/hooks/useMonitorTx.js.map +0 -1
- package/dist/providers/AptosWalletProvider.d.ts +0 -5
- package/dist/providers/SolanaWalletProvider.d.ts +0 -5
- package/dist/providers/SuiWalletProvider.d.ts +0 -5
- package/dist/state/allowance/useAllowance.js.map +0 -1
- package/dist/state/balance/useCurrencyBalanceAptos.js.map +0 -1
- package/dist/state/balance/useCurrencyBalanceSolana.js.map +0 -1
- package/dist/state/balance/useCurrencyBalanceSui.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/cleanBillsData.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataPreTGE.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js.map +0 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js.map +0 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.js.map +0 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js.map +0 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.js.map +0 -1
- package/dist/state/bonds/useTierProofSignature.js.map +0 -1
- package/dist/state/zap/useAptosZapQuote.js.map +0 -1
- package/dist/state/zap/useJupiterSolanaQuote.js.map +0 -1
- package/dist/state/zap/useSoulZapBondQuote.js.map +0 -1
- package/dist/state/zap/useSuiZapQuote.js.map +0 -1
- package/dist/types/bondCodec.js.map +0 -1
- package/dist/types/bondIssuanceCodec.js.map +0 -1
- package/dist/types/bondPricingCodec.js.map +0 -1
- package/dist/types/bondTermCodec.js.map +0 -1
- package/dist/utils/aptosHelpers.js.map +0 -1
- package/dist/utils/calculateSolanaTrueBillPrice.js.map +0 -1
- package/dist/utils/derivePda.js.map +0 -1
- package/dist/utils/getSolanaAccount.js.map +0 -1
- package/dist/utils/multicall.js.map +0 -1
- package/dist/utils/solanaAtaHelper.js.map +0 -1
- package/dist/utils/solanaMulticall.js.map +0 -1
- package/dist/utils/solanaRpc.js.map +0 -1
- package/dist/utils/suiHelpers.js.map +0 -1
- package/dist/views/Bonds/components/BondRows/ModalHandlerPreTGE.js.map +0 -1
- package/dist/views/BuyBond/BuyComponent.d.ts +0 -11
- package/dist/views/BuyBond/BuyComponent.js.map +0 -1
- package/dist/views/BuyBond/BuyComponentAptos.js.map +0 -1
- package/dist/views/BuyBond/BuyComponentPreTGE.js.map +0 -1
- package/dist/views/BuyBond/BuyComponentSolana.js.map +0 -1
- package/dist/views/BuyBond/BuyComponentSui.js.map +0 -1
- package/dist/views/LifiModal/LifiModal.d.ts +0 -6
- package/dist/views/LifiModal/LifiModal.js.map +0 -1
- package/dist/views/TransactionModal/TransactionModal.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/PreTGEActions.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRow.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowAptos.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowPreTGE.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSolana.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowYield.js.map +0 -1
- package/dist/views/YourBonds/components/UserBondRow/index.d.ts +0 -5
- package/dist/views/YourBondsModal/components/Actions/Actions.js.map +0 -1
- package/dist/views/YourBondsModal/components/Actions/ActionsAptos.js.map +0 -1
- package/dist/views/YourBondsModal/components/Actions/ActionsSolana.js.map +0 -1
- package/dist/views/YourBondsModal/components/Actions/ActionsSui.js.map +0 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferAction.js.map +0 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionAptos.js.map +0 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSolana.js.map +0 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSui.js.map +0 -1
- package/dist/views/YourBondsModalYield/YourBondsModalYield.js.map +0 -1
- package/dist/views/YourBondsModalYield/components/UnstakeModalYield/UnstakeModalYield.js.map +0 -1
- package/dist/views/YourBondsModalYield/components/YourBondModalHeader/YourBondModalHeader.js.map +0 -1
- /package/dist/{views/BuyBond → adapters/aptos}/BuyComponentAptos.d.ts +0 -0
- /package/dist/{components/ConnectAptosWalletButton → adapters/aptos}/ConnectAptosWalletButton.d.ts +0 -0
- /package/dist/{components/ConnectoToVmBanners → adapters/aptos}/ConnectToAptosBanner.d.ts +0 -0
- /package/dist/{types → adapters/aptos}/aptosBonds.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/aptos}/useAPTAccount.d.ts +0 -0
- /package/dist/{state/zap → adapters/aptos}/useAptosZapQuote.d.ts +0 -0
- /package/dist/{state/zap → adapters/aptos}/useAptosZapQuote.js +0 -0
- /package/dist/{state/balance → adapters/aptos}/useCurrencyBalanceAptos.d.ts +0 -0
- /package/dist/{components/ConnectoToVmBanners → adapters/evm}/ConnectToEvmBanner.d.ts +0 -0
- /package/dist/{utils → adapters/evm}/multicall.d.ts +0 -0
- /package/dist/{views/BuyBond → adapters/evm/preTGE}/BuyComponentPreTGE.d.ts +0 -0
- /package/dist/{views/Bonds/components/BondRows → adapters/evm/preTGE}/ModalHandlerPreTGE.d.ts +0 -0
- /package/dist/{state/allowance → adapters/evm}/useAllowance.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/evm}/useEVMAccount.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/evm}/useEVMAccount.js +0 -0
- /package/dist/{hooks → adapters/evm}/useMonitorTx.d.ts +0 -0
- /package/dist/{state/zap → adapters/evm}/useSoulZapBondQuote.d.ts +0 -0
- /package/dist/{state/bonds → adapters/evm}/useTierProofSignature.d.ts +0 -0
- /package/dist/{views/BuyBond → adapters/solana}/BuyComponentSolana.d.ts +0 -0
- /package/dist/{components/ConnectSolanaWalletButton → adapters/solana}/ConnectSolanaWalletButton.d.ts +0 -0
- /package/dist/{components/ConnectoToVmBanners → adapters/solana}/ConnectToSolanaBanner.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/calculateSolanaTrueBillPrice.d.ts +0 -0
- /package/dist/{types → adapters/solana/codecs}/index.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/derivePda.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/derivePda.js +0 -0
- /package/dist/{types → adapters/solana}/helius.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/solanaAtaHelper.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/solanaAtaHelper.js +0 -0
- /package/dist/{types → adapters/solana}/solanaBonds.d.ts +0 -0
- /package/dist/{constants → adapters/solana}/solanaConstants.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/solanaMulticall.d.ts +0 -0
- /package/dist/{utils → adapters/solana}/solanaMulticall.js +0 -0
- /package/dist/{utils → adapters/solana}/solanaRpc.d.ts +0 -0
- /package/dist/{state/zap → adapters/solana}/useJupiterSolanaQuote.d.ts +0 -0
- /package/dist/{state/zap → adapters/solana}/useJupiterSolanaQuote.js +0 -0
- /package/dist/{hooks/accounts → adapters/solana}/useSOLAccount.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/solana}/useSOLAccount.js +0 -0
- /package/dist/{views/BuyBond → adapters/sui}/BuyComponentSui.d.ts +0 -0
- /package/dist/{components/ConnectoToVmBanners → adapters/sui}/ConnectToSuiBanner.d.ts +0 -0
- /package/dist/{constants → adapters/sui}/suiConstants.d.ts +0 -0
- /package/dist/{constants → adapters/sui}/suiConstants.js +0 -0
- /package/dist/{utils → adapters/sui}/suiHelpers.d.ts +0 -0
- /package/dist/{config/constants → adapters/sui}/suiZapTokens.d.ts +0 -0
- /package/dist/{config/constants → adapters/sui}/suiZapTokens.js +0 -0
- /package/dist/{state/balance → adapters/sui}/useCurrencyBalanceSui.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/sui}/useSUIAccount.d.ts +0 -0
- /package/dist/{hooks/accounts → adapters/sui}/useSUIAccount.js +0 -0
- /package/dist/{state/zap → adapters/sui}/useSuiZapQuote.d.ts +0 -0
- /package/dist/state/bonds/fetchBondsData/{cleanBillsData.d.ts → bondPricing.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalanceSolana.js","sources":["../../../src/state/balance/useCurrencyBalanceSolana.ts"],"sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js'\nimport { getAccount } from '@solana/spl-token'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { formatUnits } from '../../utils/fixedPoint'\nimport { getRPC } from '../../config/constants/networks'\nimport { getTokenProgramForMint } from '../../utils/solanaAtaHelper'\nimport { getAssociatedTokenAddress } from '@solana/spl-token'\n\n// Use devnet or your custom cluster URL\nexport const getTokenBalanceSolana = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n): Promise<string | null> => {\n if (!account || !currency) return null\n\n const connection = new Connection(getRPC(ChainId.SOL), 'confirmed')\n const userPubkey = new PublicKey(account)\n\n try {\n if (currency === 'NATIVE') {\n const lamports = await connection.getBalance(userPubkey)\n return formatUnits(lamports, 9)\n } else {\n const mint = new PublicKey(currency?.address?.[ChainId.SOL] as string)\n // Detect token program to get correct ATA (supports Token-2022)\n const tokenProgram = await getTokenProgramForMint(connection, mint)\n const ata = await getAssociatedTokenAddress(mint, userPubkey, true, tokenProgram)\n if (!ata) return '0'\n const tokenAccount = await getAccount(connection, ata, undefined, tokenProgram)\n return formatUnits(tokenAccount.amount.toString(), currency?.decimals?.[ChainId.SOL] as number)\n }\n } catch {\n // If account doesn't exist (e.g. never received that token)\n return '0'\n }\n}\n"],"names":[],"mappings":";;;;;;;AAQA;AACO,MAAM,qBAAqB,GAAG,OACnC,QAAiC,EACjC,OAAsB,KACI;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEtC,IAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;AACnE,IAAA,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC;AAEzC,IAAA,IAAI;AACF,QAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;AACxD,YAAA,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC;aAAO;AACL,YAAA,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAW,CAAC;;YAEtE,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC;AACnE,YAAA,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC;AACjF,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,GAAG;AACpB,YAAA,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC;AAC/E,YAAA,OAAO,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAW,CAAC;QACjG;IACF;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,GAAG;IACZ;AACF;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalanceSui.js","sources":["../../../src/state/balance/useCurrencyBalanceSui.ts"],"sourcesContent":["// Sui balance reads — mirrors useCurrencyBalanceAptos.ts\n\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getSuiClient } from '../../utils/suiHelpers'\nimport { formatUnits } from '../../utils/fixedPoint'\n\nconst SUI_KEY = ChainId.SUI\nconst SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\nconst SUI_NATIVE_DECIMALS = 9\n\n/**\n * Single-token balance read for Sui.\n * Used by `useCurrencyBalance` when `chainId === ChainId.SUI`.\n */\nexport const getTokenBalanceSui = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n): Promise<string | null> => {\n if (!account || !currency) return null\n\n const coinType = currency === 'NATIVE' ? SUI_NATIVE_COIN_TYPE : currency.address[SUI_KEY]\n if (!coinType) return '0'\n\n const decimals = currency === 'NATIVE' ? SUI_NATIVE_DECIMALS : (currency.decimals?.[SUI_KEY] ?? 9)\n\n try {\n const client = getSuiClient()\n const result = await client.getBalance({ owner: account, coinType })\n return formatUnits(result.totalBalance, decimals)\n } catch {\n return '0'\n }\n}\n\n/**\n * Multi-token balance read for Sui.\n * Used by `useUserTokensBalance` when `chainId === ChainId.SUI`.\n */\nexport const getTokensBalanceSui = async (\n account: string,\n tokens: ('NATIVE' | Token)[],\n): Promise<{ address: string; balance: string }[]> => {\n return Promise.all(\n tokens.map(async (token) => {\n const address = token === 'NATIVE' ? 'NATIVE' : ((token as Token).address[SUI_KEY] as string)\n const balance = await getTokenBalanceSui(token, account)\n return { address, balance: balance ?? '0' }\n }),\n )\n}\n"],"names":[],"mappings":";;;;AAAA;AAMA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG;AAC3B,MAAM,oBAAoB,GAAG,eAAe;AAC5C,MAAM,mBAAmB,GAAG,CAAC;AAE7B;;;AAGG;AACI,MAAM,kBAAkB,GAAG,OAChC,QAAiC,EACjC,OAAsB,KACI;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEtC,IAAA,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzF,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,GAAG;IAEzB,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG,mBAAmB,IAAI,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,YAAY,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpE,OAAO,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;IACnD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,GAAG;IACZ;AACF;AAEA;;;AAGG;AACI,MAAM,mBAAmB,GAAG,OACjC,OAAe,EACf,MAA4B,KACuB;AACnD,IAAA,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,OAAO,KAAK,KAAI;AACzB,QAAA,MAAM,OAAO,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAK,KAAe,CAAC,OAAO,CAAC,OAAO,CAAY;QAC7F,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE;IAC7C,CAAC,CAAC,CACH;AACH;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanBillsData.js","sources":["../../../../src/state/bonds/fetchBondsData/cleanBillsData.ts"],"sourcesContent":["import { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { mulDivRound, parseUnits } from '../../../utils/fixedPoint'\n\n// Scale used to carry percentage ratios (tier boost, reverse fee) into integer math\n// alongside the wei-scale `trueBillPrice`, so the huge integer never round-trips through\n// a JS float before the final getBalanceNumber() conversion.\nconst RATIO_SCALE = 1_000_000_000_000n // 1e12\nconst scaleRatio = (ratio: number): bigint => parseUnits(ratio.toString(), 12)\n\nexport const getBonusWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: string,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const fee = feeInPayout ?? 0\n const reverseFee = fee / 100 / (1 - fee / 100)\n const trueBillPriceBig = BigInt(trueBillPrice)\n const tierAdjusted = mulDivRound(trueBillPriceBig, scaleRatio((100 + tierBoostRate) / 100), RATIO_SCALE)\n const feeAdjusted = mulDivRound(trueBillPriceBig, scaleRatio(reverseFee), RATIO_SCALE)\n const trueBondPrice = tierAdjusted + feeAdjusted\n const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice\n const bonusWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100\n const validatedBonus = bonusWithoutFee > 0 ? (bonusWithoutFee / (100 - bonusWithoutFee)) * 100 : 0\n return validatedBonus\n}\n\nexport const getRawBonus = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice\n const discount: number = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100\n return discount > 0 ? (discount / (100 - discount)) * 100 : 0\n}\n\nexport const getRawDiscount = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n\n return ((earnTokenPrice - lpPrice * trueBondPrice) / earnTokenPrice) * 100\n}\n\nexport const getDiscountWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: any,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n const trueBondPriceWithFee = trueBondPrice * (1 / ((100 - (feeInPayout ?? 0)) / 100))\n const discount = ((earnTokenPrice - lpPrice * trueBondPriceWithFee) / earnTokenPrice) * 100\n const discountToReturn = 100 - ((100 - discount) / (100 - tierBoostRate)) * 100\n return discountToReturn\n}\n"],"names":[],"mappings":";;;AAGA;AACA;AACA;AACA,MAAM,WAAW,GAAG,cAAkB,CAAA;AACtC,MAAM,UAAU,GAAG,CAAC,KAAa,KAAa,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;AAEvE,MAAM,eAAe,GAAG,CAC7B,WAAmB,EACnB,aAAqB,EACrB,aAAqB,EACrB,OAAe,EACf,cAAsB,KACpB;AACF,IAAA,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC;AAC5B,IAAA,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAC9C,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9C,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,GAAG,GAAG,aAAa,IAAI,GAAG,CAAC,EAAE,WAAW,CAAC;AACxG,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;AACtF,IAAA,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW;IAChD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,aAAa,CAAC,GAAG,OAAO;AAClE,IAAA,MAAM,eAAe,GAAG,CAAC,CAAC,cAAc,GAAG,gBAAgB,IAAI,cAAc,IAAI,GAAG;IACpF,MAAM,cAAc,GAAG,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,GAAG,GAAG,eAAe,CAAC,IAAI,GAAG,GAAG,CAAC;AAClG,IAAA,OAAO,cAAc;AACvB;AAEO,MAAM,WAAW,GAAG,CAAC,aAAkB,EAAE,OAAe,EAAE,cAAsB,KAAI;IACzF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO;AACrE,IAAA,MAAM,QAAQ,GAAW,CAAC,CAAC,cAAc,GAAG,QAAQ,IAAI,cAAc,IAAI,GAAG;IAC7E,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;AAC/D;AAEO,MAAM,cAAc,GAAG,CAAC,aAAkB,EAAE,OAAe,EAAE,cAAsB,KAAI;IAC5F,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;AAEhE,IAAA,OAAO,CAAC,CAAC,cAAc,GAAG,OAAO,GAAG,aAAa,IAAI,cAAc,IAAI,GAAG;AAC5E;AAEO,MAAM,kBAAkB,GAAG,CAChC,WAAmB,EACnB,aAAqB,EACrB,aAAkB,EAClB,OAAe,EACf,cAAsB,KACpB;IACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;IAChE,MAAM,oBAAoB,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AACrF,IAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,GAAG,OAAO,GAAG,oBAAoB,IAAI,cAAc,IAAI,GAAG;AAC3F,IAAA,MAAM,gBAAgB,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,QAAQ,KAAK,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG;AAC/E,IAAA,OAAO,gBAAgB;AACzB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataAptos.js","sources":["../../../../src/state/bonds/fetchBondsData/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 { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../../types/bonds'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { resolveBondTokenPrices } from '../../tokenPrices/resolveTokenPrice'\nimport { readAptosMarketInfo } from '../../../utils/aptosHelpers'\nimport { formatUnits } from '../../../utils/fixedPoint'\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 fetchBondsDataAptos = async (bonds?: BillsConfig[], aptosPrices?: TokenPrices[]): Promise<BondsData[]> => {\n const aptosConfigs = bonds?.filter((b) => !b.soldOut)\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 const { lpPrice: principalPrice, earnTokenPrice: payoutPrice } = await resolveBondTokenPrices(bond, aptosPrices)\n\n const info = await readAptosMarketInfo(marketAddr)\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 = formatUnits(BigInt(info[23]) - BigInt(info[5]), payoutDecimals)\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataEVM.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataEVM.ts"],"sourcesContent":["import { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport multicall from '../../../utils/multicall'\nimport BOND_2_4_0 from '../../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../../config/abi/erc20.json'\nimport chunk from 'lodash-es/chunk.js'\nimport { getBonusWithFee, getDiscountWithFee, getRawBonus, getRawDiscount } from './cleanBillsData'\nimport { formatUnits } from '../../../utils/fixedPoint'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { BondsData, TrueBondPrices } from '../../../types/bonds'\nimport { TIER_MAPPING } from '../../tiers/useTierPoints'\nimport { resolveBondTokenPrices } from '../../tokenPrices/resolveTokenPrice'\n\nexport const fetchBondsDataEVM = async (\n chainId: number,\n bonds: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n) => {\n try {\n const bills = bonds.filter((b) => !b.soldOut)\n const billIds: number[] = []\n const billCalls = bills.flatMap((bill) => {\n billIds.push(bill.index)\n return [\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'totalPayoutGiven',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPrincipal',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'paused',\n },\n // keep custom treasury at the very last position\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'customTreasury',\n },\n ]\n })\n const vals = await multicall(chainId, BOND_2_4_0, billCalls)\n\n // The following lines basically grab the values from customTreasury returned from bills contract and then,\n // appends the treasury contract's balance to each bill's chunk\n\n // appendIndex value assumes customTreasury will be at the end of the billCalls array\n const appendIndex = billCalls.length / bills.length\n const treasuryAddresses = vals\n .filter((_: any, i: number) => (i % appendIndex) + 1 === appendIndex)\n .map((customTreasury: string[]) => customTreasury[0])\n const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress: string, i: number) => ({\n address: bills?.[i]?.earnToken?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [treasuryAddress],\n }))\n const treasuryBalances = await multicall(chainId, ERC20ABI, treasuryBalanceCalls)\n const updatedVals = vals.reduce((acc: any, val: any, index: number) => {\n acc.push(val)\n if ((index + 1) % appendIndex === 0) {\n const pos = (index + 1) / appendIndex\n // balanceOf has a single output, so multicall wraps it as [balance] — unwrap it\n acc.push(treasuryBalances[pos - 1][0])\n }\n return acc\n }, [])\n\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n return await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n const { lpPrice, earnTokenPrice } = await resolveBondTokenPrices(bill, tokenPrices)\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n ] = chunk as any\n const trueBillPrice = trueBillPriceFromChunk\n\n const feeInPayout = Number(feeInPayoutRaw / 10000)\n const feeInPrincipal = Number(feeInPrincipalRaw / 10000)\n const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = Number(\n formatUnits(\n BigInt(maxTotalPayout ?? '0') - BigInt(totalPayoutGiven),\n bill?.earnToken.decimals[bill?.chainId] ?? 18,\n ),\n )\n const treasuryBalance = customTreasuryBalance\n ? getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n : null\n\n let trueBondPrices: TrueBondPrices[] = []\n if (bill?.billVersion === BillVersion.V4) {\n trueBondPrices = trueBillPrice[0].map((data: any) => {\n return {\n points: data?.points?.toString(),\n trueBondPrice: data?.trueBondPrice.toString(),\n discount: getRawDiscount(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n bonus: getRawBonus(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n discountWithFee: getDiscountWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n bonusWithFee: getBonusWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n boost: TIER_MAPPING[data?.points?.toString() as keyof typeof TIER_MAPPING],\n }\n })\n } else {\n const bonus = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n const discount = getRawDiscount(trueBillPrice, lpPrice, earnTokenPrice)\n const discountWithFee = getDiscountWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n discount,\n discountWithFee,\n },\n ]\n }\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining:\n treasuryBalance !== null\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),\n tierBoostRate: bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate,\n }\n return cleanedData\n }),\n )\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsData', e },\n })\n return []\n }\n}\n"],"names":["BOND_2_4_0","ERC20ABI"],"mappings":";;;;;;;;;;;AAaO,MAAM,iBAAiB,GAAG,OAC/B,OAAe,EACf,KAAoB,EACpB,MAAc,EACd,WAA2B,KACzB;AACF,IAAA,IAAI;AACF,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7C,MAAM,OAAO,GAAa,EAAE;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACvC,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,OAAO;AACL,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,GAAG,gBAAgB,GAAG,iBAAiB;AACjF,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,kBAAkB;AACzB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,OAAO;AACd,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,GAAG,mBAAmB,GAAG,gBAAgB;AACnF,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,aAAa;AACpB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,gBAAgB;AACvB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,QAAQ;AACf,iBAAA;;AAED,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjD,oBAAA,IAAI,EAAE,gBAAgB;AACvB,iBAAA;aACF;AACH,QAAA,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAEA,QAAU,EAAE,SAAS,CAAC;;;;QAM5D,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QACnD,MAAM,iBAAiB,GAAG;AACvB,aAAA,MAAM,CAAC,CAAC,CAAM,EAAE,CAAS,KAAK,CAAC,CAAC,GAAG,WAAW,IAAI,CAAC,KAAK,WAAW;aACnE,GAAG,CAAC,CAAC,cAAwB,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC;AACvD,QAAA,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,eAAuB,EAAE,CAAS,MAAM;AAC1F,YAAA,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,OAAkB,CAAC,IAAI,EAAE;AACnE,YAAA,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,CAAC,eAAe,CAAC;AAC1B,SAAA,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,OAAO,EAAEC,QAAQ,EAAE,oBAAoB,CAAC;AACjF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAQ,EAAE,KAAa,KAAI;AACpE,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,WAAW,KAAK,CAAC,EAAE;gBACnC,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,WAAW;;AAErC,gBAAA,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAE,CAAC;QAEN,MAAM,SAAS,GAAG,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC;AAElD,QAAA,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,YAAY,EAAE,GAAG,CAAC,OAAO,KAAK,EAAE,KAAK,KAAI;YACvC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAgB;AAEjF,YAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,WAAW,CAAC;YAEnF,MAAM,CACJ,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,MAAM,IAEN,qBAAqB,EACtB,GAAG,KAAY;YAChB,MAAM,aAAa,GAAG,sBAAsB;YAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC;YAClD,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC;AACxD,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa;YAC/E,MAAM,GAAG,WAAW,IAAI,SAAS,CAAC,GAAG,KAAK;AAC1C,YAAA,MAAM,eAAe,GAAG,MAAM,CAC5B,WAAW,CACT,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,EACxD,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAC9C,CACF;YACD,MAAM,eAAe,GAAG;AACtB,kBAAE,gBAAgB,CAAC,qBAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;kBACxF,IAAI;YAER,IAAI,cAAc,GAAqB,EAAE;YACzC,IAAI,IAAI,EAAE,WAAW,KAAK,WAAW,CAAC,EAAE,EAAE;gBACxC,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,KAAI;oBAClD,OAAO;AACL,wBAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;AAChC,wBAAA,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE;AAC7C,wBAAA,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC;AACjF,wBAAA,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC;AAC3E,wBAAA,eAAe,EAAE,kBAAkB,CACjC,WAAW,EACX,aAAa,EACb,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,EAC9B,OAAO,EACP,cAAc,CACf;AACD,wBAAA,YAAY,EAAE,eAAe,CAC3B,WAAW,EACX,aAAa,EACb,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,EAC9B,OAAO,EACP,cAAc,CACf;wBACD,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAA+B,CAAC;qBAC3E;AACH,gBAAA,CAAC,CAAC;YACJ;iBAAO;gBACL,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC;AACjE,gBAAA,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC;gBACxG,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC;AACvE,gBAAA,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC;AAC9G,gBAAA,cAAc,GAAG;AACf,oBAAA;AACE,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,KAAK,EAAE,CAAC;AACR,wBAAA,aAAa,EAAE,aAAa,CAAC,QAAQ,EAAE;wBACvC,KAAK;wBACL,YAAY;wBACZ,QAAQ;wBACR,eAAe;AAChB,qBAAA;iBACF;YACH;AACA,YAAA,MAAM,WAAW,GAAc;AAC7B,gBAAA,GAAG,IAAI;AACP,gBAAA,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO;gBACxC,WAAW;gBACX,cAAc;AACd,gBAAA,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,IAAI,IAAI,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;gBAC9E,cAAc;AACd,gBAAA,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE;AACxC,gBAAA,gBAAgB,EAAE,cAAc,EAAE,QAAQ,EAAE;gBAC5C,eAAe,EACb,eAAe,KAAK;sBAChB,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,QAAQ;AACrD,sBAAE,eAAe,CAAC,QAAQ,EAAE;AAChC,gBAAA,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE;AAC1C,gBAAA,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;AAChC,gBAAA,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE;AAC9C,gBAAA,WAAW,EAAE,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;AAClF,gBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa;aACzE;AACD,YAAA,OAAO,WAAW;QACpB,CAAC,CAAC,CACH;IACH;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;AACvC,SAAA,CAAC;AACF,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataPreTGE.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataPreTGE.ts"],"sourcesContent":["import { BondsData } from '../../../types/bonds'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport multicall from '../../../utils/multicall'\nimport chunk from 'lodash-es/chunk.js'\nimport launchBondsABI_V2_4_1 from '../../../config/abi/launchBond_v2_4_1.json'\nimport Vault_Shares_ABI from '../../../config/abi/Vault_Shares.json'\nimport { reportError } from '../../../utils/reportError'\n\nexport const fetchBondsDataPreTGE = async (\n chain: number,\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n preTGEBonds: PreTGEConfig[],\n apiUrl?: string,\n): Promise<BondsData[]> => {\n try {\n if (!preTGEBonds?.length) return []\n const data = []\n const chainId = chain as ChainId\n\n const preTGEBondsIds: number[] = []\n const launchBondsCalls = preTGEBonds.flatMap((bond) => {\n preTGEBondsIds.push(bond.index)\n const bill = bond\n return [\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'trueBillPrice',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'totalPrincipalBilled',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'finalized',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'minPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'maxPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'startVestingTimestamp',\n },\n ]\n })\n const vals = await multicall(chainId, launchBondsABI_V2_4_1, launchBondsCalls)\n const chunkSize = vals.length / preTGEBonds.length\n const chunkedBills = chunk(vals, chunkSize)\n const returnedBills = await Promise.all(\n chunkedBills?.map(async (chunk: any, index) => {\n const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index])!\n\n const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] =\n chunk\n const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms\n\n const initPrice = getBalanceNumber(\n trueBillPrice,\n bondConfig?.lpToken?.decimals?.[bondConfig?.chainId as ChainId] ?? 18,\n )\n\n const lpPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n const earnTokenPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n\n const principalTokenPrice = lpPrice?.toString() ?? '0'\n const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString()\n\n const bonus = Math.round((bondConfig.tgePrice! / initPrice) * 100 - 100)\n\n const endTime = parseInt(terms[0])\n const startTime = parseInt(terms[1])\n const now = Math.floor(Date.now() / 1000)\n const progress = Math.min(1, Math.max(0, (now - startTime) / (endTime - startTime)))\n const currentAPR =\n bondConfig.startAPR != null && bondConfig.endAPR != null && endTime > startTime\n ? bondConfig.startAPR + (bondConfig.endAPR - bondConfig.startAPR) * progress\n : 0\n let rewardDistributionEnd = 0\n if (bondConfig.yieldBond) {\n const calls = [\n {\n address: bondConfig.earnToken.address[bondConfig.chainId] ?? '',\n name: 'vestingEnd',\n },\n ]\n const res = await multicall(bondConfig.chainId, Vault_Shares_ABI, calls)\n rewardDistributionEnd = parseInt(res[0][0])\n }\n const data: BondsData = {\n ...bondConfig,\n initialRelease: initialRelease / 10000,\n vestingTerm: parseInt(vestingTerm),\n trueBondPrices: [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice?.toString(),\n bonus,\n bonusWithFee: bonus, // placeholder, wont be used\n discount: bonus, // placeholder, wont be used\n discountWithFee: bonus, // placeholder, wont be used\n },\n ],\n maxTotalPayout: maxTotalPayout?.toString(),\n totalPrincipalBilled: totalPrincipalBilled?.toString(),\n payoutTokenPrice,\n principalTokenPrice,\n totalRaise: totalRaise?.toString(),\n finalized: finalized[0],\n minPoints: minPoints.toString(),\n maxPoints: maxPoints.toString(),\n startVestingTimestamp: startVestingTimestamp?.toString(),\n initTime: { [bondConfig.chainId]: parseInt(terms[1]) },\n finishTime: parseInt(terms[0]),\n initPrice,\n soldOut: finalized[0] || (parseInt(terms[0]) ?? 0) < Date.now() / 1000 || bondConfig.soldOut,\n yieldData: {\n apr: bondConfig.finalAPR || currentAPR,\n rewardDistributionEnd,\n },\n }\n return data\n }),\n )\n data.push(returnedBills)\n return data.flat()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },\n })\n return []\n }\n}\n"],"names":["launchBondsABI_V2_4_1"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataSOL.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataSOL.ts"],"sourcesContent":["import { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { SolanaCall, solanaMulticall } from '../../../utils/solanaMulticall'\nimport { PublicKey } from '@solana/web3.js'\nimport { derivePda } from '../../../utils/derivePda'\nimport { PROGRAM_ID } from '../../../constants/solanaConstants'\nimport { BondIssuance, SolanaBondData, SolanaBondsResult } from '../../../types/solanaBonds'\nimport { getBonusWithFee, getDiscountWithFee, getRawBonus, getRawDiscount } from './cleanBillsData'\nimport { formatUnits } from '../../../utils/fixedPoint'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { calculateTrueBondPrice } from '../../../utils/calculateSolanaTrueBillPrice'\nimport { BondsData, TrueBondPrices } from '../../../types/bonds'\nimport { resolveBondTokenPrices } from '../../tokenPrices/resolveTokenPrice'\n\nexport const fetchBondsDataSOL = async (bonds: BillsConfig[], apiUrl: string, tokenPrices?: TokenPrices[]) => {\n const bills = bonds.filter((b) => !b.soldOut)\n try {\n const solanaCalls: SolanaCall[] = []\n const solanaBillIds: number[] = []\n for (const bill of bills) {\n const bondIssuanceAddress = bill.contractAddress[ChainId.SOL]\n if (!bondIssuanceAddress) continue\n\n solanaBillIds.push(bill.index)\n const bondIssuancePubkey = new PublicKey(bondIssuanceAddress)\n const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID)\n const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID)\n solanaCalls.push(\n { accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' },\n { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' },\n { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' },\n )\n }\n // Fetch Solana bills\n const solanaResults = (await solanaMulticall(solanaCalls)) as SolanaBondsResult\n\n const solanaBills =\n solanaResults?.bondIssuance\n ?.map((bondIssuance: BondIssuance, index: number) => {\n const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString())\n const bill = {\n ...bondIssuance,\n ...solanaResults.bondPricing[index],\n terms: solanaResults.bondTerm[index],\n } as SolanaBondData\n\n return [\n bill.trueBillPrice,\n bill.totalPayoutGiven,\n [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],\n bill.terms.maxTotalPayout,\n bill.feeInPayout.toString(),\n bill.feeInPrincipal.toString(),\n false,\n undefined,\n undefined,\n solanaResults.bondPricing[index],\n solanaResults.bondTerm[index],\n ] // Map to reflect evm structure\n })\n .filter((bill: any) => typeof bill !== 'undefined') ?? []\n const allBillsIds: number[] = []\n const allBillsData = []\n if (solanaBills.length > 0) {\n allBillsIds.push(...solanaBillIds)\n allBillsData.push(...solanaBills)\n }\n\n return await Promise.all(\n allBillsData?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === allBillsIds[index]) as BillsConfig\n\n const { lpPrice, earnTokenPrice } = await resolveBondTokenPrices(bill, tokenPrices)\n\n const [\n ,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n bondPricing,\n bondTerms,\n ] = chunk as any\n\n const feeInPayout = Number(feeInPayoutRaw / 10000)\n const feeInPrincipal = Number(feeInPrincipalRaw / 10000)\n const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = Number(\n formatUnits(\n BigInt(maxTotalPayout ?? '0') - BigInt(totalPayoutGiven),\n bill?.earnToken.decimals[bill?.chainId] ?? 18,\n ),\n )\n const treasuryBalance = customTreasuryBalance\n ? getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n : null\n\n const principalDecimals = bill?.lpToken.decimals[ChainId.SOL] as number\n const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL] as number\n const timeStamp = Math.floor(Date.now() / 1000)\n const trueBillPrice = calculateTrueBondPrice(\n bondPricing,\n bondTerms,\n timeStamp,\n principalDecimals,\n payoutDecimals,\n feeInPrincipal,\n )\n\n let trueBondPrices: TrueBondPrices[] = []\n const bonus = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n const discount = getRawDiscount(trueBillPrice, lpPrice, earnTokenPrice)\n const discountWithFee = getDiscountWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n discount,\n discountWithFee,\n },\n ]\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining:\n treasuryBalance !== null\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),\n tierBoostRate: bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate,\n }\n return cleanedData\n }),\n )\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsDataSOL', e },\n })\n return []\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataSui.js","sources":["../../../../src/state/bonds/fetchBondsData/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 { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../../types/bonds'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { resolveBondTokenPrices } from '../../tokenPrices/resolveTokenPrice'\nimport { getSuiClient } from '../../../utils/suiHelpers'\nimport { formatUnits } from '../../../utils/fixedPoint'\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 last_decay: number\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 last_decay: Number(f.last_decay ?? 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 fetchBondsDataSUI = async (bondsParam?: BillsConfig[], prices?: TokenPrices[]): Promise<BondsData[]> => {\n const bonds = bondsParam?.filter((b) => !b.soldOut)\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 { lpPrice: principalPrice, earnTokenPrice: payoutPrice } = await resolveBondTokenPrices(bond, prices)\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 // Apply debt decay to match on-chain behavior (bond_math::calculate_decay).\n // The contract decays debt inside deposit(), but getObject returns the stale\n // total_debt from the last interaction. Without this, the SDK shows a worse\n // discount than the user actually gets.\n const rawTotalDebt = BigInt(fields.total_debt)\n const vestingTermSec = Number(fields.terms.fields.vesting_term)\n const nowSec = Math.floor(Date.now() / 1000)\n const elapsed = Math.max(0, nowSec - fields.last_decay)\n let totalDebt = rawTotalDebt\n if (vestingTermSec > 0 && elapsed > 0 && rawTotalDebt > 0n) {\n if (elapsed >= vestingTermSec) {\n totalDebt = 0n\n } else {\n // decay = total_debt * elapsed / vesting_term, capped at 90%\n const decay = (rawTotalDebt * BigInt(elapsed)) / BigInt(vestingTermSec)\n const maxDecay = (rawTotalDebt * 90n) / 100n\n totalDebt = rawTotalDebt - (decay > maxDecay ? maxDecay : decay)\n }\n }\n\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 = formatUnits(\n BigInt(fields.terms.fields.max_total_payout) - BigInt(fields.total_payout_given),\n payoutDecimals,\n )\n\n return {\n ...bond,\n suiTreasuryId: fields.treasury_id || undefined,\n soldOut:\n fields.paused ||\n fields.emergency_paused ||\n BigInt(fields.total_payout_given) >= BigInt(fields.terms.fields.max_total_payout)\n ? true\n : 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsAptos.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.ts"],"sourcesContent":["// =============================================================================\n// fetchUserOwnedAptosBonds — user bills fetcher for the Aptos chain\n// =============================================================================\n//\n// On-chain first: reads user bills directly via Move view functions (no\n// api-v2 dependency). Uses:\n//\n// bond_nft::user_bills(user) → [bill_id, ...]\n// bond_nft::bond_market_by_id(bill_id) → market_addr\n// bond_nft::nft_address(bill_id) → bill_addr\n// bond::bill_info(market, bill_addr) → Bill struct\n// bond_nft::vesting_progress(bill_id) → [total_vested, claimable]\n\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport type { UserOwnedBillsData, UserBill } from '../../../types/yourbonds'\nimport type { BondsData } from '../../../types/bonds'\nimport type { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { APTOS_PLACEHOLDER_BILL_IMAGE } from '../../../constants/aptosConstants'\nimport { apiGet } from '../../../utils/httpClient'\nimport {\n readAptosBillInfo,\n readBondMarketByBillId,\n readNftAddressByBillId,\n readUserBillIds,\n readVestingProgress,\n} from '../../../utils/aptosHelpers'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nexport async function fetchUsersBondsAptos(\n user: string | undefined,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n\n // Build one `UserOwnedBillsData` per known bond config. We always return\n // the outer shell so downstream code (`getUserBonds` in useUserBonds.ts)\n // can match bills back to their bond config.\n const aptosKey = ChainId.APTOS\n const aptosPrices = tokenPrices?.[aptosKey] ?? []\n\n // Index bonds by lowercased market address for O(1) lookup when matching\n // bill_ids back to their market.\n const bondsByMarket = new Map<string, BillsConfig>()\n for (const bond of bondData) {\n const marketAddr = bond.contractAddress[aptosKey]\n if (marketAddr) bondsByMarket.set(marketAddr.toLowerCase(), bond)\n }\n\n // Seed the result with empty shells so every bond is represented.\n const result: UserOwnedBillsData[] = bondData.map((bond) => ({\n index: bond.index,\n userOwnedBills: [] as UserBill[],\n }))\n const indexByBondIndex = new Map<number, UserOwnedBillsData>()\n for (const entry of result) indexByBondIndex.set(entry.index, entry)\n\n try {\n const billIds = await readUserBillIds(user)\n if (billIds.length === 0) return result\n\n // For each bill the user owns, resolve its market, object address, state\n // and vesting progress in parallel. Bills whose market is not in our\n // bondData are silently skipped (they belong to a market the SDK isn't\n // configured to display).\n await Promise.all(\n billIds.map(async (billId) => {\n try {\n const [marketAddr, billAddr] = await Promise.all([\n readBondMarketByBillId(billId),\n readNftAddressByBillId(billId),\n ])\n const bond = bondsByMarket.get(marketAddr.toLowerCase())\n if (!bond) return\n\n const [billInfo, vesting] = await Promise.all([\n readAptosBillInfo(marketAddr, billId),\n readVestingProgress(marketAddr, billId),\n ])\n\n const principalAddr = bond.lpToken.address[aptosKey]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[aptosKey]?.toLowerCase()\n let principalPrice = aptosPrices.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price\n let payoutPrice = aptosPrices.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price\n\n // Fallback: individual price-api call (same pattern as fetchBillsUserSolana.ts).\n // TODO(aptos): price-api pending Aptos support. Fallback to hardcoded prices.\n if (principalPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.lpToken.address[aptosKey]}&chain=${aptosKey}`,\n )\n principalPrice = parseFloat(res.price ?? '0')\n } catch {\n principalPrice = 0\n }\n }\n if (payoutPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.earnToken.address[aptosKey]}&chain=${aptosKey}`,\n )\n payoutPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutPrice = 0\n }\n }\n\n const payoutTotal = String(billInfo.payout ?? '0')\n const payoutClaimed = String(billInfo.payout_claimed ?? '0')\n const payoutRemaining = (BigInt(payoutTotal) - BigInt(payoutClaimed)).toString()\n const vestingStart = billInfo.vesting_start_timestamp ?? billInfo.last_timestamp ?? '0'\n const lastClaim = billInfo.last_claim_timestamp ?? billInfo.last_timestamp ?? vestingStart\n\n // Compute human-readable amounts for the modal display.\n const payoutDecimals = bond.earnToken.decimals[aptosKey] ?? 8\n const principalDecimals = bond.lpToken.decimals[aptosKey] ?? 8\n const payoutHuman = parseFloat(payoutTotal) / 10 ** payoutDecimals\n // Reconstruct deposit from payout and true_price_paid:\n // price = principal_amount * 1e8 / payout_amount → principal = payout * price / 1e8\n const truePricePaid = parseFloat(String(billInfo.true_price_paid ?? '0'))\n const depositAtomic = (parseFloat(payoutTotal) * truePricePaid) / 1e8\n const depositHuman = depositAtomic / 10 ** principalDecimals\n const depositUSD = depositHuman * (principalPrice ?? 0)\n\n const userBill: UserBill = {\n // `UserBill.address` is used by the SDK's claim flow as the\n // second argument to `bond::claim(market, bill_addr)`. Must be\n // the object address, NOT the scalar bill_id.\n address: billAddr,\n id: billId,\n vestingTerm: String(billInfo.vesting_term ?? '0'),\n payout: payoutRemaining,\n totalPayout: payoutTotal,\n truePricePaid: String(billInfo.true_price_paid ?? '0'),\n lastBlockTimestamp: String(lastClaim),\n vestingStartTimestamp: String(vestingStart),\n pendingRewards: vesting[1], // claimable from vesting_progress tuple\n billNftAddress: bond.billNnftAddress[aptosKey] ?? '',\n payoutClaimed,\n nftData: {\n tokenId: 0,\n billNftId: parseInt(billId),\n processing: false,\n image: APTOS_PLACEHOLDER_BILL_IMAGE,\n // Populate `data` so YourBondsModal can display Deposit/Bond Value.\n // api-v2 won't enrich Aptos bills, so we compute from on-chain data.\n data: {\n dollarValue: depositUSD,\n payout: payoutHuman,\n billContract: marketAddr,\n billNftAddress: bond.billNnftAddress[aptosKey] ?? '',\n billNftId: parseInt(billId),\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: '',\n bondVersion: bond.version ?? '',\n chainId: aptosKey,\n createTransactionHash: '',\n createdAddressOwner: user,\n createdAt: parseInt(String(vestingStart)),\n deposit: depositHuman,\n expires: parseInt(String(vestingStart)) + parseInt(String(billInfo.vesting_term ?? '0')),\n pairName: `${bond.lpToken.symbol}-${bond.earnToken.symbol}`,\n payoutToken: bond.earnToken.address[aptosKey] ?? '',\n payoutTokenData: {\n address: bond.earnToken.address[aptosKey] ?? '',\n name: bond.earnToken.symbol,\n symbol: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n payoutTokenPrice: (payoutPrice ?? 0).toString(),\n principalToken: bond.lpToken.address[aptosKey] ?? '',\n token0: {\n address: bond.lpToken.address[aptosKey] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n },\n token1: {\n address: bond.earnToken.address[aptosKey] ?? '',\n symbol: bond.earnToken.symbol,\n name: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n type: bond.billType ?? 'reserve',\n vestingPeriodSeconds: parseInt(String(billInfo.vesting_term ?? '0')),\n },\n },\n bond: {\n ...bond,\n payoutTokenPrice: payoutPrice?.toString(),\n principalTokenPrice: principalPrice?.toString(),\n } as BondsData,\n }\n\n const entry = indexByBondIndex.get(bond.index)\n entry?.userOwnedBills.push(userBill)\n } catch (billErr) {\n console.warn(`[Aptos] Failed to read bill ${billId}`, billErr)\n }\n }),\n )\n } catch (e) {\n console.warn(`[Aptos] Failed to list user bills for ${user}`, e)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsEVM.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.ts"],"sourcesContent":["import billAbi from '../../../config/abi/BOND_2_0_0.json'\nimport multicall from '../../../utils/multicall'\nimport { UserBill, UserOwnedBillsData } from '../../../types/yourbonds'\nimport { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { BondsData } from '../../../types/bonds'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nexport const fetchUsersBondsEVM = async (\n chainId: ChainId,\n account: string,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> => {\n try {\n if (!account) {\n return []\n }\n const bonds: BillsConfig[] = bondData\n\n // Fetch and set user owned bill data without NFT Data\n const userOwnedBills = await fetchUserOwnedBills(chainId, account, bonds, tokenPrices)\n const mapUserOwnedBills = bonds.map((bill: BillsConfig) =>\n userOwnedBills.filter((b) => b.address.toLowerCase() === bill.contractAddress[bill.chainId]?.toLowerCase()),\n )\n const userOwnedBillsData = bonds.map((bill: BillsConfig, i: number) => ({\n index: bill.index,\n userOwnedBills: mapUserOwnedBills[i],\n }))\n\n const combinedData = userOwnedBillsData.map((data) => {\n const enrichedUserBills = data.userOwnedBills.map((bill) => {\n return {\n ...bill,\n }\n })\n return {\n ...data,\n userOwnedBills: enrichedUserBills,\n }\n })\n\n return Promise.resolve(combinedData)\n } catch (error) {\n console.error('Error fetching user owned bills data:', error)\n return Promise.reject(error)\n }\n}\n\nconst fetchUserOwnedBills = async (\n chainId: ChainId,\n account: string,\n bonds: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserBill[]> => {\n // Maps all the bills in the list repo to make a call to each of them to get Bills Id and paused state (only for V4)\n const billIdAndPausedCalls = bonds.flatMap((b, index) => {\n const calls = [\n {\n address: b.contractAddress[b.chainId] ?? '',\n name: 'getBillIds',\n params: [account],\n bondIndex: index,\n },\n ]\n // Only add paused call for V4 bonds\n if (b.billVersion === BillVersion.V4) {\n calls.push({\n address: b.contractAddress[b.chainId] ?? '',\n name: 'paused',\n params: [],\n bondIndex: index,\n })\n }\n return calls\n })\n const billIdAndPausedResults = await multicall(chainId, billAbi, billIdAndPausedCalls, true, 15)\n\n // Separate billIds and pausedStates from results, tracking which bonds have paused calls\n const billIds: any[] = []\n const pausedStates: Map<string, boolean> = new Map()\n let resultIndex = 0\n\n bonds.forEach((b) => {\n // First result is always getBillIds\n billIds.push(billIdAndPausedResults?.[resultIndex])\n resultIndex++\n\n // Next result is paused only if V4\n if (b.billVersion === BillVersion.V4) {\n pausedStates.set(\n b.contractAddress[b.chainId]?.toLowerCase() as string,\n billIdAndPausedResults?.[resultIndex]?.[0] ?? false,\n )\n resultIndex++\n }\n })\n const billDataCalls: any = []\n const billVersions: any = []\n\n billIds?.forEach((idArray: any, index: number) =>\n idArray[0].forEach((id: bigint) => {\n if (id > 0) {\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'getBillInfo' : 'billInfo',\n params: [id],\n bond: bonds[index],\n })\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'claimablePayout' : 'pendingPayoutFor',\n params: [id],\n bond: bonds[index],\n })\n billVersions.push(bonds[index].billVersion)\n }\n }),\n )\n const billData = await multicall(chainId, billAbi, billDataCalls, true, 150)\n const result = []\n\n for (let i = 0; i < billVersions.length; i++) {\n const billPos = i === 0 ? 0 : i * 2\n let bond: BondsData = billDataCalls[billPos].bond\n\n let principalTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice) => tokenPrice.tokenAddress?.toLowerCase() === bond?.lpToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n let payoutTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice: TokenPrices) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bond?.earnToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n if (principalTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.price)\n principalTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n principalTokenPrice = 0\n }\n }\n if (payoutTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.price)\n payoutTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutTokenPrice = 0\n }\n }\n\n bond = {\n ...bond,\n payoutTokenPrice: payoutTokenPrice?.toString(),\n principalTokenPrice: principalTokenPrice?.toString(),\n }\n const paused = pausedStates.get(bond.contractAddress[bond.chainId]?.toLowerCase() as string) ?? false\n\n const data =\n billVersions[i] !== BillVersion.V1\n ? {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payout: (\n BigInt(billData[billPos][0]?.payout.toString()) - BigInt(billData[billPos][0]?.payoutClaimed.toString())\n ).toString(),\n totalPayout: billData[billPos][0]?.payout.toString(),\n payoutClaimed: billData[billPos][0]?.payoutClaimed.toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][0]?.vesting.toString(),\n vestingTerm: billData[billPos][0]?.vestingTerm.toString(),\n lastBlockTimestamp: billData[billPos][0]?.lastClaimTimestamp.toString(),\n vestingStartTimestamp: billData[billPos][0]?.vestingStartTimestamp.toString(),\n truePricePaid: billData[billPos][0]?.truePricePaid.toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n : {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payoutClaimed: billData?.[billPos]?.[0]?.payoutClaimed?.toString(),\n payout: billData[billPos][0].toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][1].toString(),\n lastBlockTimestamp: billData[billPos][2].toString(),\n truePricePaid: billData[billPos][3].toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n result.push(data)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsSUI.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.ts"],"sourcesContent":["// =============================================================================\n// fetchUserOwnedSuiBonds — user bills fetcher for the Sui chain\n// =============================================================================\n//\n// On-chain first: reads user bills directly from Sui objects (no api-v2\n// dependency). Uses:\n//\n// getOwnedObjects(user, BondNFT filter) → [BondNFT objects]\n// Each BondNFT has fields: bill_id, bond_market, uri\n// getDynamicFieldObject(market.bills, bill_id) → Bill struct\n// Bill fields: payout, payout_claimed, vesting_term, vesting_start_timestamp,\n// last_claim_timestamp, true_price_paid\n\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport type { UserOwnedBillsData, UserBill } from '../../../types/yourbonds'\nimport type { BondsData } from '../../../types/bonds'\nimport type { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { SUI_PACKAGE_ID, SUI_PLACEHOLDER_BILL_IMAGE } from '../../../constants/suiConstants'\nimport { getSuiClient } from '../../../utils/suiHelpers'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface SuiBondNftFields {\n bill_id: string\n bond_market: string\n uri: string\n}\n\ninterface SuiBillFields {\n payout: string\n payout_claimed: string\n vesting_term: string\n vesting_start_timestamp: string\n last_claim_timestamp: string\n true_price_paid: string\n}\n\n/**\n * Fetch all BondNFT objects owned by a user address.\n * Returns the parsed content fields for each NFT.\n */\nasync function fetchUserBondNfts(userAddress: string): Promise<{ objectId: string; fields: SuiBondNftFields }[]> {\n const client = getSuiClient()\n const structType = `${SUI_PACKAGE_ID}::bond_nft::BondNFT`\n\n const results: { objectId: string; fields: SuiBondNftFields }[] = []\n let cursor: string | null | undefined = undefined\n let hasNextPage = true\n\n while (hasNextPage) {\n const response = await client.getOwnedObjects({\n owner: userAddress,\n filter: { StructType: structType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n })\n\n for (const item of response.data) {\n if (!item.data?.content || item.data.content.dataType !== 'moveObject') continue\n const fields = item.data.content.fields as unknown as SuiBondNftFields\n results.push({ objectId: item.data.objectId, fields })\n }\n\n hasNextPage = response.hasNextPage\n cursor = response.nextCursor\n }\n\n return results\n}\n\n/**\n * Read a single Bill from a BondMarket's `bills` Table by bill_id.\n *\n * The BondMarket is a shared object whose `bills` field is a `Table<u64, Bill>`.\n * Sui stores Table entries as dynamic fields on the Table's UID. We first read\n * the BondMarket object to get the Table's object ID, then query the dynamic\n * field for the specific bill_id.\n */\nasync function readBillFromMarket(\n marketObjectId: string,\n billId: string,\n): Promise<SuiBillFields & { cliffPeriod: number }> {\n const client = getSuiClient()\n\n // Step 1: Read the BondMarket object to find the `bills` Table object ID.\n // The `bills` field in a Move struct with `Table<u64, Bill>` is stored as an\n // object ID in the parent object's fields.\n const marketObj = await client.getObject({\n id: marketObjectId,\n options: { showContent: true },\n })\n\n if (!marketObj.data?.content || marketObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] BondMarket ${marketObjectId} not found or not a Move object`)\n }\n\n const marketFields = marketObj.data.content.fields as Record<string, any>\n // Table fields in Sui are serialised as { id: { id: \"0x...\" }, size: N }\n const billsTableId = marketFields?.bills?.fields?.id?.id ?? marketFields?.bills?.id?.id\n if (!billsTableId) {\n throw new Error(`[Sui] Could not extract bills table ID from BondMarket ${marketObjectId}`)\n }\n\n // Step 2: Read the dynamic field for this bill_id from the Table.\n const billObj = await client.getDynamicFieldObject({\n parentId: billsTableId,\n name: { type: 'u64', value: billId },\n })\n\n if (!billObj.data?.content || billObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] Bill ${billId} not found in market ${marketObjectId}`)\n }\n\n // The dynamic field value is nested under `fields.value` (or `fields.value.fields`\n // depending on serialisation depth).\n const dfFields = billObj.data.content.fields as Record<string, any>\n const billValue = dfFields?.value?.fields ?? dfFields?.value ?? dfFields\n\n // Extract cliff period from the market's vesting_config\n const vestingConfig = marketFields?.vesting_config\n const cliffPeriod = vestingConfig?.variant === 'CliffLinear' ? Number(vestingConfig?.fields?.cliff_period ?? 0) : 0\n\n return { ...(billValue as SuiBillFields), cliffPeriod }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function fetchUsersBondsSUI(\n user: string | undefined,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n\n // Build one `UserOwnedBillsData` per known bond config. We always return\n // the outer shell so downstream code (`getUserBonds` in useUserBonds.ts)\n // can match bills back to their bond config.\n const suiKey = ChainId.SUI\n const suiPrices = tokenPrices?.[suiKey] ?? []\n\n // Index bonds by lowercased market address for O(1) lookup when matching\n // NFTs back to their market.\n const bondsByMarket = new Map<string, BillsConfig>()\n for (const bond of bondData) {\n const marketAddr = bond.contractAddress[suiKey]\n if (marketAddr) bondsByMarket.set(marketAddr.toLowerCase(), bond)\n }\n\n // Seed the result with empty shells so every bond is represented.\n const result: UserOwnedBillsData[] = bondData.map((bond) => ({\n index: bond.index,\n userOwnedBills: [] as UserBill[],\n }))\n const indexByBondIndex = new Map<number, UserOwnedBillsData>()\n for (const entry of result) indexByBondIndex.set(entry.index, entry)\n\n try {\n const nfts = await fetchUserBondNfts(user)\n if (nfts.length === 0) return result\n\n // For each BondNFT the user owns, resolve its market, read the bill data,\n // and compute vesting progress. NFTs whose market is not in our bondData\n // are silently skipped (they belong to a market the SDK isn't configured\n // to display).\n await Promise.all(\n nfts.map(async (nft) => {\n try {\n const { fields } = nft\n const billId = String(fields.bill_id)\n const marketAddr = fields.bond_market\n\n const bond = bondsByMarket.get(marketAddr.toLowerCase())\n if (!bond) return\n\n const billInfo = await readBillFromMarket(marketAddr, billId)\n\n const principalAddr = bond.lpToken.address[suiKey]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[suiKey]?.toLowerCase()\n let principalPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price\n let payoutPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price\n\n if (principalPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.lpToken.address[suiKey]}&chain=${suiKey}`,\n )\n principalPrice = parseFloat(res.price ?? '0')\n } catch {\n principalPrice = 0\n }\n }\n if (payoutPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.earnToken.address[suiKey]}&chain=${suiKey}`,\n )\n payoutPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutPrice = 0\n }\n }\n\n const payoutTotal = String(billInfo.payout ?? '0')\n const payoutClaimed = String(billInfo.payout_claimed ?? '0')\n const payoutRemaining = (BigInt(payoutTotal) - BigInt(payoutClaimed)).toString()\n const vestingStart = String(billInfo.vesting_start_timestamp ?? '0')\n const lastClaim = String(billInfo.last_claim_timestamp ?? vestingStart)\n\n // Compute vesting progress client-side using the same curve as the contract.\n // Supports both Linear and CliffLinear vesting configurations.\n const nowSeconds = Math.floor(Date.now() / 1000)\n const vestingTerm = parseInt(String(billInfo.vesting_term ?? '0'))\n const vestingStartNum = parseInt(vestingStart)\n const cliffPeriod = billInfo.cliffPeriod ?? 0\n const elapsed = Math.max(0, nowSeconds - vestingStartNum)\n\n let totalVested: number\n if (cliffPeriod > 0) {\n // CliffLinear: nothing vests until cliff passes, then linear over remaining term\n if (elapsed < cliffPeriod) {\n totalVested = 0\n } else if (elapsed >= vestingTerm) {\n totalVested = parseInt(payoutTotal)\n } else {\n const elapsedAfterCliff = elapsed - cliffPeriod\n const vestingAfterCliff = vestingTerm - cliffPeriod\n totalVested =\n vestingAfterCliff > 0\n ? Math.floor((parseInt(payoutTotal) * elapsedAfterCliff) / vestingAfterCliff)\n : parseInt(payoutTotal)\n }\n } else {\n // Linear: standard proportional vesting\n const vestedFraction = vestingTerm > 0 ? Math.min(1, elapsed / vestingTerm) : 1\n totalVested = Math.floor(parseFloat(payoutTotal) * vestedFraction)\n }\n\n const claimable = Math.max(0, totalVested - parseInt(payoutClaimed))\n\n // Compute human-readable amounts for the modal display.\n const payoutDecimals = bond.earnToken.decimals[suiKey] ?? 9\n const principalDecimals = bond.lpToken.decimals[suiKey] ?? 9\n const payoutHuman = parseFloat(payoutTotal) / 10 ** payoutDecimals\n // Reconstruct deposit from payout and true_price_paid:\n // price = principal_amount * 1e8 / payout_amount -> principal = payout * price / 1e8\n const truePricePaid = parseFloat(String(billInfo.true_price_paid ?? '0'))\n const depositAtomic = (parseFloat(payoutTotal) * truePricePaid) / 1e12\n const depositHuman = depositAtomic / 10 ** principalDecimals\n const depositUSD = depositHuman * (principalPrice ?? 0)\n\n const userBill: UserBill = {\n // `UserBill.address` is used by the SDK's claim flow. On Sui, this\n // is the BondNFT object ID that the user passes to `bond::claim`.\n address: nft.objectId,\n id: billId,\n vestingTerm: String(billInfo.vesting_term ?? '0'),\n payout: payoutRemaining,\n totalPayout: payoutTotal,\n truePricePaid: String(billInfo.true_price_paid ?? '0'),\n lastBlockTimestamp: String(lastClaim),\n vestingStartTimestamp: String(vestingStart),\n pendingRewards: String(claimable),\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n payoutClaimed,\n nftData: {\n tokenId: 0,\n billNftId: parseInt(billId),\n processing: false,\n image: SUI_PLACEHOLDER_BILL_IMAGE,\n // Populate `data` so YourBondsModal can display Deposit/Bond Value.\n // api-v2 won't enrich Sui bills, so we compute from on-chain data.\n data: {\n dollarValue: depositUSD,\n payout: payoutHuman,\n billContract: marketAddr,\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n billNftId: parseInt(billId),\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: '',\n bondVersion: bond.version ?? '',\n chainId: suiKey,\n createTransactionHash: '',\n createdAddressOwner: user,\n createdAt: parseInt(String(vestingStart)),\n deposit: depositHuman,\n expires: parseInt(String(vestingStart)) + parseInt(String(billInfo.vesting_term ?? '0')),\n pairName: `${bond.lpToken.symbol}-${bond.earnToken.symbol}`,\n payoutToken: bond.earnToken.address[suiKey] ?? '',\n payoutTokenData: {\n address: bond.earnToken.address[suiKey] ?? '',\n name: bond.earnToken.symbol,\n symbol: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n payoutTokenPrice: (payoutPrice ?? 0).toString(),\n principalToken: bond.lpToken.address[suiKey] ?? '',\n token0: {\n address: bond.lpToken.address[suiKey] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n },\n token1: {\n address: bond.earnToken.address[suiKey] ?? '',\n symbol: bond.earnToken.symbol,\n name: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n type: bond.billType ?? 'reserve',\n vestingPeriodSeconds: parseInt(String(billInfo.vesting_term ?? '0')),\n },\n },\n bond: {\n ...bond,\n payoutTokenPrice: payoutPrice?.toString(),\n principalTokenPrice: principalPrice?.toString(),\n } as BondsData,\n }\n\n const entry = indexByBondIndex.get(bond.index)\n entry?.userOwnedBills.push(userBill)\n } catch (billErr) {\n console.warn(`[Sui] Failed to read bill from NFT ${nft.objectId}`, billErr)\n }\n }),\n )\n } catch (e) {\n console.warn(`[Sui] Failed to list user bills for ${user}`, e)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTierProofSignature.js","sources":["../../../src/state/bonds/useTierProofSignature.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { apiPost } from '../../utils/httpClient'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\n\nexport default function useTierProofSignature(\n bondAddress?: string,\n chainId?: ChainId,\n isUserRestricted?: boolean,\n): UseQueryResult<string | null> {\n const { address: account } = useEVMAccount()\n const SDKConfig = useSDKConfig()\n const apiAddress = SDKConfig?.urls?.apiV2\n\n return useQuery({\n queryKey: [QUERY_KEYS.TIER_PROOF_SIG, account, bondAddress, chainId, isUserRestricted],\n queryFn: () => getTierProofSig(apiAddress, account!, bondAddress!, chainId!),\n refetchOnWindowFocus: false,\n retry: 1,\n refetchInterval: 1800000, // 30 mins\n enabled: !!bondAddress && !!account && !!apiAddress && !!chainId && SDKConfig.useTiers && !isUserRestricted,\n })\n}\n\nconst getTierProofSig = async (\n apiAddress: string,\n account: string,\n bondAddress: string,\n chainId: ChainId,\n): Promise<string | null> => {\n try {\n const requestBody = {\n user: account, // Use the account as the \"user\" parameter\n bond: bondAddress, // Use the bondAddress\n chainId: chainId, // Use the specified chainId (Polygon)\n }\n\n const response = await apiPost<{ tierProofSignature: string }>(`${apiAddress}/tier-signature`, requestBody)\n return response.tierProofSignature\n } catch (e) {\n reportError({\n apiUrl: apiAddress,\n error: e,\n extraInfo: { type: 'getTierProofSig', bondAddress, e },\n chainId,\n account,\n })\n return null\n }\n}\n"],"names":[],"mappings":";;;;;;;AAQc,SAAU,qBAAqB,CAC3C,WAAoB,EACpB,OAAiB,EACjB,gBAA0B,EAAA;IAE1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;AAC5C,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AAEzC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC;AACtF,QAAA,OAAO,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,OAAQ,EAAE,WAAY,EAAE,OAAQ,CAAC;AAC5E,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,KAAK,EAAE,CAAC;QACR,eAAe,EAAE,OAAO;QACxB,OAAO,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC,gBAAgB;AAC5G,KAAA,CAAC;AACJ;AAEA,MAAM,eAAe,GAAG,OACtB,UAAkB,EAClB,OAAe,EACf,WAAmB,EACnB,OAAgB,KACU;AAC1B,IAAA,IAAI;AACF,QAAA,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;SACjB;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAiC,CAAA,EAAG,UAAU,CAAA,eAAA,CAAiB,EAAE,WAAW,CAAC;QAC3G,OAAO,QAAQ,CAAC,kBAAkB;IACpC;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,EAAE;YACtD,OAAO;YACP,OAAO;AACR,SAAA,CAAC;AACF,QAAA,OAAO,IAAI;IACb;AACF,CAAC;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAptosZapQuote.js","sources":["../../../src/state/zap/useAptosZapQuote.ts"],"sourcesContent":["// =============================================================================\n// useAptosZapQuote — Panora DEX aggregator quote for Aptos zap\n// =============================================================================\n//\n// Mirrors useJupiterSolanaQuote.ts: fetches a swap quote from Panora\n// (Aptos DEX aggregator) when the user selects an input token different\n// from the bond's principal token.\n//\n// Panora API: POST https://api.panora.exchange/swap\n// Docs: https://docs.panora.exchange/developer/swap/api\n\nimport { useMemo } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport useDebounce from '../../hooks/useDebounce'\nimport { apiPost } from '../../utils/httpClient'\nimport type { AptosZapToken } from '../../config/constants/aptosZapTokens'\nimport { toFixedString } from '../../utils/fixedPoint'\n\nconst PANORA_API_URL = 'https://api.panora.exchange/swap'\n// TODO(aptos): Move to environment variable or SDK config. This is Panora's\n// public API key — monitor usage and rotate if needed for production.\nconst PANORA_PUBLIC_API_KEY = 'a4^KV_EaTf4MW#ZdvgGKX#HUD^3IFEAOV_kzpIE^3BQGA8pDnrkT7JcIy#HNlLGi'\n\ninterface PanoraQuote {\n toTokenAmount: string\n toTokenAmountUSD: string | null\n priceImpact: string | null\n slippagePercentage: string\n minToTokenAmount: string\n feeTokenAmount: string\n txData: Record<string, unknown>\n}\n\n// Panora /swap returns the quote at the top level (not inside a `quotes` array).\ninterface PanoraSwapResponse extends PanoraQuote {\n fromToken: { address: string; decimals: number; current_price: string }\n toToken: { address: string; decimals: number; current_price: string }\n fromTokenAmount: string\n fromTokenAmountUSD: string | null\n quotes?: PanoraQuote[] // legacy — may not exist\n}\n\nconst useAptosZapQuote = (\n typedValue: string,\n inputToken: AptosZapToken | undefined,\n bond: BondsData | undefined,\n account?: string,\n slippage = 0.5,\n): [\n loading: boolean,\n response: PanoraQuote | null,\n depositAmount: string,\n error: boolean,\n minimumDepositAmount: string,\n] => {\n const debouncedInput = useDebounce(typedValue, 400)\n\n const principalTokenAddress = bond?.lpToken?.address?.[ChainId.APTOS]\n const inputTokenAddress = inputToken?.faAddress\n\n // Panora uses human-readable amounts (no decimals conversion needed)\n const inputAmount = Number(debouncedInput ?? '0').toString()\n\n const queryParams = useMemo(() => {\n if (\n !inputTokenAddress ||\n !principalTokenAddress ||\n inputAmount === '0' ||\n inputAmount === 'NaN' ||\n !account ||\n inputTokenAddress.toLowerCase() === principalTokenAddress.toLowerCase()\n ) {\n return null\n }\n\n return {\n fromTokenAddress: inputTokenAddress,\n toTokenAddress: principalTokenAddress,\n fromTokenAmount: inputAmount,\n toWalletAddress: account,\n slippagePercentage: slippage.toString(),\n }\n }, [inputTokenAddress, principalTokenAddress, inputAmount, account, slippage])\n\n const fetchPanoraQuote = async (): Promise<PanoraQuote | null> => {\n if (!queryParams) return null\n\n const params = new URLSearchParams(queryParams)\n const data = await apiPost<PanoraSwapResponse>(`${PANORA_API_URL}?${params.toString()}`, null, {\n headers: { 'x-api-key': PANORA_PUBLIC_API_KEY },\n })\n\n // Panora returns the quote at the top level. Fall back to quotes[] if present.\n if (data?.quotes?.length) return data.quotes[0]\n if (data?.txData) return data as PanoraQuote\n return null\n }\n\n const {\n data: quoteData,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, 'panora-aptos', queryParams],\n queryFn: fetchPanoraQuote,\n refetchInterval: 60000,\n enabled: !!queryParams,\n retry: 1,\n staleTime: 30000,\n })\n\n const zapError = !!error\n\n const principalDecimals = bond?.lpToken?.decimals?.[ChainId.APTOS] ?? 6\n\n // Panora returns amounts in human-readable format (no decimal conversion needed)\n const estimatedDepositAmount = quoteData?.toTokenAmount\n ? toFixedString(quoteData.toTokenAmount, principalDecimals)\n : '0'\n\n const minimumDepositAmount = quoteData?.minToTokenAmount\n ? toFixedString(quoteData.minToTokenAmount, principalDecimals)\n : '0'\n\n const zapLoading = isLoading || isFetching\n\n return [zapLoading, quoteData ?? null, estimatedDepositAmount, zapError, minimumDepositAmount]\n}\n\nexport default useAptosZapQuote\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useJupiterSolanaQuote.js","sources":["../../../src/state/zap/useJupiterSolanaQuote.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport useDebounce from '../../hooks/useDebounce'\nimport { createJupiterApiClient, QuoteGetRequest, QuoteResponse } from '@jup-ag/api'\nimport { formatUnits, parseUnits } from '../../utils/fixedPoint'\n\n// Create Jupiter API client\nconst jupiterQuoteApi = createJupiterApiClient()\n\nconst useJupiterSolanaQuote = (\n typedValue: string,\n inputCurrency: 'NATIVE' | Token | undefined,\n bond: BondsData | undefined,\n account?: string,\n preferDirectRoutes = true, // Try direct routes first for smaller tx size\n slippage = 0.5, // Slippage tolerance percentage (e.g., 0.5 = 0.5%)\n): [\n loading: boolean,\n response: QuoteResponse | null,\n depositAmount: string,\n error: boolean,\n isDirect: boolean,\n minimumDepositAmount: string,\n wrapAndUnwrapSol: boolean,\n] => {\n const debouncedInput = useDebounce(typedValue, 400)\n\n const principalToken = bond?.lpToken as Token\n const chainId = ChainId.SOL\n\n // Get token addresses\n const inputTokenAddress =\n inputCurrency === 'NATIVE'\n ? 'So11111111111111111111111111111111111111112' // Native SOL (wrapped SOL)\n : inputCurrency?.address[chainId]\n const principalTokenAddress = principalToken?.address[chainId]\n const inputCurrencyDecimals = inputCurrency === 'NATIVE' ? 9 : inputCurrency?.decimals![chainId]\n\n const wrapAndUnwrapSol = inputCurrency === 'NATIVE' // true for native SOL, false for wSOL token\n\n // Calculate amount in smallest unit (lamports for SOL, or token's base unit)\n const amountInSmallestUnit = parseUnits(debouncedInput ?? '0', inputCurrencyDecimals ?? 9).toString()\n\n // Build query params for Jupiter - try direct routes first\n const directQueryParams: QuoteGetRequest | null = useMemo(() => {\n if (\n !inputTokenAddress ||\n !principalTokenAddress ||\n amountInSmallestUnit === '0' ||\n amountInSmallestUnit === 'NaN' ||\n !account ||\n inputTokenAddress === principalTokenAddress\n ) {\n return null\n }\n\n return {\n inputMint: inputTokenAddress,\n outputMint: principalTokenAddress,\n amount: parseInt(amountInSmallestUnit),\n slippageBps: Math.round(slippage * 100), // Convert percentage to basis points (0.5% = 50 bps)\n onlyDirectRoutes: true, // Try direct route first\n asLegacyTransaction: false,\n dexes: ['Raydium'],\n maxAccounts: 24,\n useWsol: inputCurrency !== 'NATIVE',\n }\n }, [inputTokenAddress, principalTokenAddress, amountInSmallestUnit, account, slippage, inputCurrency])\n\n // Fallback params with multi-hop routing\n const multiHopQueryParams: QuoteGetRequest | null = useMemo(() => {\n if (!directQueryParams) return null\n return {\n ...directQueryParams,\n onlyDirectRoutes: false, // Allow multi-hop for better pricing\n }\n }, [directQueryParams])\n\n const fetchJupiterQuote = async (): Promise<{ quote: QuoteResponse | null; isDirect: boolean }> => {\n if (!directQueryParams) return { quote: null, isDirect: false }\n\n try {\n // STEP 1: Try direct route first (smaller transaction size)\n if (preferDirectRoutes) {\n try {\n console.log('Trying direct route on Jupiter')\n console.log(directQueryParams)\n const directQuote = await jupiterQuoteApi.quoteGet(directQueryParams)\n if (directQuote) {\n console.log('Got direct route quote from Jupiter')\n console.log('Test Tx Size Log | Route Plan:', directQuote.routePlan)\n console.log('Test Tx Size Log | Route Plan details:', JSON.stringify(directQuote.routePlan, null, 2))\n return { quote: directQuote, isDirect: true }\n }\n } catch (directError) {\n console.error('Direct route error:', directError)\n }\n }\n\n // STEP 2: Fallback to multi-hop routing (better pricing, larger tx)\n if (multiHopQueryParams) {\n const multiHopQuote = await jupiterQuoteApi.quoteGet(multiHopQueryParams)\n console.log('Got multi-hop route quote from Jupiter')\n return { quote: multiHopQuote, isDirect: false }\n }\n\n return { quote: null, isDirect: false }\n } catch (error) {\n console.error('Jupiter quote error:', error)\n throw error\n }\n }\n\n const {\n data: response,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, 'jupiter-solana', directQueryParams, preferDirectRoutes, slippage],\n queryFn: fetchJupiterQuote,\n refetchInterval: 60000,\n enabled: !!directQueryParams,\n retry: 1,\n staleTime: 30000,\n })\n\n const zapError = !!error\n\n const quoteData = response?.quote\n const isDirect = response?.isDirect ?? false\n\n const estimatedOutputAmount = quoteData?.outAmount\n const minimumOutputAmount = quoteData?.otherAmountThreshold\n\n const estimatedDepositAmount = estimatedOutputAmount\n ? formatUnits(estimatedOutputAmount.toString(), principalToken?.decimals![chainId] ?? 9)\n : '0'\n\n const minimumDepositAmount = minimumOutputAmount\n ? formatUnits(minimumOutputAmount.toString(), principalToken?.decimals![chainId] ?? 9)\n : '0'\n\n const zapLoading = isLoading || isFetching\n\n return [\n zapLoading,\n quoteData ?? null,\n estimatedDepositAmount,\n zapError,\n isDirect,\n minimumDepositAmount,\n wrapAndUnwrapSol,\n ]\n}\n\nexport default useJupiterSolanaQuote\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSoulZapBondQuote.js","sources":["../../../src/state/zap/useSoulZapBondQuote.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { BillVersion, ChainId, dexFactories, LiquidityDex, Token, Wrappers } from '@ape.swap/apeswap-lists'\nimport { getChainParam, getLpType } from './getChainParam'\nimport { apiPost } from '../../utils/httpClient'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport useCurrencyPrice from '../../state/price/useCurrencyPrice'\nimport { BondsData } from '../../types/bonds'\nimport { useSlippage } from '../slippage/useSlippage'\nimport useDebounce from '../../hooks/useDebounce'\nimport { WNATIVE, zapInputTokens } from '@ape.swap/apeswap-lists'\nimport { SOUL_ZAP_API, zapSupported, ZapSupportedChainId } from '../../config/constants/variables'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { formatUnits, parseUnits } from '../../utils/fixedPoint'\n\nconst useSoulZapBondQuote = (\n typedValue: string,\n inputCurrency: 'NATIVE' | Token | undefined,\n bond: BondsData | undefined,\n account?: string,\n tierProofSig?: string,\n): [loading: boolean, response: any, depositAmount: string, error: boolean, trueBondPrice: string | undefined] => {\n const isZapSupported = zapSupported.includes(bond?.chainId as ZapSupportedChainId)\n const debouncedInput = useDebounce(typedValue, 500)\n const isDebouncing = typedValue !== debouncedInput\n const { evmSlippage: slippage } = useSlippage()\n const SDKConfig = useSDKConfig()\n\n const principalToken = bond?.lpToken as Token\n const bondContractAddress = bond?.contractAddress[bond?.chainId as ChainId]\n const chainId = bond?.chainId as ChainId\n const inputCurrencyString =\n inputCurrency === 'NATIVE' ? '0x0000000000000000000000000000000000000000' : inputCurrency?.address[chainId]\n const inputCurrencyDecimals = inputCurrency === 'NATIVE' ? 18 : inputCurrency?.decimals![chainId]\n const principalContractAddress = principalToken?.address[chainId]\n const chainName = getChainParam(chainId)\n\n const isReserveBond = bond?.billType === 'reserve' || bond?.billType === 'staking'\n const liquidityDex: LiquidityDex | undefined =\n principalToken?.liquiditySource?.[chainId] ?? principalToken?.liquidityDex?.[chainId]\n const protocol = dexFactories[chainId]?.[liquidityDex!]?.protocol\n const lpType = isReserveBond ? 'single' : getLpType(protocol)\n const vault = principalToken?.address?.[chainId]\n const router = dexFactories[chainId]?.[liquidityDex!]?.router\n\n const bigishInputAmount = parseUnits(debouncedInput ?? '0', inputCurrencyDecimals ?? 18).toString()\n\n const zapInputData = useMemo(() => {\n if (\n inputCurrencyString &&\n inputCurrencyDecimals &&\n bigishInputAmount !== 'NaN' &&\n bigishInputAmount !== '0' &&\n principalContractAddress &&\n chainName &&\n bondContractAddress &&\n isZapSupported\n ) {\n if (principalToken.liquidityWrapper && principalToken.liquidityWrapper === Wrappers.Steer) {\n return {\n chain: chainName,\n recipient: account ?? '0x0000000000000000000000000000000000000000',\n user: account ?? '0x0000000000000000000000000000000000000000',\n integrator: 'apebond',\n lpData: {\n lpType: 'steer',\n fromToken: inputCurrencyString,\n fromAmount: bigishInputAmount,\n lpAddress: vault,\n periphery: '0xCEBF1A54A9Ce703FC80967760b5A6cbDb4111099',\n slippage,\n },\n protocolData: {\n protocol: 'ApeBond',\n bond: bondContractAddress,\n depositer: account ?? '0x0000000000000000000000000000000000000000',\n tierProofSignature: bond.billVersion === BillVersion.V4 && tierProofSig ? tierProofSig : undefined,\n enableTierOptimizer: SDKConfig.useTiers,\n tierBoostRate: bond.tierBoostRate,\n },\n }\n }\n // a.k.a if it is principal token\n if (inputCurrency !== 'NATIVE' && inputCurrency?.address[chainId] === principalToken.address[chainId]) {\n return {\n chain: chainName,\n recipient: account ?? '0x0000000000000000000000000000000000000000',\n user: account ?? '0x0000000000000000000000000000000000000000',\n integrator: 'apebond',\n lpData: {\n lpType: 'none',\n fromToken: inputCurrencyString,\n fromAmount: bigishInputAmount,\n },\n protocolData: {\n protocol: 'ApeBond',\n bond: bondContractAddress,\n depositer: account ?? '0x0000000000000000000000000000000000000000',\n tierProofSignature: bond.billVersion === BillVersion.V4 && tierProofSig ? tierProofSig : undefined,\n enableTierOptimizer: SDKConfig.useTiers,\n tierBoostRate: bond.tierBoostRate,\n },\n }\n } else\n return {\n chain: chainName,\n recipient: account ?? '0x0000000000000000000000000000000000000000',\n user: account ?? '0x0000000000000000000000000000000000000000',\n integrator: 'apebond',\n lpData: {\n lpType:\n inputCurrency !== 'NATIVE' && inputCurrency?.address[chainId] === principalToken.address[chainId]\n ? 'none'\n : lpType,\n fromToken: inputCurrencyString,\n fromAmount: bigishInputAmount,\n slippage: slippage,\n lpAddress: isReserveBond ? undefined : vault,\n router: lpType === 'solidly' || lpType === 'univ2' ? router : undefined,\n toToken: isReserveBond ? vault : undefined,\n },\n protocolData: {\n protocol: 'ApeBond',\n bond: bondContractAddress,\n depositer: account ?? '0x0000000000000000000000000000000000000000',\n tierProofSignature: bond.billVersion === BillVersion.V4 && tierProofSig ? tierProofSig : undefined,\n enableTierOptimizer: SDKConfig.useTiers,\n tierBoostRate: bond.tierBoostRate,\n },\n }\n } else {\n return null\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [\n bigishInputAmount,\n principalContractAddress,\n chainName,\n account,\n vault,\n lpType,\n router,\n slippage,\n ])\n\n const queryKey = useMemo(() => {\n if (!zapInputData) return null\n return [\n 'zapBondDetails',\n zapInputData.chain,\n zapInputData.user,\n zapInputData.lpData.lpType,\n zapInputData.lpData.fromToken,\n zapInputData.lpData.fromAmount,\n zapInputData.lpData.slippage,\n zapInputData.lpData.lpAddress,\n zapInputData.lpData.router ?? '',\n ]\n }, [zapInputData])\n\n const fetchZapDetails = async () => {\n const response = await apiPost<any>(SOUL_ZAP_API, zapInputData)\n return response?.result?.data ?? response\n }\n\n const {\n data: response,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, queryKey],\n queryFn: fetchZapDetails,\n refetchInterval: 60000, // i.e. 60 sec\n staleTime: 60000,\n enabled: !!queryKey,\n retry: 1,\n })\n const zapError = !!error\n\n const tokenList = zapInputTokens[chainId] ? zapInputTokens[chainId] : []\n\n // toToken0 data\n const toToken0Estimate: string | undefined = response?.lpQuote?.token0?.fromAmountEstimate\n const toToken0 = [...tokenList, principalToken]?.find(\n (token) => token?.address?.[chainId]?.toLowerCase() === response?.lpQuote?.token0?.address?.toLowerCase(),\n )\n const toToken0Price = useCurrencyPrice(toToken0 ?? null, chainId)\n\n // toToken1 data\n const toToken1Estimate: string | undefined = response?.lpQuote?.token1?.fromAmountEstimate\n const toToken1 = zapInputTokens[chainId]?.find(\n (token) => token.address[chainId]?.toLowerCase() === response?.lpQuote?.token1?.address?.toLowerCase(),\n )\n const toToken1Price = useCurrencyPrice(toToken1 ?? null, chainId)\n\n let toToken0USD =\n Number(formatUnits(toToken0Estimate ?? '0', toToken0?.decimals![chainId] ?? 18)) * (toToken0Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token0?.fromAmountUSD) {\n toToken0USD = Number(response?.lpQuote?.token0?.fromAmountUSD)\n }\n\n let toToken1USD =\n Number(formatUnits(toToken1Estimate ?? '0', toToken1?.decimals![chainId] ?? 18)) * (toToken1Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token1?.fromAmountUSD) {\n toToken1USD = Number(response?.lpQuote?.token1?.fromAmountUSD)\n }\n\n const youSpendUSD = toToken0USD + toToken1USD // youSpendUSD\n const estimatedDepositAmount = youSpendUSD / Number(bond?.principalTokenPrice ?? '0')\n\n const isWrap =\n inputCurrency === 'NATIVE' &&\n bond?.lpToken?.address?.[chainId]?.toLowerCase() === WNATIVE[chainId]?.address?.[chainId]?.toLowerCase()\n\n const isPrincipalToken =\n inputCurrency !== 'NATIVE' && inputCurrency?.address[chainId] === principalToken.address[chainId]\n\n const estimatedDepositAmountToReturn =\n isWrap || isPrincipalToken\n ? (Number(typedValue || '0') * ((100 - bond?.tierBoostRate!) / 100)).toString()\n : estimatedDepositAmount.toString()\n\n const trueBondPrice: string | undefined = response?.protocolQuote?.trueBondPrice\n\n // DEBUG: log tierOptimization when present\n if (response?.protocolQuote?.tierOptimization) {\n const tier = response.protocolQuote.tierOptimization\n const decimals = principalToken?.decimals?.[chainId] ?? 18\n const cost = Number(formatUnits(tier.tierCost, decimals))\n const input = Number(formatUnits(tier.bondInput, decimals))\n const profit = Number(formatUnits(tier.profit, decimals))\n console.log('[ZAP] tierOptimization:', {\n tier: `${tier.previousTier} → ${tier.newTier}`,\n cost: cost.toFixed(6),\n bondInput: input.toFixed(6),\n profit: profit.toFixed(6),\n })\n }\n\n const zapLoading = isDebouncing || isLoading || isFetching\n if (zapLoading) return [true, undefined, '', false, undefined]\n\n return [zapLoading, response, estimatedDepositAmountToReturn, zapError, trueBondPrice]\n}\n\nexport default useSoulZapBondQuote\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSuiZapQuote.js","sources":["../../../src/state/zap/useSuiZapQuote.ts"],"sourcesContent":["// =============================================================================\n// useSuiZapQuote — Aftermath Finance DEX aggregator quote for Sui zap\n// =============================================================================\n//\n// Mainnet: fetches a swap quote from Aftermath Finance (Sui DEX aggregator)\n// when the user selects an input token different from the bond's principal token.\n//\n// Testnet: no DEX aggregator supports Sui testnet or our custom test tokens.\n// Returns a mock quote calculated from fallback prices so the full zap UI and\n// two-TX flow (mint → deposit) can be tested end-to-end.\n//\n// Aftermath API: POST https://aftermath.finance/api/router/trade-route\n\nimport { useMemo } from 'react'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport useDebounce from '../../hooks/useDebounce'\nimport { apiPost } from '../../utils/httpClient'\nimport { IS_SUI_MAINNET } from '../../constants/suiConstants'\nimport { formatUnits, parseUnits, toFixedString } from '../../utils/fixedPoint'\n\nconst AFTERMATH_API_URL = 'https://aftermath.finance/api/router/trade-route'\nconst AFTERMATH_TX_API_URL = 'https://aftermath.finance/api/router/transactions/trade'\n\ninterface AftermathCoinInfo {\n type: string\n amount: string // atomic units with BigInt \"n\" suffix, e.g. \"963906n\"\n tradeFee: string\n}\n\ninterface AftermathTradeRoute {\n routes: Array<{\n paths: Array<Record<string, unknown>>\n portion: string\n coinIn: AftermathCoinInfo\n coinOut: AftermathCoinInfo\n spotPrice: number\n }>\n coinIn: AftermathCoinInfo\n coinOut: AftermathCoinInfo\n spotPrice: number\n netTradeFeePercentage: number\n}\n\n/** Parse Aftermath amount strings — they may have a trailing \"n\" (BigInt notation) */\nconst parseAftermathAmount = (amount: string): string => {\n return amount.replace(/n$/, '')\n}\n\nconst useSuiZapQuote = (\n typedValue: string,\n inputToken: Token | undefined,\n bond: BondsData | undefined,\n account?: string,\n slippage = 0.5,\n): [\n loading: boolean,\n response: AftermathTradeRoute | null,\n depositAmount: string,\n error: boolean,\n minimumDepositAmount: string,\n] => {\n const debouncedInput = useDebounce(typedValue, 400)\n\n const principalTokenAddress = bond?.lpToken?.address?.[ChainId.SUI]\n const inputTokenAddress = inputToken?.address?.[ChainId.SUI]\n\n // Aftermath uses atomic units — convert from human-readable\n const inputDecimals = inputToken?.decimals?.[ChainId.SUI] ?? 9\n const inputAmountAtomic = useMemo(() => {\n if (!debouncedInput || Number(debouncedInput) <= 0) return '0'\n return parseUnits(debouncedInput, inputDecimals, 'floor').toString()\n }, [debouncedInput, inputDecimals])\n\n const principalDecimals = bond?.lpToken?.decimals?.[ChainId.SUI] ?? 6\n\n const queryParams = useMemo(() => {\n if (\n !inputTokenAddress ||\n !principalTokenAddress ||\n inputAmountAtomic === '0' ||\n !account ||\n inputTokenAddress.toLowerCase() === principalTokenAddress.toLowerCase()\n ) {\n return null\n }\n\n return {\n coinInType: inputTokenAddress,\n coinOutType: principalTokenAddress,\n coinInAmount: inputAmountAtomic,\n }\n }, [inputTokenAddress, principalTokenAddress, inputAmountAtomic, account])\n\n // -------------------------------------------------------------------------\n // Mainnet: fetch real quote from Aftermath\n // -------------------------------------------------------------------------\n const fetchAftermathQuote = async (): Promise<AftermathTradeRoute | null> => {\n if (!queryParams) return null\n\n const data = await apiPost<AftermathTradeRoute>(AFTERMATH_API_URL, queryParams)\n if (!data?.coinOut?.amount) return null\n return data\n }\n\n const {\n data: quoteData,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, 'aftermath-sui', queryParams],\n queryFn: fetchAftermathQuote,\n refetchInterval: 60000,\n enabled: IS_SUI_MAINNET && !!queryParams,\n retry: 1,\n staleTime: 30000,\n })\n\n // Use testnet mock on testnet, real quote on mainnet\n const activeQuote = quoteData ?? null\n const zapError = !!error\n\n // Convert amounts to human-readable\n const outputAmountDecimal = activeQuote?.coinOut?.amount\n ? formatUnits(parseAftermathAmount(activeQuote.coinOut.amount), principalDecimals)\n : undefined\n\n const estimatedDepositAmount = outputAmountDecimal ? toFixedString(outputAmountDecimal, principalDecimals) : '0'\n\n // Apply slippage for minimum deposit amount\n const minimumDepositAmount = outputAmountDecimal\n ? toFixedString(Number(outputAmountDecimal) * (1 - slippage / 100), principalDecimals)\n : '0'\n\n const zapLoading = IS_SUI_MAINNET ? isLoading || isFetching : false\n\n return [zapLoading, activeQuote, estimatedDepositAmount, zapError, minimumDepositAmount]\n}\n\nexport { AFTERMATH_TX_API_URL }\n\nexport default useSuiZapQuote\n"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAYA,MAAM,iBAAiB,GAAG,kDAAkD;AAC5E,MAAM,oBAAoB,GAAG;AAsB7B;AACA,MAAM,oBAAoB,GAAG,CAAC,MAAc,KAAY;IACtD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,cAAc,GAAG,CACrB,UAAkB,EAClB,UAA6B,EAC7B,IAA2B,EAC3B,OAAgB,EAChB,QAAQ,GAAG,GAAG,KAOZ;IACF,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC;AAEnD,IAAA,MAAM,qBAAqB,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IACnE,MAAM,iBAAiB,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;;AAG5D,IAAA,MAAM,aAAa,GAAG,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9D,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAK;QACrC,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9D,OAAO,UAAU,CAAC,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;AACtE,IAAA,CAAC,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAEnC,IAAA,MAAM,iBAAiB,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAErE,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAK;AAC/B,QAAA,IACE,CAAC,iBAAiB;AAClB,YAAA,CAAC,qBAAqB;AACtB,YAAA,iBAAiB,KAAK,GAAG;AACzB,YAAA,CAAC,OAAO;YACR,iBAAiB,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC,WAAW,EAAE,EACvE;AACA,YAAA,OAAO,IAAI;QACb;QAEA,OAAO;AACL,YAAA,UAAU,EAAE,iBAAiB;AAC7B,YAAA,WAAW,EAAE,qBAAqB;AAClC,YAAA,YAAY,EAAE,iBAAiB;SAChC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;;;;AAK1E,IAAA,MAAM,mBAAmB,GAAG,YAAgD;AAC1E,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;QAE7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAsB,iBAAiB,EAAE,WAAW,CAAC;AAC/E,QAAA,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACvC,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,MAAM,EACJ,IAAI,EAAE,SAAS,EACf,SAAS,EACT,UAAU,EACV,KAAK,GACN,GAAG,QAAQ,CAAC;QACX,QAAQ,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,EAAE,WAAW,CAAC;AACpE,QAAA,OAAO,EAAE,mBAAmB;AAC5B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,OAAO,EAAoB,CAAC,CAAC,WAAW;AACxC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,SAAS,EAAE,KAAK;AACjB,KAAA,CAAC;;AAGF,IAAA,MAAM,WAAW,GAAG,SAAS,IAAI,IAAI;AACrC,IAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK;;AAGxB,IAAA,MAAM,mBAAmB,GAAG,WAAW,EAAE,OAAO,EAAE;AAChD,UAAE,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB;UAC/E,SAAS;AAEb,IAAA,MAAM,sBAAsB,GAAG,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,GAAG,GAAG;;IAGhH,MAAM,oBAAoB,GAAG;AAC3B,UAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,EAAE,iBAAiB;UACnF,GAAG;AAEP,IAAA,MAAM,UAAU,GAAoB,SAAS,IAAI,UAAU,CAAQ;IAEnE,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,oBAAoB,CAAC;AAC1F;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bondCodec.js","sources":["../../src/types/bondCodec.ts"],"sourcesContent":["import { Address, getAddressDecoder } from '@solana/addresses'\nimport {\n FixedSizeDecoder,\n fixDecoderSize,\n getBytesDecoder,\n getStructDecoder,\n getU64Decoder,\n ReadonlyUint8Array,\n} from '@solana/codecs'\nimport { BOND_DISCRIMINATOR } from '../constants/solanaConstants'\n\n// Bond account interface based on IDL\nexport interface BondAccount {\n anchorDiscriminator: ReadonlyUint8Array\n nftMint: Address\n payout: bigint\n payoutClaimed: bigint\n vestingStartTimestamp: bigint\n lastClaimTimestamp: bigint\n truePricePaid: bigint\n vesting: bigint\n vestingTerm: bigint\n}\n\n// Create the Bond account decoder\nexport const bondDecoder: FixedSizeDecoder<BondAccount> = getStructDecoder([\n ['anchorDiscriminator', fixDecoderSize(getBytesDecoder(), 8)],\n ['nftMint', getAddressDecoder()],\n ['payout', getU64Decoder()],\n ['payoutClaimed', getU64Decoder()],\n ['vestingStartTimestamp', getU64Decoder()],\n ['lastClaimTimestamp', getU64Decoder()],\n ['truePricePaid', getU64Decoder()],\n ['vesting', getU64Decoder()],\n ['vestingTerm', getU64Decoder()],\n])\n\n// Helper function to verify discriminator\nexport function verifyBondDiscriminator(data: ReadonlyUint8Array): boolean {\n const discriminator = data.slice(0, 8)\n return Array.from(discriminator).every((byte, index) => byte === BOND_DISCRIMINATOR[index])\n}\n"],"names":[],"mappings":";;;;AAwBA;AACO,MAAM,WAAW,GAAkC,gBAAgB,CAAC;IACzE,CAAC,qBAAqB,EAAE,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAChC,IAAA,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;AAC3B,IAAA,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC;AAClC,IAAA,CAAC,uBAAuB,EAAE,aAAa,EAAE,CAAC;AAC1C,IAAA,CAAC,oBAAoB,EAAE,aAAa,EAAE,CAAC;AACvC,IAAA,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC;AAClC,IAAA,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;AAC5B,IAAA,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;AACjC,CAAA;AAED;AACM,SAAU,uBAAuB,CAAC,IAAwB,EAAA;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC7F;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bondIssuanceCodec.js","sources":["../../src/types/bondIssuanceCodec.ts"],"sourcesContent":["import { Address, getAddressDecoder } from '@solana/addresses'\nimport {\n FixedSizeDecoder,\n fixDecoderSize,\n getBytesDecoder,\n getStructDecoder,\n getU8Decoder,\n getU32Decoder,\n getU64Decoder,\n ReadonlyUint8Array,\n} from '@solana/codecs'\nimport { BOND_ISSUANCE_DISCRIMINATOR } from '../constants/solanaConstants'\n\n// BondIssuance account interface based on IDL\nexport interface BondIssuanceAccount {\n anchorDiscriminator: ReadonlyUint8Array\n issuanceCounter: number\n bondCounter: number\n payoutMint: Address\n principalMint: Address\n principalMintDecimals: number\n payoutMintDecimals: number\n treasuryAta: Address\n status: number // 0 = Paused, 1 = Active, 2 = Closed\n feeInPrincipal: bigint\n feePrincipalRecipient: Address\n feeInPayout: bigint\n feePayoutRecipient: Address\n partnerPrincipalRecipient: Address\n collection: Address\n bump: number\n}\n\n// BondIssuance discriminator from IDL\n\n// Create the BondIssuance account decoder using Solana Kit's codec utilities\nexport const bondIssuanceDecoder: FixedSizeDecoder<BondIssuanceAccount> = getStructDecoder([\n ['anchorDiscriminator', fixDecoderSize(getBytesDecoder(), 8)],\n ['issuanceCounter', getU32Decoder()],\n ['bondCounter', getU32Decoder()],\n ['payoutMint', getAddressDecoder()],\n ['principalMint', getAddressDecoder()],\n ['principalMintDecimals', getU8Decoder()],\n ['payoutMintDecimals', getU8Decoder()],\n ['treasuryAta', getAddressDecoder()],\n ['status', getU8Decoder()],\n ['feeInPrincipal', getU64Decoder()],\n ['feePrincipalRecipient', getAddressDecoder()],\n ['feeInPayout', getU64Decoder()],\n ['feePayoutRecipient', getAddressDecoder()],\n ['partnerPrincipalRecipient', getAddressDecoder()],\n ['collection', getAddressDecoder()],\n ['bump', getU8Decoder()],\n])\n\n// Helper function to verify discriminator\nexport function verifyBondIssuanceDiscriminator(data: ReadonlyUint8Array): boolean {\n const discriminator = data.slice(0, 8)\n return Array.from(discriminator).every((byte, index) => byte === BOND_ISSUANCE_DISCRIMINATOR[index])\n}\n"],"names":[],"mappings":";;;;AAiCA;AAEA;AACO,MAAM,mBAAmB,GAA0C,gBAAgB,CAAC;IACzF,CAAC,qBAAqB,EAAE,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC;AACpC,IAAA,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;AAChC,IAAA,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;AACnC,IAAA,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC;AACtC,IAAA,CAAC,uBAAuB,EAAE,YAAY,EAAE,CAAC;AACzC,IAAA,CAAC,oBAAoB,EAAE,YAAY,EAAE,CAAC;AACtC,IAAA,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACpC,IAAA,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;AAC1B,IAAA,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC;AACnC,IAAA,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;AAC9C,IAAA,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;AAChC,IAAA,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;AAC3C,IAAA,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,CAAC;AAClD,IAAA,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;AACnC,IAAA,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;AACzB,CAAA;AAED;AACM,SAAU,+BAA+B,CAAC,IAAwB,EAAA;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,2BAA2B,CAAC,KAAK,CAAC,CAAC;AACtG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bondPricingCodec.js","sources":["../../src/types/bondPricingCodec.ts"],"sourcesContent":["import {\n FixedSizeDecoder,\n fixDecoderSize,\n getBytesDecoder,\n getStructDecoder,\n getU64Decoder,\n ReadonlyUint8Array,\n} from '@solana/codecs'\nimport { BOND_PRICING_DISCRIMINATOR } from '../constants/solanaConstants'\n\n// BondPricing account interface based on IDL\nexport interface BondPricingAccount {\n anchorDiscriminator: ReadonlyUint8Array\n totalDebt: bigint\n totalPayoutGiven: bigint\n totalPrincipalBilled: bigint\n lastDecay: bigint\n lastBcvUpdateTimestamp: bigint\n minBcvUpdateInterval: bigint\n}\n\n// BondPricing discriminator from IDL\n\n// Create the BondPricing account decoder\nexport const bondPricingDecoder: FixedSizeDecoder<BondPricingAccount> = getStructDecoder([\n ['anchorDiscriminator', fixDecoderSize(getBytesDecoder(), 8)],\n ['totalDebt', getU64Decoder()],\n ['totalPayoutGiven', getU64Decoder()],\n ['totalPrincipalBilled', getU64Decoder()],\n ['lastDecay', getU64Decoder()],\n ['lastBcvUpdateTimestamp', getU64Decoder()],\n ['minBcvUpdateInterval', getU64Decoder()],\n])\n\n// Helper function to verify discriminator\nexport function verifyBondPricingDiscriminator(data: ReadonlyUint8Array): boolean {\n const discriminator = data.slice(0, 8)\n return Array.from(discriminator).every((byte, index) => byte === BOND_PRICING_DISCRIMINATOR[index])\n}\n"],"names":[],"mappings":";;;AAqBA;AAEA;AACO,MAAM,kBAAkB,GAAyC,gBAAgB,CAAC;IACvF,CAAC,qBAAqB,EAAE,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;AAC9B,IAAA,CAAC,kBAAkB,EAAE,aAAa,EAAE,CAAC;AACrC,IAAA,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAC;AACzC,IAAA,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;AAC9B,IAAA,CAAC,wBAAwB,EAAE,aAAa,EAAE,CAAC;AAC3C,IAAA,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAC;AAC1C,CAAA;AAED;AACM,SAAU,8BAA8B,CAAC,IAAwB,EAAA;IACrE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,0BAA0B,CAAC,KAAK,CAAC,CAAC;AACrG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bondTermCodec.js","sources":["../../src/types/bondTermCodec.ts"],"sourcesContent":["import {\n FixedSizeDecoder,\n fixDecoderSize,\n getBytesDecoder,\n getStructDecoder,\n getU8Decoder,\n getU64Decoder,\n ReadonlyUint8Array,\n} from '@solana/codecs'\nimport { BOND_TERM_DISCRIMINATOR } from '../constants/solanaConstants'\n\n// BondTerm account interface based on IDL\nexport interface BondTermAccount {\n anchorDiscriminator: ReadonlyUint8Array\n controlVariable: bigint\n vestingEnd: bigint\n minimumDebt: bigint\n maxPayout: bigint\n maxDebt: bigint\n maxTotalPayout: bigint\n initialDebt: bigint\n payoutTokenInitialSupply: bigint\n vestingStrategy: number\n}\n\n// Create the BondTerm account decoder\nexport const bondTermDecoder: FixedSizeDecoder<BondTermAccount> = getStructDecoder([\n ['anchorDiscriminator', fixDecoderSize(getBytesDecoder(), 8)],\n ['controlVariable', getU64Decoder()],\n ['vestingEnd', getU64Decoder()],\n ['minimumDebt', getU64Decoder()],\n ['maxPayout', getU64Decoder()],\n ['maxDebt', getU64Decoder()],\n ['maxTotalPayout', getU64Decoder()],\n ['initialDebt', getU64Decoder()],\n ['payoutTokenInitialSupply', getU64Decoder()],\n ['vestingStrategy', getU8Decoder()],\n])\n\n// Helper function to verify discriminator\nexport function verifyBondTermDiscriminator(data: ReadonlyUint8Array): boolean {\n const discriminator = data.slice(0, 8)\n return Array.from(discriminator).every((byte, index) => byte === BOND_TERM_DISCRIMINATOR[index])\n}\n"],"names":[],"mappings":";;;AAyBA;AACO,MAAM,eAAe,GAAsC,gBAAgB,CAAC;IACjF,CAAC,qBAAqB,EAAE,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC;AACpC,IAAA,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;AAC/B,IAAA,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;AAChC,IAAA,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;AAC9B,IAAA,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;AAC5B,IAAA,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC;AACnC,IAAA,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;AAChC,IAAA,CAAC,0BAA0B,EAAE,aAAa,EAAE,CAAC;AAC7C,IAAA,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC;AACpC,CAAA;AAED;AACM,SAAU,2BAA2B,CAAC,IAAwB,EAAA;IAClE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAClG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aptosHelpers.js","sources":["../../src/utils/aptosHelpers.ts"],"sourcesContent":["import { Aptos, AptosConfig, Network } from '@aptos-labs/ts-sdk'\nimport {\n APTOS_FULLNODE_URL,\n APTOS_VIEW_BILL_INFO,\n APTOS_VIEW_BOND_MARKET_BY_ID,\n APTOS_VIEW_MARKET_INFO,\n APTOS_VIEW_NFT_ADDRESS,\n APTOS_VIEW_USER_BILLS,\n APTOS_VIEW_VESTING_PROGRESS,\n getRandomAptosApiKey,\n IS_APTOS_MAINNET,\n} from '../constants/aptosConstants'\nimport type { AptosBillInfo, AptosMarketInfoTuple, AptosVestingProgressTuple } from '../types/aptosBonds'\n\nexport const APTOS_NETWORK: Network = IS_APTOS_MAINNET ? Network.MAINNET : Network.TESTNET\n\n// ---------------------------------------------------------------------------\n// Aptos client — lazy singleton\n// ---------------------------------------------------------------------------\n// We keep one client per (network, api key) pair. The API key is picked with\n// `getRandomAptosApiKey()` on first call, so different sessions hit a\n// different key (very simple load balancing). If the pool is empty we fall\n// back to unauthenticated requests.\nlet _aptosClient: Aptos | undefined\n\nexport const getAptosClient = (): Aptos => {\n if (_aptosClient) return _aptosClient\n const apiKey = getRandomAptosApiKey()\n // The Aptos ts-sdk exposes `API_KEY` directly on `clientConfig`; it adds\n // the `Authorization: Bearer <key>` header internally. This is the\n // idiomatic way to authenticate — no manual header wiring needed.\n const config = new AptosConfig({\n network: APTOS_NETWORK,\n ...(apiKey && { clientConfig: { API_KEY: apiKey } }),\n })\n _aptosClient = new Aptos(config)\n return _aptosClient\n}\n\n// ---------------------------------------------------------------------------\n// Address normalisation\n// ---------------------------------------------------------------------------\n// Aptos wallet adapters can surface account addresses in several shapes:\n// plain string, `{ data: Uint8Array }`, `Uint8Array`, or an `AccountAddress`\n// instance. This helper returns a canonical `0x`-prefixed hex string, or\n// `undefined` if the input cannot be decoded. We keep the interface loose so\n// callers can pass whatever the SDK hands them.\nexport const safeExtractAddress = (input: unknown): string | undefined => {\n if (input == null) return undefined\n\n // Already a string\n if (typeof input === 'string') {\n return input.startsWith('0x') ? input : `0x${input}`\n }\n\n // AccountAddress instance (has `toString()` that returns `0x...`)\n if (typeof input === 'object' && typeof (input as { toString?: () => string }).toString === 'function') {\n const asObject = input as { data?: Uint8Array | number[]; toString: () => string }\n // Prefer `.data` if it looks like a byte array — `.toString()` on\n // AccountAddress already returns the canonical hex, but some wallets\n // return `{ data: Uint8Array }` without the method.\n if (asObject.data instanceof Uint8Array) {\n return bytesToHex(asObject.data)\n }\n if (Array.isArray(asObject.data)) {\n return bytesToHex(new Uint8Array(asObject.data))\n }\n const stringified = asObject.toString()\n if (stringified.startsWith('0x')) return stringified\n }\n\n // Raw Uint8Array\n if (input instanceof Uint8Array) {\n return bytesToHex(input)\n }\n\n // Raw number[]\n if (Array.isArray(input)) {\n return bytesToHex(new Uint8Array(input))\n }\n\n return undefined\n}\n\nconst bytesToHex = (bytes: Uint8Array): string => {\n let out = '0x'\n for (let i = 0; i < bytes.length; i++) {\n out += bytes[i].toString(16).padStart(2, '0')\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Unit conversion\n// ---------------------------------------------------------------------------\n// User inputs live in \"whole tokens\" (e.g. \"1.5 USDC\"). The Aptos ts-sdk\n// serialises numeric function arguments from strings, so we convert to\n// atomic units and return a stringified BigInt.\n// export const toAtomicUnits = (amount: string | number, decimals: number): string => {\n// if (amount === '' || amount == null) return '0'\n// const bn = new BigNumber(amount).times(new BigNumber(10).pow(decimals))\n// // Floor so we never over-spend what the user typed.\n// return bn.integerValue(BigNumber.ROUND_FLOOR).toFixed(0)\n// }\n\n// ---------------------------------------------------------------------------\n// Payload builders\n// ---------------------------------------------------------------------------\n// These return the `InputEntryFunctionData` shape consumed by\n// `wallet.signAndSubmitTransaction({ sender, data: ... })`. Keeping them in\n// one place means the buy/claim components do not have to repeat the\n// function-name and argument order.\n\n// export const buildDepositPayload = (args: AptosDepositPayload) => ({\n// function: APTOS_DEPOSIT_FUNCTION,\n// typeArguments: [] as string[],\n// functionArguments: [args.market, args.amount, args.max_price, args.depositor] as (string | number)[],\n// })\n//\n// export const buildClaimPayload = (args: AptosClaimPayload) => ({\n// function: APTOS_CLAIM_FUNCTION,\n// typeArguments: [] as string[],\n// // `apebond::bond::claim(market, bill_id: u64)` — the contract takes the\n// // scalar bill_id, NOT the object address.\n// functionArguments: [args.market, args.bill_id] as (string | number)[],\n// })\n\n// ---------------------------------------------------------------------------\n// Event extractors\n// ---------------------------------------------------------------------------\n// Parse events out of a `waitForTransaction` response. The event `type`\n// format is `${module}::${EventStruct}`. We match by `.endsWith('::Foo')` so\n// we do not have to hard-code the full module path (which contains the\n// contract address).\n\ninterface AptosTxnWithEvents {\n events?: Array<{ type: string; data: Record<string, unknown> }>\n}\n\nconst extractEventData = <T = Record<string, unknown>>(txn: AptosTxnWithEvents, eventSuffix: string): T | undefined => {\n const event = txn?.events?.find((e) => e.type.includes(eventSuffix))\n return event?.data as T | undefined\n}\n\n/**\n * `bond::DepositEvent` — emitted by the deposit entry function.\n * Contains bill_id, bill_address, deposit_amount, payout_amount, price.\n */\nexport const extractDepositEvent = (\n txn: AptosTxnWithEvents,\n):\n | {\n bill_id: string\n bill_address: string\n market: string\n deposit_amount: string\n payout_amount: string\n price: string\n depositor: string\n recipient: string\n }\n | undefined => extractEventData(txn, '::DepositEvent')\n\n/**\n * Extract bill_id from transaction events. Checks both `BillMinted` (from bond_nft)\n * and `DepositEvent` (from bond) since the contract emits both.\n */\nexport const extractBillMinted = (txn: AptosTxnWithEvents): { bill_id: string; owner: string } | undefined => {\n // Try BillMinted event first (emitted by bond_nft module)\n const billMinted = extractEventData<{ bill_id: string; owner: string }>(txn, '::BillMinted')\n if (billMinted) return billMinted\n // Fall back to DepositEvent (emitted by bond module)\n const deposit = extractDepositEvent(txn)\n if (!deposit) return undefined\n return { bill_id: deposit.bill_id, owner: deposit.depositor }\n}\n\n// ---------------------------------------------------------------------------\n// Fetch helper — GraphQL to the Aptos indexer\n// ---------------------------------------------------------------------------\n// Uses the same API key that is configured on the Aptos client. Everything\n// else on the HTTP layer goes through the Aptos ts-sdk, but the indexer\n// needs a raw `fetch` call because GraphQL is not part of the SDK surface.\n// export const aptosIndexerFetch = async <T = unknown>(\n// url: string,\n// query: string,\n// variables?: Record<string, unknown>,\n// ): Promise<T> => {\n// const apiKey = getRandomAptosApiKey()\n// const response = await fetch(url, {\n// method: 'POST',\n// headers: {\n// 'Content-Type': 'application/json',\n// ...(apiKey && { Authorization: `Bearer ${apiKey}` }),\n// },\n// body: JSON.stringify({ query, variables }),\n// })\n// if (!response.ok) {\n// throw new Error(`Aptos indexer request failed: ${response.status}`)\n// }\n// const json = (await response.json()) as { data: T; errors?: Array<{ message: string }> }\n// if (json.errors?.length) {\n// throw new Error(`Aptos indexer returned errors: ${json.errors.map((e) => e.message).join(', ')}`)\n// }\n// return json.data\n// }\n\n// ---------------------------------------------------------------------------\n// View function readers (PLAN_001 Etapa 5b — real read skeleton)\n// ---------------------------------------------------------------------------\n// Thin wrappers around `aptos.view(...)` for the specific view functions the\n// SDK needs. Every reader throws on RPC / contract error — callers should\n// wrap in try/catch so a missing deployment degrades gracefully rather than\n// crashing the UI.\n//\n// Shapes are verified against apebond-move-playground pages. See the matching\n// `AptosMarketInfoTuple` / `AptosBillInfo` / `AptosVestingProgressTuple`\n// types for documentation on each field.\n\n/**\n * `bond::market_info(market)` — returns the 27-element market info tuple.\n */\nexport const readAptosMarketInfo = async (marketAddress: string): Promise<AptosMarketInfoTuple> => {\n const aptos = getAptosClient()\n const result = await aptos.view({\n payload: {\n function: APTOS_VIEW_MARKET_INFO,\n functionArguments: [marketAddress],\n },\n })\n return result as unknown as AptosMarketInfoTuple\n}\n\n/**\n * `bond::bill_info(market, bill_id)` — returns the Bill struct for a\n * specific bill. The contract takes `bill_id: u64` (NOT the object address).\n * Uses REST directly to avoid SDK remoteAbi serialisation bug with u64 args.\n */\nexport const readAptosBillInfo = async (marketAddress: string, billId: string): Promise<AptosBillInfo> => {\n const result = await viewViaRest(APTOS_VIEW_BILL_INFO, [marketAddress, billId])\n return result[0] as unknown as AptosBillInfo\n}\n\n/**\n * `bond_nft::user_bills(user)` — returns all bill_ids owned by the user\n * across every deployed market. The view returns `[bill_ids]` (the inner\n * array is at index 0), so we unwrap it here.\n */\nexport const readUserBillIds = async (user: string): Promise<string[]> => {\n const aptos = getAptosClient()\n const result = await aptos.view({\n payload: {\n function: APTOS_VIEW_USER_BILLS,\n functionArguments: [user],\n },\n })\n const ids = (result[0] ?? []) as unknown as Array<string | number>\n return ids.map((id) => String(id))\n}\n\n/**\n * `bond::vesting_progress(market, bill_id)` — returns `[vested_amount, claimable_amount]`.\n * Note: this is in `bond` module (not `bond_nft`), and takes the market as first argument.\n * Uses REST directly to avoid SDK remoteAbi serialisation bug with u64 args.\n */\nexport const readVestingProgress = async (\n marketAddress: string,\n billId: string,\n): Promise<AptosVestingProgressTuple> => {\n const result = await viewViaRest(APTOS_VIEW_VESTING_PROGRESS, [marketAddress, billId])\n return [String(result[0] ?? '0'), String(result[1] ?? '0')] as const\n}\n\n// ---------------------------------------------------------------------------\n// REST-based view call — bypasses the SDK's remoteAbi serialisation which\n// has a bug in v6.x where u64 arguments to functions returning `address` get\n// mis-serialised. The REST endpoint handles string arguments natively.\n// ---------------------------------------------------------------------------\nconst viewViaRest = async (fn: string, args: string[], typeArgs: string[] = []): Promise<unknown[]> => {\n const apiKey = getRandomAptosApiKey()\n const res = await fetch(`${APTOS_FULLNODE_URL}/view`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey && { Authorization: `Bearer ${apiKey}` }),\n },\n body: JSON.stringify({\n function: fn,\n type_arguments: typeArgs,\n arguments: args,\n }),\n })\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`View call ${fn} failed: ${res.status} ${text}`)\n }\n return (await res.json()) as unknown[]\n}\n\n/**\n * `bond_nft::bond_market_by_id(bill_id)` — which market owns this bill.\n * Uses REST directly — SDK's aptos.view() mis-serialises u64→address functions.\n */\nexport const readBondMarketByBillId = async (billId: string): Promise<string> => {\n const result = await viewViaRest(APTOS_VIEW_BOND_MARKET_BY_ID, [billId])\n return String(result[0] ?? '')\n}\n\n/**\n * `bond_nft::nft_address(bill_id)` — resolve the scalar bill_id to the\n * on-chain NFT object address (aka `bill_addr`). Needed to then call\n * `bond::bill_info(market, bill_addr)` or `bond::claim(market, bill_addr)`.\n * Uses REST directly — SDK's aptos.view() mis-serialises u64→address functions.\n */\nexport const readNftAddressByBillId = async (billId: string): Promise<string> => {\n const result = await viewViaRest(APTOS_VIEW_NFT_ADDRESS, [billId])\n return String(result[0] ?? '')\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calculateSolanaTrueBillPrice.js","sources":["../../src/utils/calculateSolanaTrueBillPrice.ts"],"sourcesContent":["import { mulDivRound, parseUnits } from './fixedPoint'\n\n/**\n * This is the Typescript implementation of the Rust true_bond_price function since the on-chain program requires a real wallet\n *\n * Uses native BigInt with truncating division at each step, matching the real on-chain\n * Rust u64/u128 integer arithmetic (see src/utils/suiHelpers.ts for the equivalent Sui/Move\n * implementation of the same formula).\n */\nconst PRECISION_18 = 10n ** 18n\n\nexport function calculateTrueBondPrice(\n bondPricing: any,\n bondTerm: any,\n currentTimestamp: number,\n principalMintDecimals: number,\n payoutMintDecimals: number,\n feeInPrincipal: number,\n): string {\n try {\n // Extract values from the account data\n const totalDebt = BigInt(bondPricing.totalDebt?.toString() ?? '0')\n const lastDecay = BigInt(bondPricing.lastDecay?.toString() ?? '0')\n const controlVariable = BigInt(bondTerm.controlVariable?.toString() ?? '0')\n const vestingEnd = BigInt(bondTerm.vestingEnd?.toString() ?? '0')\n const minimumDebt = BigInt(bondTerm.minimumDebt?.toString() ?? '0')\n const payoutTokenInitialSupply = BigInt(bondTerm.payoutTokenInitialSupply?.toString() ?? '0')\n\n // Constants for price calculation (1e16 and 1e18)\n const e16 = 10_000_000_000_000_000n\n const principalDecimalsMultiplier = 10n ** BigInt(principalMintDecimals)\n\n // Calculate debt ratio\n const debtRatio = calculateDebtRatio(\n totalDebt,\n lastDecay,\n BigInt(currentTimestamp),\n vestingEnd,\n payoutMintDecimals,\n payoutTokenInitialSupply,\n )\n\n // Calculate price: (control_variable * debt_ratio * 1e16) / principal_decimals / 1e18\n const numerator = controlVariable * debtRatio * e16\n const price = numerator / principalDecimalsMultiplier / PRECISION_18\n\n // Apply minimum debt floor\n const priceToUse = price < minimumDebt ? minimumDebt : price\n\n // reverseFee = fee/100 / (1 - fee/100) — feeInPrincipal is a plain percentage (e.g. 0.5).\n // Scaled to 1e18 precision so the huge integer priceToUse never round-trips through a float.\n const feeToUse = feeInPrincipal\n const reverseFeeScaled = parseUnits((feeToUse / 100 / (1 - feeToUse / 100)).toString(), 18)\n const feeAdjustment = mulDivRound(priceToUse, reverseFeeScaled, PRECISION_18)\n return (priceToUse + feeAdjustment).toString()\n } catch (error) {\n console.error('Error in price calculation:', error)\n return '0'\n }\n}\n\n/**\n * This is the Typescript implementation of the Rust debt_ratio function\n */\nfunction calculateDebtRatio(\n totalDebt: bigint,\n lastDecay: bigint,\n currentTimestamp: bigint,\n vestingEnd: bigint,\n payoutDecimals: number,\n payoutTokenInitialSupply: bigint,\n): bigint {\n try {\n // If vesting term is 0 or initial supply is 0, return 0\n if (vestingEnd === 0n || payoutTokenInitialSupply === 0n) {\n return 0n\n }\n\n // Calculate time elapsed since last decay (with underflow protection)\n const timeSinceLast = currentTimestamp < lastDecay ? 0n : currentTimestamp - lastDecay\n\n // Calculate decay amount: (total_debt * time_since_last) / vesting_term\n const decayAmount = (totalDebt * timeSinceLast) / vestingEnd\n\n // Cap decay amount at total debt\n const finalDecayAmount = decayAmount > totalDebt ? totalDebt : decayAmount\n\n // Calculate current debt: total_debt - decay_amount\n const currentDebt = totalDebt - finalDecayAmount\n\n // Calculate debt ratio: (current_debt * payout_decimals_multiplier * 1e18) / initial_supply\n const payoutDecimalsMultiplier = 10n ** BigInt(payoutDecimals)\n\n const numerator = currentDebt * payoutDecimalsMultiplier * PRECISION_18\n\n return numerator / payoutTokenInitialSupply\n } catch (error) {\n console.error('Error calculating debt ratio:', error)\n return 0n\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"derivePda.js","sources":["../../src/utils/derivePda.ts"],"sourcesContent":["import { PublicKey } from '@solana/web3.js'\n\nexport const derivePda = (seed: string, base: PublicKey, programId: PublicKey) => {\n const [pda] = PublicKey.findProgramAddressSync([new TextEncoder().encode(seed), base.toBuffer()], programId)\n return pda\n}\n"],"names":[],"mappings":";;AAEO,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAe,EAAE,SAAoB,KAAI;IAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,sBAAsB,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC;AAC5G,IAAA,OAAO,GAAG;AACZ;;;;"}
|