@scallop-io/sui-scallop-sdk 4.1.2 → 4.2.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/dist/client.cjs CHANGED
@@ -7,15 +7,15 @@ var transactions = require('@mysten/sui/transactions');
7
7
  var pythSuiJs = require('@pythnetwork/pyth-sui-js');
8
8
  var jsonRpc = require('@mysten/sui/jsonRpc');
9
9
  var queryCore = require('@tanstack/query-core');
10
- var Ms = require('axios');
10
+ var Vs = require('axios');
11
11
  var bcs = require('@mysten/sui/bcs');
12
12
  var zod = require('zod');
13
13
  var grpc = require('@mysten/sui/grpc');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
17
- var Ms__default = /*#__PURE__*/_interopDefault(Ms);
17
+ var Vs__default = /*#__PURE__*/_interopDefault(Vs);
18
18
 
19
- var De=class{constructor(e){this.ctx=e;}async depositCollateral(e,o,r=true,n,a,s){let c=this.ctx.builder.createTxBlock(),i=a??this.ctx.walletAddress;c.setSender(i);let l=n??(await this.ctx.query.getObligations(i))[0]?.id;if(l)await c.depositCollateralQuick(o,e,l,s);else {let[d,u,p]=c.openObligation();await c.depositCollateralQuick(o,e,d,s),c.returnObligation(d,p),c.transferObjects([u],i);}return r?await this.ctx.executor.signAndSendTxn(c):c.txBlock}async withdrawCollateral(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=await i.takeCollateralQuick(o,e,n,a,{isSponsoredTx:c});return i.transferObjects([d],l),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}};var Le=class{constructor(e){this.ctx=e;}async supply(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.supplyQuick(o,e);return a.transferObjects([c],s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async withdraw(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.withdrawQuick(o,e);return a.transferObjects([c],s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async flashLoan(e,o,r,n=true,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let[i,l]=s.borrowFlashLoan(o,e);return s.repayFlashLoan(await r(s,i),l,e),n?await this.ctx.executor.signAndSendTxn(s):s.txBlock}};var G=class extends Error{code;context;constructor(e,o,r){super(o),this.name="ScallopError",this.code=e,this.context=r?.context,r?.cause!==void 0&&(this.cause=r.cause);}};var P=class extends G{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Ee=class extends G{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var T=class extends G{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var re=class extends G{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};var ne=class extends G{constructor(e,o){super("SCALLOP_TX_BUILD_ERROR",e,o),this.name="ScallopTransactionBuildError";}};var Ve=class{constructor(e){this.ctx=e;}async openObligation(e=true){let o=this.ctx.builder.createTxBlock();return o.openObligationEntry(),e?await this.ctx.executor.signAndSendTxn(o):o.txBlock}async borrow(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=this.ctx.constants.whitelist.lending.has(e);r&&d&&await i.unstakeObligationQuick(n,a);let u=await i.borrowQuick(o,e,n,a,{isSponsoredTx:c});return i.transferObjects([u],l),r&&d&&await i.stakeObligationWithVeScaQuick(n,a),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}async repay(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=this.ctx.constants.whitelist.lending.has(e);return r&&d&&await i.unstakeObligationQuick(n,a),await i.repayQuick(o,e,n,c),r&&d&&await i.stakeObligationWithVeScaQuick(n,a),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}async supplyAndStake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=this.ctx.utils.parseMarketCoinName(e),l=await this.ctx.query.getStakeAccounts(i),d=n??l[0]?.id,u=await s.supplyQuick(o,e,false);if(d)await s.stakeQuick(u,i,d);else {let p=s.createStakeAccount(i);await s.stakeQuick(u,i,p),s.transferObjects([p],c);}return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async stakeObligation(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),await a.stakeObligationWithVeScaQuick(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async unstakeObligation(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),await a.unstakeObligationQuick(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async claimBorrowIncentive(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c={},i=await this.ctx.query.getObligationAccount(e);if(!i)throw new ne("Obligation not found",{context:{obligationId:e}});let l=Object.values(i.borrowIncentives).filter(d=>!!d).flatMap(({rewards:d})=>d.filter(({availableClaimAmount:u})=>u>0)).flatMap(({coinName:d})=>d);for(let d of l){let u=await a.claimBorrowIncentiveQuick(d,e,o);c[d]?c[d].push(u):c[d]=[u];}return a.transferObjects(Object.values(c).map(d=>{let u=d[0];return d.length>1&&a.mergeCoins(u,d.slice(1)),u}),s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var Ke="https://sui.apis.scallop.io",qe="https://sdk.api.scallop.io";var We={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Ue="0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA";var At="0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410";var g={api:{getAddresses:t=>["api","getAddresses",t],getWhiteList:()=>["api","getWhiteList"],getPoolAddresses:()=>["api","getPoolAddresses"],getMarkets:()=>["api","getMarkets"],getSpools:()=>["api","getSpools"],getBorrowIncentivePools:()=>["api","getBorrowIncentivePools"],getTotalValueLocked:()=>["api","getTotalValueLocked"]},rpc:{getInspectTxn:t=>["rpc","getInspectTxn",t],getObject:t=>["rpc","getObject",t],getObjects:t=>["rpc","getObjects",t],getSharedObject:t=>["rpc","getSharedObject",t],getOwnedObjects:t=>["rpc","getOwnedObjects",t],getDynamicFields:t=>["rpc","getDynamicFields",t],getDynamicFieldObject:t=>["rpc","getDynamicFieldObject",t],getTotalVeScaTreasuryAmount:t=>["rpc","getTotalVeScaTreasuryAmount",{...t,refreshArgs:t?.refreshArgs?JSON.stringify(t?.refreshArgs):void 0,veScaAmountArgs:t?.veScaAmountArgs?JSON.stringify(t?.veScaAmountArgs):void 0}],getCoinBalance:t=>["rpc","getCoinBalance",t],getAllCoinBalances:t=>["rpc","getAllCoinBalances",t],getNormalizedMoveFunction:t=>["rpc","getNormalizedMoveCall",t]},oracle:{getPythLatestPriceFeeds:(t,e)=>["oracle","getPythPriceIds",e,t],getCoinPrices:t=>["oracle","getCoinPrices",t]}};[suiKit.getFullnodeUrl("mainnet")];var no={usdc:{primary:["pyth"],secondary:[]},sbeth:{primary:["pyth"],secondary:[]},sbusdt:{primary:["pyth"],secondary:[]},sbwbtc:{primary:["pyth"],secondary:[]},weth:{primary:["pyth"],secondary:[]},wbtc:{primary:["pyth"],secondary:[]},wusdc:{primary:["pyth"],secondary:[]},wusdt:{primary:["pyth"],secondary:[]},sui:{primary:["pyth"],secondary:[]},wapt:{primary:["pyth"],secondary:[]},wsol:{primary:["pyth"],secondary:[]},cetus:{primary:["pyth"],secondary:[]},afsui:{primary:["pyth"],secondary:[]},hasui:{primary:["pyth"],secondary:[]},vsui:{primary:["pyth"],secondary:[]},sca:{primary:["pyth"],secondary:[]},fud:{primary:["pyth"],secondary:[]},deep:{primary:["pyth"],secondary:[]},fdusd:{primary:["pyth"],secondary:[]},blub:{primary:["pyth"],secondary:[]},musd:{primary:["pyth"],secondary:[]},ns:{primary:["pyth"],secondary:[]},usdy:{primary:["pyth"],secondary:[]}};var ae=t=>`${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`,I=t=>{let e=t.getData().sender;if(!e)throw new Error("Sender is required");return e},Te=t=>{if(t===void 0)throw new Error("veSca not found")},Ot=t=>{if(t<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},Pt=(t,e,o)=>{Te(o),Ot(o);let r=Math.floor(o/1e3);if(t<1)throw new Error("Minimum lock period is 1 day");let n=Math.floor((e-r)/86400);if(t>n)throw new Error(`Cannot extend lock period by ${t} days, maximum lock period is ~4 years (${1460} days), remaining lock period is ${1460-n}`)},io=(t,e,o,r)=>{let n=r?Math.floor(r/1e3):void 0,a=!n,s=!a&&n*1e3<=new Date().getTime();if(a||s)if(t!==void 0&&e!==void 0){if(e<=0)throw new Error("Lock period must be greater than 0");if(typeof t=="number"&&t<1e10)throw new Error(`Minimum lock amount for ${s?"renewing expired veSca":"initial lock"} is 10 SCA`);if(e*86400>126144e3)throw new Error(`Maximum lock period is ~4 years (${1460} days)`)}else throw new Error(`SCA amount and lock period is required for ${s?"renewing expired veSca":"initial lock"}`);else {if(Te(r),Ot(r),typeof t=="number"&&t<1e9)throw new Error("Minimum top up amount is 1 SCA");o&&e&&Pt(e,o,r);}},co=(t,e)=>{if(Te(e),Ot(e),t<1e9)throw new Error("Minimum top up amount is 1 SCA");if(!!e&&e<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},lo=(t,e,o)=>{if(!o||o>new Date().getTime())throw new Error("Renew method can only be used for expired veSca");if(t<1e10)throw new Error("Minimum lock amount for renewing expired vesca 10 SCA");if(e*86400>=126057600)throw new Error(`Maximum lock period is ~4 years (${1459} days)`)};var $e=class{constructor(e){this.ctx=e;}async createStakeAccount(e,o=true,r){let n=this.ctx.builder.createTxBlock(),a=r??this.ctx.walletAddress;n.setSender(a);let s=n.createStakeAccount(e);return n.transferObjects([s],a),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async stake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await this.ctx.query.getStakeAccounts(e),l=n??i[0]?.id;if(l)await s.stakeQuick(o,e,l);else {let d=s.createStakeAccount(e);await s.stakeQuick(o,e,d),s.transferObjects([d],c);}return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async unstake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await s.unstakeQuick(o,e,n);if(i){let l=this.ctx.utils.parseSCoinType(e);if(!l)throw new ne(`Invalid sCoin type: ${e}`,{context:{stakeMarketCoinName:e}});await this.ctx.utils.mergeSimilarCoins(s,i,l,c);}return s.transferObjects([i],c),r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async unstakeAndWithdraw(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await s.unstakeQuick(o,e,n,false),l=this.ctx.utils.parseCoinName(e);if(i){let d=s.withdraw(i,l);await this.ctx.utils.mergeSimilarCoins(s,d,this.ctx.utils.parseCoinType(l),I(s)),s.transferObjects([d],c);}else throw new ne(`No stake found for ${e}`,{context:{stakeMarketCoinName:e}});return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async claim(e,o=true,r,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.claimQuick(e,r);return a.transferObjects(c,s),o?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var Ge=class{constructor(e){this.ctx=e;}async lockSca(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.lockScaQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async extendLockPeriod(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.extendLockPeriodQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async extendLockAmount(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.extendLockAmountQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async claimAllUnlockedSca(e=true,o){let r=o??this.ctx.walletAddress,n=(await this.ctx.query.getVeScas({walletAddress:r})??[]).map(({keyId:c})=>c);if(n.length===0)throw new ne("No veSCA found in the wallet",{context:{walletAddress:r}});let a=this.ctx.builder.createTxBlock();a.setSender(r);let s=[];if(await Promise.all(n.map(async c=>{try{let i=await a.redeemScaQuick({veScaKey:c,transferSca:!1});if(!i)return;s.push(i);}catch(i){this.ctx.utils.logger.warn("redeemScaQuick failed for veScaKey; skipping",{veScaKey:c,message:i?.message});}})),s.length===0)throw new ne("No unlocked SCA found in the veSCA accounts",{context:{walletAddress:r,veScaKeyCount:n.length}});return s.length>1&&a.mergeCoins(s[0],s.slice(1)),await this.ctx.utils.mergeSimilarCoins(a,s[0],"sca",r),e?await this.ctx.executor.signAndSendTxn(a):{tx:a.txBlock,scaCoin:s[0]}}};var ze=class{constructor(e){this.ctx=e;}async bindToReferral(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),n.bindToReferral(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async claimReferralRevenue(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();a.setSender(n??this.ctx.walletAddress);let s=o??[...this.ctx.constants.whitelist.lending];return await a.claimReferralRevenueQuick(e,s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async burnReferralTicket(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),a.burnReferralTicket(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var X=t=>{if(typeof t=="string")return utils.normalizeStructTag(t);if(t&&typeof t=="object"){let e=t;if(e.address&&e.module&&typeof e.name=="string"){let o=(e.typeParams??e.typeParameters??[]).map(n=>X(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return X(e.name)}throw new T(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},J=(t,e)=>{try{return X(t)}catch(o){throw new T(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var ke=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var Ye=(t,e,o)=>{let r=Math.max(1,Math.floor(Math.log10(Math.abs(t))+1)),n=Math.max(Math.floor((r-1)/e),1)+1,a=Math.pow(10,-n);return a=o==="increase"?1-a:1+a,a};var za=t=>Object.values(t).filter(e=>!!e&&e.availableWithdrawCoin>0).map(e=>({suppliedCoin:e.availableWithdrawCoin,suppliedValue:e.suppliedValue,stakedCoin:e.availableUnstakeCoin,coinName:e.coinName,symbol:e.symbol,coinType:e.coinType,coinPrice:e.coinPrice,coinDecimals:e.coinDecimal,supplyApr:e.supplyApr,supplyApy:e.supplyApy,incentiveApr:isFinite(e.rewardApr)?e.rewardApr:0})),Ya=(t,e)=>Object.values(t).filter(o=>!!o&&(o.totalBorrowedValueWithWeight>0||o.totalDepositedValue>0)).map(o=>({obligationId:o.obligationId,totalDebtsInUsd:o.totalBorrowedValueWithWeight,totalCollateralInUsd:o.totalDepositedValue,riskLevel:o.totalRiskLevel,availableCollateralInUsd:o.totalAvailableCollateralValue,totalUnhealthyCollateralInUsd:o.totalUnhealthyCollateralValue,collaterals:Object.values(o.collaterals).filter(r=>!!r&&r.depositedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,depositedCoin:r.depositedCoin,depositedValueInUsd:r.depositedValue})),borrowedPools:Object.values(o.debts).filter(r=>!!r&&r.borrowedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,borrowedCoin:r.borrowedCoin,borrowedValueInUsd:r.borrowedValueWithWeight,borrowApr:e[r.coinName]?.borrowApr,borrowApy:e[r.coinName]?.borrowApy,incentiveInfos:(o.borrowIncentives[r.coinName]?.rewards??[]).filter(n=>!!n&&isFinite(n.baseRewardApr)).map(n=>({coinName:n.coinName,symbol:n.symbol,coinType:n.coinType,boostValue:n.boostValue,maxBoost:n.maxBoost,incentiveApr:n.baseRewardApr,boostedIncentiveApr:n.boostedRewardApr}))}))})),Ae="sui",Ha="SUI",Xa=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[Ae]?o[Ae].pendingRewardInCoin+=r.availableClaimCoin:o[Ae]={symbol:Ha,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[Ae]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),Ja=t=>Object.values(t).filter(e=>!!e).reduce((e,o)=>(Object.values(o.borrowIncentives).forEach(r=>{r?.rewards.forEach(n=>{if(n.availableClaimCoin===0)return e;e[n.coinName]?e[n.coinName].pendingRewardInCoin+=n.availableClaimCoin:e[n.coinName]={symbol:n.symbol,coinType:n.coinType,coinPrice:n.coinPrice,pendingRewardInCoin:n.availableClaimCoin};});}),e),{}),Za=(t,e,o=Date.now())=>t.map(({keyId:r,lockedScaCoin:n,currentVeScaBalance:a,unlockAt:s})=>({veScaKey:r,coinPrice:e,lockedScaInCoin:n,lockedScaInUsd:n*e,currentVeScaBalance:a,remainingLockPeriodInDays:s-o>0?(s-o)/864e5:0,unlockAt:s})),es=t=>{let e=t.parsedLendings.reduce((n,a)=>n+a.suppliedValue,0),o=t.parsedObligationAccounts.reduce((n,a)=>(n.totalDebtValue+=a.totalDebtsInUsd,n.totalCollateralValue+=a.totalCollateralInUsd,n),{totalDebtValue:0,totalCollateralValue:0}),r=t.parsedVeScas.reduce((n,a)=>n+a.lockedScaInUsd,0);return {totalSupplyValue:e,...o,totalLockedScaValue:r}},ts=t=>{let e=bignumber_js.BigNumber(t.depositedRawAmount??0),o=e.shiftedBy(-t.coinDecimal),r=o.multipliedBy(t.coinPrice),n=r.multipliedBy(t.marketCollateral.collateralFactor),a=r.multipliedBy(t.marketCollateral.liquidationFactor),s=bignumber_js.BigNumber(t.coinAmount),c=s.shiftedBy(-t.coinDecimal);return {entry:{coinName:t.assetCoinName,coinType:t.coinType,symbol:t.symbol,coinDecimal:t.coinDecimal,coinPrice:t.coinPrice,depositedAmount:e.toNumber(),depositedCoin:o.toNumber(),depositedValue:r.toNumber(),borrowCapacityValue:n.toNumber(),requiredCollateralValue:a.toNumber(),availableDepositAmount:s.toNumber(),availableDepositCoin:c.toNumber(),availableWithdrawAmount:0,availableWithdrawCoin:0},depositedValue:r,borrowCapacityValue:n,requiredCollateralValue:a,isDeposited:e.isGreaterThan(0)}},os=1e9,rs=bignumber_js.BigNumber(1e12),ns=t=>{let e=[];Object.entries(t.borrowIncentiveAccount.pointList).forEach(([n,a])=>{let s=t.borrowIncentivePool.points[t.toMarketCoinName(n)];if(!a||!s)return;let c=bignumber_js.BigNumber(a.weightedAmount),i=s.currentPointIndex?Math.max(bignumber_js.BigNumber(s.currentPointIndex-a.index).dividedBy(os).toNumber(),0):1,l=c.multipliedBy(i).plus(a.points),d=l.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(rs),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),m=p.isFinite()?p.toNumber():1,f=isFinite(s.rewardApr)?s.rewardApr:0;l.isGreaterThanOrEqualTo(0)&&e.push({coinName:s.coinName,coinType:s.coinType,symbol:s.symbol,coinDecimal:s.coinDecimal,coinPrice:s.coinPrice,weightedBorrowAmount:c.toNumber(),availableClaimAmount:l.toNumber(),availableClaimCoin:d.toNumber(),baseRewardApr:f,boostedRewardApr:f*m,maxBoost:1/u.toNumber(),boostValue:m});});let r=Object.keys(t.borrowIncentivePool.points).some(n=>{let a=t.borrowIncentivePool.points[n]?.rewardApr;return a!==1/0&&typeof a=="number"&&a>0})&&t.borrowIncentiveAccount.debtAmount>0;return {rewards:e,contributesRewardedPool:r}},as=t=>{let e=t.debt?.borrowIndex?t.marketPool.borrowIndex/Number(t.debt.borrowIndex)-1:0,o=bignumber_js.BigNumber(t.debt?.amount??0).multipliedBy(e+1),r=o.shiftedBy(-t.coinDecimal),n=o,a=n.shiftedBy(-t.coinDecimal),s=bignumber_js.BigNumber(t.coinAmount),c=s.shiftedBy(-t.coinDecimal),i=a.multipliedBy(t.coinPrice),l=i.multipliedBy(t.marketPool.borrowWeight);return {entry:{coinName:t.assetCoinName,coinType:t.coinType,symbol:t.symbol,coinDecimal:t.coinDecimal,coinPrice:t.coinPrice,borrowedAmount:o.toNumber(),borrowedCoin:r.toNumber(),borrowedValue:i.toNumber(),borrowedValueWithWeight:l.toNumber(),borrowIndex:Number(t.debt?.borrowIndex??0),requiredRepayAmount:n.toNumber(),requiredRepayCoin:a.toNumber(),availableBorrowAmount:0,availableBorrowCoin:0,availableRepayAmount:s.toNumber(),availableRepayCoin:c.toNumber(),rewards:(t.rewards??[]).filter(({weightedBorrowAmount:u})=>u>0)},borrowedValue:i,borrowedValueWithWeight:l,isBorrowed:o.isGreaterThan(0)}},ss=t=>{let e=t.totalRequiredCollateralValue.isZero()?t.totalBorrowedValueWithWeight.isGreaterThan(0)?bignumber_js.BigNumber(100):bignumber_js.BigNumber(0):t.totalBorrowedValueWithWeight.dividedBy(t.totalRequiredCollateralValue);e=e.isLessThan(1)?e:bignumber_js.BigNumber(1);let o=t.totalDepositedValue.minus(t.totalBorrowedValue).isGreaterThan(0)?t.totalDepositedValue.minus(t.totalBorrowedValue):bignumber_js.BigNumber(0),r=t.totalBorrowCapacityValue.minus(t.totalBorrowedValueWithWeight).isGreaterThan(0)?t.totalBorrowCapacityValue.minus(t.totalBorrowedValueWithWeight):bignumber_js.BigNumber(0),n=t.totalBorrowedValueWithWeight.isGreaterThan(0)?t.totalRequiredCollateralValue:bignumber_js.BigNumber(0),a=t.totalBorrowedValueWithWeight.minus(n).isGreaterThan(0)?t.totalBorrowedValueWithWeight.minus(n):bignumber_js.BigNumber(0);return {riskLevel:e.toNumber(),accountBalanceValue:o.toNumber(),availableCollateralValue:r.toNumber(),requiredCollateralValue:n.toNumber(),unhealthyCollateralValue:a.toNumber()}},is=t=>{let e=bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketCollateral.collateralFactor).dividedBy(t.marketCollateral.coinPrice).shiftedBy(t.marketCollateral.coinDecimal),o=t.totalBorrowedValueWithWeight===0?bignumber_js.BigNumber(t.obligationCollateral.depositedAmount):ke(e.multipliedBy(Ye(bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketCollateral.collateralFactor).toNumber(),3,"increase")).toNumber(),t.obligationCollateral.depositedAmount,t.marketCollateral.depositAmount);return {availableWithdrawAmount:o.toNumber(),availableWithdrawCoin:o.shiftedBy(-t.obligationCollateral.coinDecimal).toNumber()}},cs=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(Ye(t.obligationDebt.borrowedValue,3,"decrease")),o=bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketPool.borrowWeight).shiftedBy(t.marketPool.coinDecimal).dividedBy(t.marketPool.coinPrice),r=t.totalAvailableCollateralValue!==0&&bignumber_js.BigNumber(t.marketPool.maxBorrowCoin).isGreaterThan(t.marketPool.borrowCoin)?ke(o.multipliedBy(Ye(o.shiftedBy(-t.marketPool.coinDecimal).multipliedBy(t.marketPool.coinPrice).toNumber(),3,"increase")).toNumber(),t.marketPool.supplyAmount):bignumber_js.BigNumber(0);return {availableBorrowAmount:r.toNumber(),availableBorrowCoin:r.shiftedBy(-t.obligationDebt.coinDecimal).toNumber(),requiredRepayAmount:e.toNumber(),requiredRepayCoin:e.shiftedBy(-t.obligationDebt.coinDecimal).toNumber()}},mo=t=>{let{coinName:e,symbol:o,coinType:r,marketCoinType:n,coinDecimal:a,coinPrice:s,marketPool:c,spool:i,stakeAccounts:l,coinAmount:d,marketCoinAmount:u,sCoinAmount:p}=t,m=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),S=bignumber_js.BigNumber(0),w=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0),_=bignumber_js.BigNumber(0);if(i)for(let ie of l){let L=bignumber_js.BigNumber(ie.staked),we=L.shiftedBy(-i.coinDecimal),W=L.multipliedBy(c?.conversionRate??1),Y=W.shiftedBy(-i.coinDecimal),ge=Y.multipliedBy(i.coinPrice);m=m.plus(L),f=f.plus(we),b=b.plus(W),y=y.plus(Y),h=h.plus(ge),S=S.plus(L),w=S.shiftedBy(-i.coinDecimal);let kt=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-ie.index).dividedBy(1e9):1;O=O.plus(L.multipliedBy(kt).plus(ie.points).multipliedBy(i.exchangeRateNumerator).dividedBy(i.exchangeRateDenominator)),_=O.shiftedBy(-i.rewardCoinDecimal);}let j=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)).multipliedBy(c?.conversionRate??1),v=j.shiftedBy(-a),x=v.multipliedBy(s??0),B=bignumber_js.BigNumber(s??0).multipliedBy(c?.conversionRate??1),N=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),F=N.shiftedBy(-a),q=bignumber_js.BigNumber(d),$=q.shiftedBy(-a),de=ke(j,c?.supplyAmount??1/0).plus(b),te=ke(v,c?.supplyCoin??1/0).plus(y);return {coinName:e,symbol:o,coinType:r,marketCoinType:n,sCoinType:c?.sCoinType??"",coinDecimal:a,coinPrice:s??0,conversionRate:c?.conversionRate??1,marketCoinPrice:B.toNumber(),supplyApr:c?.supplyApr??0,supplyApy:c?.supplyApy??0,rewardApr:i?.rewardApr??0,suppliedAmount:j.plus(b).toNumber(),suppliedCoin:v.plus(y).toNumber(),suppliedValue:x.plus(h).toNumber(),stakedMarketAmount:m.toNumber(),stakedMarketCoin:f.toNumber(),stakedAmount:b.toNumber(),stakedCoin:y.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:N.toNumber(),unstakedMarketCoin:F.toNumber(),unstakedAmount:j.toNumber(),unstakedCoin:v.toNumber(),unstakedValue:x.toNumber(),availableSupplyAmount:q.toNumber(),availableSupplyCoin:$.toNumber(),availableWithdrawAmount:de.toNumber(),availableWithdrawCoin:te.toNumber(),availableStakeAmount:N.toNumber(),availableStakeCoin:F.toNumber(),availableUnstakeAmount:S.toNumber(),availableUnstakeCoin:w.toNumber(),availableClaimAmount:O.toNumber(),availableClaimCoin:_.toNumber(),isIsolated:c?c.isIsolated:false}},bo=t=>{let{obligationId:e,collateralCoinNames:o,market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:c,borrowIncentiveAccounts:i,utils:l}=t,d={},u={},p={},m=0,f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=0,S=0,w=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0);for(let x of o){let B=s?.collaterals.find(q=>l.parseCoinNameFromType(q.type)===x),N=r.collaterals[x];if(!N)continue;let F=ts({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketCollateral:N,depositedRawAmount:B?.amount});f=f.plus(F.depositedValue),b=b.plus(F.borrowCapacityValue),y=y.plus(F.requiredCollateralValue),F.isDeposited&&m++,d[x]=F.entry;}for(let[x,B]of Object.entries(i)){if(!B)continue;let N=c[x];if(!N)continue;let F=ns({borrowIncentivePool:N,borrowIncentiveAccount:B,toMarketCoinName:q=>l.parseSCoinTypeNameToMarketCoinName(q)});F.contributesRewardedPool&&S++,p[x]={coinName:N.coinName,coinType:N.coinType,symbol:N.symbol,coinDecimal:N.coinDecimal,coinPrice:N.coinPrice,rewards:F.rewards};}let _=[...new Set(Object.values(r.pools).filter(x=>!!x).map(x=>x.coinName))];for(let x of _){let B=s?.debts.find(q=>l.parseCoinNameFromType(q.type)===x),N=r.pools[x];if(!N)continue;let F=as({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketPool:N,debt:B?{amount:B.amount,borrowIndex:B.borrowIndex}:void 0,rewards:p[x]?.rewards});w=w.plus(F.borrowedValue),O=O.plus(F.borrowedValueWithWeight),F.isBorrowed&&h++,u[x]=F.entry;}let j=ss({totalDepositedValue:f,totalBorrowedValue:w,totalBorrowCapacityValue:b,totalBorrowedValueWithWeight:O,totalRequiredCollateralValue:y}),v={obligationId:e,totalDepositedValue:f.toNumber(),totalBorrowedValue:w.toNumber(),totalBalanceValue:j.accountBalanceValue,totalBorrowCapacityValue:b.toNumber(),totalAvailableCollateralValue:j.availableCollateralValue,totalBorrowedValueWithWeight:O.toNumber(),totalRequiredCollateralValue:j.requiredCollateralValue,totalUnhealthyCollateralValue:j.unhealthyCollateralValue,totalRiskLevel:j.riskLevel,totalDepositedPools:m,totalBorrowedPools:h,totalRewardedPools:S,collaterals:d,debts:u,borrowIncentives:p};for(let[x,B]of Object.entries(v.collaterals)){if(!B)continue;let N=r.collaterals[x];if(!N)continue;let{availableWithdrawAmount:F,availableWithdrawCoin:q}=is({obligationCollateral:B,marketCollateral:N,totalAvailableCollateralValue:v.totalAvailableCollateralValue,totalBorrowedValueWithWeight:v.totalBorrowedValueWithWeight});B.availableWithdrawAmount=F,B.availableWithdrawCoin=q;}for(let[x,B]of Object.entries(v.debts)){if(!B)continue;let N=r.pools[x];if(!N)continue;let{availableBorrowAmount:F,availableBorrowCoin:q,requiredRepayAmount:$,requiredRepayCoin:de}=cs({obligationDebt:B,marketPool:N,totalAvailableCollateralValue:v.totalAvailableCollateralValue});B.availableBorrowAmount=F,B.availableBorrowCoin=q,B.requiredRepayAmount=$,B.requiredRepayCoin=de;}return v},yo=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=za(e),c=Ya(o,a),i=Xa(e,n),l=Ja(o),d=Za(r,n.sca??0);return {...es({parsedLendings:s,parsedObligationAccounts:c,parsedVeScas:d}),lendings:s,borrowings:c,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:Ae,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(l).map(([p,m])=>({coinName:p,...m,pendingRewardInUsd:m.coinPrice*m.pendingRewardInCoin}))},veScas:d}},fo=t=>{let{coinPrices:e,marketPools:o,sCoinNames:r,parseCoinName:n}=t,a={};for(let s of r){let c=n(s);a[s]=bignumber_js.BigNumber(e[c]??0).multipliedBy(o[c]?.conversionRate??1).toNumber();}return {...e,...a}};var go=({ctx:t,txBlock:e})=>{let o={protocolPkg:t.address.get("core.packages.protocol.id"),market:t.address.get("core.market"),version:t.address.get("core.version"),coinDecimalsRegistry:t.address.get("core.coinDecimalsRegistry"),xOracle:t.address.get("core.oracles.xOracle")},n=`${t.address.get("referral.id")}::scallop_referral_program::REFERRAL_WITNESS`,a=e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {openObligation:()=>{let[s,c,i]=t.moveCall(e,`${o.protocolPkg}::open_obligation::open_obligation`,[o.version]);return [s,c,i]},returnObligation:(s,c)=>{t.moveCall(e,`${o.protocolPkg}::open_obligation::return_obligation`,[o.version,s,c]);},openObligationEntry:()=>{t.moveCall(e,`${o.protocolPkg}::open_obligation::open_obligation_entry`,[o.version]);},depositCollateral:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::deposit_collateral::deposit_collateral`,[o.version,s,o.market,c],[l]);},takeCollateral:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::withdraw_collateral::withdraw_collateral`,[o.version,s,c,o.market,o.coinDecimalsRegistry,e.pure.u64(i),o.xOracle,a],[d])},supply:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::mint::mint`,[o.version,o.market,s,a],[i])},depositEntry:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::mint::mint_entry`,[o.version,o.market,s,a],[i])},withdraw:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::redeem::redeem`,[o.version,o.market,s,a],[i])},withdrawEntry:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::redeem::redeem_entry`,[o.version,o.market,s,a],[i])},borrow:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow`,[o.version,s,c,o.market,o.coinDecimalsRegistry,i,o.xOracle,a],[d])},borrowWithReferral:(s,c,i,l,d)=>{let u=t.utils.parseCoinType(d);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow_with_referral`,[o.version,s,c,o.market,o.coinDecimalsRegistry,i,typeof l=="number"?e.pure.u64(l):l,o.xOracle,a],[u,n])},borrowEntry:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow_entry`,[o.version,s,c,o.market,o.coinDecimalsRegistry,e.pure.u64(i),o.xOracle,a],[d])},repay:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::repay::repay`,[o.version,s,o.market,c,a],[l]);},borrowFlashLoan:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::flash_loan::borrow_flash_loan`,[o.version,o.market,s],[i])},repayFlashLoan:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::flash_loan::repay_flash_loan`,[o.version,o.market,s,c],[l]);},liquidate:(s,c,i,l)=>{let d=t.utils.parseCoinType(i),u=t.utils.parseCoinType(l),[p,m]=t.moveCall(e,`${o.protocolPkg}::liquidate::liquidate`,[o.version,s,o.market,c,o.coinDecimalsRegistry,o.xOracle,a],[d,u]);return [p,m]}}};var Oe=async(...t)=>{let[e,o,r,n]=t;if(t.length===3&&r)return {obligationId:r};if(t.length===4&&r&&n)return {obligationId:r,obligationKey:n};let a=I(o),s=await e.reads.getObligations(a);if(s.length===0)throw new Error(`No obligation found for sender ${a}`);return {obligationId:s[0].id,obligationKey:s[0].keyId}},ho=({ctx:t,txBlock:e})=>({depositCollateralQuick:async(o,r,n,a=false)=>{let s=I(e),{obligationId:c}=await Oe(t,e,n),{takeCoin:i,leftCoin:l}=await t.coins.selectCoin(e,r,o,s,a);l&&e.transferObjects([l],s),e.depositCollateral(c,i,r);},takeCollateralQuick:async(o,r,n,a,s)=>{let c=await Oe(t,e,n,a),i=await t.reads.getObligationCoinNames(c.obligationId);return await t.oracles.updateOracles(e,i,s),e.takeCollateral(c.obligationId,c.obligationKey,o,r)},supplyQuick:async(o,r,n=true,a=false)=>{let s=I(e),{leftCoin:c,takeCoin:i}=await t.coins.selectCoin(e,r,o,s,a);c&&e.transferObjects([c],s);let l=e.supply(i,r);return n?e.mintSCoin(t.utils.parseMarketCoinName(r),l):l},withdrawQuick:async(o,r)=>{let n=I(e),a=t.utils.parseSCoinName(r);if(!a)throw new Error(`No sCoin for ${r}`);let{sCoin:s,marketCoin:c}=await t.coins.selectSCoinOrMarketCoin(e,a,o,n);if(s){let i=e.burnSCoin(a,s);c?e.mergeCoins(c,[i]):c=i;}if(!c)throw new Error(`No market coin for ${r}`);return e.withdraw(c,r)},borrowQuick:async(o,r,n,a,s)=>{let c=await Oe(t,e,n,a),l=[...await t.reads.getObligationCoinNames(c.obligationId)??[],r];return await t.oracles.updateOracles(e,l,s),e.borrow(c.obligationId,c.obligationKey,o,r)},borrowWithReferralQuick:async(o,r,n,a,s,c)=>{let i=await Oe(t,e,a,s),d=[...await t.reads.getObligationCoinNames(i.obligationId)??[],r];return await t.oracles.updateOracles(e,d,c),e.borrowWithReferral(i.obligationId,i.obligationKey,n,o,r)},repayQuick:async(o,r,n,a=false)=>{let s=I(e),c=await Oe(t,e,n),{leftCoin:i,takeCoin:l}=await t.coins.selectCoin(e,r,o,s,a);return i&&e.transferObjects([i],s),e.repay(c.obligationId,l,r)},updateAssetPricesQuick:async(o,r)=>await t.oracles.updateOracles(e,o,r),liquidateQuick:async(o,r,n,a,s)=>{let c=I(e),i=await t.reads.getObligationCoinNames(a);await t.oracles.updateOracles(e,i,s);let{takeCoin:l,leftCoin:d}=await t.coins.selectCoin(e,r,o,c,s?.isSponsoredTx??false);d&&e.transferObjects([d],c);let u=typeof a=="string"?e.object(a):a;return e.liquidate(u,l,r,n)}});var Rt=class extends pythSuiJs.SuiPythClient{constructor(o,r,n,a){super(o,r,n);this.params=a;}async updatePriceFeedsWithSponsoredBaseUpdateFee(o,r,n){if(!this.params)throw new Error("Please provide params");let{defaultPackageId:a,gasStationId:s}=this.params,c=await this.getPythPackageId(),i=await this.verifyVaasAndGetHotPotato(o,r,c),l=[];for(let u of n){let p=await this.getPriceFeedObjectId(u);if(!p)throw new Error(`Price feed object not found for ID: ${u}`);l.push(p);}let d=o.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});for(let u=0;u<l.length;u++){let p=l[u];[i]=o.moveCall({target:`${a}::pyth_sponsor::update_single_price_feed_with_sponsor`,arguments:[o.object(this.pythStateId),i,o.object(p),o.object(s),d]});}o.moveCall({target:`${c}::hot_potato_vector::destroy`,arguments:[i],typeArguments:[`${c}::price_info::PriceInfo`]});}},So=async(t,e,o,r=false)=>{let n=(()=>{try{return t.suiKit.suiInteractor.currentFullNode}catch{return jsonRpc.getJsonRpcFullnodeUrl("mainnet")}})(),a=t.suiKit.client.network,s=new jsonRpc.SuiJsonRpcClient({url:n,network:a}),c=new Rt(s,t.address.get("core.oracles.pyth.state"),t.address.get("core.oracles.pyth.wormholeState"),{defaultPackageId:"0xa6f9bec2f9748656b6af8aafb5d7bc1a0d5faf25ac9645fc7f447822cd509325",gasStationId:"0xa8b8dcc9880166edb57b53e05f8df7364d31b5d9b7d107fd27f0b69cf338b687"}),i=Array.from(new Set(e.map(d=>t.address.get(`core.coins.${d}.oracle.pyth.feed`)))),l=t.pythEndpoints??[...t.constants.whitelist.pythEndpoints];for(let d of l)try{let p=await new pythSuiJs.SuiPriceServiceConnection(d,{priceFeedRequestConfig:{binary:!0}}).getPriceFeedsUpdateData(i);r?await c.updatePriceFeedsWithSponsoredBaseUpdateFee(o.txBlock,p,i):await c.updatePriceFeeds(o.txBlock,p,i);return}catch(u){t.utils.logger.warn("pyth price-feed update failed; trying next endpoint",{endpoint:d,message:u?.message});}};var Co=async(t,e,o=[...t.constants.whitelist.lending],r)=>{let n=r?.usePythPullModel??t.usePythPullModel,a=r?.useOnChainXOracleList??t.useOnChainXOracleList,s=new Set((r?.sponsoredFeeds??t.sponsoredFeeds).filter(m=>t.constants.whitelist.lending.has(m)?true:(t.utils.logger.warn("sponsored feed not in lending whitelist; skipping",{feed:m}),false))),c=r?.isSponsoredTx??false,i=a?await t.query.getAssetOracles():no,l=new Set(Object.values(i).flatMap(({primary:m,secondary:f})=>[...m,...f])),d=(m,f)=>{let b=i[m];return b&&(b.primary.includes(f)||b.secondary.includes(f))},u=[...new Set(o)],p=u.filter(m=>d(m,"pyth"));if(l.has("pyth")){let m=[];for(let f of p){let b=!n&&!s.has(f);(n||b)&&m.push(f);}m.length>0&&await So(t,m,e,c);}for(let m of u)ys(t,e,m,i[m]);},ys=(t,e,o,r)=>{let n=t.utils.parseCoinType(o);fs(e,r,t.address.get("core.packages.xOracle.id"),t.address.get("core.oracles.xOracle"),t.address.get("core.packages.pyth.id"),t.address.get("core.oracles.pyth.registry"),t.address.get("core.oracles.pyth.state"),t.address.get(`core.coins.${o}.oracle.pyth.feedObject`),t.address.get("core.packages.switchboard.id"),t.address.get("core.oracles.switchboard.registry"),t.address.get(`core.coins.${o}.oracle.switchboard`),t.address.get("core.packages.supra.id"),t.address.get("core.oracles.supra.registry"),t.address.get("core.oracles.supra.holder"),n);},fs=(t,e,o,r,n,a,s,c,i,l,d,u,p,m,f)=>{let b=h=>typeof h=="string"?t.object(h):h;r=b(r),a=b(a),s=b(s),c=b(c),l=b(l),d=b(d),p=b(p),m=b(m);let y=gs(t,o,r,f);return Object.entries(e).forEach(([h,S])=>{S.includes("pyth")&&ws(h,t,n,y,s,c,a,f),S.includes("supra")&&Ss(h,t,u,y,m,p,f),S.includes("switchboard")&&Cs(h,t,i,y,d,l,f);}),hs(t,o,r,y,f),t},gs=(t,e,o,r)=>{let n=`${e}::x_oracle::price_update_request`,a=[r];return t.moveCall(n,[o],a)},hs=(t,e,o,r,n)=>{let a=`${e}::x_oracle::confirm_price_update_request`,s=[n];return t.moveCall(a,[o,r,t.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"})],s),t},Ss=(t,e,o,r,n,a,s)=>{e.moveCall(`${o}::rule::set_price_as_${t}`,[r,n,a,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[s]);},Cs=(t,e,o,r,n,a,s)=>{e.moveCall(`${o}::rule::set_as_${t}_price`,[r,n,a,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[s]);},ws=(t,e,o,r,n,a,s,c)=>{e.moveCall(`${o}::rule::set_price_as_${t}`,[r,n,a,s,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[c]);};var wo=async(t,e)=>{let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("getObligationCoinNames expects an object id (string) or an object reference");let r=await t.query.repos.obligation.getObligationData(o);if(!r)return;let n=r.collaterals.map(i=>i.type),a=r.debts.map(i=>i.type);return [...new Set([...n,...a])].map(i=>t.utils.parseCoinNameFromType(i))};var To=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={reads:{getObligations:i=>t.query.getObligations(i),getObligationCoinNames:i=>wo(t,i)},coins:{selectCoin:(...i)=>t.selectCoin(...i),selectSCoinOrMarketCoin:(...i)=>t.selectSCoinOrMarketCoin(...i)},oracles:{updateOracles:(i,l,d)=>Co(t,i,l,d)},utils:{parseMarketCoinName:i=>t.utils.parseMarketCoinName(i),parseSCoinName:i=>t.utils.parseSCoinName(i)}},a=go({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=ho({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var ko=({ctx:t,txBlock:e})=>{let o={spoolPkg:t.address.get("spool.id")},r=e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {createStakeAccount:n=>{let a=t.utils.parseMarketCoinType(n),s=t.address.get(`spool.pools.${n}.id`);return t.moveCall(e,`${o.spoolPkg}::user::new_spool_account`,[s,r],[a])},stake:(n,a,s)=>{let c=t.utils.parseMarketCoinType(s),i=t.address.get(`spool.pools.${s}.id`);t.moveCall(e,`${o.spoolPkg}::user::stake`,[i,n,a,r],[c]);},unstake:(n,a,s)=>{let c=t.utils.parseMarketCoinType(s),i=t.address.get(`spool.pools.${s}.id`);return t.moveCall(e,`${o.spoolPkg}::user::unstake`,[i,n,a,r],[c])},claim:(n,a)=>{let s=t.address.get(`spool.pools.${a}.id`),c=t.address.get(`spool.pools.${a}.rewardPoolId`),i=t.utils.parseMarketCoinType(a),l=t.utils.getSpoolRewardCoinName(),d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.spoolPkg}::user::redeem_rewards`,[s,c,n,r],[i,d])}}};var Ao=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&n)return [n];let a=I(o),s=await e.reads.getAllStakeAccounts(a);if(s[r].length===0)throw new Error(`No stake account id found for sender ${a}`);return s[r].map(c=>c.id)},ks=async(...t)=>{let[e,o,r,n]=t,a=I(o),s=await e.reads.getAllStakeAccounts(a);if(s[r].length===0)throw new Error(`No stake account found for sender ${a}`);return n?s[r].filter(i=>i.id===n):s[r]},Oo=async(t,e,o,r,n,a,s=false)=>{try{let{takeCoin:c,leftCoin:i,totalAmount:l}=s?await t.coins.selectSCoin(e,r,n,a):await t.coins.selectMarketCoin(e,r,n,a);if(s){let d=e.burnSCoin(r,c);e.stake(o,d,r);}else e.stake(o,c,r);return e.transferObjects([i],a),l}catch{return 0}},Po=({ctx:t,txBlock:e})=>({stakeQuick:async(o,r,n)=>{let a=I(e),s=await Ao(t,e,r,n);if(s.length===0)throw new Error(`No stakeAccountIds found for user ${a}`);if(typeof o=="number"){let c=await Oo(t,e,s[0],r,o,a);o-=c,o>0&&await Oo(t,e,s[0],r,o,a,true);}else e.stake(s[0],o,r);},unstakeQuick:async(o,r,n,a=true)=>{let s=await ks(t,e,r,n),c=[];for(let i of s){if(i.staked===0)continue;let l=Math.min(o,i.staked),d=e.unstake(i.id,l,r);if(a){let u=e.mintSCoin(r,d);c.push(u);}else c.push(d);if(o-=l,o<=0)break}if(c.length>0){let i=c[0];return c.length>1&&e.mergeCoins(i,c.slice(1)),i}},claimQuick:async(o,r)=>{let n=await Ao(t,e,o,r),a=[];for(let s of n){let c=await e.claim(s,o);a.push(c);}return a}});var vo=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={reads:{getAllStakeAccounts:i=>t.query.getAllStakeAccounts(i)},coins:{selectMarketCoin:(...i)=>t.selectMarketCoin(...i),selectSCoin:(...i)=>t.selectSCoin(...i)}},a=ko({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Po({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Io=({ctx:t,txBlock:e})=>{let o={borrowIncentivePkg:t.address.get("borrowIncentive.id"),query:t.address.get("borrowIncentive.query"),config:t.address.get("borrowIncentive.config"),incentivePools:t.address.get("borrowIncentive.incentivePools"),incentiveAccounts:t.address.get("borrowIncentive.incentiveAccounts"),obligationAccessStore:t.address.get("core.obligationAccessStore")},r={table:t.address.get("vesca.table"),treasury:t.address.get("vesca.treasury"),config:t.address.get("vesca.config")},n=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {stakeObligation:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::stake`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,o.obligationAccessStore,n]);},stakeObligationWithVesca:(a,s,c)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::stake_with_ve_sca_v2`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,o.obligationAccessStore,r.config,r.treasury,r.table,c,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n],[]);},unstakeObligation:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::unstake_v2`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n]);},claimBorrowIncentive:(a,s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.borrowIncentivePkg}::user::redeem_rewards`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,n],[i])},deactivateBoost:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::deactivate_boost_v2`,[o.config,o.incentivePools,o.incentiveAccounts,a,s,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n]);}}};var Xe=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&r&&n&&typeof r=="string"){let i=await e.reads.getObligationLocked(r);return {obligationId:r,obligationKey:n,obligationLocked:i}}let a=I(o),s=await e.reads.getObligations(a);if(s.length===0)throw new Error(`No obligation found for sender ${a}`);let c=s.find(i=>i.id===r||i.keyId===n);if(!c)throw new Error(`No obligation found for sender ${a} with id ${r} or key ${n}`);return {obligationId:c.id,obligationKey:c.keyId,obligationLocked:c.locked}},jo=({ctx:t,txBlock:e})=>({stakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await Xe(t,e,o,r),c=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&(ae(i)===`${At}::user::unstake`||ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake`));(!s||c)&&e.stakeObligation(n,a);},stakeObligationWithVeScaQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s,obligationLocked:c}=await Xe(t,e,o,r),i=!!e.txBlock.getData().commands.find(l=>l.$kind==="MoveCall"&&(ae(l)===`${At}::user::unstake`||ae(l)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||ae(l)===`${t.address.get("borrowIncentive.id")}::user::unstake`));if(!c||i){let d=await t.reads.getBindedVeScaKey(a)??n;d?e.stakeObligationWithVesca(a,s,d):e.stakeObligation(a,s);}},unstakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await Xe(t,e,o,r);s&&e.unstakeObligation(n,a);},claimBorrowIncentiveQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s}=await Xe(t,e,r,n);return e.claimBorrowIncentive(a,s,o)}});var Bo=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={address:t.address,reads:{getObligations:i=>t.query.getObligations(i),getObligationLocked:i=>t.query.getObligationLocked(i),getBindedVeScaKey:i=>t.query.getBindedVeScaKey(i)}},a=Io({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=jo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Mo=({ctx:t,txBlock:e})=>{let o={id:t.address.get("vesca.id"),table:t.address.get("vesca.table"),treasury:t.address.get("vesca.treasury"),config:t.address.get("vesca.config"),subsTable:t.address.get("vesca.subsTable")},r=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {lockSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::mint_ve_sca_key`,[o.config,o.table,o.treasury,n,a,r],[]),extendLockPeriod:(n,a)=>{t.moveCall(e,`${o.id}::ve_sca::extend_lock_period`,[o.config,n,o.table,o.treasury,a,r],[]);},extendLockAmount:(n,a)=>{t.moveCall(e,`${o.id}::ve_sca::lock_more_sca`,[o.config,n,o.table,o.treasury,a,r],[]);},renewExpiredVeSca:(n,a,s)=>{t.moveCall(e,`${o.id}::ve_sca::renew_expired_ve_sca`,[o.config,n,o.table,o.treasury,a,s,r],[]);},redeemSca:n=>t.moveCall(e,`${o.id}::ve_sca::redeem`,[o.config,n,o.table,o.treasury,r],[]),mintEmptyVeSca:()=>t.moveCall(e,`${o.id}::ve_sca::mint_ve_sca_placeholder_key`,[o.config,o.table],[]),splitVeSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::split`,[o.config,n,o.table,o.subsTable,e.pure.u64(a)]),mergeVeSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::merge`,[o.config,n,a,o.table,o.subsTable,e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"})],[])}};var Pe=async(...t)=>{let[e,o,r]=t;if(t.length===3&&r&&typeof r<"u"){let s=await e.reads.getVeSca(r);return s||void 0}let n=I(o),a=await e.reads.getVeScas({walletAddress:n});if(a.length!==0)return r?a.find(({keyId:s})=>(typeof r=="string"?r:r.objectId)===s):a[0]},vt=async(...t)=>{let[e,o,r]=t;try{return await e.reads.isVeScaKeyInSubsTable(o,r)}catch(n){return e.utils.logger.error("isInSubsTable lookup failed",{veScaKey:o,tableId:r,message:n?.message}),false}},Fo=({ctx:t,txBlock:e})=>({lockScaQuick:async({amountOrCoin:o,lockPeriodInDays:r,autoCheck:n=true,veScaKey:a})=>{let s=I(e),c=await Pe(t,e,a),i=t.utils.getUnlockAt(r,c?.unlockAt);n&&io(o,r,i,c?.unlockAt);let l,d=[];if(o!==void 0&&typeof o=="number"){let m=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:s}),[f,b]=e.takeAmountFromCoins(m,o);l=f,d.push(b);}else l=o;let u=!c,p=!u&&c.unlockAt<=new Date().getTime();if(u||p){if(l)if(u){let m=e.lockSca(l,i);d.push(m);}else {if(c.lockedScaCoin!==0){let m=e.redeemSca(c.keyId);d.push(m);}e.renewExpiredVeSca(c.keyId,l,i);}}else l&&r?(e.extendLockPeriod(c.keyId,i),e.extendLockAmount(c.keyId,l)):r?e.extendLockPeriod(c.keyId,i):l&&e.extendLockAmount(c.keyId,l);d.length>0&&e.transferObjects(d,s);},extendLockPeriodQuick:async({lockPeriodInDays:o,veScaKey:r,autoCheck:n=true})=>{let a=await Pe(t,e,r),s=t.utils.getUnlockAt(o,a?.unlockAt);n&&Pt(o,s,a?.unlockAt),a&&e.extendLockPeriod(a.keyId,s);},extendLockAmountQuick:async({scaAmount:o,veScaKey:r,autoCheck:n=true})=>{let a=I(e),s=await Pe(t,e,r);if(n&&co(o,s?.unlockAt),s){let c=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:a}),[i,l]=e.takeAmountFromCoins(c,o);e.extendLockAmount(s.keyId,i),e.transferObjects([l],a);}},renewExpiredVeScaQuick:async({scaAmount:o,lockPeriodInDays:r,veScaKey:n,autoCheck:a=true})=>{let s=I(e),c=await Pe(t,e,n),i=t.utils.getUnlockAt(r,c?.unlockAt);if(a&&lo(o,r,c?.unlockAt),c){let l=[];if(c.lockedScaCoin!==0){let m=e.redeemSca(c.keyId);l.push(m);}let d=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:s}),[u,p]=e.takeAmountFromCoins(d,o);l.push(p),e.renewExpiredVeSca(c.keyId,u,i),e.transferObjects(l,s);}},redeemScaQuick:async({veScaKey:o,transferSca:r})=>{let n=I(e),a=await Pe(t,e,o);if(Te(a?.unlockAt),a){let s=e.redeemSca(a.keyId);if(r){e.transferObjects([s],n);return}return s}},splitVeScaQuick:async({splitAmount:o,veScaKey:r,transferVeScaKey:n=true})=>{let a=await vt(t,r,t.address.get("vesca.subsTable")),s=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`);if(a&&!s)throw new Error("Key cannot be in the subs table, please call unsubscribe vesca or unstake obligation first");let c=e.splitVeSca(r,o);if(n){e.transferObjects([c],I(e));return}else return c},mergeVeScaQuick:async({targetVeScaKey:o,sourceVeScaKey:r})=>{let n=t.address.get("vesca.subsTableId"),[a,s]=await Promise.all([vt(t,o,n),vt(t,r,n)]),c=!!e.txBlock.getData().commands.find(d=>d.$kind==="MoveCall"&&ae(d)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`);if((a||s)&&!c)throw new Error("Both target and source cannot be in the subs table. Please call unsubscribe vesca or unstake obligation first");let[i,l]=await Promise.all([t.reads.getVeSca(r),t.reads.getVeSca(o)]);if(!i||!l)throw new Error("Source or target veSCA not found");return i.unlockAt<l.unlockAt?e.extendLockPeriod(i.keyId,l.unlockAt/1e3):i.unlockAt>l.unlockAt&&e.extendLockPeriod(l.keyId,i.unlockAt/1e3),e.mergeVeSca(o,r)}});var Lo=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={address:t.address,utils:t.utils,reads:{getVeSca:i=>t.query.getVeSca(i),getVeScas:i=>t.query.getVeScas(i),isVeScaKeyInSubsTable:(i,l)=>t.query.repos.veSca.isVeScaKeyInSubsTable(i,l)}},a=Mo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Fo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Eo=({ctx:t,txBlock:e})=>{let o={referralPgkId:t.address.get("referral.id"),referralBindings:t.address.get("referral.referralBindings"),referralRevenuePool:t.address.get("referral.referralRevenuePool"),authorizedWitnessList:t.address.get("referral.authorizedWitnessList"),referralTiers:t.address.get("referral.referralTiers"),version:t.address.get("referral.version")},r=t.address.get("vesca.table"),n=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {bindToReferral:a=>{t.moveCall(e,`${o.referralPgkId}::referral_bindings::bind_ve_sca_referrer`,[o.referralBindings,e.pure.id(a),r,n],[]);},claimReferralTicket:a=>{let s=t.utils.parseCoinType(a);return t.moveCall(e,`${o.referralPgkId}::scallop_referral_program::claim_ve_sca_referral_ticket`,[o.version,r,o.referralBindings,o.authorizedWitnessList,o.referralTiers,n],[s])},burnReferralTicket:(a,s)=>{let c=t.utils.parseCoinType(s);t.moveCall(e,`${o.referralPgkId}::scallop_referral_program::burn_ve_sca_referral_ticket`,[o.version,a,o.referralRevenuePool,n],[c]);},claimReferralRevenue:(a,s)=>{let c=t.utils.parseCoinType(s);return t.moveCall(e,`${o.referralPgkId}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,[o.version,o.referralRevenuePool,a,n],[c])},unbindReferral:()=>t.moveCall(e,`${o.referralPgkId}::referral_bindings::unbind_ve_sca_referrer`,[o.referralBindings])}};var Vo=({ctx:t,txBlock:e})=>({claimReferralRevenueQuick:async(o,r=[...t.constants.whitelist.lending])=>{let n=I(e),a=[];for(let s of r)if(s==="sui"){let c=e.claimReferralRevenue(o,s);a.push(c);}else {let c=e.claimReferralRevenue(o,s);try{let i=await t.utils.selectCoins({amount:1/0,coinType:t.utils.parseCoinType(s),ownerAddress:n});e.mergeCoins(c,i.slice(0,500));}catch{}finally{a.push(c);}}a.length>0&&e.transferObjects(a,n);}});var qo=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,constants:{whitelist:t.constants.whitelist}},a=Eo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Vo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Wo=({ctx:t,txBlock:e})=>{let o={pkgId:t.address.get("loyaltyProgram.id"),scaRewardPool:t.address.get("loyaltyProgram.rewardPool")},r={object:t.address.get("vesca.object"),protocolConfig:t.address.get("vesca.config"),veScaTable:t.address.get("vesca.table"),subsTable:t.address.get("vesca.subsTable")},n={pkgId:t.address.get("veScaLoyaltyProgram.id"),veScaRewardPool:t.address.get("veScaLoyaltyProgram.veScaRewardPool")};return {claimLoyaltyRevenue:a=>t.moveCall(e,`${o.pkgId}::reward_pool::redeem_reward`,[o.scaRewardPool,a]),claimVeScaLoyaltyReward:a=>t.moveCall(e,`${n.pkgId}::ve_sca_reward::redeem_reward`,[n.veScaRewardPool,a,r.protocolConfig,r.veScaTable,r.subsTable])}};var Uo=({ctx:t,txBlock:e})=>({claimLoyaltyRevenueQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=I(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimLoyaltyRevenue(o),a=t.constants.coinTypes.sca;if(!a)throw new Error("Coin type sca not found");await t.utils.mergeSimilarCoins(e,n,a,I(e)),e.transferObjects([n],r);},claimVeScaLoyaltyRewardQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=I(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimVeScaLoyaltyReward(o);e.transferObjects([n],r);}});var $o=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,reads:{getVeScas:(...i)=>t.query.getVeScas(...i)},constants:{coinTypes:t.constants.coinTypes}},a=Wo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Uo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Go=({ctx:t,txBlock:e})=>{let o={pkgId:t.address.get("scoin.id")};return {mintSCoin:(r,n)=>{let a=t.utils.parseSCoinType(r);if(!a)throw new Error(`Invalid marketCoinName name: ${r}`);return t.moveCall(e,`${o.pkgId}::s_coin_converter::mint_s_coin`,[t.utils.getSCoinTreasury(r),n],[a,t.utils.parseUnderlyingSCoinType(r)])},burnSCoin:(r,n)=>{let a=t.utils.parseSCoinType(r);if(!a)throw new Error(`Invalid sCoin name: ${r}`);return t.moveCall(e,`${o.pkgId}::s_coin_converter::burn_s_coin`,[t.utils.getSCoinTreasury(r),n],[a,t.utils.parseUnderlyingSCoinType(r)])}}};var zo=({ctx:t,txBlock:e})=>({mintSCoinQuick:async(o,r)=>{let n=I(e),{leftCoin:a,takeCoin:s}=await t.coins.selectMarketCoin(e,o,r,n);return e.transferObjects([a],n),e.mintSCoin(o,s)},burnSCoinQuick:async(o,r)=>{let n=I(e),{leftCoin:a,takeCoin:s}=await t.coins.selectSCoin(e,o,r,n);return e.transferObjects([a],n),e.burnSCoin(o,s)}});var Ho=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,coins:{selectMarketCoin:(...i)=>t.selectMarketCoin(...i),selectSCoin:(...i)=>t.selectSCoin(...i)}},a=Go({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=zo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Xo=["openObligation","returnObligation","openObligationEntry","depositCollateral","takeCollateral","supply","depositEntry","withdraw","withdrawEntry","borrow","borrowWithReferral","borrowEntry","repay","borrowFlashLoan","repayFlashLoan","liquidate"],Jo=["depositCollateralQuick","takeCollateralQuick","borrowQuick","borrowWithReferralQuick","supplyQuick","withdrawQuick","repayQuick","updateAssetPricesQuick","liquidateQuick"],Zo=["createStakeAccount","stake","unstake","claim","stakeQuick","unstakeQuick","claimQuick"],er=["stakeObligation","stakeObligationWithVesca","unstakeObligation","claimBorrowIncentive","deactivateBoost","stakeObligationQuick","stakeObligationWithVeScaQuick","unstakeObligationQuick","claimBorrowIncentiveQuick"],tr=["lockSca","extendLockPeriod","extendLockAmount","renewExpiredVeSca","redeemSca","mintEmptyVeSca","splitVeSca","mergeVeSca","lockScaQuick","extendLockPeriodQuick","extendLockAmountQuick","renewExpiredVeScaQuick","redeemScaQuick","splitVeScaQuick","mergeVeScaQuick"],or=["bindToReferral","claimReferralTicket","burnReferralTicket","claimReferralRevenue","unbindReferral","claimReferralRevenueQuick"],rr=["claimLoyaltyRevenue","claimVeScaLoyaltyReward","claimLoyaltyRevenueQuick","claimVeScaLoyaltyRewardQuick"],nr=["mintSCoin","burnSCoin","mintSCoinQuick","burnSCoinQuick"];var Se=(t,e)=>{let o={};for(let r of e){let n=t[r];typeof n=="function"&&(o[r]=n);}return Object.freeze(o)},ar=t=>{let e=t;return Object.freeze({core:Se(e,[...Xo,...Jo]),spool:Se(e,Zo),borrowIncentive:Se(e,er),vesca:Se(e,tr),referral:Se(e,or),loyalty:Se(e,rr),sCoin:Se(e,nr)})},sr=["core","spool","borrowIncentive","vesca","referral","loyalty","sCoin"];var ir=(t,e)=>{let o=Lo(t,e),r=$o(t,o),n=Bo(t,r),a=qo(t,n),s=Ho(t,a),c=vo(t,s),i=To(t,c),l=new Proxy(i,{get:(p,m)=>m in o?Reflect.get(o,m):m in n?Reflect.get(n,m):m in a?Reflect.get(a,m):m in c?Reflect.get(c,m):m in r?Reflect.get(r,m):m in s?Reflect.get(s,m):Reflect.get(p,m)}),d=ar(l),u=new Set(sr);return new Proxy(l,{get:(p,m)=>typeof m=="string"&&u.has(m)?d[m]:Reflect.get(p,m),has:(p,m)=>typeof m=="string"&&u.has(m)?true:Reflect.has(p,m)})};var cr={effects:true,events:true},Je=class{constructor(e){this.suiKit=e;}get client(){return this.suiKit.client.core}signTransaction(e,o){return this.suiKit.signTxn(e,o)}executeTransaction(e){return this.client.executeTransaction({include:cr,...e})}signAndExecuteTransaction({transaction:e,additionalSignatures:o,signer:r,derivePathParams:n}){return this.client.signAndExecuteTransaction({transaction:e,additionalSignatures:o,include:cr,signer:r??this.suiKit.getKeypair(n)})}signAndSendTxn(e,o){let r=e instanceof Uint8Array?e:"txBlock"in e?e.txBlock:e;return this.signAndExecuteTransaction({transaction:r,derivePathParams:o})}};var k=(t,e)=>{let o=e instanceof G?e.context:void 0;return t?.error(e.message,o),e},V=async t=>{if(t.source==="api")return t.api();if(t.source==="api-first")try{return await t.api()}catch(e){return t.logger?.warn(`[${t.label}] api failed, falling back to onchain`,{cause:e instanceof Error?e.message:String(e)}),t.onchain()}return t.onchain()},Bs=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),_s=new Set(["notExists","dynamicFieldNotFound","deleted"]),It=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&_s.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ce=async(t,e)=>{try{return await Bs(t,e)}catch(o){if(It(o))return null;throw o}};var ue=class{client;constructor({url:e,client:o,timeout:r=8e3}={}){this.client=o??Ms__default.default.create({baseURL:e,headers:{"Content-Type":"application/json",Accept:"application/json"},timeout:r});}async get(e){let o=await this.client.get(e);if(o.status!==200)throw new Error(`API request failed with status ${o.status}: ${o.statusText}`);return o.data}};var Ze=class extends ue{constructor({url:e=qe,...o}){super({url:e,...o});}};var et=class{constructor(e=10){this.capacity=e;this.refillRate=this.capacity/1e3,this.tokens=this.capacity,this.lastRefillTime=Date.now();}tokens;lastRefillTime;refillRate;refill(){let e=Date.now(),r=(e-this.lastRefillTime)*this.refillRate;this.tokens=Math.min(this.capacity,this.tokens+r),this.lastRefillTime=e;}getTimeToNextToken(){if(this.refill(),this.tokens>=1)return 0;let e=1-this.tokens;return Math.ceil(e/this.refillRate)}async acquireToken(){for(;;){let e=this.getTimeToNextToken();if(e===0){if(this.tokens>=1){this.tokens-=1;return}continue}await new Promise(o=>setTimeout(o,e)),this.refill();}}async execute(e){return await this.acquireToken(),await e()}};var Fs=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],Ds=new Set(Fs),lr=new Map;var Ls=(t,e)=>{let o=lr.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,lr.set(t,o);},Es=(t,e)=>new Proxy(t,{get(o,r,n){let a=Reflect.get(o,r,n);if(typeof a!="function")return a;let s=a.bind(o);return typeof r=="string"&&Ds.has(r)?(...c)=>{let i=Date.now();return e.execute(()=>(Ls(r,Date.now()-i),s(...c)))}:s}}),tt=class{client;url;constructor({client:e,url:o,tokensPerSecond:r}){this.client=Es(e,new et(r)),this.url=o;}async getObject(e){let{objectId:o}=e,{objects:[r]}=await this.client.getObjects({objectIds:[o],signal:e.signal,include:e.include});if(r instanceof Error)throw r;return {object:r}}};var jt=(t,e,o)=>new tt({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond}),dr=(t=qe)=>new Ze({url:t}),ur=(t=Ke)=>new ue({url:t});var pr=["supra","switchboard","pyth"];var mr=t=>({whitelist:{lending:t.constants.whitelist.lending,collateral:t.constants.whitelist.collateral},poolAddresses:t.constants.poolAddresses,parseCoinNameFromType:e=>t.parseCoinNameFromType(e),parseCoinType:e=>t.parseCoinType(e),parseSymbol:e=>t.parseSymbol(e),parseMarketCoinType:e=>t.parseMarketCoinType(e),parseMarketCoinName:e=>t.parseMarketCoinName(e),parseSCoinType:e=>t.parseSCoinType(e),getCoinWrappedType:e=>t.getCoinWrappedType(e),getCoinDecimal:e=>t.getCoinDecimal(e),parseAprToApy:e=>t.parseAprToApy(e)}),br=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),yr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {whitelist:{lending:t.constants.whitelist.lending,scoin:t.constants.whitelist.scoin},addresses:{scoin:e.scoin},parseCoinType:o=>t.parseCoinType(o),parseSCoinType:o=>t.parseSCoinType(o),parseMarketCoinType:o=>t.parseMarketCoinType(o),parseSCoinNameFromType:o=>t.parseSCoinNameFromType(o),parseUnderlyingSCoinType:o=>t.parseUnderlyingSCoinType(o),getSCoinTreasury:o=>t.getSCoinTreasury(o),getCoinDecimal:o=>t.getCoinDecimal(o),parseCoinName:o=>t.parseCoinName(o)}},fr=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},gr=t=>({addresses:{protocolObjectId:t.address.get("core.object"),queryPackageId:t.address.get("core.packages.query.id"),version:t.address.get("core.version"),market:t.address.get("core.market")}}),hr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {whitelist:{lending:t.constants.whitelist.lending},addresses:{borrowIncentive:e.borrowIncentive,core:{object:t.address.get("core.object")},vesca:{object:t.address.get("vesca.object")}},parseCoinNameFromType:o=>t.parseCoinNameFromType(o),parseSymbol:o=>t.parseSymbol(o),getCoinDecimal:o=>t.getCoinDecimal(o)}},Sr=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),Cr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{coins:Object.fromEntries(Object.entries(e.core.coins).filter(r=>r[1]!==void 0))}}},wr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{core:{coins:e.core.coins,market:e.core.market},spool:{pools:e.spool.pools},scoin:{coins:e.scoin.coins}}}},xr=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),Tr=t=>({addresses:{veSca:{id:t.address.get("vesca.id"),config:t.address.get("vesca.config"),tableId:t.address.get("vesca.tableId"),object:t.address.get("vesca.object"),treasury:t.address.get("vesca.treasury")}}}),kr=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),Ar=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{veSca:{tableId:e.vesca.tableId},veScaLoyaltyProgram:{veScaRewardPool:e.veScaLoyaltyProgram.veScaRewardPool,veScaRewardTableId:e.veScaLoyaltyProgram.veScaRewardTableId}}}},Or=t=>({whitelist:{spool:t.constants.whitelist.spool},addresses:{spoolObjectId:t.address.get("spool.object"),spools:[...t.constants.whitelist.spool].reduce((e,o)=>(e[o]={id:t.address.get(`spool.pools.${o}.id`),rewardPoolId:t.address.get(`spool.pools.${o}.rewardPoolId`)},e),{})},poolAddresses:t.constants.poolAddresses,parseCoinName:e=>t.parseCoinName(e),parseSymbol:e=>t.parseSymbol(e),parseCoinType:e=>t.parseCoinType(e),parseMarketCoinType:e=>t.parseMarketCoinType(e),parseSCoinType:e=>t.parseSCoinType(e),isMarketCoin:e=>t.isMarketCoin(e),getCoinDecimal:e=>t.getCoinDecimal(e)??0,getSpoolRewardCoinName:()=>t.getSpoolRewardCoinName()}),Pr=t=>({addresses:{...pr.reduce((e,o)=>(e[o]={object:t.address.get(`core.packages.${o}.object`)},e),{}),xOracleObject:t.address.get("core.packages.xOracle.object"),oracles:{primaryPriceUpdatePolicyVecsetId:t.address.get("core.oracles.primaryPriceUpdatePolicyVecsetId"),secondaryPriceUpdatePolicyVecsetId:t.address.get("core.oracles.secondaryPriceUpdatePolicyVecsetId"),primaryPriceUpdatePolicyObject:t.address.get("core.oracles.primaryPriceUpdatePolicyObject"),secondaryPriceUpdatePolicyObject:t.address.get("core.oracles.secondaryPriceUpdatePolicyObject"),switchboardRegistryTableId:t.address.get("core.oracles.switchboard.registryTableId")}},whitelist:{lending:t.constants.whitelist.lending},parseCoinNameFromType:e=>t.parseCoinNameFromType(e),parseCoinType:e=>t.parseCoinType(e),getSwitchboardAggAddress:e=>t.address.get(`core.coins.${e}.oracle.switchboard`)});var pe={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}};var Rr=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var vr=new queryCore.QueryClient(We);var R=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=vr,logger:o=pe,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=Rr(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function U(t){let{type:e,value:o}=t;if(t.bcs instanceof Uint8Array)return {type:e,bcs:t.bcs};if(o===void 0)throw new Error(`DynamicField name must have 'value' or 'bcs' for type: ${e}`);let r;if(e==="0x2::object::ID"||e==="address"||e.includes("::typed_id::TypedID"))r=bcs.bcs.Address.serialize(o).toBytes();else if(e==="u64"||e==="u8"||e==="u128"||e==="u256")r={u64:bcs.bcs.u64(),u8:bcs.bcs.u8(),u128:bcs.bcs.u128(),u256:bcs.bcs.u256()}[e].serialize(o).toBytes();else if(e.includes("::type_name::TypeName")){let n=typeof o=="object"&&o!==null&&"name"in o?o.name:suiKit.normalizeStructTag(o);r=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).serialize({name:n}).toBytes();}else r=bcs.bcs.string().serialize(o).toBytes();return {type:e,bcs:r}}var be=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var qs="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",rt=t=>typeof t=="object"&&t!==null,Ws=t=>!rt(t)||t.$kind!=="Shared"||!("Shared"in t)||!rt(t.Shared)?false:"initialSharedVersion"in t.Shared;function Us(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var ot=t=>{if(Array.isArray(t))return t.map(ot);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return ot(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=ot(n);return o}return t},jr=t=>{Us(t);let e=t.json,o="fields"in e?e.fields:e;return ot(o)},Ir=t=>Ws(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Qs=(t,{obj:e,mutable:o=false})=>typeof e=="object"&&"initialSharedVersion"in e?t.sharedObjectRef({objectId:e.objectId,initialSharedVersion:e.initialSharedVersion.toString(),mutable:o}):typeof e=="object"&&"objectId"in e?t.object(e.objectId):typeof e=="string"?t.object(e):e,Z=async({onchain:t,fetchWithCache:e},{tx:o,objectId:r,mutable:n=false,include:a})=>{let s;if(typeof r=="string"){let c=await e({queryKey:g.rpc.getSharedObject({objectId:r,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!c?.object)throw new Error("Failed to get object data");s=Ir(c.object);}else "objectId"in r&&"owner"in r&&(s=Ir(r));return Qs(o,{obj:s??r,mutable:n})},$s=zod.z.union([zod.z.string(),zod.z.object({name:zod.z.string()}),zod.z.object({id:zod.z.string()}),zod.z.object({bytes:zod.z.string()}),zod.z.record(zod.z.unknown())]),Gs=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),zs=zod.z.object({id:Gs,name:$s,value:zod.z.unknown().optional()}),Nr=t=>t.type.startsWith(qs),Br=t=>{let{success:e}=zs.safeParse(t);return !!e},Ys=t=>typeof t=="string"?t:t.id,Hs=t=>{if(!Br(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},Xs=t=>{if(typeof t=="string")return t;if(!rt(t))return;let e=t,o=e.name,r=e.id,n=e.bytes;if(typeof o=="string")return o;if(typeof r=="string")return r;if(typeof n=="string")return n},Js=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!rt(t))return "string";let e=t;if(typeof e.id=="string")return "id";if(typeof e.bytes=="string")return "bytes";let o=e.name;return typeof o=="string"&&o.includes("::")?"type":"string"},A=t=>{let e=jr(t);return Nr(t)&&typeof e=="object"?Hs(e):e},_r=t=>{if(!Nr(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=jr(t);if(Br(e)){let o=Xs(e.name);if(!o)throw new Error(`Failed to parse dynamic field name from object ${t.objectId}: ${JSON.stringify(e.name,null,2)}`);return {objectId:Ys(e.id),name:o,nameKind:Js(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var Mr=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:J(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:J(e.type,`market.collaterals[${o}].type`)}))}};var Fr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",Dr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",Lr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var Nt=t=>({coinType:utils.normalizeStructTag(t.type),maxBorrowRate:Number(t.maxBorrowRate.value)/2**32,borrowRate:Number(t.interestRate.value)/2**32,borrowRateScale:Number(t.interestRateScale),borrowIndex:Number(t.borrowIndex),lastUpdated:Number(t.lastUpdated),cashAmount:Number(t.cash),debtAmount:Number(t.debt),marketCoinSupplyAmount:Number(t.marketCoinSupply),reserveAmount:Number(t.reserve),reserveFactor:Number(t.reserveFactor.value)/2**32,borrowWeight:Number(t.borrowWeight.value)/2**32,borrowFee:Number(t.borrowFeeRate.value)/2**32,baseBorrowRate:Number(t.baseBorrowRatePerSec.value)/2**32,borrowRateOnHighKink:Number(t.borrowRateOnHighKink.value)/2**32,borrowRateOnMidKink:Number(t.borrowRateOnMidKink.value)/2**32,highKink:Number(t.highKink.value)/2**32,midKink:Number(t.midKink.value)/2**32,minBorrowAmount:Number(t.minBorrowAmount),isIsolated:t.isIsolated,supplyLimit:Number(t.supplyLimit),borrowLimit:Number(t.borrowLimit)}),Bt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new T(`Coin decimal not found for ${o}`,{context:{coinName:o}});let n=24*365*3600,a=e.baseBorrowRate*n/e.borrowRateScale,s=e.borrowRateOnHighKink*n/e.borrowRateScale,c=e.borrowRateOnMidKink*n/e.borrowRateScale,i=e.maxBorrowRate*n/e.borrowRateScale,l=e.borrowRate*n/e.borrowRateScale,d=Math.floor(new Date().getTime()/1e3)-e.lastUpdated,u=bignumber_js.BigNumber(e.borrowIndex).multipliedBy(bignumber_js.BigNumber(d).multipliedBy(e.borrowRate)).dividedBy(e.borrowRateScale),p=bignumber_js.BigNumber(e.borrowIndex).plus(u),m=bignumber_js.BigNumber(p).dividedBy(e.borrowIndex).minus(1),f=bignumber_js.BigNumber(e.debtAmount).multipliedBy(m),b=f.plus(e.debtAmount),y=b.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(f.multipliedBy(e.reserveFactor)),S=h.shiftedBy(-r),w=bignumber_js.BigNumber(b).plus(Math.max(e.cashAmount-h.toNumber(),0)),O=w.shiftedBy(-r),_=bignumber_js.BigNumber(b).dividedBy(w);_=_.isFinite()?_:bignumber_js.BigNumber(0);let j=bignumber_js.BigNumber(l).multipliedBy(_).multipliedBy(1-e.reserveFactor);j=j.isFinite()?j:bignumber_js.BigNumber(0);let v=w.dividedBy(e.marketCoinSupplyAmount);return v=v.isFinite()&&!v.isNaN()?v:bignumber_js.BigNumber(1),{baseBorrowApr:a,baseBorrowApy:t.parseAprToApy(a),borrowAprOnHighKink:s,borrowApyOnHighKink:t.parseAprToApy(s),borrowAprOnMidKink:c,borrowApyOnMidKink:t.parseAprToApy(c),coinDecimal:r,maxBorrowApr:i,maxBorrowApy:t.parseAprToApy(i),borrowApr:Math.min(l,i),borrowApy:Math.min(t.parseAprToApy(l),t.parseAprToApy(i)),borrowIndex:p.toNumber(),growthInterest:m.toNumber(),supplyAmount:w.toNumber(),supplyCoin:O.toNumber(),borrowAmount:b.toNumber(),borrowCoin:y.toNumber(),reserveAmount:h.toNumber(),reserveCoin:S.toNumber(),utilizationRate:_.toNumber(),supplyApr:j.toNumber(),supplyApy:t.parseAprToApy(j.toNumber()),conversionRate:v.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},_t=t=>({coinType:utils.normalizeStructTag(t.type),isIsolated:t.isIsolated,collateralFactor:Number(t.collateralFactor.value)/4294967296,liquidationFactor:Number(t.liquidationFactor.value)/4294967296,liquidationDiscount:Number(t.liquidationDiscount.value)/4294967296,liquidationPenalty:Number(t.liquidationPenalty.value)/4294967296,liquidationReserveFactor:Number(t.liquidationReserveFactor.value)/4294967296,maxCollateralAmount:Number(t.maxCollateralAmount),totalCollateralAmount:Number(t.totalCollateralAmount)}),Mt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new T(`Coin decimal not found for ${o}`,{context:{coinName:o}});let n=bignumber_js.BigNumber(e.maxCollateralAmount).shiftedBy(-r),a=bignumber_js.BigNumber(e.totalCollateralAmount).shiftedBy(-r);return {coinDecimal:r,isIsolated:e.isIsolated,maxDepositAmount:e.maxCollateralAmount,maxDepositCoin:n.toNumber(),depositAmount:e.totalCollateralAmount,depositCoin:a.toNumber()}},Vr=t=>{let e=bignumber_js.BigNumber(0),o=bignumber_js.BigNumber(0),r=bignumber_js.BigNumber(0);for(let n of Object.values(t.pools))n&&(e=e.plus(bignumber_js.BigNumber(n.supplyCoin).multipliedBy(n.coinPrice)),r=r.plus(bignumber_js.BigNumber(n.borrowCoin).multipliedBy(n.coinPrice)));for(let n of Object.values(t.collaterals))n&&(o=o.plus(bignumber_js.BigNumber(n.depositCoin).multipliedBy(n.coinPrice)));return {supplyValue:e.plus(o).toNumber(),supplyLendingValue:e.toNumber(),supplyCollateralValue:o.toNumber(),borrowValue:r.toNumber(),totalValue:e.plus(o).minus(r).toNumber()}};var Ft=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{indexer:n,metadata:a,fetchWithCache:s}=t,c="api/market/migrate",i=await s({queryFn:()=>n.get(c),queryKey:g.api.getMarkets()}),l={},d={},u=o?new Set(o):void 0,p=r?new Set(r):void 0,m=b=>{u&&!u.has(b.coinName)||(l[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});},f=b=>{p&&!p.has(b.coinName)||(d[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(m),Object.values(i.collaterals).filter(Boolean).forEach(f),{pools:l,collaterals:d}},Dt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{onchain:n,addresses:a,fetchWithCache:s}=t,{queryPackageId:c,market:i}=a,l=new suiKit.SuiTxBlock,d=`${c}::market_query::market_data`,p=[await Z({onchain:n,fetchWithCache:s},{tx:l,mutable:true,objectId:i})];l.moveCall(d,p);let m=await s({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:p.map(y=>typeof y=="object"&&"objectId"in y?y.objectId:y),typeArgs:[],node:n.url}),queryFn:()=>n.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=m?.Transaction??m?.FailedTransaction;if(!f.status.success)throw k(t.logger,new P(`On-chain market query transaction failed: ${f.status.error.message}`));let b=Mr(f?.events?.[0]?.json);return ei(t,b,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},qr=async(t,{coinPrice:e,coinName:o})=>{let r=await Ft(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw k(t.logger,new T(`Market pool for ${o} not found in indexer data`,{context:{coinName:o}}));return {pool:r.pools[o],collateral:r.collaterals[o]}},Wr=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await $r(t,[o]))[o];if(!a)throw k(t.logger,new P(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await ri(t,a),c=Nt(s),i=Bt(r,c),l=s.parsedOriginMarketCollateral?_t(s.parsedOriginMarketCollateral):void 0,d=()=>({coinName:o,symbol:r.parseSymbol(o),marketCoinType:r.parseMarketCoinType(o),coinType:r.parseCoinType(o)});return {pool:{...d(),sCoinType:r.parseSCoinType(r.parseMarketCoinName(o))??"",coinWrappedType:r.getCoinWrappedType(o),coinPrice:e??0,highKink:c.highKink,midKink:c.midKink,reserveFactor:c.reserveFactor,borrowWeight:c.borrowWeight,borrowFee:c.borrowFee,marketCoinSupplyAmount:c.marketCoinSupplyAmount,minBorrowAmount:c.minBorrowAmount,...i},collateral:l?{...d(),coinWrappedType:r.getCoinWrappedType(o),coinPrice:e,collateralFactor:l.collateralFactor,liquidationFactor:l.liquidationFactor,liquidationDiscount:l.liquidationDiscount,liquidationPenalty:l.liquidationPenalty,liquidationReserveFactor:l.liquidationReserveFactor,...Mt(r,l)}:void 0}},Ur=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},Qr=async(t,{coinPrices:e})=>{let o=await Dt(t,{coinPrices:e});return Vr(o)},ei=async(t,e,{coinPrices:o,poolCoinNames:r,collateralCoinNames:n})=>{let{metadata:a}=t,s={},c={},i=r?new Set(r):void 0,l=n?new Set(n):void 0,d=new Set;for(let p of e?.pools??[]){let m=a.parseCoinNameFromType(p.type);a.whitelist.lending.has(m)&&(i&&!i.has(m)||d.add(m));}for(let p of e?.collaterals??[]){let m=a.parseCoinNameFromType(p.type);a.whitelist.collateral.has(m)&&(l&&!l.has(m)||d.add(m));}let u=await $r(t,[...d],oi);for(let p of e?.pools??[]){let m=p.type,f=a.parseCoinNameFromType(m),b=o[f]??0;if(!a.whitelist.lending.has(f)||i&&!i.has(f))continue;let{supplyLimit:y,borrowLimit:h,isIsolated:S}=Kr(u[f]??{}),w=Nt({...p,type:p.type,isIsolated:S,supplyLimit:y,borrowLimit:h}),O=Bt(a,w);s[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),sCoinType:a.parseSCoinType(a.parseMarketCoinName(f))??"",coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...w,...O};}for(let p of e?.collaterals??[]){let m=p.type,f=a.parseCoinNameFromType(m),b=o[f]??0;if(!a.whitelist.collateral.has(f)||l&&!l.has(f))continue;let{isIsolated:y}=Kr(u[f]??{}),h=_t({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:y}),S=Mt(a,h);c[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...h,...S};}return {pools:s,collaterals:c}},ti=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],oi=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Kr=t=>({supplyLimit:t.supplyLimitKey?A(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?A(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?A(t.isolatedAssetKey):false}),ri=async(t,{balanceSheet:e,borrowDynamic:o,collateralStat:r,interestModel:n,riskModel:a,borrowFeeKey:s,supplyLimitKey:c,borrowLimitKey:i,isolatedAssetKey:l})=>{if(!e||!o||!n)throw k(t.logger,new P("Missing required market objects"));let d=A(e),u=A(n),p=A(o),m=s?A(s):{value:"0"},f=c?A(c):"0",b=i?A(i):"0",y=a?A(a):void 0,h=r?A(r):void 0,S=t.metadata.parseCoinNameFromType(`0x${u.type}`),w=l?.json?A(l):await ni(t,S),O=y&&h?{type:u.type,collateralFactor:y.collateral_factor,liquidationFactor:y.liquidation_factor,liquidationPenalty:y.liquidation_penalty,liquidationDiscount:y.liquidation_discount,liquidationReserveFactor:y.liquidation_revenue_factor,maxCollateralAmount:y.max_collateral_amount,totalCollateralAmount:h.amount,isIsolated:w}:void 0;return {type:u.type,maxBorrowRate:u.max_borrow_rate,interestRate:p.interest_rate,interestRateScale:p.interest_rate_scale,borrowIndex:p.borrow_index,lastUpdated:p.last_updated,cash:d.cash,debt:d.debt,marketCoinSupply:d.market_coin_supply,reserve:d.revenue,reserveFactor:u.revenue_factor,borrowWeight:u.borrow_weight,borrowFeeRate:m,baseBorrowRatePerSec:u.base_borrow_rate_per_sec,borrowRateOnHighKink:u.borrow_rate_on_high_kink,borrowRateOnMidKink:u.borrow_rate_on_mid_kink,highKink:u.high_kink,midKink:u.mid_kink,minBorrowAmount:u.min_borrow_amount,supplyLimit:f,borrowLimit:b,isIsolated:w,parsedOriginMarketCollateral:O}},$r=async({onchain:t,metadata:e,fetchWithCache:o},r,n=ti)=>{let a=[];for(let d of r){let u=e.poolAddresses[d];for(let p of n){let m=u?.[p];m&&a.push(m);}}let s=[],c=be([...new Set(a)],50);for(let d of c){let u=await o({queryKey:g.rpc.getObjects({objectIds:d,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:d,include:{json:true}})});s.push(...u.objects.filter(p=>!(p instanceof Error)));}let i=s.reduce((d,u)=>(d[u.objectId]=u,d),{}),l={};for(let d of r){let u=e.poolAddresses[d];l[d]={balanceSheet:i[u?.lendingPoolAddress??""],collateralStat:i[u?.collateralPoolAddress??""],borrowDynamic:i[u?.borrowDynamic??""],interestModel:i[u?.interestModel??""],riskModel:i[u?.riskModel??""],borrowFeeKey:i[u?.borrowFeeKey??""],supplyLimitKey:i[u?.supplyLimitKey??""],borrowLimitKey:i[u?.borrowLimitKey??""],isolatedAssetKey:i[u?.isolatedAssetKey??""]};}return l},Gr=(t,e)=>Yr(t,Fr,e),zr=(t,e)=>Yr(t,Dr,e),ni=async(t,e)=>{let o=await Hr(t,Lr,e);return o?.object?.json?A(o.object):false},Yr=async(t,e,o)=>{let r=await Hr(t,e,o);return r?.object?.json?A(r.object):"0"},Hr=({onchain:t,addresses:e,metadata:o,fetchWithCache:r},n,a)=>{let s=o.parseCoinType(a).slice(2),c={type:n,value:s};return r({queryKey:g.rpc.getDynamicFieldObject({parentId:e.market,name:c,node:t.url}),queryFn:async()=>{try{let{dynamicField:i}=await t.client.getDynamicField({parentId:e.market,name:U(c)});return await t.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(i instanceof Error&&i.message.toLowerCase().includes("not found"))return null;throw i}}})};var nt=class extends R{indexer;addresses;onchain;constructor({indexer:e,addresses:o,onchain:r,...n}){super(n),this.indexer=e,this.addresses=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,addresses:this.addresses}}getMarkets({coinPrices:e,poolCoinNames:o,collateralCoinNames:r,source:n="api-first"}){let a={coinPrices:e,poolCoinNames:o,collateralCoinNames:r};return V({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>Ft(this.context,a),onchain:()=>Dt(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return V({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>qr(this.context,{coinPrice:e,coinName:o}),onchain:()=>Wr(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return Gr(this.context,e)}getPoolBorrowLimit(e){return zr(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return V({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>Ur(this.context),onchain:()=>Qr(this.context,{coinPrices:o})})}};var Lt=async(t,{address:e,coinType:o})=>{let{onchain:r}=t;return (await r.client.getBalance({owner:e,coinType:o})).balance},li=(t,{balance:e,coinType:o,address:r,node:n})=>{let a=g.rpc.getCoinBalance({node:n,address:r,coinType:o});t.setQueryData(a,e,{updatedAt:Date.now()});},Et=async(t,e)=>{let{onchain:o,queryClient:r}=t,n=[],a=null,s=true;for(;s;){let i=await o.client.listBalances({owner:e,cursor:a,limit:50});n.push(...i.balances??[]),s=i.hasNextPage,a=i.cursor;}return n.length?n.reduce((i,l)=>{if(l.balance!=="0"){let d=utils.normalizeStructTag(l.coinType);i[d]=l,li(r,{balance:l,coinType:d,address:e,node:o.url});}return i},{}):{}},Xr=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,coinNames:c=[...n.whitelist.lending.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},Jr=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,coinName:s}=e,c=n.parseCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},Zr=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,sCoinNames:c=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseSCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},en=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,sCoinName:s}=e,c=n.parseSCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},tn=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,marketCoinNames:c=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseMarketCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},on=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,marketCoinName:s}=e,c=n.parseMarketCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},rn=async(t,e)=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,{getCoinDecimal:a,parseSCoinType:s,parseUnderlyingSCoinType:c,parseCoinName:i,addresses:{scoin:l}}=r,d=`${l.id}::s_coin_converter::total_supply`,u=l.coins[e]?.treasury;if(!u)throw k(t.logger,new T(`Treasury address not found for sCoin: ${e}`,{context:{sCoinName:e}}));let p=new suiKit.SuiTxBlock,m=await n({queryKey:g.rpc.getSharedObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!m.object)throw k(t.logger,new P(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let f=[await Z({onchain:o,fetchWithCache:n},{tx:p,objectId:m.object})],b=[s(e),c(e)].filter(w=>!!w);p.moveCall(d,f,b);let y={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:f,typeArgs:b,node:o.url,...y}),queryFn:()=>o.client.simulateTransaction({...y,transaction:p.txBlock})}),S=h?.commandResults;if(!S)throw k(t.logger,new P(`Failed to query total supply for ${e}: ${h[h.$kind]?.status.error?.message}`,{context:{sCoinName:e}}));if(S&&S[0]?.returnValues&&S[0].returnValues[0]){let w=S[0].returnValues[0].bcs,O=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(w)).shiftedBy(-O).toNumber()}return 0};var at=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain,queryClient:this.queryClient}}getCoinAmounts(e){return Xr(this.context,e)}getCoinAmount(e){return Jr(this.context,e)}getSCoinAmounts(e){return Zr(this.context,e)}getSCoinAmount(e){return en(this.context,e)}getSCoinTotalSupply(e){return rn(this.context,e)}getMarketCoinAmounts(e){return tn(this.context,e)}getMarketCoinAmount(e){return on(this.context,e)}};var nn="0x00481a93b819d744a7d79ecdc6c62c74f2f7cb4779316c4df640415817ac61bb";var pi=async(t,{assetTypeMap:e})=>{let{onchain:o,fetchWithCache:r}=t,n=null,a=false,s=[];do{let l={parentId:nn,limit:50,cursor:n},d=await r({queryKey:g.rpc.getDynamicFields(l),queryFn:()=>o.client.listDynamicFields(l)});if(!d)break;let u=d.dynamicFields.filter(p=>{let m=`0x${bcs.bcs.string().parse(p.name.bcs)}`;return !!e[m]}).map(p=>p.fieldId);s.push(...u),a=d.hasNextPage,n=d.cursor;}while(a);if(s.length===0)return [];let c={json:true},{objects:i}=await r({queryKey:g.rpc.getObjects({node:o.url,objectIds:s}),queryFn:()=>o.client.getObjects({objectIds:s,include:c})});return i},an=async(t,{assetNames:e})=>{let{metadata:o}=t,r=new Set(e),n=Object.fromEntries([...o.coinTypeToCoinNameMap.entries()].filter(([,s])=>r.has(s)));return (await pi(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,c)=>{if(c){let{name:i}=_r(c),l=`0x${i}`,d=n[l];if(!d)return s;let u=+A(c);s[d]=u/1e4;}return s},{})};var st=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getFlashloanFees(e){return an(this.context,{assetNames:e})}};var sn=t=>{let o=A(t).ownership?.of;if(!o)throw new T(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var cn=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:J(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:J(e.type,`obligation.debts[${o}].type`)}))}};var bi=async(t,{address:e})=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,a=`${r.addresses.protocolObjectId}::obligation::ObligationKey`,s=[],c=false,i=null;do{let l={owner:e,type:a,include:{json:true},limit:50,cursor:i},d=await n({queryKey:g.rpc.getOwnedObjects(l),queryFn:()=>o.client.listOwnedObjects(l)});s.push(...d.objects),d.hasNextPage&&d.cursor?(c=true,i=d.cursor):c=false;}while(c);return s},ln=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{queryPackageId:a,version:s,market:c}=n.addresses,i=`${a}::obligation_query::obligation_data`,l=new suiKit.SuiTxBlock,d=y=>({objectId:y,include:{json:false,content:false}}),u=async y=>{let h=await r({queryKey:g.rpc.getObject({...d(y),node:o.url}),queryFn:()=>o.getObject(d(y))});if(!h.object)throw k(t.logger,new P(`Failed to fetch object ${y}`,{context:{objectId:y}}));return Z({onchain:o,fetchWithCache:r},{tx:l,mutable:false,objectId:h.object})},p=await Promise.all([u(s),u(c),u(e)]);l.moveCall(i,[...p,l.txBlock.object.clock()]);let m=[s,c,e],f=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:m,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),b=f.Transaction??f.FailedTransaction;if(!b.status.success)throw k(t.logger,new P(`Failed to query obligation data for obligationId ${e}: ${b.status.error.message}`,{context:{obligationId:e}}));return cn(b?.events?.[0]?.json)},dn=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},a=await r({queryKey:g.rpc.getObject(n),queryFn:()=>o.getObject(n)});return !!A(a.object)?.lock_key},un=async(t,{address:e})=>{let o=await bi(t,{address:e}),r=o.map(sn),n=await Vt(t,r);return o.map((a,s)=>{let c=n[s],i=c?A(c):void 0;return {id:r[s],keyId:a.objectId,locked:!!i?.lock_key}})},Vt=async(t,e)=>{if(e.length===0)return [];let{onchain:o,fetchWithCache:r}=t,n={objectIds:e,include:{json:true}},{objects:a}=await r({queryKey:g.rpc.getObjects({objectIds:e,node:o.url}),queryFn:()=>o.client.getObjects(n)});return a.map(s=>s instanceof Error?null:s)};var it=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return un(this.context,{address:e})}getObligationData(e){return ln(this.context,e)}getObligationLocked(e){return dn(this.context,e)}getObligationObjects(e){return Vt(this.context,e)}};var yi=t=>({pointType:X(t.point_type),distributedPointPerPeriod:Number(t.distributed_point_per_period),period:Number(t.point_distribution_time),distributedPoint:Number(t.distributed_point),points:Number(t.points),index:Number(t.index),baseWeight:Number(t.base_weight),weightedAmount:Number(t.weighted_amount),lastUpdate:Number(t.last_update),createdAt:Number(t.created_at)}),pn=(t,e)=>({poolType:X(e.pool_type),minStakes:Number(e.min_stakes),maxStakes:Number(e.max_stakes),staked:Number(e.stakes),poolPoints:e.points.reduce((o,r)=>{let n=yi(r),a=t(n.pointType);return o[a]=n,o},{})}),mn=(t,e,o,r,n)=>{let s=bignumber_js.BigNumber(t.distributedPointPerPeriod).dividedBy(t.period),c=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),i=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(c).multipliedBy(t.distributedPointPerPeriod),bignumber_js.BigNumber(t.points)),l=bignumber_js.BigNumber(t.index).plus(i.dividedBy(t.weightedAmount).isFinite()?bignumber_js.BigNumber(1e9).multipliedBy(i).dividedBy(t.weightedAmount):0),d=bignumber_js.BigNumber(t.distributedPoint).plus(i),u=bignumber_js.BigNumber(t.baseWeight),p=bignumber_js.BigNumber(t.weightedAmount),m=p.shiftedBy(-1*n),f=m.multipliedBy(r),b=365*24*60*60,y=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(y).multipliedBy(b).multipliedBy(e),S=bignumber_js.BigNumber(1e12),w=bignumber_js.BigNumber(t.baseWeight).dividedBy(S),O=h.multipliedBy(w).dividedBy(f).isFinite()&&t.points>0?h.multipliedBy(w).dividedBy(f).toNumber():1/0;return {distributedPointPerSec:s.toNumber(),accumulatedPoints:i.toNumber(),currentPointIndex:l.toNumber(),currentTotalDistributedPoint:d.toNumber(),baseWeight:u.toNumber(),weightedStakedAmount:p.toNumber(),weightedStakedCoin:m.toNumber(),weightedStakedValue:f.toNumber(),rewardApr:O,rewardPerSec:y.toNumber()}},fi=t=>({pointType:X(t.point_type),weightedAmount:Number(t.weighted_amount),points:Number(t.points),totalPoints:Number(t.total_points),index:Number(t.index)}),bn=(t,e)=>({poolType:X(e.pool_type),debtAmount:Number(e.debt_amount),pointList:e.points_list.reduce((o,r)=>{let n=fi(r),a=t(n.pointType);return o[a]=n,o},{})}),yn=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:J(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:J(r.point_type,`borrowIncentive.incentive_pools[${o}].points[${n}].point_type`)}))}))}},fn=t=>{if(t)return {...t,pool_records:(t.pool_records??[]).map((e,o)=>({...e,pool_type:J(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:J(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var gi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),hi=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),gn=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:hi,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(gi)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var Sn=async(t,{coinNames:e,coinPrices:o})=>{let{onchain:r,metadata:n,fetchWithCache:a}=t,{borrowIncentive:s}=n.addresses,c=new suiKit.SuiTxBlock,i=`${s.query}::incentive_pools_query::incentive_pools_data`,l={objectId:s.incentivePools},d=await a({queryKey:g.rpc.getSharedObject({...l,node:r.url}),queryFn:()=>r.getObject(l)});if(!d.object)throw k(t.logger,new P(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await Z({onchain:r,fetchWithCache:a},{tx:c,mutable:true,objectId:d.object})];c.moveCall(i,p,[]);let m=await a({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentivePools],node:r.url}),queryFn:()=>r.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=m?.Transaction??m?.FailedTransaction,b=yn(f?.events?.[0]?.json),y=e??[...n.whitelist.lending.values()],h={};for(let S of b?.incentive_pools??[]){let w={},O=pn(n.parseCoinNameFromType,S),_=S.pool_type,j=n.parseCoinNameFromType(_),v=o[j]??0,x=n.getCoinDecimal(j);if(x===void 0)throw k(t.logger,new T(`Coin decimal not found for ${j}`,{context:{poolCoinName:j}}));if(!y.includes(j))continue;for(let[q,$]of Object.entries(O.poolPoints)){if(!$)continue;let de=$.pointType,te=n.parseCoinNameFromType(de),ie=n.getCoinDecimal(te);if(ie===void 0)throw k(t.logger,new T(`Coin decimal not found for ${te}`,{context:{poolCoinName:te}}));let L=o[te]??0,we=n.parseSymbol(te),W=mn($,L,ie,v,x),Y=$.points<=W.accumulatedPoints;$.points>W.accumulatedPoints&&(w[q]={symbol:we,coinName:te,coinType:de,coinDecimal:ie,coinPrice:L,points:$.points,distributedPoint:$.distributedPoint,weightedAmount:$.weightedAmount,...W,...Y?{rewardApr:0}:{}});}let B=bignumber_js.BigNumber(O.staked),N=B.shiftedBy(-x),F=N.multipliedBy(v);h[j]={coinName:j,symbol:n.parseSymbol(j),coinType:_,coinDecimal:x,coinPrice:v,stakedAmount:B.toNumber(),stakedCoin:N.toNumber(),stakedValue:F.toNumber(),points:w};}return h},Cn=async(t,{coinNames:e,obligationId:o})=>{let{metadata:r,fetchWithCache:n,onchain:a}=t,{borrowIncentive:s}=r.addresses,c=new suiKit.SuiTxBlock,i=`${s.query}::incentive_account_query::incentive_account_data`,l=async(h,S)=>{let w=await n({queryKey:g.rpc.getSharedObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!w.object)throw k(t.logger,new P(`Failed to fetch object ${h}`,{context:{objectId:h}}));return Z({onchain:a,fetchWithCache:n},{tx:c,mutable:S,objectId:w.object})},[d,u]=await Promise.all([l(s.incentiveAccounts,true),l(o,true)]),p=[d,u];c.moveCall(i,p,[]);let m=await n({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentiveAccounts,o],node:a.url}),queryFn:()=>a.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=m?.Transaction??m?.FailedTransaction,b=fn(f?.events?.[0]?.json),y=e??[...r.whitelist.lending.values()];return b?b.pool_records.reduce((h,S)=>{let w=bn(r.parseCoinNameFromType,S),O=w.poolType,_=r.parseCoinNameFromType(O);return y.includes(_)&&(h[_]=w),h},{}):{}},wn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,core:s}=n,c={objectId:a.incentiveAccounts,include:{json:true}},i=await r({queryKey:g.rpc.getObject(c),queryFn:()=>o.getObject(c)});if(!i.object)throw k(t.logger,new P(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let l=A(i.object).accounts.id,d=await ce(t,{parentId:l,name:U({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?gn.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},xn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,vesca:s}=n,c={objectId:a.incentivePools,include:{json:true}},i=await r({queryKey:g.rpc.getObject(c),queryFn:()=>o.getObject(c)});if(!i.object)throw k(t.logger,new P(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let l=A(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ce(t,{parentId:l,name:U({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var ct=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return Sn(this.context,e)}getBorrowIncentiveAccounts(e){return Cn(this.context,e)}getBindedVeScaKey(e){return wn(this.context,e)}getBindedObligation(e){return xn(this.context,e)}};var Tn="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var An=bcs.bcs.bool(),On=bcs.bcs.string();var wi=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,n=false,a=null,s=i=>i.name.type===Tn,c=[];do{let i={parentId:r.market,cursor:a,limit:50,include:{value:true}},{dynamicFields:l,hasNextPage:d,cursor:u}=await o({queryKey:g.rpc.getDynamicFields({...i,node:e.url}),queryFn:()=>e.client.listDynamicFields(i)}),p=l.filter(m=>s(m)?An.parse(m.valueType.bcs):false).map(m=>`0x${On.parse(m.name.bcs)}`);c.push(...p),a=u,n=d;}while(n);return c},Pn=async t=>wi(t),Rn=async t=>{let{metadata:{poolAddresses:e,whitelist:o}}=t;return Object.values(e).filter(r=>r!==void 0&&o.lending.has(r.coinName)&&r.isIsolated).map(r=>r.coinType)};var lt=class extends R{onchain;constructor(e){let{onchain:o,...r}=e;super(r),this.onchain=o;}get context(){return {...this.baseContext,onchain:this.onchain}}getIsolatedAssets({source:e}){return V({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>Rn(this.context),onchain:()=>Pn(this.context)})}};var vn=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var ki=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=`${n.veSca.object}::ve_sca::VeScaKey`,s=[],c=false,i=null;do{let l={owner:e,type:a,include:{json:true},cursor:i,limit:50},d=await r({queryKey:g.rpc.getOwnedObjects({...l,node:o.url}),queryFn:()=>o.client.listOwnedObjects(l)});s.push(...d.objects),d.hasNextPage&&d.cursor?(c=true,i=d.cursor):c=false;}while(c);return s},Ai=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,{id:n,config:a,treasury:s}=r.veSca,c=new suiKit.SuiTxBlock,i=async(S,w)=>{let O=await o({queryKey:g.rpc.getSharedObject({node:e.url,objectId:S}),queryFn:()=>e.getObject({objectId:S})});if(!O.object)throw k(t.logger,new P(`Failed to fetch object ${S}`,{context:{objectId:S}}));return Z({onchain:e,fetchWithCache:o},{tx:c,mutable:w,objectId:O.object})},[l,d]=await Promise.all([i(s,true),i(a,false)]),u=`${n}::treasury::refresh`,p=[d,l,c.txBlock.object.clock()],m=`${n}::treasury::total_ve_sca_amount`,f=[l,c.txBlock.object.clock()];c.moveCall(u,p),c.moveCall(m,f);let y=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:f,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:c.txBlock,include:{commandResults:true}})}))?.commandResults;if(!y)throw k(t.logger,new P("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=y[1]?.returnValues?.[0].bcs;if(!h)throw k(t.logger,new P("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},Re=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:U({type:"0x2::object::ID",value:e})},{dynamicField:s}=await n({queryKey:g.rpc.getDynamicFieldObject({...a,node:o.url}),queryFn:()=>o.client.getDynamicField(a)});if(!s?.value?.bcs)return;let c=s.value.bcs,i=vn.parse(c),l=Math.max(+i.unlock_at*1e3-Date.now(),0),d=String(i.locked_amount),u=bignumber_js.BigNumber(i.locked_amount).shiftedBy(-9).toNumber(),p=u*(Math.floor(l/1e3)/126144e3);return {id:s.fieldId,keyId:e,object:{objectId:s.fieldId,version:s.version,digest:s.digest},lockedScaAmount:d,lockedScaCoin:u,currentVeScaBalance:p,unlockAt:bignumber_js.BigNumber(Number(i.unlock_at)*1e3).toNumber()}},In=async(t,{address:e,excludeEmpty:o})=>{let r=await ki(t,e),n=(await Promise.all(r.map(a=>Re(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},jn=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={type:"0x2::object::ID",value:e},s=await n({queryKey:g.rpc.getDynamicFieldObject({parentId:o,name:a,node:r.url}),queryFn:async()=>{try{let{dynamicField:i}=await r.client.getDynamicField({parentId:o,name:U(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(It(i))return null;throw i}}});if(!s?.object)return false;let c=A(s.object);return Array.isArray(c?.contents)&&c.contents.length>0},Nn=async t=>{let{onchain:e,metadata:{addresses:o},fetchWithCache:r}=t,n={objectId:o.veSca.treasury,include:{json:true}},a=await r({queryKey:g.rpc.getObject({...n,node:e.url}),queryFn:()=>e.getObject(n)}),s=A(a.object),c=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await Ai(t)).shiftedBy(-9).toNumber(),l=c>0?i/c*4:0;return {totalLockedSca:c,totalVeSca:i,averageLockingPeriod:l,averageLockingPeriodUnit:"year"}};var ut=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return Re(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return In(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return Nn(this.context)}isVeScaKeyInSubsTable(e,o){return jn(this.context,{veScaKey:e,tableId:o})}};var Bn=zod.z.object({balance:zod.z.string(),enable_claim:zod.z.boolean(),id:zod.z.string(),user_rewards:zod.z.object({id:zod.z.string(),size:zod.z.string()})}).transform(t=>({isClaimEnabled:t.enable_claim,totalPoolReward:bignumber_js.BigNumber(t.balance).shiftedBy(-9).toNumber(),userRewardTableId:t.user_rewards.id}));var _n=bcs.bcs.u64();var vi=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});if(!a)throw k(t.logger,new P("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Ii=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={parentId:o,name:U({type:"0x2::object::ID",value:e})},{dynamicField:{value:s}}=await n({queryKey:g.rpc.getDynamicFieldObject({...a,node:r.url}),queryFn:()=>r.client.getDynamicField(a)});return bignumber_js.BigNumber(_n.parse(s.bcs)).shiftedBy(-9).toNumber()},Mn=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await vi(t,r),{data:a,success:s}=Bn.safeParse(n.json);return s?{pendingReward:e?await Ii(t,{veScaKey:e,tableId:a.userRewardTableId}).catch(()=>0):0,totalPoolReward:a.totalPoolReward,isClaimEnabled:a.isClaimEnabled}:{pendingReward:0,totalPoolReward:0,isClaimEnabled:false}};var pt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return Mn(this.context,e)}};var qt=t=>t.startsWith("0x")?t:`0x${t}`;var ji=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Ni=t=>bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(t)}),Fn=Ni(ji);var Bi=3,Dn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{addresses:a,parseCoinNameFromType:s}=n,c=50,i={[`${a.pyth.object}::rule::Rule`]:"pyth",[`${a.supra.object}::rule::Rule`]:"supra",[`${a.switchboard.object}::rule::Rule`]:"switchboard"},l=null,d=true,u={};do{let p={parentId:e,cursor:l,limit:c,include:{value:true}},{dynamicFields:m,cursor:f,hasNextPage:b}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});l=f,d=b,m.forEach(y=>{let h=qt(bcs.bcs.string().parse(y.name.bcs)),S=s(h),w=Fn.parse(y.value.bcs);u[S]||(u[S]=[]),w.contents.forEach(({name:O})=>{let _=i[qt(O)];_&&u[S].push(_);});});}while(d);return u},Ln=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([Dn(t,e.oracles.primaryPriceUpdatePolicyVecsetId),Dn(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},En=async t=>{let{addresses:e}=t.metadata,o=`${e.xOracleObject}::price_update_policy::PriceUpdatePolicyRulesKey`,r=bcs.bcs.struct("TypeName",{dummy_field:bcs.bcs.bool()}).serialize({dummy_field:false}).toBytes(),[n,a]=await Promise.all([ce(t,{parentId:e.oracles.primaryPriceUpdatePolicyObject,name:{type:o,bcs:r}}),ce(t,{parentId:e.oracles.secondaryPriceUpdatePolicyObject,name:{type:o,bcs:r}})]);return {primary:n,secondary:a}},Vn=async(t,e)=>{let{addresses:o,parseCoinType:r,getSwitchboardAggAddress:n}=t.metadata,a=o.oracles.switchboardRegistryTableId,s=[],c=e.map((i,l)=>{let d=n(i);return d||(s.push({idx:l,coinName:i}),null)});if(s.length===0)return c;if(s.length>Bi){let i=new Map;for(let d of s){let u=r(d.coinName);if(!u)throw k(t.logger,new T(`Invalid coin name: ${d.coinName}`,{context:{coinName:d.coinName}}));i.set(u.slice(2),d);}let l=await Mi(t,a,i);for(let[d,{idx:u}]of i){let p=l[d];if(!p)throw k(t.logger,new P(`No on-demand aggregator found for 0x${d}`,{context:{coinTypeKey:d}}));c[u]=p;}return c}return await Promise.all(s.map(async({idx:i,coinName:l})=>{let d=r(l);if(!d)throw k(t.logger,new T(`Invalid coin name: ${l}`,{context:{coinName:l}}));let u=await ce(t,{parentId:a,name:U({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw k(t.logger,new P(`No on-demand aggregator found for ${d}`,{context:{coinType:d}}));c[i]=bcs.bcs.Address.parse(u.dynamicField.value.bcs);})),c},_i=t=>{try{return bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(t.name.bcs).name}catch{try{return bcs.bcs.string().parse(t.name.bcs)}catch{return}}},Mi=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,c=false;do{let i={parentId:e,cursor:s,limit:50,include:{value:true}},l=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});for(let d of l.dynamicFields){let u=_i(d);if(!u||!o.has(u))continue;let p=d.value?.bcs;p&&(a[u]=bcs.bcs.Address.parse(p));}s=l.cursor,c=l.hasNextPage&&Object.keys(a).length<o.size;}while(c);return a};var bt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getAssetOracles(){return Ln(this.context)}getPriceUpdatePolicies(){return En(this.context)}getOnDemandAggObjectIds(e){return Vn(this.context,e)}};var Kn=t=>({stakeType:utils.normalizeStructTag(t.stakeType),maxPoint:Number(t.maxDistributedPoint),distributedPoint:Number(t.distributedPoint),pointPerPeriod:Number(t.distributedPointPerPeriod),period:Number(t.pointDistributionTime),maxStake:Number(t.maxStake),staked:Number(t.stakes),index:Number(t.index),createdAt:Number(t.createdAt),lastUpdate:Number(t.lastUpdate)}),qn=(t={})=>{let{spool:e,spoolReward:o}=t;if(!e||!o)throw new T("spool or spoolReward is undefined");let r=A(e),n=A(o);return {stakeType:r.stake_type,maxDistributedPoint:r.max_distributed_point,distributedPoint:r.distributed_point,distributedPointPerPeriod:r.distributed_point_per_period,pointDistributionTime:r.point_distribution_time,maxStake:r.max_stakes,stakes:r.stakes,index:r.index,createdAt:r.created_at,lastUpdate:r.last_update,...n}},Wn=(t,e,o)=>{let n=bignumber_js.BigNumber(t.pointPerPeriod).dividedBy(t.period),a=bignumber_js.BigNumber(t.pointPerPeriod).dividedBy(t.period),s=a.gt(0)?bignumber_js.BigNumber(t.maxPoint).minus(t.distributedPoint).dividedBy(a):bignumber_js.BigNumber(0),c=t.createdAt,i=s.plus(t.lastUpdate).integerValue().toNumber(),l=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),d=bignumber_js.BigNumber(t.maxPoint).minus(t.distributedPoint),u=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(l).multipliedBy(t.pointPerPeriod),d),p=bignumber_js.BigNumber(t.index).plus(u.dividedBy(t.staked).isFinite()?bignumber_js.BigNumber(1e9).multipliedBy(u).dividedBy(t.staked):0),m=bignumber_js.BigNumber(t.distributedPoint).plus(u),f=bignumber_js.BigNumber(t.staked),b=f.shiftedBy(-o),y=b.multipliedBy(e);return {distributedPointPerSec:n.toNumber(),accumulatedPoints:u.toNumber(),currentPointIndex:p.toNumber(),currentTotalDistributedPoint:m.toNumber(),startDate:new Date(c*1e3),endDate:new Date(i*1e3),stakedAmount:f.toNumber(),stakedCoin:b.toNumber(),stakedValue:y.toNumber()}},Un=t=>({claimedRewards:Number(t.claimed_rewards),exchangeRateDenominator:Number(t.exchange_rate_denominator),exchangeRateNumerator:Number(t.exchange_rate_numerator),rewards:Number(t.rewards),spoolId:String(t.spool_id)}),Qn=(t,e,o,r,n)=>{let a=bignumber_js.BigNumber(o.distributedPointPerSec).multipliedBy(e.exchangeRateNumerator).dividedBy(e.exchangeRateDenominator),s=bignumber_js.BigNumber(t.maxPoint).multipliedBy(e.exchangeRateNumerator).dividedBy(e.exchangeRateDenominator),c=s.shiftedBy(-n),i=c.multipliedBy(r),l=bignumber_js.BigNumber(e.rewards),d=l.shiftedBy(-n),u=d.multipliedBy(r),p=bignumber_js.BigNumber(e.claimedRewards),m=p.shiftedBy(-n),f=m.multipliedBy(r),b=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),y=b.dividedBy(o.stakedValue).isFinite()?b.dividedBy(o.stakedValue).toNumber():1/0;return (t.maxPoint<=t.distributedPoint||t.pointPerPeriod===0)&&(y=1/0),{rewardApr:y,totalRewardAmount:s.toNumber(),totalRewardCoin:c.toNumber(),totalRewardValue:i.toNumber(),remaindRewardAmount:l.toNumber(),remaindRewardCoin:d.toNumber(),remaindRewardValue:u.toNumber(),claimedRewardAmount:p.toNumber(),claimedRewardCoin:m.toNumber(),claimedRewardValue:f.toNumber(),rewardPerSec:a.toNumber()}},$n=t=>({...t,stakeType:Li(t.stakeType)}),Li=t=>{try{return X(t)}catch(e){throw new T("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Wt=async(t,{coinPrices:e,stakeCoinNames:o}={})=>{let{indexer:r,fetchWithCache:n,metadata:a}=t;e??={};let{spools:s}=await n({queryKey:g.api.getSpools(),queryFn:()=>r.get("/api/spools/migrate")}),c=o?new Set(o):a.whitelist.spool,i=a.getSpoolRewardCoinName();return s.reduce((l,d)=>{if(!c.has(d.marketCoinName))return l;let u=a.parseCoinName(d.marketCoinName);return l[d.marketCoinName]={...d,coinPrice:e[u]??d.coinPrice,marketCoinPrice:e[d.marketCoinName]??d.marketCoinPrice,rewardCoinPrice:e[i]??d.rewardCoinPrice},l},{})},Gn=async(t,{coinPrices:e,stakeCoinName:o})=>(await Wt(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,zn=async(t,{coinPrices:e={},stakeCoinNames:o}={})=>{let{metadata:r}=t,n=o??[...r.whitelist.spool.values()],a=n.map(i=>r.parseCoinName(i)),s=await Hn(t,a);return (await Promise.allSettled(n.map((i,l)=>Ut(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[l]]})))).reduce((i,l,d)=>(l.status==="fulfilled"&&l.value&&(i[n[d]]=l.value),i),{})},Ut=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),c=$n(qn(r??(await Hn(t,[a]))[a])),i=Kn(c),l=e[o]??0,d=Wn(i,l,n.getCoinDecimal(o)),u=Un(c),p=e[s]??0;return {marketCoinName:o,symbol:n.parseSymbol(o),coinType:n.parseCoinType(a),marketCoinType:n.parseMarketCoinType(a),rewardCoinType:n.isMarketCoin(s)?n.parseMarketCoinType(s):n.parseCoinType(s),sCoinType:n.parseSCoinType(o)??"",coinDecimal:n.getCoinDecimal(a),rewardCoinDecimal:n.getCoinDecimal(s),coinPrice:e[a]??0,marketCoinPrice:l,rewardCoinPrice:p,maxPoint:i.maxPoint,distributedPoint:i.distributedPoint,maxStake:i.maxStake,...d,exchangeRateNumerator:u.exchangeRateNumerator,exchangeRateDenominator:u.exchangeRateDenominator,...Qn(i,u,d,p,n.getCoinDecimal(s))}},Yn=async(t,{address:e,stakeCoinNames:o})=>{let{metadata:r}=t,n=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount`,a=await Ei(t,{address:e,stakeAccountType:n}),s=(o??[...r.whitelist.spool.values()]).reduce((l,d)=>(l[d]=[],l),{}),c=Object.keys(s).reduce((l,d)=>{let u=r.parseCoinName(d),p=r.parseMarketCoinType(u);return l[d]=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount<${p}>`,l},{}),i=Object.entries(c).reduce((l,[d,u])=>(l[u]=d,l),{});for(let l of a){let{objectId:d,type:u,json:p}=l;if(!d||!u||!p)continue;let m=A(l),f=utils.normalizeStructTag(u),b=i[f],y=s[b];y&&y.push({id:d,type:f,stakePoolId:String(m.spool_id),stakeType:utils.normalizeStructTag(String(m.stake_type)),staked:Number(m.stakes),index:Number(m.index),points:Number(m.points),totalPoints:Number(m.total_points)});}return s},Qt=async(t,{stakeCoinNames:e})=>(await Promise.allSettled(e.map(r=>Vi(t,{stakeCoinName:r})))).reduce((r,n,a)=>(n.status==="fulfilled"&&(r[e[a]]=n.value),r),{}),Ei=async(t,{address:e,stakeAccountType:o})=>{let{onchain:r,fetchWithCache:n}=t,a=false,s=null,c=[];do{let i={owner:e,type:o,include:{json:true},cursor:s,limit:50},l=await n({queryKey:g.rpc.getOwnedObjects(i),queryFn:()=>r.client.listOwnedObjects(i)});l.objects&&c.push(...l.objects),l.hasNextPage&&l.cursor?(a=true,s=l.cursor):a=false;}while(a);return c},Hn=async({onchain:t,metadata:e,fetchWithCache:o},r)=>{let n=["spool","spoolReward","sCoinTreasury"],a=r.flatMap(l=>{let d=e.poolAddresses[l];return n.flatMap(u=>{let p=d?.[u];return p?[p]:[]})}),s=[],c=be([...new Set(a)],50);for(let l of c){let d=await o({queryKey:g.rpc.getObjects({objectIds:l,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:l,include:{json:true}})});s.push(...d.objects.filter(u=>!(u instanceof Error)));}let i=s.reduce((l,d)=>(l[d.objectId]=d,l),{});return r.reduce((l,d)=>{let u=e.poolAddresses[d];return l[d]={spool:i[u?.spool??""],spoolReward:i[u?.spoolReward??""]},l},{})},Vi=async(t,{stakeCoinName:e})=>{let{metadata:o,onchain:r,fetchWithCache:n}=t,a=o.addresses.spools[e]?.rewardPoolId;if(!a)return;let s={json:true},i=(await n({queryKey:g.rpc.getObject({objectId:a,node:r.url,include:s}),queryFn:()=>r.getObject({objectId:a,include:s})})).object;if(!i?.json)return;let l=A(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),stakePoolId:String(l.spool_id),ratioNumerator:Number(l.exchange_rate_numerator),ratioDenominator:Number(l.exchange_rate_denominator),rewards:Number(l.rewards),claimedRewards:Number(l.claimed_rewards)}},Xn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,a=n.addresses.spools[e]?.id;if(!a)return;let s={json:true},i=(await r({queryKey:g.rpc.getObject({objectId:a,node:o.url,include:s}),queryFn:()=>o.getObject({objectId:a,include:s})})).object;if(!i?.json)return;let l=A(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),maxPoint:Number(l.max_distributed_point),distributedPoint:Number(l.distributed_point),pointPerPeriod:Number(l.distributed_point_per_period),period:Number(l.point_distribution_time),maxStake:Number(l.max_stakes),stakeType:utils.normalizeStructTag(String(l.stake_type)),totalStaked:Number(l.stakes),index:Number(l.index),createdAt:Number(l.created_at),lastUpdate:Number(l.last_update)}};var yt=class extends R{indexer;onchain;constructor({indexer:e,onchain:o,...r}){super(r),this.indexer=e,this.onchain=o;}get context(){return {...this.baseContext,indexer:this.indexer,onchain:this.onchain}}getSpools({stakeCoinNames:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Wt(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>zn(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>Gn(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>Ut(this.context,{stakeCoinName:e,coinPrices:o})})}getStakeAccounts(e){return Yn(this.context,e)}async getStakeAccountsByPool(e,o){return (await this.getStakeAccounts({address:e,stakeCoinNames:[o]}))[o]||[]}getSpoolRewardPools(e){return Qt(this.context,{stakeCoinNames:e})}getSpoolRewardPool(e){return Qt(this.context,{stakeCoinNames:[e]}).then(o=>o[e])}getStakePool(e){return Xn(this.context,e)}};var Jn=zod.z.object({reserve_ve_sca_key:zod.z.nullable(zod.z.object({id:zod.z.string()})),enable_claim:zod.z.boolean()}).transform(t=>({reserveVeScaKey:t.reserve_ve_sca_key?.id,isClaimEnabled:t.enable_claim}));var Zn=bcs.bcs.u64();var Wi=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,{veScaRewardTableId:a}=r.veScaLoyaltyProgram,s={parentId:a,name:U({type:"0x2::object::ID",value:e})},{dynamicField:{value:c}}=await n({queryKey:g.rpc.getDynamicFieldObject({...s,node:o.url}),queryFn:()=>o.client.getDynamicField(s)});return bignumber_js.BigNumber(Zn.parse(c.bcs)).shiftedBy(-9).toNumber()},Ui=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});if(!a)throw k(t.logger,new P("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},ea=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await Ui(t,r),{data:a,success:s}=Jn.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let c=await Re(t,a.reserveVeScaKey),i=e?await Wi(t,e).catch(()=>0):0,l=Math.max((c?.unlockAt??0)-Date.now(),0);return {pendingScaReward:i,pendingVeScaReward:i*(Math.floor(l/1e3)/126144e3),totalPoolReward:c?.currentVeScaBalance??0,isClaimEnabled:a.isClaimEnabled}};var ft=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return ea(this.context,e)}};var ta=bcs.bcs.Address;var oa=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:U({type:"address",value:e})},n=await ce(t,r);return n?ta.parse(n.dynamicField.value.bcs):null};var gt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return oa(this.context,e)}};var se=zod.z.object({id:zod.z.string(),keys:zod.z.nullable(zod.z.object({contents:zod.z.array(zod.z.string())})),table:zod.z.object({id:zod.z.string(),size:zod.z.string()}),with_keys:zod.z.boolean()}),ra=zod.z.object({id:zod.z.string(),size:zod.z.string()}),na=zod.z.object({asset_active_states:zod.z.object({base:se,collateral:se}),borrow_dynamics:se,collateral_stats:se,id:zod.z.string(),interest_models:se,limiters:se,reward_factors:se,risk_models:se,vault:zod.z.object({balance_sheets:se,flash_loan_fees:se,id:zod.z.string(),market_coin_supplies:ra,underlying_balances:ra})});var xe="0x1::type_name::TypeName",aa="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",sa="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",ia="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",ca="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var la=async(t,{poolNames:e=[]})=>{let o=new Set(e),{fetchWithCache:r,api:n}=t,a=await r({queryKey:g.api.getPoolAddresses(),queryFn:()=>n.get("/pool/addresses")});return o.size===0?a:Object.entries(a).reduce((s,[c,i])=>(o.has(c)&&(s[c]=i),s),{})},$i=t=>{try{return t.name.type.includes("::type_name::TypeName")?bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(t.name.bcs).name:bcs.bcs.string().parse(t.name.bcs)}catch{return}},le=async(t,{parentId:e,type:o,coinTypeKeys:r})=>{let{onchain:n,fetchWithCache:a}=t,s={},c=null,i=false;do{let l={parentId:e,cursor:c,limit:50},d=await a({queryKey:g.rpc.getDynamicFields({...l,node:n.url}),queryFn:()=>n.client.listDynamicFields(l)});for(let u of d.dynamicFields){if(u.name.type!==o)continue;let p=$i(u);p&&r.has(p)&&(s[p]=u.fieldId);}c=d.cursor,i=d.hasNextPage;}while(i);return s},Gi=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n=[...new Set(Object.values(e).flatMap(s=>Object.values(s)))],a={};for(let s of be(n,50)){let{objects:c}=await r({queryKey:g.rpc.getObjects({objectIds:s,node:o.url}),queryFn:()=>o.client.getObjects({objectIds:s,include:{json:true}})});for(let i of c)i instanceof Error||(a[i.objectId]=i);}return Object.entries(e).reduce((s,[c,i])=>(s[c]=Object.entries(i).reduce((l,[d,u])=>{let p=a[u];return l[d]=p?{objectId:p.objectId,json:p.json}:void 0,l},{}),s),{})},zi=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,c=false;do{let i={parentId:o,limit:50,cursor:s},l=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});if(!l)break;for(let d of l.dynamicFields){let p=`0x${bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(d.name.bcs).name}`;e.has(p)&&(a[p]=d.fieldId);}s=l.cursor,c=l.hasNextPage;}while(c);return a},da=async(t,{poolNames:e=[]})=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{core:a,spool:s,scoin:c}=n,{market:i,coins:l}=a,d={objectId:i,include:{json:true}},{object:u}=await r({queryKey:g.rpc.getObject({...d,node:o.url}),queryFn:()=>o.getObject(d)}),p=na.safeParse(u?.json);if(!p.success)throw k(t.logger,new T("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let m=p.data,f=m.vault.balance_sheets.table.id,b=m.collateral_stats.table.id,y=m.borrow_dynamics.table.id,h=m.interest_models.table.id,S=m.risk_models.table.id,w=m.vault.flash_loan_fees.table.id,O=new Set(e),_=Object.entries(l).filter(W=>{let[Y,ge]=W;return ge?.coinType?O.size===0||O.has(Y):false});if(_.length===0)throw k(t.logger,new P("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let j=await zi(t,new Set(_.map(([,W])=>W.coinType)),w),v=new Set(_.map(([,W])=>W.coinType.slice(2))),[x,B,N,F,q,$,de,te,ie]=await Promise.all([le(t,{parentId:f,type:xe,coinTypeKeys:v}),le(t,{parentId:b,type:xe,coinTypeKeys:v}),le(t,{parentId:y,type:xe,coinTypeKeys:v}),le(t,{parentId:h,type:xe,coinTypeKeys:v}),le(t,{parentId:S,type:xe,coinTypeKeys:v}),le(t,{parentId:i,type:aa,coinTypeKeys:v}),le(t,{parentId:i,type:sa,coinTypeKeys:v}),le(t,{parentId:i,type:ia,coinTypeKeys:v}),le(t,{parentId:i,type:ca,coinTypeKeys:v})]),L=await Gi(t,{lendingPool:x,collateralPool:B,borrowDynamic:N,interestModel:F,riskModel:q,borrowFee:$,supplyLimit:de,borrowLimit:te,isolatedAsset:ie}),we={};for(let[W,Y]of _){let{coinType:ge}=Y,oe=ge.slice(2),kt=L.lendingPool[oe],La=L.collateralPool[oe],Ea=L.borrowDynamic[oe],Va=L.interestModel[oe],Ka=L.riskModel[oe],qa=L.borrowFee[oe],Wa=L.supplyLimit[oe],Ua=L.borrowLimit[oe],to=L.isolatedAsset[oe]?.json,Me=`s${W}`,oo=s.pools[Me],Fe=c.coins[Me],ro=Y.oracle?.pyth;we[W]={coinName:W,symbol:Y.symbol,coinType:ge,coinMetadataId:Y.metaData,decimals:Y.decimals,lendingPoolAddress:kt?.objectId??"",collateralPoolAddress:La?.objectId??"",borrowDynamic:Ea?.objectId??"",interestModel:Va?.objectId??"",riskModel:Ka?.objectId,borrowFeeKey:qa?.objectId??"",supplyLimitKey:Wa?.objectId??"",borrowLimitKey:Ua?.objectId??"",isolatedAssetKey:to?.id??"",isIsolated:to?.value??false,spool:oo?.id??"",spoolReward:oo?.rewardPoolId??"",spoolName:Me,sCoinName:Me,sCoinType:Fe?.coinType??"",sCoinTreasury:Fe?.treasury??"",sCoinMetadataId:Fe?.metaData??"",sCoinSymbol:Fe?.symbol??"",pythFeed:ro?.feed??"",pythFeedObjectId:ro?.feedObject??"",flashloanFeeObject:j[ge]??""};}return we};var ht=class extends R{api;onchain;constructor({api:e,onchain:o,...r}){super(r),this.api=e,this.onchain=o;}get context(){return {...this.baseContext,api:this.api,onchain:this.onchain}}getPoolAddresses({poolNames:e,source:o="api"}){return V({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>la(this.context,{poolNames:e}),onchain:()=>da(this.context,{poolNames:e})})}};var ua="https://hermes.pyth.network";var pa=zod.z.object({id:zod.z.string(),price_info:zod.z.object({arrival_time:zod.z.string(),attestation_time:zod.z.string(),price_feed:zod.z.object({ema_price:zod.z.object({conf:zod.z.string(),expo:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),price:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),timestamp:zod.z.string()}),price:zod.z.object({conf:zod.z.string(),expo:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),price:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),timestamp:zod.z.string()}),price_identifier:zod.z.object({bytes:zod.z.string()})})})});var ba=({price:t,expo:e})=>{let o=e.negative?-1:1,r=t.negative?-1:1;return bignumber_js.BigNumber(t.magnitude).multipliedBy(bignumber_js.BigNumber(10).shiftedBy(o*+e.magnitude)).multipliedBy(r)};var ya=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a}}=t,s=new Map(e.map(d=>[d,r.coins[d]?.oracle?.pyth?.feed])),c=Array.from(new Set(s.values())).filter(d=>!!d),l=await new pythSuiJs.SuiPriceServiceConnection(n,a).getLatestPriceFeeds(c);if(!l)throw k(t.logger,new Ee("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:c}}));return await o({queryKey:g.oracle.getPythLatestPriceFeeds(n,c),queryFn:()=>{let d=new Map;for(let p of l)d.set(p.id,p.getPriceUnchecked().getPriceAsNumberUnchecked());let u={};for(let[p,m]of s)u[p]=(m!==void 0?d.get(m):void 0)??0;return u}})},fa=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});return a??null},ga=async(t,e)=>{if(e.length===0)return [];let{onchain:o,fetchWithCache:r}=t,n={objectIds:e,include:{json:true}},{objects:a}=await r({queryKey:g.rpc.getObjects({...n,node:o.url}),queryFn:()=>o.client.getObjects(n)});return a.filter(s=>!(s instanceof Error))},ha=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=new Map(e.map(l=>[l,n.coins[l]?.oracle?.pyth?.feedObject])),s=Array.from(new Set(a.values())).filter(l=>!!l),c=new Map;for(let l of be(s,50)){let d={objectIds:l,include:{json:true}},{objects:u}=await r({queryKey:g.rpc.getObjects({...d,node:o.url}),queryFn:()=>o.client.getObjects(d)});for(let p of u){if(p instanceof Error)throw k(t.logger,new P("Failed to fetch price feed object on chain",{cause:p}));let{data:m,success:f}=pa.safeParse(p.json);if(!f)throw k(t.logger,new T("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:b}=m.price_info;c.set(p.objectId,ba(b.price).toNumber());}}let i={};for(let[l,d]of a)i[l]=(d!==void 0?c.get(d):void 0)??0;return i},Sa=async(t,{coinNames:e})=>{let{indexer:o,fetchWithCache:r}=t,n="/api/market/migrate";return (await r({queryKey:g.api.getMarkets(),queryFn:()=>o.get(n)})).pools.reduce((s,c)=>(e.includes(c.coinName)&&(s[c.coinName]=c.coinPrice),s),{})};var St=class extends R{config;indexer;onchain;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,...n}){super(n),this.config=e??{endpoint:ua,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return V({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>ya(this.context,e),onchain:()=>ha(this.context,e)})}getPythFeedObject(e){return fa(this.context,e)}getPythFeedObjects(e){return ga(this.context,e)}getPricesFromIndexer(e){return Sa(this.context,e)}};var Ca=t=>{let{utils:e,indexerUrl:o,queryClientConfig:r=We}=t,n=e.onchain,a=dr(o),s=t.queryClient??new queryCore.QueryClient(r),c=e.logger,i={onchain:n,queryClient:s,logger:c},l,d,u,p,m,f,b,y,h,S,w,O,_,j;return {get market(){return l??=new nt({...i,indexer:a,addresses:br(e),metadata:mr(e)})},get coinBalance(){return d??=new at({...i,metadata:yr(e)})},get flashloan(){return u??=new st({...i,metadata:fr(e)})},get obligation(){return p??=new it({...i,metadata:gr(e)})},get borrowIncentive(){return m??=new ct({...i,metadata:hr(e)})},get isolatedAssets(){return f??=new lt({...i,metadata:xr(e)})},get veSca(){return b??=new ut({...i,metadata:Tr(e)})},get loyaltyProgram(){return y??=new pt({...i,metadata:kr(e)})},get xOracle(){return h??=new bt({...i,metadata:Pr(e)})},get spool(){return S??=new yt({...i,indexer:a,metadata:Or(e)})},get veScaLoyaltyProgram(){return w??=new ft({...i,metadata:Ar(e)})},get referral(){return O??=new gt({...i,metadata:Sr(e)})},get price(){return _??=new St({...i,indexer:a,metadata:Cr(e)})},get poolAddresses(){return j??=new ht({...i,api:ur(),metadata:wr(e)})}}};var wa=(t={})=>t.source?t.source:t.useOnChainQuery!==void 0?t.useOnChainQuery?"onchain":"api-first":t.indexer!==void 0?t.indexer?"api-first":"onchain":"api-first",Xi={rpc:"onchain",indexer:"api","indexer-first":"api-first"},fe=t=>t?.source?Xi[t.source]:t?.indexer?"api-first":"onchain";var xa=t=>{let e=new Date(t*1e3),o=new Date(t*1e3);o.setUTCHours(0,0,0,0),e.getUTCHours()>=0&&o.setUTCDate(o.getUTCDate()+1);let r=new Date().getTime();return o.getTime()-r>126144e3*1e3&&o.setUTCDate(o.getUTCDate()-1),Math.floor(o.getTime()/1e3)};var Ta=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var Ct=class extends R{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return Ta(this.context,e)}};var $t=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=Ke,timeout:r,client:n,network:a="mainnet",logger:s=pe,forceAddressesInterface:c}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new Ct({api:new ue({url:o,timeout:r,client:n})}),c&&this.initializeForcedAddresses(c);}initializeForcedAddresses(e){let o=["localnet","devnet","testnet","mainnet"];Object.entries(e).forEach(([r,n])=>{if(!n){this.logger.warn(`No addresses provided for network: ${r}. Skipping initialization for this network.`);return}if(o.includes(r)){let a=r;this.addressMap.set(a,n),a===this.network&&(this.currentAddresses=n);}});}async read(e=this.addressId){let o=await this.addressApiRepo.read(e),r=n=>["localnet","devnet","testnet","mainnet"].includes(n);for(let[n,a]of Object.entries(o))r(n)&&typeof a=="object"&&(n===this.network&&(this.currentAddresses=a),this.addressMap.set(n,a));return this.addressId!==o.id&&this.logger.warn(`The addressId provided (${this.addressId}) does not match the id returned from the API (${o.id}).`),this.getAllAddresses()}get(e){if(this.currentAddresses)return e.split(".").reduce((r,n)=>typeof r=="object"?r[n]:r,this.currentAddresses)||void 0}set(e,o){if(this.currentAddresses){let r=e.split(".");r.reduce((n,a,s)=>{if(s===r.length-1)n[a]=o;else return n[a]},this.currentAddresses);}return this.currentAddresses}switchCurrentAddresses(e){return this.addressMap.has(e)&&(this.currentAddresses=this.addressMap.get(e),this.network=e),this.currentAddresses}getAddresses(e){return e?this.addressMap.get(e):this.currentAddresses??this.addressMap.get(this.network)}getAllAddresses(){return Object.fromEntries(this.addressMap)}},ka=$t;var wt=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([b,y])=>!!y).map(([b,y])=>[b,y.decimals]),...Object.entries(t).filter(([b,y])=>!!y?.sCoinName).map(([b,y])=>[y.sCoinName,y.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([b,y])=>!!y).map(([b,y])=>[b,y?.coinType]),...Object.entries(t).filter(([b,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([b,y])=>[y.sCoinName,y.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([b,y])=>[y,b])),s=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y&&e.wormhole.has(b)).map(([b,y])=>[y.coinType,y.coinName])),c=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y).map(([b,y])=>[y.coinName,o(y.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([b,y])=>[suiKit.parseStructTag(y.sCoinType).name,y.sCoinName])),l=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([b,y])=>[y.sCoinType,y.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y&&e.suiBridge.has(y.coinName)).map(([b,y])=>[y.coinType,y.coinName])),m=Object.fromEntries(Object.entries(t).filter(([b,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([b,y])=>[y.sCoinName,y.sCoinType])),f=new Set([...Object.values(t).filter(b=>!!b).map(b=>b.sCoinName?[b.coinName,b.sCoinName]:[b.coinName]).flat()]);return {coinDecimals:Object.freeze(r),coinTypes:Object.freeze(n),coinTypeToCoinNameMap:Object.freeze(a),coinNameToOldMarketCoinTypeMap:Object.freeze(c),wormholeCoinTypeToCoinNameMap:Object.freeze(s),voloCoinTypeToCoinNameMap:Object.freeze(u),suiBridgeCoinTypeToCoinNameMap:Object.freeze(p),scoinRawNameToSCoinNameMap:Object.freeze(i),scoinTypeToSCoinNameMap:Object.freeze(l),sCoinTypes:Object.freeze(m),supportedBorrowIncentiveRewards:f}};var Aa={lending:new Set,borrowing:new Set,collateral:new Set,packages:new Set,scoin:new Set,spool:new Set,borrowIncentiveRewards:new Set,rewardsAsPoint:new Set,suiBridge:new Set,wormhole:new Set,layerZero:new Set,oracles:new Set,pythEndpoints:new Set,deprecated:new Set,emerging:new Set};var Ne=()=>Object.fromEntries(Object.entries(Aa).map(([t,e])=>[t,new Set(e)])),Zi=t=>{let e=new Set(t),o=()=>{throw new TypeError("Cannot mutate readonly ScallopConstants whitelist")};return Object.defineProperties(e,{add:{value:o},clear:{value:o},delete:{value:o}}),Object.freeze(e)},Be=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,Zi(o)]))),_e=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),xt=t=>{let e=Ne();for(let[o,r]of Object.entries(t))r&&(Array.isArray(r)?e[o]=new Set(r):r instanceof Set&&(e[o]=new Set(r)));return Be(e)},Gt=t=>Object.keys(t).length===0;var Oa=({address:t,logger:e,defaultValues:o})=>({async ensureAddresses({network:r,force:n,addressId:a}){let s=t.getAddresses(r);(!s||Object.keys(s).length===0||n)&&await t.read(a);},getAddresses(r){return t.getAddresses(r)},async fetchWhitelist(){let{api:r,fetchWithCache:n}=t.addressApiRepo.context,a=await(async()=>{try{return await n({queryKey:g.api.getWhiteList(),queryFn:()=>r.get("/pool/whitelist")})}catch(s){return e.warn("whitelist fetch failed; using default values",{message:s?.message}),o?.whitelist??Ne()}})();return xt(a)},async fetchPoolAddresses(){let{api:r,fetchWithCache:n}=t.addressApiRepo.context;return await(async()=>{try{return await n({queryKey:g.api.getPoolAddresses(),queryFn:()=>r.get("/pool/addresses")})}catch(s){return e.warn("poolAddresses fetch failed; using default values",{message:s?.message}),o?.poolAddresses??{}}})()}});var zt=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],ec=(t,e)=>Object.fromEntries(Object.entries(t).filter(([o])=>Object.values(e).some(r=>r.has(o))).filter(o=>o[1]!==void 0).map(([o,r])=>{let n=Object.fromEntries(Object.entries(r).map(([a,s])=>[a,typeof s=="boolean"?s??false:s||void 0]));return [o,n]})),tc=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&zt.every(s=>o[s].size>0)},Pa=async({source:t,network:e,force:o,addressId:r,overrides:n={},current:a,parseToOldMarketCoin:s})=>{await t.ensureAddresses({network:e,force:o,addressId:r});let c=a.whitelist,i=a.poolAddresses;n.forcePoolAddressInterface&&(i=_e(n.forcePoolAddressInterface)),n.forceWhitelistInterface&&(c=xt(n.forceWhitelistInterface));let l=()=>wt({poolAddresses:i,whitelist:c,parseToOldMarketCoin:s});if(tc(t,e,c,i)&&!o)return {whitelist:c,poolAddresses:i,derived:l()};let[d,u]=await Promise.all([t.fetchWhitelist(),t.fetchPoolAddresses()]);return n.forceWhitelistInterface||(c=Be(d)),n.forcePoolAddressInterface||(i=_e(ec(u,c))),{whitelist:c,poolAddresses:i,derived:l()}};var Ra=t=>({getAddresses:()=>t.getAddresses()});var va=t=>({getPoolAddresses:()=>t.poolAddresses});var Ia=t=>({getWhitelist:()=>t.whitelist});var oc=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],rc=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],nc=(t,e)=>{let r=(e?.requiredPaths??oc).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=rc.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},ja=(t,e)=>{let o=nc(t,e);if(!o.valid)throw new re("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var ac=(t,e)=>{let o=e.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},t);return typeof o=="string"&&o!==""?o:void 0},sc=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],ic=t=>{let e=t;return sc.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},Na=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:ic(t.whitelistSource.getWhitelist()),get:n=>ac(o,n)};return ja(r,{requiredPaths:e.requiredPaths}),r};var cc=()=>{let t=Be(Ne()),e=_e({});return {whitelist:t,poolAddresses:e,derived:wt({poolAddresses:e,whitelist:t,parseToOldMarketCoin:()=>""})}},Yt=class{address;logger;params;source;_state=cc();get coinDecimals(){return this._state.derived.coinDecimals}get coinNameToOldMarketCoinTypeMap(){return this._state.derived.coinNameToOldMarketCoinTypeMap}get scoinRawNameToSCoinNameMap(){return this._state.derived.scoinRawNameToSCoinNameMap}get scoinTypeToSCoinNameMap(){return this._state.derived.scoinTypeToSCoinNameMap}get wormholeCoinTypeToCoinNameMap(){return this._state.derived.wormholeCoinTypeToCoinNameMap}get voloCoinTypeToCoinNameMap(){return this._state.derived.voloCoinTypeToCoinNameMap}get suiBridgeCoinTypeToCoinNameMap(){return this._state.derived.suiBridgeCoinTypeToCoinNameMap}get coinTypes(){return this._state.derived.coinTypes}get sCoinTypes(){return this._state.derived.sCoinTypes}get coinTypeToCoinNameMap(){return this._state.derived.coinTypeToCoinNameMap}get supportedBorrowIncentiveRewards(){return this._state.derived.supportedBorrowIncentiveRewards}constructor(e){let{logger:o=pe,scallopAddress:r,defaultValues:n,forcePoolAddressInterface:a,forceWhitelistInterface:s,strictInit:c,urls:i,...l}=e;this.address=r??new ka({...l,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??Oa({address:this.address,logger:this.logger,defaultValues:n});}get url(){return this.address.url}get protocolObjectId(){return this.address.get("core.object")??"0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf"}get isInitialized(){return this.isInitializedFor("mainnet")}get whitelist(){return this._state.whitelist}get poolAddresses(){return this._state.poolAddresses}get(e){return this.address.get(e)}set(e,o){return this.address.set(e,o)}getAddresses(e){return this.address.getAddresses(e)}getAllAddresses(){return this.address.getAllAddresses()}switchCurrentAddresses(e){return this.address.switchCurrentAddresses(e)}isAddressInitialized({network:e="mainnet"}={}){let o=this.address.getAddresses(e);return !!o&&!Gt(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!Gt(this._state.poolAddresses)&&zt.every(o=>this._state.whitelist[o].size>0)}async init({network:e="mainnet",force:o=false,addressId:r,constantsParams:n=this.params}={}){this._state=await Pa({source:this.source,network:e,force:o,addressId:r,overrides:{forcePoolAddressInterface:n.forcePoolAddressInterface,forceWhitelistInterface:n.forceWhitelistInterface},current:{whitelist:this._state.whitelist,poolAddresses:this._state.poolAddresses},parseToOldMarketCoin:a=>this.parseToOldMarketCoin(a)}),this.maybeAssertStrictInit();}maybeAssertStrictInit(){this.params.strictInit&&Na({addressSource:Ra(this),poolAddressSource:va(this),whitelistSource:Ia(this)},{});}},Ba=Yt;var _a=10,Xt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new Ba(e),e.client){let{client:o,fullnodeUrl:r,tokensPerSecond:n=_a}=e;this.onchain=jt(o,r,{tokensPerSecond:n});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=_a}=e,a=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=jt(a,r,{tokensPerSecond:n});}this.walletAddress=e.walletAddress,this.logger=e.logger??pe;}get address(){return this.constants.address}isSuiBridgeAsset(e){return this.constants.whitelist.suiBridge.has(e)}isWormholeAsset(e){return this.constants.whitelist.wormhole.has(e)}isLayerZeroAsset(e){return this.constants.whitelist.layerZero.has(e)}isMarketCoin(e){let o=e.slice(1).toLowerCase();return e.charAt(0).toLowerCase()==="s"&&this.constants.whitelist.lending.has(o)}async init({force:e=false}={}){await this.constants.init({force:e});}parseCoinName(e){return e.slice(1)}parseSymbol(e){return this.isMarketCoin(e)?this.constants.poolAddresses[this.parseCoinName(e)]?.sCoinSymbol??"":this.constants.poolAddresses[e]?.symbol??""}parseCoinType(e,o=false){return o?this.constants.coinNameToOldMarketCoinTypeMap[e]??"":this.constants.coinTypes[e]??""}parseSCoinName(e){if(this.isMarketCoin(e)&&this.constants.whitelist.scoin.has(e))return e;{let o=`s${e}`;return this.constants.whitelist.scoin.has(o)?o:void 0}}parseSCoinTypeNameToMarketCoinName(e){return this.constants.scoinRawNameToSCoinNameMap[e]??e}parseSCoinType(e){return this.constants.sCoinTypes[e]??""}parseSCoinNameFromType(e){return this.constants.scoinTypeToSCoinNameMap[e]}parseUnderlyingSCoinType(e){let o=this.parseCoinName(e);return this.parseCoinType(o)}getSCoinTreasury(e){return this.address.get(`scoin.coins.${e}.treasury`)}parseMarketCoinType(e){return this.parseCoinType(this.isMarketCoin(e)?this.parseCoinName(e):e,true)}parseMarketCoinName(e){return `s${e}`}getSpoolRewardCoinName=()=>"sui";getCoinDecimal(e){return this.constants.coinDecimals[e]??0}getCoinWrappedType(e){if(this.isSuiBridgeAsset(e))return {from:"Sui Bridge",type:"Asset from Sui Bridge"};if(this.isWormholeAsset(e))return {from:"Wormhole",type:"Portal from Ethereum"};if(this.isLayerZeroAsset(e))return {from:"LayerZero",type:"Ominchain Fungible Token from LayerZero"}}parseCoinNameFromType(e){e=suiKit.normalizeStructTag(e);let{address:o,module:r,name:n,typeParams:a}=suiKit.parseStructTag(e);return o===this.constants.protocolObjectId&&r==="reserve"&&n==="MarketCoin"?this.parseMarketCoinName((typeof a[0]=="string"?suiKit.parseStructTag(a[0]):a[0]).name.toLowerCase()):this.constants.coinTypeToCoinNameMap[e]||this.constants.scoinTypeToSCoinNameMap[e]||suiKit.parseStructTag(e).name.toLowerCase()}async selectCoins({amount:e,count:o,coinType:r=suiKit.SUI_TYPE_ARG,ownerAddress:n=this.walletAddress}){if(e!==void 0&&e<=0)throw new Error("selectCoins amount must be greater than 0.");if(o!==void 0&&o<=0)throw new Error("selectCoins count must be greater than 0.");let a=[],s=e===void 0?void 0:BigInt(Math.trunc(e)),c=o??0,i=0n,l=true,d=null;for(;l&&(s===void 0?a.length<c:i<s);){let{objects:u,hasNextPage:p,cursor:m}=await this.onchain.client.listCoins({owner:n,coinType:r,cursor:d});u.sort((f,b)=>Number(BigInt(b.balance)-BigInt(f.balance)));for(let f of u)if(a.push({objectId:f.objectId,digest:f.digest,version:f.version,balance:f.balance}),i+=BigInt(f.balance),s===void 0?a.length>=c:i>=s)break;d=m,l=p;}if(!a.length)throw new Error("No valid coins found for the transaction.");return a}async mergeSimilarCoins(e,o,r,n=this.walletAddress){try{let a=await this.selectCoins({amount:Number.MAX_SAFE_INTEGER,coinType:r,ownerAddress:n});a.length>0&&e.mergeCoins(o,a.slice(0,500).map(e.objectRef));}catch{}}parseAprToApy(e,o=365){return (1+e/o)**o-1}parseApyToApr(e,o=365){return ((1+e)**(1/o)-1)*o}getUnlockAt(e,o){let r=Math.floor(new Date().getTime()/1e3),n=o?Math.max(Math.floor(o/1e3)-r,0):0,a=0;if(n===0){let s=(e??1)*86400;a=Math.min(r+s,r+126144e3);}else {let s=Math.min(e?e*86400+n:n,126144e3);a=r+s;}return xa(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},Ma=Xt;var Tt=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var Jt=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,...n}){this.utils=e??new Ma(n),this.repos=Ca({utils:this.utils,queryClient:o,queryClientConfig:r});}get logger(){return this.utils.logger}async init(e=false){await this.utils.init({force:e});}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async fetchMarkets(e){let o=e?.poolCoinNames||e?.collateralCoinNames?Array.from(new Set([...e.poolCoinNames??[],...e.collateralCoinNames??[]])):void 0,r=e?.coinPrices??await this.getPythCoinPrices({coinNames:o})??{};return this.repos.market.getMarkets({coinPrices:r,poolCoinNames:e?.poolCoinNames,collateralCoinNames:e?.collateralCoinNames,source:fe(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:Tt(r,e),collaterals:Tt(n,e)}}async getMarketPool(e,o){return (await this.getMarketPools(void 0,o)).pools[e]}async getMarketCollaterals(e=[...this.constants.whitelist.collateral],o){let{collaterals:r}=await this.fetchMarkets({...o,poolCoinNames:[],collateralCoinNames:e});return Tt(r,e)}async getMarketCollateral(e,o){return (await this.getMarketCollaterals(void 0,o))[e]}async getObligations(e=this.walletAddress){return this.repos.obligation.getObligations(e)}async queryObligation(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("queryObligation expects an object id (string) or an object reference");return this.repos.obligation.getObligationData(o)}async getObligationLocked(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("getObligationLocked expects an object id (string) or an object reference");return this.repos.obligation.getObligationLocked(o)}async getCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmounts({coinNames:e,address:o})}async getCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmount({coinName:e,address:o})}async getMarketCoinAmounts(e,o=this.walletAddress){let r=e??[...this.constants.whitelist.lending].map(n=>this.utils.parseMarketCoinName(n));return await this.repos.coinBalance.getMarketCoinAmounts({marketCoinNames:r,address:o})}async getMarketCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getMarketCoinAmount({marketCoinName:e,address:o})}async getSpools(e,o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.spool.getSpools({stakeCoinNames:e??[...this.constants.whitelist.spool],coinPrices:r,source:fe(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:fe(o)})}async getAllStakeAccounts(e=this.walletAddress){return await this.repos.spool.getStakeAccounts({address:e})}async getStakeAccounts(e,o=this.walletAddress){return (await this.getAllStakeAccounts(o))[e]??[]}async getStakePools(e=[...this.constants.whitelist.spool]){let o={};for(let r of e){let n=await this.repos.spool.getStakePool(r);n&&(o[r]=n);}return o}async getStakePool(e){return this.repos.spool.getStakePool(e)}async getStakeRewardPools(e=[...this.constants.whitelist.spool]){return this.repos.spool.getSpoolRewardPools(e)}async getStakeRewardPool(e){return this.repos.spool.getSpoolRewardPool(e)}async getPythCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromPyth({coinNames:o,source:"api-first"})}async getPythCoinPrice(e){return (await this.getPythCoinPrices({coinNames:[e]}))[e]}async getIndexerCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromIndexer({coinNames:o})}async getIndexerCoinPrice(e){return (await this.getIndexerCoinPrices({coinNames:[e]}))[e]}async getBorrowIncentivePools(e=[...this.constants.whitelist.lending],o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.borrowIncentive.getBorrowIncentivePools({coinNames:e,coinPrices:r})}async getBorrowIncentiveAccounts(e,o=[...this.constants.whitelist.lending]){return await this.repos.borrowIncentive.getBorrowIncentiveAccounts({obligationId:typeof e=="string"?e:e.objectId,coinNames:o})}async getLendings(e,o=this.walletAddress,r){let n=e??[...this.constants.whitelist.lending],a=n.map(b=>this.utils.parseMarketCoinName(b)),s=a.filter(b=>this.constants.whitelist.spool.has(b)),c=r?.coinPrices??await this.getPythCoinPrices({coinNames:n})??{},i=r?.marketPools??(await this.getMarketPools(n,{...r,coinPrices:c})).pools,l=await this.getSpools(s,{...r,marketPools:i,coinPrices:c}),[d,u,p,m]=await Promise.all([this.getCoinAmounts(n,o),this.getMarketCoinAmounts(a,o),this.getSCoinAmounts(a,o),this.getAllStakeAccounts(o)]),f={};for(let b of n){let y=this.utils.parseMarketCoinName(b),h=s.includes(y);f[b]=mo({coinName:b,symbol:this.utils.parseSymbol(b),coinType:this.utils.parseCoinType(b),marketCoinType:this.utils.parseMarketCoinType(b),coinDecimal:this.utils.getCoinDecimal(b)??0,coinPrice:c[b]??0,marketPool:i?.[b],spool:h?l[y]:void 0,stakeAccounts:h?m[y]??[]:[],coinAmount:d[b]??0,marketCoinAmount:u[y]??0,sCoinAmount:p[y]??0});}return f}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return V({source:fe(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)})}async getObligationAccountsByIds(e,o){return V({source:fe(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return V({source:fe(o),label:"ScallopQuery.getObligationAccountById",logger:this.logger,api:()=>this.assembleObligationAccountById(e,o,true),onchain:()=>this.assembleObligationAccountById(e,o,false)})}async resolveObligationMarketInputs(e,o){let r=e?.market??await this.getMarketPools(void 0,{indexer:o}),n=e?.coinPrices??await this.getAllCoinPrices({marketPools:r.pools});return {market:r,coinPrices:n}}async assembleObligationAccount(e,o){let{market:r,coinPrices:n,coinAmounts:a}=o,[s,c,i]=await Promise.all([this.queryObligation(e),this.getBorrowIncentivePools(void 0,{coinPrices:n,marketPools:r.pools}),this.getBorrowIncentiveAccounts(e)]);return bo({obligationId:typeof e=="string"?e:e.objectId,collateralCoinNames:Array.from(this.constants.whitelist.collateral),market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:c,borrowIncentiveAccounts:i,utils:{parseCoinNameFromType:l=>this.utils.parseCoinNameFromType(l),parseCoinType:l=>this.utils.parseCoinType(l),parseSymbol:l=>this.utils.parseSymbol(l),getCoinDecimal:l=>this.utils.getCoinDecimal(l),parseSCoinTypeNameToMarketCoinName:l=>this.utils.parseSCoinTypeNameToMarketCoinName(l)}})}async assembleObligationAccountsByOwner(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),[s,c]=await Promise.all([this.getCoinAmounts(void 0,e),this.getObligations(e)]),i=await this.repos.obligation.getObligationObjects(c.map(d=>d.id)),l={};return await Promise.allSettled(c.map(async(d,u)=>{l[d.keyId]=await this.assembleObligationAccount(i[u]??d.id,{market:n,coinPrices:a,coinAmounts:s});})),l}async assembleObligationAccountsByIds(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),s=[];return await Promise.allSettled(e.map(async c=>{let i=await this.assembleObligationAccount(c,{market:n,coinPrices:a,coinAmounts:{}});i&&s.push(i);})),s}async assembleObligationAccountById(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r);return this.assembleObligationAccount(e,{market:n,coinPrices:a,coinAmounts:{}})}async getObligationAccount(e,o=this.walletAddress,r){let n=await this.getObligationAccounts(o,r);return Object.values(n).find(a=>a?.obligationId===e)}async getTvl(e){let o=await this.getIndexerCoinPrices();return this.repos.market.getTvl({source:fe(e),coinPrices:o})}async getVeSca(e){return await this.repos.veSca.getVeSca(typeof e=="string"?e:e.objectId)}async getVeScas({walletAddress:e=this.walletAddress,excludeEmpty:o=false}={}){return await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o})}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return this.repos.referral.getVeScaKeyIdFromReferralBindings(e)}async getBindedObligation(e){return this.repos.borrowIncentive.getBindedObligation(e)}async getBindedVeScaKey(e){return this.repos.borrowIncentive.getBindedVeScaKey(e)}async getLoyaltyProgramInfos(e){let o=e??(await this.getVeScas())[0]?.keyId,r=typeof o=="string"?o:o?.objectId;return this.repos.loyaltyProgram.getLoyaltyProgramInfos(r)}async getVeScaLoyaltyProgramInfos(e){return this.repos.veScaLoyaltyProgram.getVeScaLoyaltyProgramInfos(e)}async getSCoinTotalSupply(e){return await this.repos.coinBalance.getSCoinTotalSupply(e)}async getSCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getSCoinAmounts({sCoinNames:e,address:o})}async getSCoinAmount(e,o=this.walletAddress){let r=this.utils.parseSCoinName(e);return r?await this.repos.coinBalance.getSCoinAmount({sCoinName:r,address:o}):0}async getSCoinSwapRate(e,o){if(e===o)throw new T("fromAsset and toAsset must be different");if(!this.constants.whitelist.scoin.has(e))throw new T("fromAsset is not supported");if(!this.constants.whitelist.scoin.has(o))throw new T("toAsset is not supported");let r=this.utils.parseCoinName(e),n=this.utils.parseCoinName(o),[a,s]=await Promise.all([this.getMarketPool(r),this.getMarketPool(n)]);if(!a||!s)throw new T("Failed to fetch the lendings data");if(a.conversionRate===0||s.conversionRate===0)throw new T("Conversion rate cannot be zero");let c=a.conversionRate,i=1/s.conversionRate,l=await this.getPythCoinPrices();if(!l[r]||!l[n]||l[r]===0||l[n]===0){let u=await this.getIndexerCoinPrices().catch(()=>({}));l={...l,...u};}if(!l[r]||!l[n])throw new T("Failed to fetch the coin prices");let d=l[r]/l[n];return bignumber_js.BigNumber(c).multipliedBy(d).multipliedBy(i).toNumber()}async getFlashLoanFees(e=[...this.constants.whitelist.lending]){return await this.repos.flashloan.getFlashloanFees(e)}async getPoolSupplyLimit(e){return this.repos.market.getPoolSupplyLimit(e)}async getPoolBorrowLimit(e){return this.repos.market.getPoolBorrowLimit(e)}async getIsolatedAssets(e=false){return await this.repos.isolatedAssets.getIsolatedAssets({source:wa({useOnChainQuery:e})})}async isIsolatedAsset(e,o=false){let r=this.constants.poolAddresses[e];return r&&!o?r.isIsolated:(await this.repos.isolatedAssets.getIsolatedAssets({source:"onchain"})).includes(this.utils.parseCoinType(e))}async getAllCoinPrices(e){let o=e?.indexer??false,r=e?.coinPrices??(o?await this.getIndexerCoinPrices():await this.getPythCoinPrices()),n=e?.marketPools??(await this.getMarketPools(void 0,{coinPrices:r,indexer:o})).pools;return fo({coinPrices:r,marketPools:n,sCoinNames:[...this.constants.whitelist.scoin],parseCoinName:a=>this.utils.parseCoinName(a)})}async getPoolAddresses(e=this.address.addressId){if(!e)throw new T("apiAddressId is required");return this.repos.poolAddresses.getPoolAddresses({})}async getUserPortfolio(e){let o=e?.walletAddress??this.walletAddress,r=e?.indexer??false,n=await this.getAllCoinPrices({indexer:r}),a=await this.getMarketPools(void 0,{indexer:r,coinPrices:n}),[s,c,i]=await Promise.all([this.getLendings(void 0,o,{indexer:r,marketPools:a.pools,coinPrices:n}),this.getObligationAccounts(o,{indexer:r,market:a,coinPrices:n}),this.getVeScas({walletAddress:o,excludeEmpty:true})]);return yo({lendings:s,obligationAccounts:c,veScas:i,coinPrices:n,marketPools:a.pools})}async getPriceUpdatePolicies(){return this.repos.xOracle.getPriceUpdatePolicies()}async getAssetOracles(){return this.repos.xOracle.getAssetOracles()}async getSwitchboardOnDemandAggregatorObjectIds(e){return this.repos.xOracle.getOnDemandAggObjectIds(e)}},Fa=Jt;var Zt=class{query;usePythPullModel;useOnChainXOracleList;sponsoredFeeds;suiKit;pythEndpoints;constructor({usePythPullModel:e=true,useOnChainXOracleList:o=true,sponsoredFeeds:r=[],pythEndpoints:n=[],query:a,...s}){this.suiKit=new suiKit.SuiKit({...s,fullnodeUrls:[s.fullnodeUrl]}),this.query=a??new Fa({...s,walletAddress:s.walletAddress??this.suiKit.currentAddress}),this.usePythPullModel=e,this.useOnChainXOracleList=o,this.sponsoredFeeds=r,this.pythEndpoints=n;}_executor;get executor(){return this._executor??=new Je(this.suiKit)}get utils(){return this.query.utils}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async init(e=false){await this.query.init(e);}createTxBlock(e){return ir(this,e)}async selectCoin(e,o,r,n=this.walletAddress,a=false){if(o==="sui"&&!a){let[s]=e.splitSUIFromGas([r]);return {takeCoin:s}}else {let s=this.utils.parseCoinType(o),c=await this.utils.selectCoins({amount:r,coinType:s,ownerAddress:n}),i=c.reduce((u,p)=>(u+=Number(p.balance),u),0),[l,d]=e.takeAmountFromCoins(c,r);return {takeCoin:l,leftCoin:d,totalAmount:i}}}async selectMarketCoin(e,o,r,n=this.walletAddress){let a=this.utils.parseMarketCoinType(o),s=await this.utils.selectCoins({amount:r,coinType:a,ownerAddress:n}),c=s.reduce((d,u)=>(d+=Number(u.balance),d),0),[i,l]=e.takeAmountFromCoins(s,Math.min(r,c));return {takeCoin:i,leftCoin:l,totalAmount:c}}async selectSCoin(e,o,r,n=this.walletAddress){let a=this.utils.parseSCoinType(o),s=await this.utils.selectCoins({amount:r,coinType:a,ownerAddress:n}),c=s.reduce((d,u)=>(d+=Number(u.balance),d),0),[i,l]=e.takeAmountFromCoins(s,Math.min(c,r));return {takeCoin:i,leftCoin:l,totalAmount:c}}async selectSCoinOrMarketCoin(e,o,r,n=this.walletAddress){let a=r,s={sCoins:[],marketCoins:[],leftCoins:[]};try{let{leftCoin:l,takeCoin:d,totalAmount:u}=await this.selectSCoin(e,o,a,n);if(s.leftCoins.push(l),s.sCoins.push(d),a-=u,a>0){let{leftCoin:p,takeCoin:m}=await this.selectMarketCoin(e,o,r,n);e.transferObjects([p],n),s.marketCoins.push(m);}}catch{let{takeCoin:d,leftCoin:u}=await this.selectMarketCoin(e,o,r,n);s.leftCoins.push(u),s.marketCoins.push(d);}e.transferObjects(s.leftCoins,n);let c=s.marketCoins.length>0?s.marketCoins.length>1?e.mergeCoins(s.marketCoins[0],s.marketCoins.slice(1)):s.marketCoins[0]:void 0;return {sCoin:s.sCoins.length>0?s.sCoins.length>1?e.mergeCoins(s.sCoins[0],s.sCoins.slice(1)):s.sCoins[0]:void 0,marketCoin:c}}async signAndSendTxBlock(e){return await this.executor.signAndSendTxn(e)}moveCall(e,o,r,n){return e.moveCall(o,r,n)}},Da=Zt;var eo=class{builder;collateralService;lendingService;borrowService;spoolService;veScaService;referralService;networkType;constructor({builder:e,networkType:o,...r}){this.builder=e??new Da(r),this.collateralService=new De(this),this.lendingService=new Le(this),this.borrowService=new Ve(this),this.spoolService=new $e(this),this.veScaService=new Ge(this),this.referralService=new ze(this),this.networkType=o??"mainnet";}get query(){return this.builder.query}get utils(){return this.query.utils}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get suiKit(){return this.builder.suiKit}get onchain(){return this.utils.onchain}get executor(){return this.builder.executor}get address(){return this.builder.address}async init(e=false){await this.builder.init(e);}async openObligation(e=true){return this.borrowService.openObligation(e)}async depositCollateral(e,o,r=true,n,a,s){return this.collateralService.depositCollateral(e,o,r,n,a,s)}async withdrawCollateral(e,o,r=true,n,a,s,c){return this.collateralService.withdrawCollateral(e,o,r,n,a,s,c)}async supply(e,o,r=true,n){return this.lendingService.supply(e,o,r,n)}async supplyAndStake(e,o,r=true,n,a){return this.borrowService.supplyAndStake(e,o,r,n,a)}async withdraw(e,o,r=true,n){return this.lendingService.withdraw(e,o,r,n)}async borrow(e,o,r=true,n,a,s,c){return this.borrowService.borrow(e,o,r,n,a,s,c)}async repay(e,o,r=true,n,a,s,c){return this.borrowService.repay(e,o,r,n,a,s,c)}async flashLoan(e,o,r,n=true,a){return this.lendingService.flashLoan(e,o,r,n,a)}async createStakeAccount(e,o=true,r){return this.spoolService.createStakeAccount(e,o,r)}async stake(e,o,r=true,n,a){return this.spoolService.stake(e,o,r,n,a)}async unstake(e,o,r=true,n,a){return this.spoolService.unstake(e,o,r,n,a)}async unstakeAndWithdraw(e,o,r=true,n,a){return this.spoolService.unstakeAndWithdraw(e,o,r,n,a)}async claim(e,o=true,r,n){return this.spoolService.claim(e,o,r,n)}async stakeObligation(e,o,r=true,n){return this.borrowService.stakeObligation(e,o,r,n)}async unstakeObligation(e,o,r=true,n){return this.borrowService.unstakeObligation(e,o,r,n)}async claimBorrowIncentive(e,o,r=true,n){return this.borrowService.claimBorrowIncentive(e,o,r,n)}async migrateAllMarketCoin(e=true,o=true,r){let n=r??this.walletAddress,a=this.builder.createTxBlock();a.setSender(n);let s=[];for(let c of this.constants.whitelist.scoin){let i=[];try{let{takeCoin:l}=await this.builder.selectMarketCoin(a,c,Number.MAX_SAFE_INTEGER,n);if(l){let d=a.mintSCoin(c,l);i.push(d);}}catch(l){if(!l.toString().includes("No valid coins found for the transaction"))throw l}if(e&&this.constants.whitelist.spool.has(c))try{let l=await a.unstakeQuick(Number.MAX_SAFE_INTEGER,c);l&&i.push(l);}catch{}if(i.length>0){let l=i[0];i.length>1&&a.mergeCoins(l,i.slice(1));let d=this.utils.parseSCoinType(c);await this.utils.mergeSimilarCoins(a,l,d,n),s.push(l);}}return s.length>0&&a.transferObjects(s,n),o?await this.executor.signAndSendTxn(a):a.txBlock}async claimAllUnlockedSca(e=true,o){return this.veScaService.claimAllUnlockedSca(e,o)}async mintTestCoin(e,o,r=true,n){if(!(this.networkType==="testnet"))throw new Error("Only be used on the test network.");let s=this.builder.createTxBlock(),c=n??this.walletAddress,i=this.address.get("core.packages.testCoin.id"),l=this.address.get(`core.coins.${e}.treasury`),d=`${i}::${e}::mint`,u=s.moveCall(d,[l,o]);return s.transferObjects([u],c),r?await this.executor.signAndSendTxn(s):s.txBlock}},bc=eo;
19
+ var De=class{constructor(e){this.ctx=e;}async depositCollateral(e,o,r=true,n,a,s){let c=this.ctx.builder.createTxBlock(),i=a??this.ctx.walletAddress;c.setSender(i);let l=n??(await this.ctx.query.getObligations(i))[0]?.id;if(l)await c.depositCollateralQuick(o,e,l,s);else {let[d,u,p]=c.openObligation();await c.depositCollateralQuick(o,e,d,s),c.returnObligation(d,p),c.transferObjects([u],i);}return r?await this.ctx.executor.signAndSendTxn(c):c.txBlock}async withdrawCollateral(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=await i.takeCollateralQuick(o,e,n,a,{isSponsoredTx:c});return i.transferObjects([d],l),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}};var Le=class{constructor(e){this.ctx=e;}async supply(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.supplyQuick(o,e);return a.transferObjects([c],s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async withdraw(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.withdrawQuick(o,e);return a.transferObjects([c],s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async flashLoan(e,o,r,n=true,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let[i,l]=s.borrowFlashLoan(o,e);return s.repayFlashLoan(await r(s,i),l,e),n?await this.ctx.executor.signAndSendTxn(s):s.txBlock}};var G=class extends Error{code;context;constructor(e,o,r){super(o),this.name="ScallopError",this.code=e,this.context=r?.context,r?.cause!==void 0&&(this.cause=r.cause);}};var P=class extends G{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Ee=class extends G{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var T=class extends G{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var re=class extends G{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};var ne=class extends G{constructor(e,o){super("SCALLOP_TX_BUILD_ERROR",e,o),this.name="ScallopTransactionBuildError";}};var Ve=class{constructor(e){this.ctx=e;}async openObligation(e=true){let o=this.ctx.builder.createTxBlock();return o.openObligationEntry(),e?await this.ctx.executor.signAndSendTxn(o):o.txBlock}async borrow(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=this.ctx.constants.whitelist.lending.has(e);r&&d&&await i.unstakeObligationQuick(n,a);let u=await i.borrowQuick(o,e,n,a,{isSponsoredTx:c});return i.transferObjects([u],l),r&&d&&await i.stakeObligationWithVeScaQuick(n,a),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}async repay(e,o,r=true,n,a,s,c){let i=this.ctx.builder.createTxBlock(),l=s??this.ctx.walletAddress;i.setSender(l);let d=this.ctx.constants.whitelist.lending.has(e);return r&&d&&await i.unstakeObligationQuick(n,a),await i.repayQuick(o,e,n,c),r&&d&&await i.stakeObligationWithVeScaQuick(n,a),r?await this.ctx.executor.signAndSendTxn(i):i.txBlock}async supplyAndStake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=this.ctx.utils.parseMarketCoinName(e),l=await this.ctx.query.getStakeAccounts(i),d=n??l[0]?.id,u=await s.supplyQuick(o,e,false);if(d)await s.stakeQuick(u,i,d);else {let p=s.createStakeAccount(i);await s.stakeQuick(u,i,p),s.transferObjects([p],c);}return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async stakeObligation(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),await a.stakeObligationWithVeScaQuick(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async unstakeObligation(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),await a.unstakeObligationQuick(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async claimBorrowIncentive(e,o,r=true,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c={},i=await this.ctx.query.getObligationAccount(e);if(!i)throw new ne("Obligation not found",{context:{obligationId:e}});let l=Object.values(i.borrowIncentives).filter(d=>!!d).flatMap(({rewards:d})=>d.filter(({availableClaimAmount:u})=>u>0)).flatMap(({coinName:d})=>d);for(let d of l){let u=await a.claimBorrowIncentiveQuick(d,e,o);c[d]?c[d].push(u):c[d]=[u];}return a.transferObjects(Object.values(c).map(d=>{let u=d[0];return d.length>1&&a.mergeCoins(u,d.slice(1)),u}),s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var Ke="https://sui.apis.scallop.io",qe="https://sdk.api.scallop.io";var We={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Ue="0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA";var At="0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410";var g={api:{getAddresses:t=>["api","getAddresses",t],getWhiteList:()=>["api","getWhiteList"],getPoolAddresses:()=>["api","getPoolAddresses"],getMarkets:()=>["api","getMarkets"],getSpools:()=>["api","getSpools"],getBorrowIncentivePools:()=>["api","getBorrowIncentivePools"],getTotalValueLocked:()=>["api","getTotalValueLocked"]},rpc:{getInspectTxn:t=>["rpc","getInspectTxn",t],getObject:t=>["rpc","getObject",t],getObjects:t=>["rpc","getObjects",t],getSharedObject:t=>["rpc","getSharedObject",t],getOwnedObjects:t=>["rpc","getOwnedObjects",t],getDynamicFields:t=>["rpc","getDynamicFields",t],getDynamicFieldObject:t=>["rpc","getDynamicFieldObject",t],getTotalVeScaTreasuryAmount:t=>["rpc","getTotalVeScaTreasuryAmount",{...t,refreshArgs:t?.refreshArgs?JSON.stringify(t?.refreshArgs):void 0,veScaAmountArgs:t?.veScaAmountArgs?JSON.stringify(t?.veScaAmountArgs):void 0}],getCoinBalance:t=>["rpc","getCoinBalance",t],getAllCoinBalances:t=>["rpc","getAllCoinBalances",t],getNormalizedMoveFunction:t=>["rpc","getNormalizedMoveCall",t]},oracle:{getPythLatestPriceFeeds:(t,e)=>["oracle","getPythPriceIds",e,t],getCoinPrices:t=>["oracle","getCoinPrices",t]}};[suiKit.getFullnodeUrl("mainnet")];var no={usdc:{primary:["pyth"],secondary:[]},sbeth:{primary:["pyth"],secondary:[]},sbusdt:{primary:["pyth"],secondary:[]},sbwbtc:{primary:["pyth"],secondary:[]},weth:{primary:["pyth"],secondary:[]},wbtc:{primary:["pyth"],secondary:[]},wusdc:{primary:["pyth"],secondary:[]},wusdt:{primary:["pyth"],secondary:[]},sui:{primary:["pyth"],secondary:[]},wapt:{primary:["pyth"],secondary:[]},wsol:{primary:["pyth"],secondary:[]},cetus:{primary:["pyth"],secondary:[]},afsui:{primary:["pyth"],secondary:[]},hasui:{primary:["pyth"],secondary:[]},vsui:{primary:["pyth"],secondary:[]},sca:{primary:["pyth"],secondary:[]},fud:{primary:["pyth"],secondary:[]},deep:{primary:["pyth"],secondary:[]},fdusd:{primary:["pyth"],secondary:[]},blub:{primary:["pyth"],secondary:[]},musd:{primary:["pyth"],secondary:[]},ns:{primary:["pyth"],secondary:[]},usdy:{primary:["pyth"],secondary:[]}};var ae=t=>`${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`,I=t=>{let e=t.getData().sender;if(!e)throw new Error("Sender is required");return e},Te=t=>{if(t===void 0)throw new Error("veSca not found")},Ot=t=>{if(t<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},Pt=(t,e,o)=>{Te(o),Ot(o);let r=Math.floor(o/1e3);if(t<1)throw new Error("Minimum lock period is 1 day");let n=Math.floor((e-r)/86400);if(t>n)throw new Error(`Cannot extend lock period by ${t} days, maximum lock period is ~4 years (${1460} days), remaining lock period is ${1460-n}`)},io=(t,e,o,r)=>{let n=r?Math.floor(r/1e3):void 0,a=!n,s=!a&&n*1e3<=new Date().getTime();if(a||s)if(t!==void 0&&e!==void 0){if(e<=0)throw new Error("Lock period must be greater than 0");if(typeof t=="number"&&t<1e10)throw new Error(`Minimum lock amount for ${s?"renewing expired veSca":"initial lock"} is 10 SCA`);if(e*86400>126144e3)throw new Error(`Maximum lock period is ~4 years (${1460} days)`)}else throw new Error(`SCA amount and lock period is required for ${s?"renewing expired veSca":"initial lock"}`);else {if(Te(r),Ot(r),typeof t=="number"&&t<1e9)throw new Error("Minimum top up amount is 1 SCA");o&&e&&Pt(e,o,r);}},co=(t,e)=>{if(Te(e),Ot(e),t<1e9)throw new Error("Minimum top up amount is 1 SCA");if(!!e&&e<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},lo=(t,e,o)=>{if(!o||o>new Date().getTime())throw new Error("Renew method can only be used for expired veSca");if(t<1e10)throw new Error("Minimum lock amount for renewing expired vesca 10 SCA");if(e*86400>=126057600)throw new Error(`Maximum lock period is ~4 years (${1459} days)`)};var $e=class{constructor(e){this.ctx=e;}async createStakeAccount(e,o=true,r){let n=this.ctx.builder.createTxBlock(),a=r??this.ctx.walletAddress;n.setSender(a);let s=n.createStakeAccount(e);return n.transferObjects([s],a),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async stake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await this.ctx.query.getStakeAccounts(e),l=n??i[0]?.id;if(l)await s.stakeQuick(o,e,l);else {let d=s.createStakeAccount(e);await s.stakeQuick(o,e,d),s.transferObjects([d],c);}return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async unstake(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await s.unstakeQuick(o,e,n);if(i){let l=this.ctx.utils.parseSCoinType(e);if(!l)throw new ne(`Invalid sCoin type: ${e}`,{context:{stakeMarketCoinName:e}});await this.ctx.utils.mergeSimilarCoins(s,i,l,c);}return s.transferObjects([i],c),r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async unstakeAndWithdraw(e,o,r=true,n,a){let s=this.ctx.builder.createTxBlock(),c=a??this.ctx.walletAddress;s.setSender(c);let i=await s.unstakeQuick(o,e,n,false),l=this.ctx.utils.parseCoinName(e);if(i){let d=s.withdraw(i,l);await this.ctx.utils.mergeSimilarCoins(s,d,this.ctx.utils.parseCoinType(l),I(s)),s.transferObjects([d],c);}else throw new ne(`No stake found for ${e}`,{context:{stakeMarketCoinName:e}});return r?await this.ctx.executor.signAndSendTxn(s):s.txBlock}async claim(e,o=true,r,n){let a=this.ctx.builder.createTxBlock(),s=n??this.ctx.walletAddress;a.setSender(s);let c=await a.claimQuick(e,r);return a.transferObjects(c,s),o?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var Ge=class{constructor(e){this.ctx=e;}async lockSca(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.lockScaQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async extendLockPeriod(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.extendLockPeriodQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async extendLockAmount(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),await n.extendLockAmountQuick(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async claimAllUnlockedSca(e=true,o){let r=o??this.ctx.walletAddress,n=(await this.ctx.query.getVeScas({walletAddress:r})??[]).map(({keyId:c})=>c);if(n.length===0)throw new ne("No veSCA found in the wallet",{context:{walletAddress:r}});let a=this.ctx.builder.createTxBlock();a.setSender(r);let s=[];if(await Promise.all(n.map(async c=>{try{let i=await a.redeemScaQuick({veScaKey:c,transferSca:!1});if(!i)return;s.push(i);}catch(i){this.ctx.utils.logger.warn("redeemScaQuick failed for veScaKey; skipping",{veScaKey:c,message:i?.message});}})),s.length===0)throw new ne("No unlocked SCA found in the veSCA accounts",{context:{walletAddress:r,veScaKeyCount:n.length}});return s.length>1&&a.mergeCoins(s[0],s.slice(1)),await this.ctx.utils.mergeSimilarCoins(a,s[0],"sca",r),e?await this.ctx.executor.signAndSendTxn(a):{tx:a.txBlock,scaCoin:s[0]}}};var ze=class{constructor(e){this.ctx=e;}async bindToReferral(e,o=true,r){let n=this.ctx.builder.createTxBlock();return n.setSender(r??this.ctx.walletAddress),n.bindToReferral(e),o?await this.ctx.executor.signAndSendTxn(n):n.txBlock}async claimReferralRevenue(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();a.setSender(n??this.ctx.walletAddress);let s=o??[...this.ctx.constants.whitelist.lending];return await a.claimReferralRevenueQuick(e,s),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}async burnReferralTicket(e,o,r=true,n){let a=this.ctx.builder.createTxBlock();return a.setSender(n??this.ctx.walletAddress),a.burnReferralTicket(e,o),r?await this.ctx.executor.signAndSendTxn(a):a.txBlock}};var X=t=>{if(typeof t=="string")return utils.normalizeStructTag(t);if(t&&typeof t=="object"){let e=t;if(e.address&&e.module&&typeof e.name=="string"){let o=(e.typeParams??e.typeParameters??[]).map(n=>X(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return X(e.name)}throw new T(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},J=(t,e)=>{try{return X(t)}catch(o){throw new T(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var ke=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var Ye=(t,e,o)=>{let r=Math.max(1,Math.floor(Math.log10(Math.abs(t))+1)),n=Math.max(Math.floor((r-1)/e),1)+1,a=Math.pow(10,-n);return a=o==="increase"?1-a:1+a,a};var Ja=t=>Object.values(t).filter(e=>!!e&&e.availableWithdrawCoin>0).map(e=>({suppliedCoin:e.availableWithdrawCoin,suppliedValue:e.suppliedValue,stakedCoin:e.availableUnstakeCoin,coinName:e.coinName,symbol:e.symbol,coinType:e.coinType,coinPrice:e.coinPrice,coinDecimals:e.coinDecimal,supplyApr:e.supplyApr,supplyApy:e.supplyApy,incentiveApr:isFinite(e.rewardApr)?e.rewardApr:0})),Za=(t,e)=>Object.values(t).filter(o=>!!o&&(o.totalBorrowedValueWithWeight>0||o.totalDepositedValue>0)).map(o=>({obligationId:o.obligationId,totalDebtsInUsd:o.totalBorrowedValueWithWeight,totalCollateralInUsd:o.totalDepositedValue,riskLevel:o.totalRiskLevel,availableCollateralInUsd:o.totalAvailableCollateralValue,totalUnhealthyCollateralInUsd:o.totalUnhealthyCollateralValue,collaterals:Object.values(o.collaterals).filter(r=>!!r&&r.depositedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,depositedCoin:r.depositedCoin,depositedValueInUsd:r.depositedValue})),borrowedPools:Object.values(o.debts).filter(r=>!!r&&r.borrowedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,borrowedCoin:r.borrowedCoin,borrowedValueInUsd:r.borrowedValueWithWeight,borrowApr:e[r.coinName]?.borrowApr,borrowApy:e[r.coinName]?.borrowApy,incentiveInfos:(o.borrowIncentives[r.coinName]?.rewards??[]).filter(n=>!!n&&isFinite(n.baseRewardApr)).map(n=>({coinName:n.coinName,symbol:n.symbol,coinType:n.coinType,boostValue:n.boostValue,maxBoost:n.maxBoost,incentiveApr:n.baseRewardApr,boostedIncentiveApr:n.boostedRewardApr}))}))})),Ae="sui",es="SUI",ts=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[Ae]?o[Ae].pendingRewardInCoin+=r.availableClaimCoin:o[Ae]={symbol:es,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[Ae]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),os=t=>Object.values(t).filter(e=>!!e).reduce((e,o)=>(Object.values(o.borrowIncentives).forEach(r=>{r?.rewards.forEach(n=>{if(n.availableClaimCoin===0)return e;e[n.coinName]?e[n.coinName].pendingRewardInCoin+=n.availableClaimCoin:e[n.coinName]={symbol:n.symbol,coinType:n.coinType,coinPrice:n.coinPrice,pendingRewardInCoin:n.availableClaimCoin};});}),e),{}),rs=(t,e,o=Date.now())=>t.map(({keyId:r,lockedScaCoin:n,currentVeScaBalance:a,unlockAt:s})=>({veScaKey:r,coinPrice:e,lockedScaInCoin:n,lockedScaInUsd:n*e,currentVeScaBalance:a,remainingLockPeriodInDays:s-o>0?(s-o)/864e5:0,unlockAt:s})),ns=t=>{let e=t.parsedLendings.reduce((n,a)=>n+a.suppliedValue,0),o=t.parsedObligationAccounts.reduce((n,a)=>(n.totalDebtValue+=a.totalDebtsInUsd,n.totalCollateralValue+=a.totalCollateralInUsd,n),{totalDebtValue:0,totalCollateralValue:0}),r=t.parsedVeScas.reduce((n,a)=>n+a.lockedScaInUsd,0);return {totalSupplyValue:e,...o,totalLockedScaValue:r}},as=t=>{let e=bignumber_js.BigNumber(t.depositedRawAmount??0),o=e.shiftedBy(-t.coinDecimal),r=o.multipliedBy(t.coinPrice),n=r.multipliedBy(t.marketCollateral.collateralFactor),a=r.multipliedBy(t.marketCollateral.liquidationFactor),s=bignumber_js.BigNumber(t.coinAmount),c=s.shiftedBy(-t.coinDecimal);return {entry:{coinName:t.assetCoinName,coinType:t.coinType,symbol:t.symbol,coinDecimal:t.coinDecimal,coinPrice:t.coinPrice,depositedAmount:e.toNumber(),depositedCoin:o.toNumber(),depositedValue:r.toNumber(),borrowCapacityValue:n.toNumber(),requiredCollateralValue:a.toNumber(),availableDepositAmount:s.toNumber(),availableDepositCoin:c.toNumber(),availableWithdrawAmount:0,availableWithdrawCoin:0},depositedValue:r,borrowCapacityValue:n,requiredCollateralValue:a,isDeposited:e.isGreaterThan(0)}},ss=1e9,is=bignumber_js.BigNumber(1e12),cs=t=>{let e=[];Object.entries(t.borrowIncentiveAccount.pointList).forEach(([n,a])=>{let s=t.borrowIncentivePool.points[t.toMarketCoinName(n)];if(!a||!s)return;let c=bignumber_js.BigNumber(a.weightedAmount),i=s.currentPointIndex?Math.max(bignumber_js.BigNumber(s.currentPointIndex-a.index).dividedBy(ss).toNumber(),0):1,l=c.multipliedBy(i).plus(a.points),d=l.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(is),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),b=p.isFinite()?p.toNumber():1,f=isFinite(s.rewardApr)?s.rewardApr:0;l.isGreaterThanOrEqualTo(0)&&e.push({coinName:s.coinName,coinType:s.coinType,symbol:s.symbol,coinDecimal:s.coinDecimal,coinPrice:s.coinPrice,weightedBorrowAmount:c.toNumber(),availableClaimAmount:l.toNumber(),availableClaimCoin:d.toNumber(),baseRewardApr:f,boostedRewardApr:f*b,maxBoost:1/u.toNumber(),boostValue:b});});let r=Object.keys(t.borrowIncentivePool.points).some(n=>{let a=t.borrowIncentivePool.points[n]?.rewardApr;return a!==1/0&&typeof a=="number"&&a>0})&&t.borrowIncentiveAccount.debtAmount>0;return {rewards:e,contributesRewardedPool:r}},ls=t=>{let e=t.debt?.borrowIndex?t.marketPool.borrowIndex/Number(t.debt.borrowIndex)-1:0,o=bignumber_js.BigNumber(t.debt?.amount??0).multipliedBy(e+1),r=o.shiftedBy(-t.coinDecimal),n=o,a=n.shiftedBy(-t.coinDecimal),s=bignumber_js.BigNumber(t.coinAmount),c=s.shiftedBy(-t.coinDecimal),i=a.multipliedBy(t.coinPrice),l=i.multipliedBy(t.marketPool.borrowWeight);return {entry:{coinName:t.assetCoinName,coinType:t.coinType,symbol:t.symbol,coinDecimal:t.coinDecimal,coinPrice:t.coinPrice,borrowedAmount:o.toNumber(),borrowedCoin:r.toNumber(),borrowedValue:i.toNumber(),borrowedValueWithWeight:l.toNumber(),borrowIndex:Number(t.debt?.borrowIndex??0),requiredRepayAmount:n.toNumber(),requiredRepayCoin:a.toNumber(),availableBorrowAmount:0,availableBorrowCoin:0,availableRepayAmount:s.toNumber(),availableRepayCoin:c.toNumber(),rewards:(t.rewards??[]).filter(({weightedBorrowAmount:u})=>u>0)},borrowedValue:i,borrowedValueWithWeight:l,isBorrowed:o.isGreaterThan(0)}},ds=t=>{let e=t.totalRequiredCollateralValue.isZero()?t.totalBorrowedValueWithWeight.isGreaterThan(0)?bignumber_js.BigNumber(100):bignumber_js.BigNumber(0):t.totalBorrowedValueWithWeight.dividedBy(t.totalRequiredCollateralValue);e=e.isLessThan(1)?e:bignumber_js.BigNumber(1);let o=t.totalDepositedValue.minus(t.totalBorrowedValue).isGreaterThan(0)?t.totalDepositedValue.minus(t.totalBorrowedValue):bignumber_js.BigNumber(0),r=t.totalBorrowCapacityValue.minus(t.totalBorrowedValueWithWeight).isGreaterThan(0)?t.totalBorrowCapacityValue.minus(t.totalBorrowedValueWithWeight):bignumber_js.BigNumber(0),n=t.totalBorrowedValueWithWeight.isGreaterThan(0)?t.totalRequiredCollateralValue:bignumber_js.BigNumber(0),a=t.totalBorrowedValueWithWeight.minus(n).isGreaterThan(0)?t.totalBorrowedValueWithWeight.minus(n):bignumber_js.BigNumber(0);return {riskLevel:e.toNumber(),accountBalanceValue:o.toNumber(),availableCollateralValue:r.toNumber(),requiredCollateralValue:n.toNumber(),unhealthyCollateralValue:a.toNumber()}},us=t=>{let e=bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketCollateral.collateralFactor).dividedBy(t.marketCollateral.coinPrice).shiftedBy(t.marketCollateral.coinDecimal),o=t.totalBorrowedValueWithWeight===0?bignumber_js.BigNumber(t.obligationCollateral.depositedAmount):ke(e.multipliedBy(Ye(bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketCollateral.collateralFactor).toNumber(),3,"increase")).toNumber(),t.obligationCollateral.depositedAmount,t.marketCollateral.depositAmount);return {availableWithdrawAmount:o.toNumber(),availableWithdrawCoin:o.shiftedBy(-t.obligationCollateral.coinDecimal).toNumber()}},ps=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(Ye(t.obligationDebt.borrowedValue,3,"decrease")),o=bignumber_js.BigNumber(t.totalAvailableCollateralValue).dividedBy(t.marketPool.borrowWeight).shiftedBy(t.marketPool.coinDecimal).dividedBy(t.marketPool.coinPrice),r=t.totalAvailableCollateralValue!==0&&bignumber_js.BigNumber(t.marketPool.maxBorrowCoin).isGreaterThan(t.marketPool.borrowCoin)?ke(o.multipliedBy(Ye(o.shiftedBy(-t.marketPool.coinDecimal).multipliedBy(t.marketPool.coinPrice).toNumber(),3,"increase")).toNumber(),t.marketPool.supplyAmount):bignumber_js.BigNumber(0);return {availableBorrowAmount:r.toNumber(),availableBorrowCoin:r.shiftedBy(-t.obligationDebt.coinDecimal).toNumber(),requiredRepayAmount:e.toNumber(),requiredRepayCoin:e.shiftedBy(-t.obligationDebt.coinDecimal).toNumber()}},mo=t=>{let{coinName:e,symbol:o,coinType:r,marketCoinType:n,coinDecimal:a,coinPrice:s,marketPool:c,spool:i,stakeAccounts:l,coinAmount:d,marketCoinAmount:u,sCoinAmount:p}=t,b=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),S=bignumber_js.BigNumber(0),w=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0),_=bignumber_js.BigNumber(0);if(i)for(let ie of l){let L=bignumber_js.BigNumber(ie.staked),we=L.shiftedBy(-i.coinDecimal),W=L.multipliedBy(c?.conversionRate??1),Y=W.shiftedBy(-i.coinDecimal),he=Y.multipliedBy(i.coinPrice);b=b.plus(L),f=f.plus(we),m=m.plus(W),y=y.plus(Y),h=h.plus(he),S=S.plus(L),w=S.shiftedBy(-i.coinDecimal);let kt=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-ie.index).dividedBy(1e9):1;O=O.plus(L.multipliedBy(kt).plus(ie.points).multipliedBy(i.exchangeRateNumerator).dividedBy(i.exchangeRateDenominator)),_=O.shiftedBy(-i.rewardCoinDecimal);}let N=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)).multipliedBy(c?.conversionRate??1),v=N.shiftedBy(-a),x=v.multipliedBy(s??0),B=bignumber_js.BigNumber(s??0).multipliedBy(c?.conversionRate??1),j=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),F=j.shiftedBy(-a),q=bignumber_js.BigNumber(d),$=q.shiftedBy(-a),de=ke(N,c?.supplyAmount??1/0).plus(m),te=ke(v,c?.supplyCoin??1/0).plus(y);return {coinName:e,symbol:o,coinType:r,marketCoinType:n,sCoinType:c?.sCoinType??"",coinDecimal:a,coinPrice:s??0,conversionRate:c?.conversionRate??1,marketCoinPrice:B.toNumber(),supplyApr:c?.supplyApr??0,supplyApy:c?.supplyApy??0,rewardApr:i?.rewardApr??0,suppliedAmount:N.plus(m).toNumber(),suppliedCoin:v.plus(y).toNumber(),suppliedValue:x.plus(h).toNumber(),stakedMarketAmount:b.toNumber(),stakedMarketCoin:f.toNumber(),stakedAmount:m.toNumber(),stakedCoin:y.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:j.toNumber(),unstakedMarketCoin:F.toNumber(),unstakedAmount:N.toNumber(),unstakedCoin:v.toNumber(),unstakedValue:x.toNumber(),availableSupplyAmount:q.toNumber(),availableSupplyCoin:$.toNumber(),availableWithdrawAmount:de.toNumber(),availableWithdrawCoin:te.toNumber(),availableStakeAmount:j.toNumber(),availableStakeCoin:F.toNumber(),availableUnstakeAmount:S.toNumber(),availableUnstakeCoin:w.toNumber(),availableClaimAmount:O.toNumber(),availableClaimCoin:_.toNumber(),isIsolated:c?c.isIsolated:false}},bo=t=>{let{obligationId:e,collateralCoinNames:o,market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:c,borrowIncentiveAccounts:i,utils:l}=t,d={},u={},p={},b=0,f=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=0,S=0,w=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0);for(let x of o){let B=s?.collaterals.find(q=>l.parseCoinNameFromType(q.type)===x),j=r.collaterals[x];if(!j)continue;let F=as({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketCollateral:j,depositedRawAmount:B?.amount});f=f.plus(F.depositedValue),m=m.plus(F.borrowCapacityValue),y=y.plus(F.requiredCollateralValue),F.isDeposited&&b++,d[x]=F.entry;}for(let[x,B]of Object.entries(i)){if(!B)continue;let j=c[x];if(!j)continue;let F=cs({borrowIncentivePool:j,borrowIncentiveAccount:B,toMarketCoinName:q=>l.parseSCoinTypeNameToMarketCoinName(q)});F.contributesRewardedPool&&S++,p[x]={coinName:j.coinName,coinType:j.coinType,symbol:j.symbol,coinDecimal:j.coinDecimal,coinPrice:j.coinPrice,rewards:F.rewards};}let _=[...new Set(Object.values(r.pools).filter(x=>!!x).map(x=>x.coinName))];for(let x of _){let B=s?.debts.find(q=>l.parseCoinNameFromType(q.type)===x),j=r.pools[x];if(!j)continue;let F=ls({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketPool:j,debt:B?{amount:B.amount,borrowIndex:B.borrowIndex}:void 0,rewards:p[x]?.rewards});w=w.plus(F.borrowedValue),O=O.plus(F.borrowedValueWithWeight),F.isBorrowed&&h++,u[x]=F.entry;}let N=ds({totalDepositedValue:f,totalBorrowedValue:w,totalBorrowCapacityValue:m,totalBorrowedValueWithWeight:O,totalRequiredCollateralValue:y}),v={obligationId:e,totalDepositedValue:f.toNumber(),totalBorrowedValue:w.toNumber(),totalBalanceValue:N.accountBalanceValue,totalBorrowCapacityValue:m.toNumber(),totalAvailableCollateralValue:N.availableCollateralValue,totalBorrowedValueWithWeight:O.toNumber(),totalRequiredCollateralValue:N.requiredCollateralValue,totalUnhealthyCollateralValue:N.unhealthyCollateralValue,totalRiskLevel:N.riskLevel,totalDepositedPools:b,totalBorrowedPools:h,totalRewardedPools:S,collaterals:d,debts:u,borrowIncentives:p};for(let[x,B]of Object.entries(v.collaterals)){if(!B)continue;let j=r.collaterals[x];if(!j)continue;let{availableWithdrawAmount:F,availableWithdrawCoin:q}=us({obligationCollateral:B,marketCollateral:j,totalAvailableCollateralValue:v.totalAvailableCollateralValue,totalBorrowedValueWithWeight:v.totalBorrowedValueWithWeight});B.availableWithdrawAmount=F,B.availableWithdrawCoin=q;}for(let[x,B]of Object.entries(v.debts)){if(!B)continue;let j=r.pools[x];if(!j)continue;let{availableBorrowAmount:F,availableBorrowCoin:q,requiredRepayAmount:$,requiredRepayCoin:de}=ps({obligationDebt:B,marketPool:j,totalAvailableCollateralValue:v.totalAvailableCollateralValue});B.availableBorrowAmount=F,B.availableBorrowCoin=q,B.requiredRepayAmount=$,B.requiredRepayCoin=de;}return v},yo=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=Ja(e),c=Za(o,a),i=ts(e,n),l=os(o),d=rs(r,n.sca??0);return {...ns({parsedLendings:s,parsedObligationAccounts:c,parsedVeScas:d}),lendings:s,borrowings:c,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:Ae,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(l).map(([p,b])=>({coinName:p,...b,pendingRewardInUsd:b.coinPrice*b.pendingRewardInCoin}))},veScas:d}},fo=t=>{let{coinPrices:e,marketPools:o,sCoinNames:r,parseCoinName:n}=t,a={};for(let s of r){let c=n(s);a[s]=bignumber_js.BigNumber(e[c]??0).multipliedBy(o[c]?.conversionRate??1).toNumber();}return {...e,...a}};var go=({ctx:t,txBlock:e})=>{let o={protocolPkg:t.address.get("core.packages.protocol.id"),market:t.address.get("core.market"),version:t.address.get("core.version"),coinDecimalsRegistry:t.address.get("core.coinDecimalsRegistry"),xOracle:t.address.get("core.oracles.xOracle")},n=`${t.address.get("referral.id")}::scallop_referral_program::REFERRAL_WITNESS`,a=e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {openObligation:()=>{let[s,c,i]=t.moveCall(e,`${o.protocolPkg}::open_obligation::open_obligation`,[o.version]);return [s,c,i]},returnObligation:(s,c)=>{t.moveCall(e,`${o.protocolPkg}::open_obligation::return_obligation`,[o.version,s,c]);},openObligationEntry:()=>{t.moveCall(e,`${o.protocolPkg}::open_obligation::open_obligation_entry`,[o.version]);},depositCollateral:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::deposit_collateral::deposit_collateral`,[o.version,s,o.market,c],[l]);},takeCollateral:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::withdraw_collateral::withdraw_collateral`,[o.version,s,c,o.market,o.coinDecimalsRegistry,e.pure.u64(i),o.xOracle,a],[d])},supply:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::mint::mint`,[o.version,o.market,s,a],[i])},depositEntry:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::mint::mint_entry`,[o.version,o.market,s,a],[i])},withdraw:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::redeem::redeem`,[o.version,o.market,s,a],[i])},withdrawEntry:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::redeem::redeem_entry`,[o.version,o.market,s,a],[i])},borrow:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow`,[o.version,s,c,o.market,o.coinDecimalsRegistry,i,o.xOracle,a],[d])},borrowWithReferral:(s,c,i,l,d)=>{let u=t.utils.parseCoinType(d);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow_with_referral`,[o.version,s,c,o.market,o.coinDecimalsRegistry,i,typeof l=="number"?e.pure.u64(l):l,o.xOracle,a],[u,n])},borrowEntry:(s,c,i,l)=>{let d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.protocolPkg}::borrow::borrow_entry`,[o.version,s,c,o.market,o.coinDecimalsRegistry,e.pure.u64(i),o.xOracle,a],[d])},repay:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::repay::repay`,[o.version,s,o.market,c,a],[l]);},borrowFlashLoan:(s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.protocolPkg}::flash_loan::borrow_flash_loan`,[o.version,o.market,s],[i])},repayFlashLoan:(s,c,i)=>{let l=t.utils.parseCoinType(i);t.moveCall(e,`${o.protocolPkg}::flash_loan::repay_flash_loan`,[o.version,o.market,s,c],[l]);},liquidate:(s,c,i,l)=>{let d=t.utils.parseCoinType(i),u=t.utils.parseCoinType(l),[p,b]=t.moveCall(e,`${o.protocolPkg}::liquidate::liquidate`,[o.version,s,o.market,c,o.coinDecimalsRegistry,o.xOracle,a],[d,u]);return [p,b]}}};var Oe=async(...t)=>{let[e,o,r,n]=t;if(t.length===3&&r)return {obligationId:r};if(t.length===4&&r&&n)return {obligationId:r,obligationKey:n};let a=I(o),s=await e.reads.getObligations(a);if(s.length===0)throw new Error(`No obligation found for sender ${a}`);return {obligationId:s[0].id,obligationKey:s[0].keyId}},ho=({ctx:t,txBlock:e})=>({depositCollateralQuick:async(o,r,n,a=false)=>{let s=I(e),{obligationId:c}=await Oe(t,e,n),{takeCoin:i,leftCoin:l}=await t.coins.selectCoin(e,r,o,s,a);l&&e.transferObjects([l],s),e.depositCollateral(c,i,r);},takeCollateralQuick:async(o,r,n,a,s)=>{let c=await Oe(t,e,n,a),i=await t.reads.getObligationCoinNames(c.obligationId);return await t.oracles.updateOracles(e,i,s),e.takeCollateral(c.obligationId,c.obligationKey,o,r)},supplyQuick:async(o,r,n=true,a=false)=>{let s=I(e),{leftCoin:c,takeCoin:i}=await t.coins.selectCoin(e,r,o,s,a);c&&e.transferObjects([c],s);let l=e.supply(i,r);return n?e.mintSCoin(t.utils.parseMarketCoinName(r),l):l},withdrawQuick:async(o,r)=>{let n=I(e),a=t.utils.parseSCoinName(r);if(!a)throw new Error(`No sCoin for ${r}`);let{sCoin:s,marketCoin:c}=await t.coins.selectSCoinOrMarketCoin(e,a,o,n);if(s){let i=e.burnSCoin(a,s);c?e.mergeCoins(c,[i]):c=i;}if(!c)throw new Error(`No market coin for ${r}`);return e.withdraw(c,r)},borrowQuick:async(o,r,n,a,s)=>{let c=await Oe(t,e,n,a),l=[...await t.reads.getObligationCoinNames(c.obligationId)??[],r];return await t.oracles.updateOracles(e,l,s),e.borrow(c.obligationId,c.obligationKey,o,r)},borrowWithReferralQuick:async(o,r,n,a,s,c)=>{let i=await Oe(t,e,a,s),d=[...await t.reads.getObligationCoinNames(i.obligationId)??[],r];return await t.oracles.updateOracles(e,d,c),e.borrowWithReferral(i.obligationId,i.obligationKey,n,o,r)},repayQuick:async(o,r,n,a=false)=>{let s=I(e),c=await Oe(t,e,n),{leftCoin:i,takeCoin:l}=await t.coins.selectCoin(e,r,o,s,a);return i&&e.transferObjects([i],s),e.repay(c.obligationId,l,r)},updateAssetPricesQuick:async(o,r)=>await t.oracles.updateOracles(e,o,r),liquidateQuick:async(o,r,n,a,s)=>{let c=I(e),i=await t.reads.getObligationCoinNames(a);await t.oracles.updateOracles(e,i,s);let{takeCoin:l,leftCoin:d}=await t.coins.selectCoin(e,r,o,c,s?.isSponsoredTx??false);d&&e.transferObjects([d],c);let u=typeof a=="string"?e.object(a):a;return e.liquidate(u,l,r,n)}});var Rt=class extends pythSuiJs.SuiPythClient{constructor(o,r,n,a){super(o,r,n);this.params=a;}async updatePriceFeedsWithSponsoredBaseUpdateFee(o,r,n){if(!this.params)throw new Error("Please provide params");let{defaultPackageId:a,gasStationId:s}=this.params,c=await this.getPythPackageId(),i=await this.verifyVaasAndGetHotPotato(o,r,c),l=[];for(let u of n){let p=await this.getPriceFeedObjectId(u);if(!p)throw new Error(`Price feed object not found for ID: ${u}`);l.push(p);}let d=o.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});for(let u=0;u<l.length;u++){let p=l[u];[i]=o.moveCall({target:`${a}::pyth_sponsor::update_single_price_feed_with_sponsor`,arguments:[o.object(this.pythStateId),i,o.object(p),o.object(s),d]});}o.moveCall({target:`${c}::hot_potato_vector::destroy`,arguments:[i],typeArguments:[`${c}::price_info::PriceInfo`]});}},So=async(t,e,o,r=false)=>{let n=(()=>{try{return t.suiKit.suiInteractor.currentFullNode}catch{return jsonRpc.getJsonRpcFullnodeUrl("mainnet")}})(),a=t.suiKit.client.network,s=new jsonRpc.SuiJsonRpcClient({url:n,network:a}),c=new Rt(s,t.address.get("core.oracles.pyth.state"),t.address.get("core.oracles.pyth.wormholeState"),{defaultPackageId:"0xa6f9bec2f9748656b6af8aafb5d7bc1a0d5faf25ac9645fc7f447822cd509325",gasStationId:"0xa8b8dcc9880166edb57b53e05f8df7364d31b5d9b7d107fd27f0b69cf338b687"}),i=Array.from(new Set(e.map(d=>t.address.get(`core.coins.${d}.oracle.pyth.feed`)))),l=t.pythEndpoints??[...t.constants.whitelist.pythEndpoints];for(let d of l)try{let p=await new pythSuiJs.SuiPriceServiceConnection(d,{priceFeedRequestConfig:{binary:!0}}).getPriceFeedsUpdateData(i);r?await c.updatePriceFeedsWithSponsoredBaseUpdateFee(o.txBlock,p,i):await c.updatePriceFeeds(o.txBlock,p,i);return}catch(u){t.utils.logger.warn("pyth price-feed update failed; trying next endpoint",{endpoint:d,message:u?.message});}};var Co=async(t,e,o=[...t.constants.whitelist.lending],r)=>{let n=r?.usePythPullModel??t.usePythPullModel,a=r?.useOnChainXOracleList??t.useOnChainXOracleList,s=new Set((r?.sponsoredFeeds??t.sponsoredFeeds).filter(b=>t.constants.whitelist.lending.has(b)?true:(t.utils.logger.warn("sponsored feed not in lending whitelist; skipping",{feed:b}),false))),c=r?.isSponsoredTx??false,i=a?await t.query.getAssetOracles():no,l=new Set(Object.values(i).flatMap(({primary:b,secondary:f})=>[...b,...f])),d=(b,f)=>{let m=i[b];return m&&(m.primary.includes(f)||m.secondary.includes(f))},u=[...new Set(o)],p=u.filter(b=>d(b,"pyth"));if(l.has("pyth")){let b=[];for(let f of p){let m=!n&&!s.has(f);(n||m)&&b.push(f);}b.length>0&&await So(t,b,e,c);}for(let b of u)Ss(t,e,b,i[b]);},Ss=(t,e,o,r)=>{let n=t.utils.parseCoinType(o);Cs(e,r,t.address.get("core.packages.xOracle.id"),t.address.get("core.oracles.xOracle"),t.address.get("core.packages.pyth.id"),t.address.get("core.oracles.pyth.registry"),t.address.get("core.oracles.pyth.state"),t.address.get(`core.coins.${o}.oracle.pyth.feedObject`),t.address.get("core.packages.switchboard.id"),t.address.get("core.oracles.switchboard.registry"),t.address.get(`core.coins.${o}.oracle.switchboard`),t.address.get("core.packages.supra.id"),t.address.get("core.oracles.supra.registry"),t.address.get("core.oracles.supra.holder"),n);},Cs=(t,e,o,r,n,a,s,c,i,l,d,u,p,b,f)=>{let m=h=>typeof h=="string"?t.object(h):h;r=m(r),a=m(a),s=m(s),c=m(c),l=m(l),d=m(d),p=m(p),b=m(b);let y=ws(t,o,r,f);return Object.entries(e).forEach(([h,S])=>{S.includes("pyth")&&As(h,t,n,y,s,c,a,f),S.includes("supra")&&Ts(h,t,u,y,b,p,f),S.includes("switchboard")&&ks(h,t,i,y,d,l,f);}),xs(t,o,r,y,f),t},ws=(t,e,o,r)=>{let n=`${e}::x_oracle::price_update_request`,a=[r];return t.moveCall(n,[o],a)},xs=(t,e,o,r,n)=>{let a=`${e}::x_oracle::confirm_price_update_request`,s=[n];return t.moveCall(a,[o,r,t.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"})],s),t},Ts=(t,e,o,r,n,a,s)=>{e.moveCall(`${o}::rule::set_price_as_${t}`,[r,n,a,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[s]);},ks=(t,e,o,r,n,a,s)=>{e.moveCall(`${o}::rule::set_as_${t}_price`,[r,n,a,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[s]);},As=(t,e,o,r,n,a,s,c)=>{e.moveCall(`${o}::rule::set_price_as_${t}`,[r,n,a,s,e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,initialSharedVersion:"1",mutable:false})],[c]);};var wo=async(t,e)=>{let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("getObligationCoinNames expects an object id (string) or an object reference");let r=await t.query.repos.obligation.getObligationData(o);if(!r)return;let n=r.collaterals.map(i=>i.type),a=r.debts.map(i=>i.type);return [...new Set([...n,...a])].map(i=>t.utils.parseCoinNameFromType(i))};var To=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={reads:{getObligations:i=>t.query.getObligations(i),getObligationCoinNames:i=>wo(t,i)},coins:{selectCoin:(...i)=>t.selectCoin(...i),selectSCoinOrMarketCoin:(...i)=>t.selectSCoinOrMarketCoin(...i)},oracles:{updateOracles:(i,l,d)=>Co(t,i,l,d)},utils:{parseMarketCoinName:i=>t.utils.parseMarketCoinName(i),parseSCoinName:i=>t.utils.parseSCoinName(i)}},a=go({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=ho({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var ko=({ctx:t,txBlock:e})=>{let o={spoolPkg:t.address.get("spool.id")},r=e.sharedObjectRef({objectId:utils.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {createStakeAccount:n=>{let a=t.utils.parseMarketCoinType(n),s=t.address.get(`spool.pools.${n}.id`);return t.moveCall(e,`${o.spoolPkg}::user::new_spool_account`,[s,r],[a])},stake:(n,a,s)=>{let c=t.utils.parseMarketCoinType(s),i=t.address.get(`spool.pools.${s}.id`);t.moveCall(e,`${o.spoolPkg}::user::stake`,[i,n,a,r],[c]);},unstake:(n,a,s)=>{let c=t.utils.parseMarketCoinType(s),i=t.address.get(`spool.pools.${s}.id`);return t.moveCall(e,`${o.spoolPkg}::user::unstake`,[i,n,a,r],[c])},claim:(n,a)=>{let s=t.address.get(`spool.pools.${a}.id`),c=t.address.get(`spool.pools.${a}.rewardPoolId`),i=t.utils.parseMarketCoinType(a),l=t.utils.getSpoolRewardCoinName(),d=t.utils.parseCoinType(l);return t.moveCall(e,`${o.spoolPkg}::user::redeem_rewards`,[s,c,n,r],[i,d])}}};var Ao=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&n)return [n];let a=I(o),s=await e.reads.getAllStakeAccounts(a);if(s[r].length===0)throw new Error(`No stake account id found for sender ${a}`);return s[r].map(c=>c.id)},Rs=async(...t)=>{let[e,o,r,n]=t,a=I(o),s=await e.reads.getAllStakeAccounts(a);if(s[r].length===0)throw new Error(`No stake account found for sender ${a}`);return n?s[r].filter(i=>i.id===n):s[r]},Oo=async(t,e,o,r,n,a,s=false)=>{try{let{takeCoin:c,leftCoin:i,totalAmount:l}=s?await t.coins.selectSCoin(e,r,n,a):await t.coins.selectMarketCoin(e,r,n,a);if(s){let d=e.burnSCoin(r,c);e.stake(o,d,r);}else e.stake(o,c,r);return e.transferObjects([i],a),l}catch{return 0}},Po=({ctx:t,txBlock:e})=>({stakeQuick:async(o,r,n)=>{let a=I(e),s=await Ao(t,e,r,n);if(s.length===0)throw new Error(`No stakeAccountIds found for user ${a}`);if(typeof o=="number"){let c=await Oo(t,e,s[0],r,o,a);o-=c,o>0&&await Oo(t,e,s[0],r,o,a,true);}else e.stake(s[0],o,r);},unstakeQuick:async(o,r,n,a=true)=>{let s=await Rs(t,e,r,n),c=[];for(let i of s){if(i.staked===0)continue;let l=Math.min(o,i.staked),d=e.unstake(i.id,l,r);if(a){let u=e.mintSCoin(r,d);c.push(u);}else c.push(d);if(o-=l,o<=0)break}if(c.length>0){let i=c[0];return c.length>1&&e.mergeCoins(i,c.slice(1)),i}},claimQuick:async(o,r)=>{let n=await Ao(t,e,o,r),a=[];for(let s of n){let c=await e.claim(s,o);a.push(c);}return a}});var vo=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={reads:{getAllStakeAccounts:i=>t.query.getAllStakeAccounts(i)},coins:{selectMarketCoin:(...i)=>t.selectMarketCoin(...i),selectSCoin:(...i)=>t.selectSCoin(...i)}},a=ko({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Po({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Io=({ctx:t,txBlock:e})=>{let o={borrowIncentivePkg:t.address.get("borrowIncentive.id"),query:t.address.get("borrowIncentive.query"),config:t.address.get("borrowIncentive.config"),incentivePools:t.address.get("borrowIncentive.incentivePools"),incentiveAccounts:t.address.get("borrowIncentive.incentiveAccounts"),obligationAccessStore:t.address.get("core.obligationAccessStore")},r={table:t.address.get("vesca.table"),treasury:t.address.get("vesca.treasury"),config:t.address.get("vesca.config")},n=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {stakeObligation:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::stake`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,o.obligationAccessStore,n]);},stakeObligationWithVesca:(a,s,c)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::stake_with_ve_sca_v2`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,o.obligationAccessStore,r.config,r.treasury,r.table,c,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n],[]);},unstakeObligation:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::unstake_v2`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n]);},claimBorrowIncentive:(a,s,c)=>{let i=t.utils.parseCoinType(c);return t.moveCall(e,`${o.borrowIncentivePkg}::user::redeem_rewards`,[o.config,o.incentivePools,o.incentiveAccounts,s,a,n],[i])},deactivateBoost:(a,s)=>{t.moveCall(e,`${o.borrowIncentivePkg}::user::deactivate_boost_v2`,[o.config,o.incentivePools,o.incentiveAccounts,a,s,t.address.get("vesca.subsTable"),t.address.get("vesca.subsWhitelist"),n]);}}};var Xe=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&r&&n&&typeof r=="string"){let i=await e.reads.getObligationLocked(r);return {obligationId:r,obligationKey:n,obligationLocked:i}}let a=I(o),s=await e.reads.getObligations(a);if(s.length===0)throw new Error(`No obligation found for sender ${a}`);let c=s.find(i=>i.id===r||i.keyId===n);if(!c)throw new Error(`No obligation found for sender ${a} with id ${r} or key ${n}`);return {obligationId:c.id,obligationKey:c.keyId,obligationLocked:c.locked}},No=({ctx:t,txBlock:e})=>({stakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await Xe(t,e,o,r),c=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&(ae(i)===`${At}::user::unstake`||ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake`));(!s||c)&&e.stakeObligation(n,a);},stakeObligationWithVeScaQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s,obligationLocked:c}=await Xe(t,e,o,r),i=!!e.txBlock.getData().commands.find(l=>l.$kind==="MoveCall"&&(ae(l)===`${At}::user::unstake`||ae(l)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||ae(l)===`${t.address.get("borrowIncentive.id")}::user::unstake`));if(!c||i){let d=await t.reads.getBindedVeScaKey(a)??n;d?e.stakeObligationWithVesca(a,s,d):e.stakeObligation(a,s);}},unstakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await Xe(t,e,o,r);s&&e.unstakeObligation(n,a);},claimBorrowIncentiveQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s}=await Xe(t,e,r,n);return e.claimBorrowIncentive(a,s,o)}});var Bo=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={address:t.address,reads:{getObligations:i=>t.query.getObligations(i),getObligationLocked:i=>t.query.getObligationLocked(i),getBindedVeScaKey:i=>t.query.getBindedVeScaKey(i)}},a=Io({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=No({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Mo=({ctx:t,txBlock:e})=>{let o={id:t.address.get("vesca.id"),table:t.address.get("vesca.table"),treasury:t.address.get("vesca.treasury"),config:t.address.get("vesca.config"),subsTable:t.address.get("vesca.subsTable")},r=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {lockSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::mint_ve_sca_key`,[o.config,o.table,o.treasury,n,a,r],[]),extendLockPeriod:(n,a)=>{t.moveCall(e,`${o.id}::ve_sca::extend_lock_period`,[o.config,n,o.table,o.treasury,a,r],[]);},extendLockAmount:(n,a)=>{t.moveCall(e,`${o.id}::ve_sca::lock_more_sca`,[o.config,n,o.table,o.treasury,a,r],[]);},renewExpiredVeSca:(n,a,s)=>{t.moveCall(e,`${o.id}::ve_sca::renew_expired_ve_sca`,[o.config,n,o.table,o.treasury,a,s,r],[]);},redeemSca:n=>t.moveCall(e,`${o.id}::ve_sca::redeem`,[o.config,n,o.table,o.treasury,r],[]),mintEmptyVeSca:()=>t.moveCall(e,`${o.id}::ve_sca::mint_ve_sca_placeholder_key`,[o.config,o.table],[]),splitVeSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::split`,[o.config,n,o.table,o.subsTable,e.pure.u64(a)]),mergeVeSca:(n,a)=>t.moveCall(e,`${o.id}::ve_sca::merge`,[o.config,n,a,o.table,o.subsTable,e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"})],[])}};var Pe=async(...t)=>{let[e,o,r]=t;if(t.length===3&&r&&typeof r<"u"){let s=await e.reads.getVeSca(r);return s||void 0}let n=I(o),a=await e.reads.getVeScas({walletAddress:n});if(a.length!==0)return r?a.find(({keyId:s})=>(typeof r=="string"?r:r.objectId)===s):a[0]},vt=async(...t)=>{let[e,o,r]=t;try{return await e.reads.isVeScaKeyInSubsTable(o,r)}catch(n){return e.utils.logger.error("isInSubsTable lookup failed",{veScaKey:o,tableId:r,message:n?.message}),false}},Fo=({ctx:t,txBlock:e})=>({lockScaQuick:async({amountOrCoin:o,lockPeriodInDays:r,autoCheck:n=true,veScaKey:a})=>{let s=I(e),c=await Pe(t,e,a),i=t.utils.getUnlockAt(r,c?.unlockAt);n&&io(o,r,i,c?.unlockAt);let l,d=[];if(o!==void 0&&typeof o=="number"){let b=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:s}),[f,m]=e.takeAmountFromCoins(b,o);l=f,d.push(m);}else l=o;let u=!c,p=!u&&c.unlockAt<=new Date().getTime();if(u||p){if(l)if(u){let b=e.lockSca(l,i);d.push(b);}else {if(c.lockedScaCoin!==0){let b=e.redeemSca(c.keyId);d.push(b);}e.renewExpiredVeSca(c.keyId,l,i);}}else l&&r?(e.extendLockPeriod(c.keyId,i),e.extendLockAmount(c.keyId,l)):r?e.extendLockPeriod(c.keyId,i):l&&e.extendLockAmount(c.keyId,l);d.length>0&&e.transferObjects(d,s);},extendLockPeriodQuick:async({lockPeriodInDays:o,veScaKey:r,autoCheck:n=true})=>{let a=await Pe(t,e,r),s=t.utils.getUnlockAt(o,a?.unlockAt);n&&Pt(o,s,a?.unlockAt),a&&e.extendLockPeriod(a.keyId,s);},extendLockAmountQuick:async({scaAmount:o,veScaKey:r,autoCheck:n=true})=>{let a=I(e),s=await Pe(t,e,r);if(n&&co(o,s?.unlockAt),s){let c=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:a}),[i,l]=e.takeAmountFromCoins(c,o);e.extendLockAmount(s.keyId,i),e.transferObjects([l],a);}},renewExpiredVeScaQuick:async({scaAmount:o,lockPeriodInDays:r,veScaKey:n,autoCheck:a=true})=>{let s=I(e),c=await Pe(t,e,n),i=t.utils.getUnlockAt(r,c?.unlockAt);if(a&&lo(o,r,c?.unlockAt),c){let l=[];if(c.lockedScaCoin!==0){let b=e.redeemSca(c.keyId);l.push(b);}let d=await t.utils.selectCoins({amount:o,coinType:Ue,ownerAddress:s}),[u,p]=e.takeAmountFromCoins(d,o);l.push(p),e.renewExpiredVeSca(c.keyId,u,i),e.transferObjects(l,s);}},redeemScaQuick:async({veScaKey:o,transferSca:r})=>{let n=I(e),a=await Pe(t,e,o);if(Te(a?.unlockAt),a){let s=e.redeemSca(a.keyId);if(r){e.transferObjects([s],n);return}return s}},splitVeScaQuick:async({splitAmount:o,veScaKey:r,transferVeScaKey:n=true})=>{let a=await vt(t,r,t.address.get("vesca.subsTable")),s=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&ae(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`);if(a&&!s)throw new Error("Key cannot be in the subs table, please call unsubscribe vesca or unstake obligation first");let c=e.splitVeSca(r,o);if(n){e.transferObjects([c],I(e));return}else return c},mergeVeScaQuick:async({targetVeScaKey:o,sourceVeScaKey:r})=>{let n=t.address.get("vesca.subsTableId"),[a,s]=await Promise.all([vt(t,o,n),vt(t,r,n)]),c=!!e.txBlock.getData().commands.find(d=>d.$kind==="MoveCall"&&ae(d)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`);if((a||s)&&!c)throw new Error("Both target and source cannot be in the subs table. Please call unsubscribe vesca or unstake obligation first");let[i,l]=await Promise.all([t.reads.getVeSca(r),t.reads.getVeSca(o)]);if(!i||!l)throw new Error("Source or target veSCA not found");return i.unlockAt<l.unlockAt?e.extendLockPeriod(i.keyId,l.unlockAt/1e3):i.unlockAt>l.unlockAt&&e.extendLockPeriod(l.keyId,i.unlockAt/1e3),e.mergeVeSca(o,r)}});var Lo=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={address:t.address,utils:t.utils,reads:{getVeSca:i=>t.query.getVeSca(i),getVeScas:i=>t.query.getVeScas(i),isVeScaKeyInSubsTable:(i,l)=>t.query.repos.veSca.isVeScaKeyInSubsTable(i,l)}},a=Mo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Fo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Eo=({ctx:t,txBlock:e})=>{let o={referralPgkId:t.address.get("referral.id"),referralBindings:t.address.get("referral.referralBindings"),referralRevenuePool:t.address.get("referral.referralRevenuePool"),authorizedWitnessList:t.address.get("referral.authorizedWitnessList"),referralTiers:t.address.get("referral.referralTiers"),version:t.address.get("referral.version")},r=t.address.get("vesca.table"),n=e.sharedObjectRef({objectId:suiKit.SUI_CLOCK_OBJECT_ID,mutable:false,initialSharedVersion:"1"});return {bindToReferral:a=>{t.moveCall(e,`${o.referralPgkId}::referral_bindings::bind_ve_sca_referrer`,[o.referralBindings,e.pure.id(a),r,n],[]);},claimReferralTicket:a=>{let s=t.utils.parseCoinType(a);return t.moveCall(e,`${o.referralPgkId}::scallop_referral_program::claim_ve_sca_referral_ticket`,[o.version,r,o.referralBindings,o.authorizedWitnessList,o.referralTiers,n],[s])},burnReferralTicket:(a,s)=>{let c=t.utils.parseCoinType(s);t.moveCall(e,`${o.referralPgkId}::scallop_referral_program::burn_ve_sca_referral_ticket`,[o.version,a,o.referralRevenuePool,n],[c]);},claimReferralRevenue:(a,s)=>{let c=t.utils.parseCoinType(s);return t.moveCall(e,`${o.referralPgkId}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,[o.version,o.referralRevenuePool,a,n],[c])},unbindReferral:()=>t.moveCall(e,`${o.referralPgkId}::referral_bindings::unbind_ve_sca_referrer`,[o.referralBindings])}};var Vo=({ctx:t,txBlock:e})=>({claimReferralRevenueQuick:async(o,r=[...t.constants.whitelist.lending])=>{let n=I(e),a=[];for(let s of r)if(s==="sui"){let c=e.claimReferralRevenue(o,s);a.push(c);}else {let c=e.claimReferralRevenue(o,s);try{let i=await t.utils.selectCoins({amount:1/0,coinType:t.utils.parseCoinType(s),ownerAddress:n});e.mergeCoins(c,i.slice(0,500));}catch{}finally{a.push(c);}}a.length>0&&e.transferObjects(a,n);}});var qo=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,constants:{whitelist:t.constants.whitelist}},a=Eo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Vo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Wo=({ctx:t,txBlock:e})=>{let o={pkgId:t.address.get("loyaltyProgram.id"),scaRewardPool:t.address.get("loyaltyProgram.rewardPool")},r={object:t.address.get("vesca.object"),protocolConfig:t.address.get("vesca.config"),veScaTable:t.address.get("vesca.table"),subsTable:t.address.get("vesca.subsTable")},n={pkgId:t.address.get("veScaLoyaltyProgram.id"),veScaRewardPool:t.address.get("veScaLoyaltyProgram.veScaRewardPool")};return {claimLoyaltyRevenue:a=>t.moveCall(e,`${o.pkgId}::reward_pool::redeem_reward`,[o.scaRewardPool,a]),claimVeScaLoyaltyReward:a=>t.moveCall(e,`${n.pkgId}::ve_sca_reward::redeem_reward`,[n.veScaRewardPool,a,r.protocolConfig,r.veScaTable,r.subsTable])}};var Uo=({ctx:t,txBlock:e})=>({claimLoyaltyRevenueQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=I(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimLoyaltyRevenue(o),a=t.constants.coinTypes.sca;if(!a)throw new Error("Coin type sca not found");await t.utils.mergeSimilarCoins(e,n,a,I(e)),e.transferObjects([n],r);},claimVeScaLoyaltyRewardQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=I(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimVeScaLoyaltyReward(o);e.transferObjects([n],r);}});var $o=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,reads:{getVeScas:(...i)=>t.query.getVeScas(...i)},constants:{coinTypes:t.constants.coinTypes}},a=Wo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Uo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Go=({ctx:t,txBlock:e})=>{let o={pkgId:t.address.get("scoin.id")};return {mintSCoin:(r,n)=>{let a=t.utils.parseSCoinType(r);if(!a)throw new Error(`Invalid marketCoinName name: ${r}`);return t.moveCall(e,`${o.pkgId}::s_coin_converter::mint_s_coin`,[t.utils.getSCoinTreasury(r),n],[a,t.utils.parseUnderlyingSCoinType(r)])},burnSCoin:(r,n)=>{let a=t.utils.parseSCoinType(r);if(!a)throw new Error(`Invalid sCoin name: ${r}`);return t.moveCall(e,`${o.pkgId}::s_coin_converter::burn_s_coin`,[t.utils.getSCoinTreasury(r),n],[a,t.utils.parseUnderlyingSCoinType(r)])}}};var zo=({ctx:t,txBlock:e})=>({mintSCoinQuick:async(o,r)=>{let n=I(e),{leftCoin:a,takeCoin:s}=await t.coins.selectMarketCoin(e,o,r,n);return e.transferObjects([a],n),e.mintSCoin(o,s)},burnSCoinQuick:async(o,r)=>{let n=I(e),{leftCoin:a,takeCoin:s}=await t.coins.selectSCoin(e,o,r,n);return e.transferObjects([a],n),e.burnSCoin(o,s)}});var Ho=(t,e)=>{let o=e instanceof suiKit.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n={utils:t.utils,coins:{selectMarketCoin:(...i)=>t.selectMarketCoin(...i),selectSCoin:(...i)=>t.selectSCoin(...i)}},a=Go({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=zo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Xo=({ctx:t,txBlock:e})=>{let o={pkgId:t.address.get("obligationNaming.id"),namingRegistry:t.address.get("obligationNaming.namingRegistry")};return {setObligationName:(r,n)=>{t.moveCall(e,`${o.pkgId}::obligation_naming::set_name`,[o.namingRegistry,r,e.pure.string(n)],[]);},removeObligationName:r=>{t.moveCall(e,`${o.pkgId}::obligation_naming::remove_name`,[o.namingRegistry,r],[]);}}};var Zo=(t,e)=>{let o=e instanceof transactions.Transaction?new suiKit.SuiTxBlock(e):e||new suiKit.SuiTxBlock,r={address:t.address,moveCall:t.moveCall.bind(t),utils:t.utils},n=Xo({ctx:r,txBlock:o});return new Proxy(o,{get:(a,s)=>s in n?Reflect.get(n,s):Reflect.get(a,s)})};var er=["openObligation","returnObligation","openObligationEntry","depositCollateral","takeCollateral","supply","depositEntry","withdraw","withdrawEntry","borrow","borrowWithReferral","borrowEntry","repay","borrowFlashLoan","repayFlashLoan","liquidate"],tr=["depositCollateralQuick","takeCollateralQuick","borrowQuick","borrowWithReferralQuick","supplyQuick","withdrawQuick","repayQuick","updateAssetPricesQuick","liquidateQuick"],or=["createStakeAccount","stake","unstake","claim","stakeQuick","unstakeQuick","claimQuick"],rr=["stakeObligation","stakeObligationWithVesca","unstakeObligation","claimBorrowIncentive","deactivateBoost","stakeObligationQuick","stakeObligationWithVeScaQuick","unstakeObligationQuick","claimBorrowIncentiveQuick"],nr=["lockSca","extendLockPeriod","extendLockAmount","renewExpiredVeSca","redeemSca","mintEmptyVeSca","splitVeSca","mergeVeSca","lockScaQuick","extendLockPeriodQuick","extendLockAmountQuick","renewExpiredVeScaQuick","redeemScaQuick","splitVeScaQuick","mergeVeScaQuick"],ar=["bindToReferral","claimReferralTicket","burnReferralTicket","claimReferralRevenue","unbindReferral","claimReferralRevenueQuick"],sr=["claimLoyaltyRevenue","claimVeScaLoyaltyReward","claimLoyaltyRevenueQuick","claimVeScaLoyaltyRewardQuick"],ir=["mintSCoin","burnSCoin","mintSCoinQuick","burnSCoinQuick"],cr=["setObligationName","removeObligationName"];var ue=(t,e)=>{let o={};for(let r of e){let n=t[r];typeof n=="function"&&(o[r]=n);}return Object.freeze(o)},lr=t=>{let e=t;return Object.freeze({core:ue(e,[...er,...tr]),spool:ue(e,or),borrowIncentive:ue(e,rr),vesca:ue(e,nr),referral:ue(e,ar),loyalty:ue(e,sr),sCoin:ue(e,ir),obligationNaming:ue(e,cr)})},dr=["core","spool","borrowIncentive","vesca","referral","loyalty","sCoin","obligationNaming"];var ur=(t,e)=>{let o=Zo(t,e),r=Lo(t,o),n=$o(t,r),a=Bo(t,n),s=qo(t,a),c=Ho(t,s),i=vo(t,c),l=To(t,i),d=new Proxy(l,{get:(b,f)=>f in r?Reflect.get(r,f):f in a?Reflect.get(a,f):f in s?Reflect.get(s,f):f in i?Reflect.get(i,f):f in n?Reflect.get(n,f):f in c?Reflect.get(c,f):f in o?Reflect.get(o,f):Reflect.get(b,f)}),u=lr(d),p=new Set(dr);return new Proxy(d,{get:(b,f)=>typeof f=="string"&&p.has(f)?u[f]:Reflect.get(b,f),has:(b,f)=>typeof f=="string"&&p.has(f)?true:Reflect.has(b,f)})};var pr={effects:true,events:true},Je=class{constructor(e){this.suiKit=e;}get client(){return this.suiKit.client.core}signTransaction(e,o){return this.suiKit.signTxn(e,o)}executeTransaction(e){return this.client.executeTransaction({include:pr,...e})}signAndExecuteTransaction({transaction:e,additionalSignatures:o,signer:r,derivePathParams:n}){return this.client.signAndExecuteTransaction({transaction:e,additionalSignatures:o,include:pr,signer:r??this.suiKit.getKeypair(n)})}signAndSendTxn(e,o){let r=e instanceof Uint8Array?e:"txBlock"in e?e.txBlock:e;return this.signAndExecuteTransaction({transaction:r,derivePathParams:o})}};var k=(t,e)=>{let o=e instanceof G?e.context:void 0;return t?.error(e.message,o),e},V=async t=>{if(t.source==="api")return t.api();if(t.source==="api-first")try{return await t.api()}catch(e){return t.logger?.warn(`[${t.label}] api failed, falling back to onchain`,{cause:e instanceof Error?e.message:String(e)}),t.onchain()}return t.onchain()},Ls=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),Es=new Set(["notExists","dynamicFieldNotFound","deleted"]),It=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&Es.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ce=async(t,e)=>{try{return await Ls(t,e)}catch(o){if(It(o))return null;throw o}};var pe=class{client;constructor({url:e,client:o,timeout:r=8e3}={}){this.client=o??Vs__default.default.create({baseURL:e,headers:{"Content-Type":"application/json",Accept:"application/json"},timeout:r});}async get(e){let o=await this.client.get(e);if(o.status!==200)throw new Error(`API request failed with status ${o.status}: ${o.statusText}`);return o.data}};var Ze=class extends pe{constructor({url:e=qe,...o}){super({url:e,...o});}};var et=class{constructor(e=10){this.capacity=e;this.refillRate=this.capacity/1e3,this.tokens=this.capacity,this.lastRefillTime=Date.now();}tokens;lastRefillTime;refillRate;refill(){let e=Date.now(),r=(e-this.lastRefillTime)*this.refillRate;this.tokens=Math.min(this.capacity,this.tokens+r),this.lastRefillTime=e;}getTimeToNextToken(){if(this.refill(),this.tokens>=1)return 0;let e=1-this.tokens;return Math.ceil(e/this.refillRate)}async acquireToken(){for(;;){let e=this.getTimeToNextToken();if(e===0){if(this.tokens>=1){this.tokens-=1;return}continue}await new Promise(o=>setTimeout(o,e)),this.refill();}}async execute(e){return await this.acquireToken(),await e()}};var Ks=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],qs=new Set(Ks),mr=new Map;var Ws=(t,e)=>{let o=mr.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,mr.set(t,o);},Us=(t,e)=>new Proxy(t,{get(o,r,n){let a=Reflect.get(o,r,n);if(typeof a!="function")return a;let s=a.bind(o);return typeof r=="string"&&qs.has(r)?(...c)=>{let i=Date.now();return e.execute(()=>(Ws(r,Date.now()-i),s(...c)))}:s}}),tt=class{client;url;constructor({client:e,url:o,tokensPerSecond:r}){this.client=Us(e,new et(r)),this.url=o;}async getObject(e){let{objectId:o}=e,{objects:[r]}=await this.client.getObjects({objectIds:[o],signal:e.signal,include:e.include});if(r instanceof Error)throw r;return {object:r}}};var Nt=(t,e,o)=>new tt({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond}),br=(t=qe)=>new Ze({url:t}),yr=(t=Ke)=>new pe({url:t});var fr=["supra","switchboard","pyth"];var gr=t=>({whitelist:{lending:t.constants.whitelist.lending,collateral:t.constants.whitelist.collateral},poolAddresses:t.constants.poolAddresses,parseCoinNameFromType:e=>t.parseCoinNameFromType(e),parseCoinType:e=>t.parseCoinType(e),parseSymbol:e=>t.parseSymbol(e),parseMarketCoinType:e=>t.parseMarketCoinType(e),parseMarketCoinName:e=>t.parseMarketCoinName(e),parseSCoinType:e=>t.parseSCoinType(e),getCoinWrappedType:e=>t.getCoinWrappedType(e),getCoinDecimal:e=>t.getCoinDecimal(e),parseAprToApy:e=>t.parseAprToApy(e)}),hr=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),Sr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {whitelist:{lending:t.constants.whitelist.lending,scoin:t.constants.whitelist.scoin},addresses:{scoin:e.scoin},parseCoinType:o=>t.parseCoinType(o),parseSCoinType:o=>t.parseSCoinType(o),parseMarketCoinType:o=>t.parseMarketCoinType(o),parseSCoinNameFromType:o=>t.parseSCoinNameFromType(o),parseUnderlyingSCoinType:o=>t.parseUnderlyingSCoinType(o),getSCoinTreasury:o=>t.getSCoinTreasury(o),getCoinDecimal:o=>t.getCoinDecimal(o),parseCoinName:o=>t.parseCoinName(o)}},Cr=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},wr=t=>({addresses:{protocolObjectId:t.address.get("core.object"),queryPackageId:t.address.get("core.packages.query.id"),version:t.address.get("core.version"),market:t.address.get("core.market")}}),xr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {whitelist:{lending:t.constants.whitelist.lending},addresses:{borrowIncentive:e.borrowIncentive,core:{object:t.address.get("core.object")},vesca:{object:t.address.get("vesca.object")}},parseCoinNameFromType:o=>t.parseCoinNameFromType(o),parseSymbol:o=>t.parseSymbol(o),getCoinDecimal:o=>t.getCoinDecimal(o)}},Tr=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),kr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{coins:Object.fromEntries(Object.entries(e.core.coins).filter(r=>r[1]!==void 0))}}},Ar=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{core:{coins:e.core.coins,market:e.core.market},spool:{pools:e.spool.pools},scoin:{coins:e.scoin.coins}}}},Or=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),Pr=t=>({addresses:{veSca:{id:t.address.get("vesca.id"),config:t.address.get("vesca.config"),tableId:t.address.get("vesca.tableId"),object:t.address.get("vesca.object"),treasury:t.address.get("vesca.treasury")}}}),Rr=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),vr=t=>{let e=t.address.getAddresses();if(!e)throw new re("Addresses are not initialized; call init() before building repositories");return {addresses:{veSca:{tableId:e.vesca.tableId},veScaLoyaltyProgram:{veScaRewardPool:e.veScaLoyaltyProgram.veScaRewardPool,veScaRewardTableId:e.veScaLoyaltyProgram.veScaRewardTableId}}}},Ir=t=>({whitelist:{spool:t.constants.whitelist.spool},addresses:{spoolObjectId:t.address.get("spool.object"),spools:[...t.constants.whitelist.spool].reduce((e,o)=>(e[o]={id:t.address.get(`spool.pools.${o}.id`),rewardPoolId:t.address.get(`spool.pools.${o}.rewardPoolId`)},e),{})},poolAddresses:t.constants.poolAddresses,parseCoinName:e=>t.parseCoinName(e),parseSymbol:e=>t.parseSymbol(e),parseCoinType:e=>t.parseCoinType(e),parseMarketCoinType:e=>t.parseMarketCoinType(e),parseSCoinType:e=>t.parseSCoinType(e),isMarketCoin:e=>t.isMarketCoin(e),getCoinDecimal:e=>t.getCoinDecimal(e)??0,getSpoolRewardCoinName:()=>t.getSpoolRewardCoinName()}),Nr=t=>({addresses:{...fr.reduce((e,o)=>(e[o]={object:t.address.get(`core.packages.${o}.object`)},e),{}),xOracleObject:t.address.get("core.packages.xOracle.object"),oracles:{primaryPriceUpdatePolicyVecsetId:t.address.get("core.oracles.primaryPriceUpdatePolicyVecsetId"),secondaryPriceUpdatePolicyVecsetId:t.address.get("core.oracles.secondaryPriceUpdatePolicyVecsetId"),primaryPriceUpdatePolicyObject:t.address.get("core.oracles.primaryPriceUpdatePolicyObject"),secondaryPriceUpdatePolicyObject:t.address.get("core.oracles.secondaryPriceUpdatePolicyObject"),switchboardRegistryTableId:t.address.get("core.oracles.switchboard.registryTableId")}},whitelist:{lending:t.constants.whitelist.lending},parseCoinNameFromType:e=>t.parseCoinNameFromType(e),parseCoinType:e=>t.parseCoinType(e),getSwitchboardAggAddress:e=>t.address.get(`core.coins.${e}.oracle.switchboard`)});var me={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}};var jr=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var Br=new queryCore.QueryClient(We);var R=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=Br,logger:o=me,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=jr(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function U(t){let{type:e,value:o}=t;if(t.bcs instanceof Uint8Array)return {type:e,bcs:t.bcs};if(o===void 0)throw new Error(`DynamicField name must have 'value' or 'bcs' for type: ${e}`);let r;if(e==="0x2::object::ID"||e==="address"||e.includes("::typed_id::TypedID"))r=bcs.bcs.Address.serialize(o).toBytes();else if(e==="u64"||e==="u8"||e==="u128"||e==="u256")r={u64:bcs.bcs.u64(),u8:bcs.bcs.u8(),u128:bcs.bcs.u128(),u256:bcs.bcs.u256()}[e].serialize(o).toBytes();else if(e.includes("::type_name::TypeName")){let n=typeof o=="object"&&o!==null&&"name"in o?o.name:suiKit.normalizeStructTag(o);r=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).serialize({name:n}).toBytes();}else r=bcs.bcs.string().serialize(o).toBytes();return {type:e,bcs:r}}var ye=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var Gs="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",rt=t=>typeof t=="object"&&t!==null,zs=t=>!rt(t)||t.$kind!=="Shared"||!("Shared"in t)||!rt(t.Shared)?false:"initialSharedVersion"in t.Shared;function Ys(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var ot=t=>{if(Array.isArray(t))return t.map(ot);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return ot(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=ot(n);return o}return t},Mr=t=>{Ys(t);let e=t.json,o="fields"in e?e.fields:e;return ot(o)},_r=t=>zs(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Hs=(t,{obj:e,mutable:o=false})=>typeof e=="object"&&"initialSharedVersion"in e?t.sharedObjectRef({objectId:e.objectId,initialSharedVersion:e.initialSharedVersion.toString(),mutable:o}):typeof e=="object"&&"objectId"in e?t.object(e.objectId):typeof e=="string"?t.object(e):e,Z=async({onchain:t,fetchWithCache:e},{tx:o,objectId:r,mutable:n=false,include:a})=>{let s;if(typeof r=="string"){let c=await e({queryKey:g.rpc.getSharedObject({objectId:r,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!c?.object)throw new Error("Failed to get object data");s=_r(c.object);}else "objectId"in r&&"owner"in r&&(s=_r(r));return Hs(o,{obj:s??r,mutable:n})},Xs=zod.z.union([zod.z.string(),zod.z.object({name:zod.z.string()}),zod.z.object({id:zod.z.string()}),zod.z.object({bytes:zod.z.string()}),zod.z.record(zod.z.unknown())]),Js=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),Zs=zod.z.object({id:Js,name:Xs,value:zod.z.unknown().optional()}),Fr=t=>t.type.startsWith(Gs),Dr=t=>{let{success:e}=Zs.safeParse(t);return !!e},ei=t=>typeof t=="string"?t:t.id,ti=t=>{if(!Dr(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},oi=t=>{if(typeof t=="string")return t;if(!rt(t))return;let e=t,o=e.name,r=e.id,n=e.bytes;if(typeof o=="string")return o;if(typeof r=="string")return r;if(typeof n=="string")return n},ri=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!rt(t))return "string";let e=t;if(typeof e.id=="string")return "id";if(typeof e.bytes=="string")return "bytes";let o=e.name;return typeof o=="string"&&o.includes("::")?"type":"string"},A=t=>{let e=Mr(t);return Fr(t)&&typeof e=="object"?ti(e):e},Lr=t=>{if(!Fr(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=Mr(t);if(Dr(e)){let o=oi(e.name);if(!o)throw new Error(`Failed to parse dynamic field name from object ${t.objectId}: ${JSON.stringify(e.name,null,2)}`);return {objectId:ei(e.id),name:o,nameKind:ri(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var Er=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:J(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:J(e.type,`market.collaterals[${o}].type`)}))}};var Vr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",Kr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",qr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var jt=t=>({coinType:utils.normalizeStructTag(t.type),maxBorrowRate:Number(t.maxBorrowRate.value)/2**32,borrowRate:Number(t.interestRate.value)/2**32,borrowRateScale:Number(t.interestRateScale),borrowIndex:Number(t.borrowIndex),lastUpdated:Number(t.lastUpdated),cashAmount:Number(t.cash),debtAmount:Number(t.debt),marketCoinSupplyAmount:Number(t.marketCoinSupply),reserveAmount:Number(t.reserve),reserveFactor:Number(t.reserveFactor.value)/2**32,borrowWeight:Number(t.borrowWeight.value)/2**32,borrowFee:Number(t.borrowFeeRate.value)/2**32,baseBorrowRate:Number(t.baseBorrowRatePerSec.value)/2**32,borrowRateOnHighKink:Number(t.borrowRateOnHighKink.value)/2**32,borrowRateOnMidKink:Number(t.borrowRateOnMidKink.value)/2**32,highKink:Number(t.highKink.value)/2**32,midKink:Number(t.midKink.value)/2**32,minBorrowAmount:Number(t.minBorrowAmount),isIsolated:t.isIsolated,supplyLimit:Number(t.supplyLimit),borrowLimit:Number(t.borrowLimit)}),Bt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new T(`Coin decimal not found for ${o}`,{context:{coinName:o}});let n=24*365*3600,a=e.baseBorrowRate*n/e.borrowRateScale,s=e.borrowRateOnHighKink*n/e.borrowRateScale,c=e.borrowRateOnMidKink*n/e.borrowRateScale,i=e.maxBorrowRate*n/e.borrowRateScale,l=e.borrowRate*n/e.borrowRateScale,d=Math.floor(new Date().getTime()/1e3)-e.lastUpdated,u=bignumber_js.BigNumber(e.borrowIndex).multipliedBy(bignumber_js.BigNumber(d).multipliedBy(e.borrowRate)).dividedBy(e.borrowRateScale),p=bignumber_js.BigNumber(e.borrowIndex).plus(u),b=bignumber_js.BigNumber(p).dividedBy(e.borrowIndex).minus(1),f=bignumber_js.BigNumber(e.debtAmount).multipliedBy(b),m=f.plus(e.debtAmount),y=m.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(f.multipliedBy(e.reserveFactor)),S=h.shiftedBy(-r),w=bignumber_js.BigNumber(m).plus(Math.max(e.cashAmount-h.toNumber(),0)),O=w.shiftedBy(-r),_=bignumber_js.BigNumber(m).dividedBy(w);_=_.isFinite()?_:bignumber_js.BigNumber(0);let N=bignumber_js.BigNumber(l).multipliedBy(_).multipliedBy(1-e.reserveFactor);N=N.isFinite()?N:bignumber_js.BigNumber(0);let v=w.dividedBy(e.marketCoinSupplyAmount);return v=v.isFinite()&&!v.isNaN()?v:bignumber_js.BigNumber(1),{baseBorrowApr:a,baseBorrowApy:t.parseAprToApy(a),borrowAprOnHighKink:s,borrowApyOnHighKink:t.parseAprToApy(s),borrowAprOnMidKink:c,borrowApyOnMidKink:t.parseAprToApy(c),coinDecimal:r,maxBorrowApr:i,maxBorrowApy:t.parseAprToApy(i),borrowApr:Math.min(l,i),borrowApy:Math.min(t.parseAprToApy(l),t.parseAprToApy(i)),borrowIndex:p.toNumber(),growthInterest:b.toNumber(),supplyAmount:w.toNumber(),supplyCoin:O.toNumber(),borrowAmount:m.toNumber(),borrowCoin:y.toNumber(),reserveAmount:h.toNumber(),reserveCoin:S.toNumber(),utilizationRate:_.toNumber(),supplyApr:N.toNumber(),supplyApy:t.parseAprToApy(N.toNumber()),conversionRate:v.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},_t=t=>({coinType:utils.normalizeStructTag(t.type),isIsolated:t.isIsolated,collateralFactor:Number(t.collateralFactor.value)/4294967296,liquidationFactor:Number(t.liquidationFactor.value)/4294967296,liquidationDiscount:Number(t.liquidationDiscount.value)/4294967296,liquidationPenalty:Number(t.liquidationPenalty.value)/4294967296,liquidationReserveFactor:Number(t.liquidationReserveFactor.value)/4294967296,maxCollateralAmount:Number(t.maxCollateralAmount),totalCollateralAmount:Number(t.totalCollateralAmount)}),Mt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new T(`Coin decimal not found for ${o}`,{context:{coinName:o}});let n=bignumber_js.BigNumber(e.maxCollateralAmount).shiftedBy(-r),a=bignumber_js.BigNumber(e.totalCollateralAmount).shiftedBy(-r);return {coinDecimal:r,isIsolated:e.isIsolated,maxDepositAmount:e.maxCollateralAmount,maxDepositCoin:n.toNumber(),depositAmount:e.totalCollateralAmount,depositCoin:a.toNumber()}},Ur=t=>{let e=bignumber_js.BigNumber(0),o=bignumber_js.BigNumber(0),r=bignumber_js.BigNumber(0);for(let n of Object.values(t.pools))n&&(e=e.plus(bignumber_js.BigNumber(n.supplyCoin).multipliedBy(n.coinPrice)),r=r.plus(bignumber_js.BigNumber(n.borrowCoin).multipliedBy(n.coinPrice)));for(let n of Object.values(t.collaterals))n&&(o=o.plus(bignumber_js.BigNumber(n.depositCoin).multipliedBy(n.coinPrice)));return {supplyValue:e.plus(o).toNumber(),supplyLendingValue:e.toNumber(),supplyCollateralValue:o.toNumber(),borrowValue:r.toNumber(),totalValue:e.plus(o).minus(r).toNumber()}};var Ft=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{indexer:n,metadata:a,fetchWithCache:s}=t,c="api/market/migrate",i=await s({queryFn:()=>n.get(c),queryKey:g.api.getMarkets()}),l={},d={},u=o?new Set(o):void 0,p=r?new Set(r):void 0,b=m=>{u&&!u.has(m.coinName)||(l[m.coinName]={...m,coinPrice:e[m.coinName]??m.coinPrice,coinWrappedType:a.getCoinWrappedType(m.coinName)});},f=m=>{p&&!p.has(m.coinName)||(d[m.coinName]={...m,coinPrice:e[m.coinName]??m.coinPrice,coinWrappedType:a.getCoinWrappedType(m.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(b),Object.values(i.collaterals).filter(Boolean).forEach(f),{pools:l,collaterals:d}},Dt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{onchain:n,addresses:a,fetchWithCache:s}=t,{queryPackageId:c,market:i}=a,l=new suiKit.SuiTxBlock,d=`${c}::market_query::market_data`,p=[await Z({onchain:n,fetchWithCache:s},{tx:l,mutable:true,objectId:i})];l.moveCall(d,p);let b=await s({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:p.map(y=>typeof y=="object"&&"objectId"in y?y.objectId:y),typeArgs:[],node:n.url}),queryFn:()=>n.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=b?.Transaction??b?.FailedTransaction;if(!f.status.success)throw k(t.logger,new P(`On-chain market query transaction failed: ${f.status.error.message}`));let m=Er(f?.events?.[0]?.json);return ai(t,m,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},$r=async(t,{coinPrice:e,coinName:o})=>{let r=await Ft(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw k(t.logger,new T(`Market pool for ${o} not found in indexer data`,{context:{coinName:o}}));return {pool:r.pools[o],collateral:r.collaterals[o]}},Gr=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await Hr(t,[o]))[o];if(!a)throw k(t.logger,new P(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await ci(t,a),c=jt(s),i=Bt(r,c),l=s.parsedOriginMarketCollateral?_t(s.parsedOriginMarketCollateral):void 0,d=()=>({coinName:o,symbol:r.parseSymbol(o),marketCoinType:r.parseMarketCoinType(o),coinType:r.parseCoinType(o)});return {pool:{...d(),sCoinType:r.parseSCoinType(r.parseMarketCoinName(o))??"",coinWrappedType:r.getCoinWrappedType(o),coinPrice:e??0,highKink:c.highKink,midKink:c.midKink,reserveFactor:c.reserveFactor,borrowWeight:c.borrowWeight,borrowFee:c.borrowFee,marketCoinSupplyAmount:c.marketCoinSupplyAmount,minBorrowAmount:c.minBorrowAmount,...i},collateral:l?{...d(),coinWrappedType:r.getCoinWrappedType(o),coinPrice:e,collateralFactor:l.collateralFactor,liquidationFactor:l.liquidationFactor,liquidationDiscount:l.liquidationDiscount,liquidationPenalty:l.liquidationPenalty,liquidationReserveFactor:l.liquidationReserveFactor,...Mt(r,l)}:void 0}},zr=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},Yr=async(t,{coinPrices:e})=>{let o=await Dt(t,{coinPrices:e});return Ur(o)},ai=async(t,e,{coinPrices:o,poolCoinNames:r,collateralCoinNames:n})=>{let{metadata:a}=t,s={},c={},i=r?new Set(r):void 0,l=n?new Set(n):void 0,d=new Set;for(let p of e?.pools??[]){let b=a.parseCoinNameFromType(p.type);a.whitelist.lending.has(b)&&(i&&!i.has(b)||d.add(b));}for(let p of e?.collaterals??[]){let b=a.parseCoinNameFromType(p.type);a.whitelist.collateral.has(b)&&(l&&!l.has(b)||d.add(b));}let u=await Hr(t,[...d],ii);for(let p of e?.pools??[]){let b=p.type,f=a.parseCoinNameFromType(b),m=o[f]??0;if(!a.whitelist.lending.has(f)||i&&!i.has(f))continue;let{supplyLimit:y,borrowLimit:h,isIsolated:S}=Qr(u[f]??{}),w=jt({...p,type:p.type,isIsolated:S,supplyLimit:y,borrowLimit:h}),O=Bt(a,w);s[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),sCoinType:a.parseSCoinType(a.parseMarketCoinName(f))??"",coinWrappedType:a.getCoinWrappedType(f),coinPrice:m,...w,...O};}for(let p of e?.collaterals??[]){let b=p.type,f=a.parseCoinNameFromType(b),m=o[f]??0;if(!a.whitelist.collateral.has(f)||l&&!l.has(f))continue;let{isIsolated:y}=Qr(u[f]??{}),h=_t({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:y}),S=Mt(a,h);c[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),coinWrappedType:a.getCoinWrappedType(f),coinPrice:m,...h,...S};}return {pools:s,collaterals:c}},si=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],ii=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Qr=t=>({supplyLimit:t.supplyLimitKey?A(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?A(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?A(t.isolatedAssetKey):false}),ci=async(t,{balanceSheet:e,borrowDynamic:o,collateralStat:r,interestModel:n,riskModel:a,borrowFeeKey:s,supplyLimitKey:c,borrowLimitKey:i,isolatedAssetKey:l})=>{if(!e||!o||!n)throw k(t.logger,new P("Missing required market objects"));let d=A(e),u=A(n),p=A(o),b=s?A(s):{value:"0"},f=c?A(c):"0",m=i?A(i):"0",y=a?A(a):void 0,h=r?A(r):void 0,S=t.metadata.parseCoinNameFromType(`0x${u.type}`),w=l?.json?A(l):await li(t,S),O=y&&h?{type:u.type,collateralFactor:y.collateral_factor,liquidationFactor:y.liquidation_factor,liquidationPenalty:y.liquidation_penalty,liquidationDiscount:y.liquidation_discount,liquidationReserveFactor:y.liquidation_revenue_factor,maxCollateralAmount:y.max_collateral_amount,totalCollateralAmount:h.amount,isIsolated:w}:void 0;return {type:u.type,maxBorrowRate:u.max_borrow_rate,interestRate:p.interest_rate,interestRateScale:p.interest_rate_scale,borrowIndex:p.borrow_index,lastUpdated:p.last_updated,cash:d.cash,debt:d.debt,marketCoinSupply:d.market_coin_supply,reserve:d.revenue,reserveFactor:u.revenue_factor,borrowWeight:u.borrow_weight,borrowFeeRate:b,baseBorrowRatePerSec:u.base_borrow_rate_per_sec,borrowRateOnHighKink:u.borrow_rate_on_high_kink,borrowRateOnMidKink:u.borrow_rate_on_mid_kink,highKink:u.high_kink,midKink:u.mid_kink,minBorrowAmount:u.min_borrow_amount,supplyLimit:f,borrowLimit:m,isIsolated:w,parsedOriginMarketCollateral:O}},Hr=async({onchain:t,metadata:e,fetchWithCache:o},r,n=si)=>{let a=[];for(let d of r){let u=e.poolAddresses[d];for(let p of n){let b=u?.[p];b&&a.push(b);}}let s=[],c=ye([...new Set(a)],50);for(let d of c){let u=await o({queryKey:g.rpc.getObjects({objectIds:d,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:d,include:{json:true}})});s.push(...u.objects.filter(p=>!(p instanceof Error)));}let i=s.reduce((d,u)=>(d[u.objectId]=u,d),{}),l={};for(let d of r){let u=e.poolAddresses[d];l[d]={balanceSheet:i[u?.lendingPoolAddress??""],collateralStat:i[u?.collateralPoolAddress??""],borrowDynamic:i[u?.borrowDynamic??""],interestModel:i[u?.interestModel??""],riskModel:i[u?.riskModel??""],borrowFeeKey:i[u?.borrowFeeKey??""],supplyLimitKey:i[u?.supplyLimitKey??""],borrowLimitKey:i[u?.borrowLimitKey??""],isolatedAssetKey:i[u?.isolatedAssetKey??""]};}return l},Xr=(t,e)=>Zr(t,Vr,e),Jr=(t,e)=>Zr(t,Kr,e),li=async(t,e)=>{let o=await en(t,qr,e);return o?.object?.json?A(o.object):false},Zr=async(t,e,o)=>{let r=await en(t,e,o);return r?.object?.json?A(r.object):"0"},en=({onchain:t,addresses:e,metadata:o,fetchWithCache:r},n,a)=>{let s=o.parseCoinType(a).slice(2),c={type:n,value:s};return r({queryKey:g.rpc.getDynamicFieldObject({parentId:e.market,name:c,node:t.url}),queryFn:async()=>{try{let{dynamicField:i}=await t.client.getDynamicField({parentId:e.market,name:U(c)});return await t.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(i instanceof Error&&i.message.toLowerCase().includes("not found"))return null;throw i}}})};var nt=class extends R{indexer;addresses;onchain;constructor({indexer:e,addresses:o,onchain:r,...n}){super(n),this.indexer=e,this.addresses=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,addresses:this.addresses}}getMarkets({coinPrices:e,poolCoinNames:o,collateralCoinNames:r,source:n="api-first"}){let a={coinPrices:e,poolCoinNames:o,collateralCoinNames:r};return V({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>Ft(this.context,a),onchain:()=>Dt(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return V({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>$r(this.context,{coinPrice:e,coinName:o}),onchain:()=>Gr(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return Xr(this.context,e)}getPoolBorrowLimit(e){return Jr(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return V({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>zr(this.context),onchain:()=>Yr(this.context,{coinPrices:o})})}};var Lt=async(t,{address:e,coinType:o})=>{let{onchain:r}=t;return (await r.client.getBalance({owner:e,coinType:o})).balance},bi=(t,{balance:e,coinType:o,address:r,node:n})=>{let a=g.rpc.getCoinBalance({node:n,address:r,coinType:o});t.setQueryData(a,e,{updatedAt:Date.now()});},Et=async(t,e)=>{let{onchain:o,queryClient:r}=t,n=[],a=null,s=true;for(;s;){let i=await o.client.listBalances({owner:e,cursor:a,limit:50});n.push(...i.balances??[]),s=i.hasNextPage,a=i.cursor;}return n.length?n.reduce((i,l)=>{if(l.balance!=="0"){let d=utils.normalizeStructTag(l.coinType);i[d]=l,bi(r,{balance:l,coinType:d,address:e,node:o.url});}return i},{}):{}},tn=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,coinNames:c=[...n.whitelist.lending.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},on=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,coinName:s}=e,c=n.parseCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},rn=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,sCoinNames:c=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseSCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},nn=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,sCoinName:s}=e,c=n.parseSCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},an=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,marketCoinNames:c=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>Et({onchain:r,queryClient:a},s)});return c.reduce((d,u)=>{let p=n.parseMarketCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},sn=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,marketCoinName:s}=e,c=n.parseMarketCoinType(s);if(!c)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:c}),queryFn:()=>Lt({onchain:r},{address:a,coinType:c})});return Number(i?.balance??0)},cn=async(t,e)=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,{getCoinDecimal:a,parseSCoinType:s,parseUnderlyingSCoinType:c,parseCoinName:i,addresses:{scoin:l}}=r,d=`${l.id}::s_coin_converter::total_supply`,u=l.coins[e]?.treasury;if(!u)throw k(t.logger,new T(`Treasury address not found for sCoin: ${e}`,{context:{sCoinName:e}}));let p=new suiKit.SuiTxBlock,b=await n({queryKey:g.rpc.getSharedObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!b.object)throw k(t.logger,new P(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let f=[await Z({onchain:o,fetchWithCache:n},{tx:p,objectId:b.object})],m=[s(e),c(e)].filter(w=>!!w);p.moveCall(d,f,m);let y={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:f,typeArgs:m,node:o.url,...y}),queryFn:()=>o.client.simulateTransaction({...y,transaction:p.txBlock})}),S=h?.commandResults;if(!S)throw k(t.logger,new P(`Failed to query total supply for ${e}: ${h[h.$kind]?.status.error?.message}`,{context:{sCoinName:e}}));if(S&&S[0]?.returnValues&&S[0].returnValues[0]){let w=S[0].returnValues[0].bcs,O=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(w)).shiftedBy(-O).toNumber()}return 0};var at=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain,queryClient:this.queryClient}}getCoinAmounts(e){return tn(this.context,e)}getCoinAmount(e){return on(this.context,e)}getSCoinAmounts(e){return rn(this.context,e)}getSCoinAmount(e){return nn(this.context,e)}getSCoinTotalSupply(e){return cn(this.context,e)}getMarketCoinAmounts(e){return an(this.context,e)}getMarketCoinAmount(e){return sn(this.context,e)}};var ln="0x00481a93b819d744a7d79ecdc6c62c74f2f7cb4779316c4df640415817ac61bb";var gi=async(t,{assetTypeMap:e})=>{let{onchain:o,fetchWithCache:r}=t,n=null,a=false,s=[];do{let l={parentId:ln,limit:50,cursor:n},d=await r({queryKey:g.rpc.getDynamicFields(l),queryFn:()=>o.client.listDynamicFields(l)});if(!d)break;let u=d.dynamicFields.filter(p=>{let b=`0x${bcs.bcs.string().parse(p.name.bcs)}`;return !!e[b]}).map(p=>p.fieldId);s.push(...u),a=d.hasNextPage,n=d.cursor;}while(a);if(s.length===0)return [];let c={json:true},{objects:i}=await r({queryKey:g.rpc.getObjects({node:o.url,objectIds:s}),queryFn:()=>o.client.getObjects({objectIds:s,include:c})});return i},dn=async(t,{assetNames:e})=>{let{metadata:o}=t,r=new Set(e),n=Object.fromEntries([...o.coinTypeToCoinNameMap.entries()].filter(([,s])=>r.has(s)));return (await gi(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,c)=>{if(c){let{name:i}=Lr(c),l=`0x${i}`,d=n[l];if(!d)return s;let u=+A(c);s[d]=u/1e4;}return s},{})};var st=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getFlashloanFees(e){return dn(this.context,{assetNames:e})}};var un=t=>{let o=A(t).ownership?.of;if(!o)throw new T(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var pn=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:J(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:J(e.type,`obligation.debts[${o}].type`)}))}};var Si=async(t,{address:e})=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,a=`${r.addresses.protocolObjectId}::obligation::ObligationKey`,s=[],c=false,i=null;do{let l={owner:e,type:a,include:{json:true},limit:50,cursor:i},d=await n({queryKey:g.rpc.getOwnedObjects(l),queryFn:()=>o.client.listOwnedObjects(l)});s.push(...d.objects),d.hasNextPage&&d.cursor?(c=true,i=d.cursor):c=false;}while(c);return s},mn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{queryPackageId:a,version:s,market:c}=n.addresses,i=`${a}::obligation_query::obligation_data`,l=new suiKit.SuiTxBlock,d=y=>({objectId:y,include:{json:false,content:false}}),u=async y=>{let h=await r({queryKey:g.rpc.getObject({...d(y),node:o.url}),queryFn:()=>o.getObject(d(y))});if(!h.object)throw k(t.logger,new P(`Failed to fetch object ${y}`,{context:{objectId:y}}));return Z({onchain:o,fetchWithCache:r},{tx:l,mutable:false,objectId:h.object})},p=await Promise.all([u(s),u(c),u(e)]);l.moveCall(i,[...p,l.txBlock.object.clock()]);let b=[s,c,e],f=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:b,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),m=f.Transaction??f.FailedTransaction;if(!m.status.success)throw k(t.logger,new P(`Failed to query obligation data for obligationId ${e}: ${m.status.error.message}`,{context:{obligationId:e}}));return pn(m?.events?.[0]?.json)},bn=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},a=await r({queryKey:g.rpc.getObject(n),queryFn:()=>o.getObject(n)});return !!A(a.object)?.lock_key},yn=async(t,{address:e})=>{let o=await Si(t,{address:e}),r=o.map(un),n=await Vt(t,r);return o.map((a,s)=>{let c=n[s],i=c?A(c):void 0;return {id:r[s],keyId:a.objectId,locked:!!i?.lock_key}})},Vt=async(t,e)=>{if(e.length===0)return [];let{onchain:o,fetchWithCache:r}=t,n={objectIds:e,include:{json:true}},{objects:a}=await r({queryKey:g.rpc.getObjects({objectIds:e,node:o.url}),queryFn:()=>o.client.getObjects(n)});return a.map(s=>s instanceof Error?null:s)};var it=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return yn(this.context,{address:e})}getObligationData(e){return mn(this.context,e)}getObligationLocked(e){return bn(this.context,e)}getObligationObjects(e){return Vt(this.context,e)}};var Ci=t=>({pointType:X(t.point_type),distributedPointPerPeriod:Number(t.distributed_point_per_period),period:Number(t.point_distribution_time),distributedPoint:Number(t.distributed_point),points:Number(t.points),index:Number(t.index),baseWeight:Number(t.base_weight),weightedAmount:Number(t.weighted_amount),lastUpdate:Number(t.last_update),createdAt:Number(t.created_at)}),fn=(t,e)=>({poolType:X(e.pool_type),minStakes:Number(e.min_stakes),maxStakes:Number(e.max_stakes),staked:Number(e.stakes),poolPoints:e.points.reduce((o,r)=>{let n=Ci(r),a=t(n.pointType);return o[a]=n,o},{})}),gn=(t,e,o,r,n)=>{let s=bignumber_js.BigNumber(t.distributedPointPerPeriod).dividedBy(t.period),c=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),i=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(c).multipliedBy(t.distributedPointPerPeriod),bignumber_js.BigNumber(t.points)),l=bignumber_js.BigNumber(t.index).plus(i.dividedBy(t.weightedAmount).isFinite()?bignumber_js.BigNumber(1e9).multipliedBy(i).dividedBy(t.weightedAmount):0),d=bignumber_js.BigNumber(t.distributedPoint).plus(i),u=bignumber_js.BigNumber(t.baseWeight),p=bignumber_js.BigNumber(t.weightedAmount),b=p.shiftedBy(-1*n),f=b.multipliedBy(r),m=365*24*60*60,y=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(y).multipliedBy(m).multipliedBy(e),S=bignumber_js.BigNumber(1e12),w=bignumber_js.BigNumber(t.baseWeight).dividedBy(S),O=h.multipliedBy(w).dividedBy(f).isFinite()&&t.points>0?h.multipliedBy(w).dividedBy(f).toNumber():1/0;return {distributedPointPerSec:s.toNumber(),accumulatedPoints:i.toNumber(),currentPointIndex:l.toNumber(),currentTotalDistributedPoint:d.toNumber(),baseWeight:u.toNumber(),weightedStakedAmount:p.toNumber(),weightedStakedCoin:b.toNumber(),weightedStakedValue:f.toNumber(),rewardApr:O,rewardPerSec:y.toNumber()}},wi=t=>({pointType:X(t.point_type),weightedAmount:Number(t.weighted_amount),points:Number(t.points),totalPoints:Number(t.total_points),index:Number(t.index)}),hn=(t,e)=>({poolType:X(e.pool_type),debtAmount:Number(e.debt_amount),pointList:e.points_list.reduce((o,r)=>{let n=wi(r),a=t(n.pointType);return o[a]=n,o},{})}),Sn=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:J(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:J(r.point_type,`borrowIncentive.incentive_pools[${o}].points[${n}].point_type`)}))}))}},Cn=t=>{if(t)return {...t,pool_records:(t.pool_records??[]).map((e,o)=>({...e,pool_type:J(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:J(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var xi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Ti=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),wn=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:Ti,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(xi)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var Tn=async(t,{coinNames:e,coinPrices:o})=>{let{onchain:r,metadata:n,fetchWithCache:a}=t,{borrowIncentive:s}=n.addresses,c=new suiKit.SuiTxBlock,i=`${s.query}::incentive_pools_query::incentive_pools_data`,l={objectId:s.incentivePools},d=await a({queryKey:g.rpc.getSharedObject({...l,node:r.url}),queryFn:()=>r.getObject(l)});if(!d.object)throw k(t.logger,new P(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await Z({onchain:r,fetchWithCache:a},{tx:c,mutable:true,objectId:d.object})];c.moveCall(i,p,[]);let b=await a({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentivePools],node:r.url}),queryFn:()=>r.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=b?.Transaction??b?.FailedTransaction,m=Sn(f?.events?.[0]?.json),y=e??[...n.whitelist.lending.values()],h={};for(let S of m?.incentive_pools??[]){let w={},O=fn(n.parseCoinNameFromType,S),_=S.pool_type,N=n.parseCoinNameFromType(_),v=o[N]??0,x=n.getCoinDecimal(N);if(x===void 0)throw k(t.logger,new T(`Coin decimal not found for ${N}`,{context:{poolCoinName:N}}));if(!y.includes(N))continue;for(let[q,$]of Object.entries(O.poolPoints)){if(!$)continue;let de=$.pointType,te=n.parseCoinNameFromType(de),ie=n.getCoinDecimal(te);if(ie===void 0)throw k(t.logger,new T(`Coin decimal not found for ${te}`,{context:{poolCoinName:te}}));let L=o[te]??0,we=n.parseSymbol(te),W=gn($,L,ie,v,x),Y=$.points<=W.accumulatedPoints;$.points>W.accumulatedPoints&&(w[q]={symbol:we,coinName:te,coinType:de,coinDecimal:ie,coinPrice:L,points:$.points,distributedPoint:$.distributedPoint,weightedAmount:$.weightedAmount,...W,...Y?{rewardApr:0}:{}});}let B=bignumber_js.BigNumber(O.staked),j=B.shiftedBy(-x),F=j.multipliedBy(v);h[N]={coinName:N,symbol:n.parseSymbol(N),coinType:_,coinDecimal:x,coinPrice:v,stakedAmount:B.toNumber(),stakedCoin:j.toNumber(),stakedValue:F.toNumber(),points:w};}return h},kn=async(t,{coinNames:e,obligationId:o})=>{let{metadata:r,fetchWithCache:n,onchain:a}=t,{borrowIncentive:s}=r.addresses,c=new suiKit.SuiTxBlock,i=`${s.query}::incentive_account_query::incentive_account_data`,l=async(h,S)=>{let w=await n({queryKey:g.rpc.getSharedObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!w.object)throw k(t.logger,new P(`Failed to fetch object ${h}`,{context:{objectId:h}}));return Z({onchain:a,fetchWithCache:n},{tx:c,mutable:S,objectId:w.object})},[d,u]=await Promise.all([l(s.incentiveAccounts,true),l(o,true)]),p=[d,u];c.moveCall(i,p,[]);let b=await n({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentiveAccounts,o],node:a.url}),queryFn:()=>a.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=b?.Transaction??b?.FailedTransaction,m=Cn(f?.events?.[0]?.json),y=e??[...r.whitelist.lending.values()];return m?m.pool_records.reduce((h,S)=>{let w=hn(r.parseCoinNameFromType,S),O=w.poolType,_=r.parseCoinNameFromType(O);return y.includes(_)&&(h[_]=w),h},{}):{}},An=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,core:s}=n,c={objectId:a.incentiveAccounts,include:{json:true}},i=await r({queryKey:g.rpc.getObject(c),queryFn:()=>o.getObject(c)});if(!i.object)throw k(t.logger,new P(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let l=A(i.object).accounts.id,d=await ce(t,{parentId:l,name:U({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?wn.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},On=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,vesca:s}=n,c={objectId:a.incentivePools,include:{json:true}},i=await r({queryKey:g.rpc.getObject(c),queryFn:()=>o.getObject(c)});if(!i.object)throw k(t.logger,new P(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let l=A(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ce(t,{parentId:l,name:U({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var ct=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return Tn(this.context,e)}getBorrowIncentiveAccounts(e){return kn(this.context,e)}getBindedVeScaKey(e){return An(this.context,e)}getBindedObligation(e){return On(this.context,e)}};var Pn="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var vn=bcs.bcs.bool(),In=bcs.bcs.string();var Oi=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,n=false,a=null,s=i=>i.name.type===Pn,c=[];do{let i={parentId:r.market,cursor:a,limit:50,include:{value:true}},{dynamicFields:l,hasNextPage:d,cursor:u}=await o({queryKey:g.rpc.getDynamicFields({...i,node:e.url}),queryFn:()=>e.client.listDynamicFields(i)}),p=l.filter(b=>s(b)?vn.parse(b.valueType.bcs):false).map(b=>`0x${In.parse(b.name.bcs)}`);c.push(...p),a=u,n=d;}while(n);return c},Nn=async t=>Oi(t),jn=async t=>{let{metadata:{poolAddresses:e,whitelist:o}}=t;return Object.values(e).filter(r=>r!==void 0&&o.lending.has(r.coinName)&&r.isIsolated).map(r=>r.coinType)};var lt=class extends R{onchain;constructor(e){let{onchain:o,...r}=e;super(r),this.onchain=o;}get context(){return {...this.baseContext,onchain:this.onchain}}getIsolatedAssets({source:e}){return V({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>jn(this.context),onchain:()=>Nn(this.context)})}};var Bn=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var vi=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=`${n.veSca.object}::ve_sca::VeScaKey`,s=[],c=false,i=null;do{let l={owner:e,type:a,include:{json:true},cursor:i,limit:50},d=await r({queryKey:g.rpc.getOwnedObjects({...l,node:o.url}),queryFn:()=>o.client.listOwnedObjects(l)});s.push(...d.objects),d.hasNextPage&&d.cursor?(c=true,i=d.cursor):c=false;}while(c);return s},Ii=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,{id:n,config:a,treasury:s}=r.veSca,c=new suiKit.SuiTxBlock,i=async(S,w)=>{let O=await o({queryKey:g.rpc.getSharedObject({node:e.url,objectId:S}),queryFn:()=>e.getObject({objectId:S})});if(!O.object)throw k(t.logger,new P(`Failed to fetch object ${S}`,{context:{objectId:S}}));return Z({onchain:e,fetchWithCache:o},{tx:c,mutable:w,objectId:O.object})},[l,d]=await Promise.all([i(s,true),i(a,false)]),u=`${n}::treasury::refresh`,p=[d,l,c.txBlock.object.clock()],b=`${n}::treasury::total_ve_sca_amount`,f=[l,c.txBlock.object.clock()];c.moveCall(u,p),c.moveCall(b,f);let y=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:f,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:c.txBlock,include:{commandResults:true}})}))?.commandResults;if(!y)throw k(t.logger,new P("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=y[1]?.returnValues?.[0].bcs;if(!h)throw k(t.logger,new P("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},Re=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:U({type:"0x2::object::ID",value:e})},{dynamicField:s}=await n({queryKey:g.rpc.getDynamicFieldObject({...a,node:o.url}),queryFn:()=>o.client.getDynamicField(a)});if(!s?.value?.bcs)return;let c=s.value.bcs,i=Bn.parse(c),l=Math.max(+i.unlock_at*1e3-Date.now(),0),d=String(i.locked_amount),u=bignumber_js.BigNumber(i.locked_amount).shiftedBy(-9).toNumber(),p=u*(Math.floor(l/1e3)/126144e3);return {id:s.fieldId,keyId:e,object:{objectId:s.fieldId,version:s.version,digest:s.digest},lockedScaAmount:d,lockedScaCoin:u,currentVeScaBalance:p,unlockAt:bignumber_js.BigNumber(Number(i.unlock_at)*1e3).toNumber()}},_n=async(t,{address:e,excludeEmpty:o})=>{let r=await vi(t,e),n=(await Promise.all(r.map(a=>Re(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},Mn=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={type:"0x2::object::ID",value:e},s=await n({queryKey:g.rpc.getDynamicFieldObject({parentId:o,name:a,node:r.url}),queryFn:async()=>{try{let{dynamicField:i}=await r.client.getDynamicField({parentId:o,name:U(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(It(i))return null;throw i}}});if(!s?.object)return false;let c=A(s.object);return Array.isArray(c?.contents)&&c.contents.length>0},Fn=async t=>{let{onchain:e,metadata:{addresses:o},fetchWithCache:r}=t,n={objectId:o.veSca.treasury,include:{json:true}},a=await r({queryKey:g.rpc.getObject({...n,node:e.url}),queryFn:()=>e.getObject(n)}),s=A(a.object),c=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await Ii(t)).shiftedBy(-9).toNumber(),l=c>0?i/c*4:0;return {totalLockedSca:c,totalVeSca:i,averageLockingPeriod:l,averageLockingPeriodUnit:"year"}};var ut=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return Re(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return _n(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return Fn(this.context)}isVeScaKeyInSubsTable(e,o){return Mn(this.context,{veScaKey:e,tableId:o})}};var Dn=zod.z.object({balance:zod.z.string(),enable_claim:zod.z.boolean(),id:zod.z.string(),user_rewards:zod.z.object({id:zod.z.string(),size:zod.z.string()})}).transform(t=>({isClaimEnabled:t.enable_claim,totalPoolReward:bignumber_js.BigNumber(t.balance).shiftedBy(-9).toNumber(),userRewardTableId:t.user_rewards.id}));var Ln=bcs.bcs.u64();var _i=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});if(!a)throw k(t.logger,new P("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Mi=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={parentId:o,name:U({type:"0x2::object::ID",value:e})},{dynamicField:{value:s}}=await n({queryKey:g.rpc.getDynamicFieldObject({...a,node:r.url}),queryFn:()=>r.client.getDynamicField(a)});return bignumber_js.BigNumber(Ln.parse(s.bcs)).shiftedBy(-9).toNumber()},En=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await _i(t,r),{data:a,success:s}=Dn.safeParse(n.json);return s?{pendingReward:e?await Mi(t,{veScaKey:e,tableId:a.userRewardTableId}).catch(()=>0):0,totalPoolReward:a.totalPoolReward,isClaimEnabled:a.isClaimEnabled}:{pendingReward:0,totalPoolReward:0,isClaimEnabled:false}};var pt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return En(this.context,e)}};var qt=t=>t.startsWith("0x")?t:`0x${t}`;var Fi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Di=t=>bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(t)}),Vn=Di(Fi);var Li=3,Kn=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{addresses:a,parseCoinNameFromType:s}=n,c=50,i={[`${a.pyth.object}::rule::Rule`]:"pyth",[`${a.supra.object}::rule::Rule`]:"supra",[`${a.switchboard.object}::rule::Rule`]:"switchboard"},l=null,d=true,u={};do{let p={parentId:e,cursor:l,limit:c,include:{value:true}},{dynamicFields:b,cursor:f,hasNextPage:m}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});l=f,d=m,b.forEach(y=>{let h=qt(bcs.bcs.string().parse(y.name.bcs)),S=s(h),w=Vn.parse(y.value.bcs);u[S]||(u[S]=[]),w.contents.forEach(({name:O})=>{let _=i[qt(O)];_&&u[S].push(_);});});}while(d);return u},qn=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([Kn(t,e.oracles.primaryPriceUpdatePolicyVecsetId),Kn(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},Wn=async t=>{let{addresses:e}=t.metadata,o=`${e.xOracleObject}::price_update_policy::PriceUpdatePolicyRulesKey`,r=bcs.bcs.struct("TypeName",{dummy_field:bcs.bcs.bool()}).serialize({dummy_field:false}).toBytes(),[n,a]=await Promise.all([ce(t,{parentId:e.oracles.primaryPriceUpdatePolicyObject,name:{type:o,bcs:r}}),ce(t,{parentId:e.oracles.secondaryPriceUpdatePolicyObject,name:{type:o,bcs:r}})]);return {primary:n,secondary:a}},Un=async(t,e)=>{let{addresses:o,parseCoinType:r,getSwitchboardAggAddress:n}=t.metadata,a=o.oracles.switchboardRegistryTableId,s=[],c=e.map((i,l)=>{let d=n(i);return d||(s.push({idx:l,coinName:i}),null)});if(s.length===0)return c;if(s.length>Li){let i=new Map;for(let d of s){let u=r(d.coinName);if(!u)throw k(t.logger,new T(`Invalid coin name: ${d.coinName}`,{context:{coinName:d.coinName}}));i.set(u.slice(2),d);}let l=await Vi(t,a,i);for(let[d,{idx:u}]of i){let p=l[d];if(!p)throw k(t.logger,new P(`No on-demand aggregator found for 0x${d}`,{context:{coinTypeKey:d}}));c[u]=p;}return c}return await Promise.all(s.map(async({idx:i,coinName:l})=>{let d=r(l);if(!d)throw k(t.logger,new T(`Invalid coin name: ${l}`,{context:{coinName:l}}));let u=await ce(t,{parentId:a,name:U({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw k(t.logger,new P(`No on-demand aggregator found for ${d}`,{context:{coinType:d}}));c[i]=bcs.bcs.Address.parse(u.dynamicField.value.bcs);})),c},Ei=t=>{try{return bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(t.name.bcs).name}catch{try{return bcs.bcs.string().parse(t.name.bcs)}catch{return}}},Vi=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,c=false;do{let i={parentId:e,cursor:s,limit:50,include:{value:true}},l=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});for(let d of l.dynamicFields){let u=Ei(d);if(!u||!o.has(u))continue;let p=d.value?.bcs;p&&(a[u]=bcs.bcs.Address.parse(p));}s=l.cursor,c=l.hasNextPage&&Object.keys(a).length<o.size;}while(c);return a};var bt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getAssetOracles(){return qn(this.context)}getPriceUpdatePolicies(){return Wn(this.context)}getOnDemandAggObjectIds(e){return Un(this.context,e)}};var Qn=t=>({stakeType:utils.normalizeStructTag(t.stakeType),maxPoint:Number(t.maxDistributedPoint),distributedPoint:Number(t.distributedPoint),pointPerPeriod:Number(t.distributedPointPerPeriod),period:Number(t.pointDistributionTime),maxStake:Number(t.maxStake),staked:Number(t.stakes),index:Number(t.index),createdAt:Number(t.createdAt),lastUpdate:Number(t.lastUpdate)}),$n=(t={})=>{let{spool:e,spoolReward:o}=t;if(!e||!o)throw new T("spool or spoolReward is undefined");let r=A(e),n=A(o);return {stakeType:r.stake_type,maxDistributedPoint:r.max_distributed_point,distributedPoint:r.distributed_point,distributedPointPerPeriod:r.distributed_point_per_period,pointDistributionTime:r.point_distribution_time,maxStake:r.max_stakes,stakes:r.stakes,index:r.index,createdAt:r.created_at,lastUpdate:r.last_update,...n}},Gn=(t,e,o)=>{let n=bignumber_js.BigNumber(t.pointPerPeriod).dividedBy(t.period),a=bignumber_js.BigNumber(t.pointPerPeriod).dividedBy(t.period),s=a.gt(0)?bignumber_js.BigNumber(t.maxPoint).minus(t.distributedPoint).dividedBy(a):bignumber_js.BigNumber(0),c=t.createdAt,i=s.plus(t.lastUpdate).integerValue().toNumber(),l=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),d=bignumber_js.BigNumber(t.maxPoint).minus(t.distributedPoint),u=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(l).multipliedBy(t.pointPerPeriod),d),p=bignumber_js.BigNumber(t.index).plus(u.dividedBy(t.staked).isFinite()?bignumber_js.BigNumber(1e9).multipliedBy(u).dividedBy(t.staked):0),b=bignumber_js.BigNumber(t.distributedPoint).plus(u),f=bignumber_js.BigNumber(t.staked),m=f.shiftedBy(-o),y=m.multipliedBy(e);return {distributedPointPerSec:n.toNumber(),accumulatedPoints:u.toNumber(),currentPointIndex:p.toNumber(),currentTotalDistributedPoint:b.toNumber(),startDate:new Date(c*1e3),endDate:new Date(i*1e3),stakedAmount:f.toNumber(),stakedCoin:m.toNumber(),stakedValue:y.toNumber()}},zn=t=>({claimedRewards:Number(t.claimed_rewards),exchangeRateDenominator:Number(t.exchange_rate_denominator),exchangeRateNumerator:Number(t.exchange_rate_numerator),rewards:Number(t.rewards),spoolId:String(t.spool_id)}),Yn=(t,e,o,r,n)=>{let a=bignumber_js.BigNumber(o.distributedPointPerSec).multipliedBy(e.exchangeRateNumerator).dividedBy(e.exchangeRateDenominator),s=bignumber_js.BigNumber(t.maxPoint).multipliedBy(e.exchangeRateNumerator).dividedBy(e.exchangeRateDenominator),c=s.shiftedBy(-n),i=c.multipliedBy(r),l=bignumber_js.BigNumber(e.rewards),d=l.shiftedBy(-n),u=d.multipliedBy(r),p=bignumber_js.BigNumber(e.claimedRewards),b=p.shiftedBy(-n),f=b.multipliedBy(r),m=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),y=m.dividedBy(o.stakedValue).isFinite()?m.dividedBy(o.stakedValue).toNumber():1/0;return (t.maxPoint<=t.distributedPoint||t.pointPerPeriod===0)&&(y=1/0),{rewardApr:y,totalRewardAmount:s.toNumber(),totalRewardCoin:c.toNumber(),totalRewardValue:i.toNumber(),remaindRewardAmount:l.toNumber(),remaindRewardCoin:d.toNumber(),remaindRewardValue:u.toNumber(),claimedRewardAmount:p.toNumber(),claimedRewardCoin:b.toNumber(),claimedRewardValue:f.toNumber(),rewardPerSec:a.toNumber()}},Hn=t=>({...t,stakeType:Wi(t.stakeType)}),Wi=t=>{try{return X(t)}catch(e){throw new T("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Wt=async(t,{coinPrices:e,stakeCoinNames:o}={})=>{let{indexer:r,fetchWithCache:n,metadata:a}=t;e??={};let{spools:s}=await n({queryKey:g.api.getSpools(),queryFn:()=>r.get("/api/spools/migrate")}),c=o?new Set(o):a.whitelist.spool,i=a.getSpoolRewardCoinName();return s.reduce((l,d)=>{if(!c.has(d.marketCoinName))return l;let u=a.parseCoinName(d.marketCoinName);return l[d.marketCoinName]={...d,coinPrice:e[u]??d.coinPrice,marketCoinPrice:e[d.marketCoinName]??d.marketCoinPrice,rewardCoinPrice:e[i]??d.rewardCoinPrice},l},{})},Xn=async(t,{coinPrices:e,stakeCoinName:o})=>(await Wt(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,Jn=async(t,{coinPrices:e={},stakeCoinNames:o}={})=>{let{metadata:r}=t,n=o??[...r.whitelist.spool.values()],a=n.map(i=>r.parseCoinName(i)),s=await ea(t,a);return (await Promise.allSettled(n.map((i,l)=>Ut(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[l]]})))).reduce((i,l,d)=>(l.status==="fulfilled"&&l.value&&(i[n[d]]=l.value),i),{})},Ut=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),c=Hn($n(r??(await ea(t,[a]))[a])),i=Qn(c),l=e[o]??0,d=Gn(i,l,n.getCoinDecimal(o)),u=zn(c),p=e[s]??0;return {marketCoinName:o,symbol:n.parseSymbol(o),coinType:n.parseCoinType(a),marketCoinType:n.parseMarketCoinType(a),rewardCoinType:n.isMarketCoin(s)?n.parseMarketCoinType(s):n.parseCoinType(s),sCoinType:n.parseSCoinType(o)??"",coinDecimal:n.getCoinDecimal(a),rewardCoinDecimal:n.getCoinDecimal(s),coinPrice:e[a]??0,marketCoinPrice:l,rewardCoinPrice:p,maxPoint:i.maxPoint,distributedPoint:i.distributedPoint,maxStake:i.maxStake,...d,exchangeRateNumerator:u.exchangeRateNumerator,exchangeRateDenominator:u.exchangeRateDenominator,...Yn(i,u,d,p,n.getCoinDecimal(s))}},Zn=async(t,{address:e,stakeCoinNames:o})=>{let{metadata:r}=t,n=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount`,a=await Ui(t,{address:e,stakeAccountType:n}),s=(o??[...r.whitelist.spool.values()]).reduce((l,d)=>(l[d]=[],l),{}),c=Object.keys(s).reduce((l,d)=>{let u=r.parseCoinName(d),p=r.parseMarketCoinType(u);return l[d]=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount<${p}>`,l},{}),i=Object.entries(c).reduce((l,[d,u])=>(l[u]=d,l),{});for(let l of a){let{objectId:d,type:u,json:p}=l;if(!d||!u||!p)continue;let b=A(l),f=utils.normalizeStructTag(u),m=i[f],y=s[m];y&&y.push({id:d,type:f,stakePoolId:String(b.spool_id),stakeType:utils.normalizeStructTag(String(b.stake_type)),staked:Number(b.stakes),index:Number(b.index),points:Number(b.points),totalPoints:Number(b.total_points)});}return s},Qt=async(t,{stakeCoinNames:e})=>(await Promise.allSettled(e.map(r=>Qi(t,{stakeCoinName:r})))).reduce((r,n,a)=>(n.status==="fulfilled"&&(r[e[a]]=n.value),r),{}),Ui=async(t,{address:e,stakeAccountType:o})=>{let{onchain:r,fetchWithCache:n}=t,a=false,s=null,c=[];do{let i={owner:e,type:o,include:{json:true},cursor:s,limit:50},l=await n({queryKey:g.rpc.getOwnedObjects(i),queryFn:()=>r.client.listOwnedObjects(i)});l.objects&&c.push(...l.objects),l.hasNextPage&&l.cursor?(a=true,s=l.cursor):a=false;}while(a);return c},ea=async({onchain:t,metadata:e,fetchWithCache:o},r)=>{let n=["spool","spoolReward","sCoinTreasury"],a=r.flatMap(l=>{let d=e.poolAddresses[l];return n.flatMap(u=>{let p=d?.[u];return p?[p]:[]})}),s=[],c=ye([...new Set(a)],50);for(let l of c){let d=await o({queryKey:g.rpc.getObjects({objectIds:l,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:l,include:{json:true}})});s.push(...d.objects.filter(u=>!(u instanceof Error)));}let i=s.reduce((l,d)=>(l[d.objectId]=d,l),{});return r.reduce((l,d)=>{let u=e.poolAddresses[d];return l[d]={spool:i[u?.spool??""],spoolReward:i[u?.spoolReward??""]},l},{})},Qi=async(t,{stakeCoinName:e})=>{let{metadata:o,onchain:r,fetchWithCache:n}=t,a=o.addresses.spools[e]?.rewardPoolId;if(!a)return;let s={json:true},i=(await n({queryKey:g.rpc.getObject({objectId:a,node:r.url,include:s}),queryFn:()=>r.getObject({objectId:a,include:s})})).object;if(!i?.json)return;let l=A(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),stakePoolId:String(l.spool_id),ratioNumerator:Number(l.exchange_rate_numerator),ratioDenominator:Number(l.exchange_rate_denominator),rewards:Number(l.rewards),claimedRewards:Number(l.claimed_rewards)}},ta=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,a=n.addresses.spools[e]?.id;if(!a)return;let s={json:true},i=(await r({queryKey:g.rpc.getObject({objectId:a,node:o.url,include:s}),queryFn:()=>o.getObject({objectId:a,include:s})})).object;if(!i?.json)return;let l=A(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),maxPoint:Number(l.max_distributed_point),distributedPoint:Number(l.distributed_point),pointPerPeriod:Number(l.distributed_point_per_period),period:Number(l.point_distribution_time),maxStake:Number(l.max_stakes),stakeType:utils.normalizeStructTag(String(l.stake_type)),totalStaked:Number(l.stakes),index:Number(l.index),createdAt:Number(l.created_at),lastUpdate:Number(l.last_update)}};var yt=class extends R{indexer;onchain;constructor({indexer:e,onchain:o,...r}){super(r),this.indexer=e,this.onchain=o;}get context(){return {...this.baseContext,indexer:this.indexer,onchain:this.onchain}}getSpools({stakeCoinNames:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Wt(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>Jn(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>Xn(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>Ut(this.context,{stakeCoinName:e,coinPrices:o})})}getStakeAccounts(e){return Zn(this.context,e)}async getStakeAccountsByPool(e,o){return (await this.getStakeAccounts({address:e,stakeCoinNames:[o]}))[o]||[]}getSpoolRewardPools(e){return Qt(this.context,{stakeCoinNames:e})}getSpoolRewardPool(e){return Qt(this.context,{stakeCoinNames:[e]}).then(o=>o[e])}getStakePool(e){return ta(this.context,e)}};var oa=zod.z.object({reserve_ve_sca_key:zod.z.nullable(zod.z.object({id:zod.z.string()})),enable_claim:zod.z.boolean()}).transform(t=>({reserveVeScaKey:t.reserve_ve_sca_key?.id,isClaimEnabled:t.enable_claim}));var ra=bcs.bcs.u64();var zi=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,{veScaRewardTableId:a}=r.veScaLoyaltyProgram,s={parentId:a,name:U({type:"0x2::object::ID",value:e})},{dynamicField:{value:c}}=await n({queryKey:g.rpc.getDynamicFieldObject({...s,node:o.url}),queryFn:()=>o.client.getDynamicField(s)});return bignumber_js.BigNumber(ra.parse(c.bcs)).shiftedBy(-9).toNumber()},Yi=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});if(!a)throw k(t.logger,new P("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},na=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await Yi(t,r),{data:a,success:s}=oa.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let c=await Re(t,a.reserveVeScaKey),i=e?await zi(t,e).catch(()=>0):0,l=Math.max((c?.unlockAt??0)-Date.now(),0);return {pendingScaReward:i,pendingVeScaReward:i*(Math.floor(l/1e3)/126144e3),totalPoolReward:c?.currentVeScaBalance??0,isClaimEnabled:a.isClaimEnabled}};var ft=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return na(this.context,e)}};var aa=bcs.bcs.Address;var sa=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:U({type:"address",value:e})},n=await ce(t,r);return n?aa.parse(n.dynamicField.value.bcs):null};var gt=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return sa(this.context,e)}};var se=zod.z.object({id:zod.z.string(),keys:zod.z.nullable(zod.z.object({contents:zod.z.array(zod.z.string())})),table:zod.z.object({id:zod.z.string(),size:zod.z.string()}),with_keys:zod.z.boolean()}),ia=zod.z.object({id:zod.z.string(),size:zod.z.string()}),ca=zod.z.object({asset_active_states:zod.z.object({base:se,collateral:se}),borrow_dynamics:se,collateral_stats:se,id:zod.z.string(),interest_models:se,limiters:se,reward_factors:se,risk_models:se,vault:zod.z.object({balance_sheets:se,flash_loan_fees:se,id:zod.z.string(),market_coin_supplies:ia,underlying_balances:ia})});var xe="0x1::type_name::TypeName",la="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",da="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",ua="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",pa="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var ma=async(t,{poolNames:e=[]})=>{let o=new Set(e),{fetchWithCache:r,api:n}=t,a=await r({queryKey:g.api.getPoolAddresses(),queryFn:()=>n.get("/pool/addresses")});return o.size===0?a:Object.entries(a).reduce((s,[c,i])=>(o.has(c)&&(s[c]=i),s),{})},Xi=t=>{try{return t.name.type.includes("::type_name::TypeName")?bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(t.name.bcs).name:bcs.bcs.string().parse(t.name.bcs)}catch{return}},le=async(t,{parentId:e,type:o,coinTypeKeys:r})=>{let{onchain:n,fetchWithCache:a}=t,s={},c=null,i=false;do{let l={parentId:e,cursor:c,limit:50},d=await a({queryKey:g.rpc.getDynamicFields({...l,node:n.url}),queryFn:()=>n.client.listDynamicFields(l)});for(let u of d.dynamicFields){if(u.name.type!==o)continue;let p=Xi(u);p&&r.has(p)&&(s[p]=u.fieldId);}c=d.cursor,i=d.hasNextPage;}while(i);return s},Ji=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n=[...new Set(Object.values(e).flatMap(s=>Object.values(s)))],a={};for(let s of ye(n,50)){let{objects:c}=await r({queryKey:g.rpc.getObjects({objectIds:s,node:o.url}),queryFn:()=>o.client.getObjects({objectIds:s,include:{json:true}})});for(let i of c)i instanceof Error||(a[i.objectId]=i);}return Object.entries(e).reduce((s,[c,i])=>(s[c]=Object.entries(i).reduce((l,[d,u])=>{let p=a[u];return l[d]=p?{objectId:p.objectId,json:p.json}:void 0,l},{}),s),{})},Zi=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,c=false;do{let i={parentId:o,limit:50,cursor:s},l=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});if(!l)break;for(let d of l.dynamicFields){let p=`0x${bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}).parse(d.name.bcs).name}`;e.has(p)&&(a[p]=d.fieldId);}s=l.cursor,c=l.hasNextPage;}while(c);return a},ba=async(t,{poolNames:e=[]})=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{core:a,spool:s,scoin:c}=n,{market:i,coins:l}=a,d={objectId:i,include:{json:true}},{object:u}=await r({queryKey:g.rpc.getObject({...d,node:o.url}),queryFn:()=>o.getObject(d)}),p=ca.safeParse(u?.json);if(!p.success)throw k(t.logger,new T("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let b=p.data,f=b.vault.balance_sheets.table.id,m=b.collateral_stats.table.id,y=b.borrow_dynamics.table.id,h=b.interest_models.table.id,S=b.risk_models.table.id,w=b.vault.flash_loan_fees.table.id,O=new Set(e),_=Object.entries(l).filter(W=>{let[Y,he]=W;return he?.coinType?O.size===0||O.has(Y):false});if(_.length===0)throw k(t.logger,new P("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let N=await Zi(t,new Set(_.map(([,W])=>W.coinType)),w),v=new Set(_.map(([,W])=>W.coinType.slice(2))),[x,B,j,F,q,$,de,te,ie]=await Promise.all([le(t,{parentId:f,type:xe,coinTypeKeys:v}),le(t,{parentId:m,type:xe,coinTypeKeys:v}),le(t,{parentId:y,type:xe,coinTypeKeys:v}),le(t,{parentId:h,type:xe,coinTypeKeys:v}),le(t,{parentId:S,type:xe,coinTypeKeys:v}),le(t,{parentId:i,type:la,coinTypeKeys:v}),le(t,{parentId:i,type:da,coinTypeKeys:v}),le(t,{parentId:i,type:ua,coinTypeKeys:v}),le(t,{parentId:i,type:pa,coinTypeKeys:v})]),L=await Ji(t,{lendingPool:x,collateralPool:B,borrowDynamic:j,interestModel:F,riskModel:q,borrowFee:$,supplyLimit:de,borrowLimit:te,isolatedAsset:ie}),we={};for(let[W,Y]of _){let{coinType:he}=Y,oe=he.slice(2),kt=L.lendingPool[oe],qa=L.collateralPool[oe],Wa=L.borrowDynamic[oe],Ua=L.interestModel[oe],Qa=L.riskModel[oe],$a=L.borrowFee[oe],Ga=L.supplyLimit[oe],za=L.borrowLimit[oe],to=L.isolatedAsset[oe]?.json,Me=`s${W}`,oo=s.pools[Me],Fe=c.coins[Me],ro=Y.oracle?.pyth;we[W]={coinName:W,symbol:Y.symbol,coinType:he,coinMetadataId:Y.metaData,decimals:Y.decimals,lendingPoolAddress:kt?.objectId??"",collateralPoolAddress:qa?.objectId??"",borrowDynamic:Wa?.objectId??"",interestModel:Ua?.objectId??"",riskModel:Qa?.objectId,borrowFeeKey:$a?.objectId??"",supplyLimitKey:Ga?.objectId??"",borrowLimitKey:za?.objectId??"",isolatedAssetKey:to?.id??"",isIsolated:to?.value??false,spool:oo?.id??"",spoolReward:oo?.rewardPoolId??"",spoolName:Me,sCoinName:Me,sCoinType:Fe?.coinType??"",sCoinTreasury:Fe?.treasury??"",sCoinMetadataId:Fe?.metaData??"",sCoinSymbol:Fe?.symbol??"",pythFeed:ro?.feed??"",pythFeedObjectId:ro?.feedObject??"",flashloanFeeObject:N[he]??""};}return we};var ht=class extends R{api;onchain;constructor({api:e,onchain:o,...r}){super(r),this.api=e,this.onchain=o;}get context(){return {...this.baseContext,api:this.api,onchain:this.onchain}}getPoolAddresses({poolNames:e,source:o="api"}){return V({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>ma(this.context,{poolNames:e}),onchain:()=>ba(this.context,{poolNames:e})})}};var ya="https://hermes.pyth.network";var fa=zod.z.object({id:zod.z.string(),price_info:zod.z.object({arrival_time:zod.z.string(),attestation_time:zod.z.string(),price_feed:zod.z.object({ema_price:zod.z.object({conf:zod.z.string(),expo:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),price:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),timestamp:zod.z.string()}),price:zod.z.object({conf:zod.z.string(),expo:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),price:zod.z.object({magnitude:zod.z.string(),negative:zod.z.boolean()}),timestamp:zod.z.string()}),price_identifier:zod.z.object({bytes:zod.z.string()})})})});var ha=({price:t,expo:e})=>{let o=e.negative?-1:1,r=t.negative?-1:1;return bignumber_js.BigNumber(t.magnitude).multipliedBy(bignumber_js.BigNumber(10).shiftedBy(o*+e.magnitude)).multipliedBy(r)};var Sa=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a}}=t,s=new Map(e.map(d=>[d,r.coins[d]?.oracle?.pyth?.feed])),c=Array.from(new Set(s.values())).filter(d=>!!d),l=await new pythSuiJs.SuiPriceServiceConnection(n,a).getLatestPriceFeeds(c);if(!l)throw k(t.logger,new Ee("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:c}}));return await o({queryKey:g.oracle.getPythLatestPriceFeeds(n,c),queryFn:()=>{let d=new Map;for(let p of l)d.set(p.id,p.getPriceUnchecked().getPriceAsNumberUnchecked());let u={};for(let[p,b]of s)u[p]=(b!==void 0?d.get(b):void 0)??0;return u}})},Ca=async(t,e)=>{let{onchain:o,fetchWithCache:r}=t,n={objectId:e,include:{json:true}},{object:a}=await r({queryKey:g.rpc.getObject({...n,node:o.url}),queryFn:()=>o.getObject(n)});return a??null},wa=async(t,e)=>{if(e.length===0)return [];let{onchain:o,fetchWithCache:r}=t,n={objectIds:e,include:{json:true}},{objects:a}=await r({queryKey:g.rpc.getObjects({...n,node:o.url}),queryFn:()=>o.client.getObjects(n)});return a.filter(s=>!(s instanceof Error))},xa=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=new Map(e.map(l=>[l,n.coins[l]?.oracle?.pyth?.feedObject])),s=Array.from(new Set(a.values())).filter(l=>!!l),c=new Map;for(let l of ye(s,50)){let d={objectIds:l,include:{json:true}},{objects:u}=await r({queryKey:g.rpc.getObjects({...d,node:o.url}),queryFn:()=>o.client.getObjects(d)});for(let p of u){if(p instanceof Error)throw k(t.logger,new P("Failed to fetch price feed object on chain",{cause:p}));let{data:b,success:f}=fa.safeParse(p.json);if(!f)throw k(t.logger,new T("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:m}=b.price_info;c.set(p.objectId,ha(m.price).toNumber());}}let i={};for(let[l,d]of a)i[l]=(d!==void 0?c.get(d):void 0)??0;return i},Ta=async(t,{coinNames:e})=>{let{indexer:o,fetchWithCache:r}=t,n="/api/market/migrate";return (await r({queryKey:g.api.getMarkets(),queryFn:()=>o.get(n)})).pools.reduce((s,c)=>(e.includes(c.coinName)&&(s[c.coinName]=c.coinPrice),s),{})};var St=class extends R{config;indexer;onchain;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,...n}){super(n),this.config=e??{endpoint:ya,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return V({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>Sa(this.context,e),onchain:()=>xa(this.context,e)})}getPythFeedObject(e){return Ca(this.context,e)}getPythFeedObjects(e){return wa(this.context,e)}getPricesFromIndexer(e){return Ta(this.context,e)}};var ka=t=>{let{utils:e,indexerUrl:o,queryClientConfig:r=We}=t,n=e.onchain,a=br(o),s=t.queryClient??new queryCore.QueryClient(r),c=e.logger,i={onchain:n,queryClient:s,logger:c},l,d,u,p,b,f,m,y,h,S,w,O,_,N;return {get market(){return l??=new nt({...i,indexer:a,addresses:hr(e),metadata:gr(e)})},get coinBalance(){return d??=new at({...i,metadata:Sr(e)})},get flashloan(){return u??=new st({...i,metadata:Cr(e)})},get obligation(){return p??=new it({...i,metadata:wr(e)})},get borrowIncentive(){return b??=new ct({...i,metadata:xr(e)})},get isolatedAssets(){return f??=new lt({...i,metadata:Or(e)})},get veSca(){return m??=new ut({...i,metadata:Pr(e)})},get loyaltyProgram(){return y??=new pt({...i,metadata:Rr(e)})},get xOracle(){return h??=new bt({...i,metadata:Nr(e)})},get spool(){return S??=new yt({...i,indexer:a,metadata:Ir(e)})},get veScaLoyaltyProgram(){return w??=new ft({...i,metadata:vr(e)})},get referral(){return O??=new gt({...i,metadata:Tr(e)})},get price(){return _??=new St({...i,indexer:a,metadata:kr(e)})},get poolAddresses(){return N??=new ht({...i,api:yr(),metadata:Ar(e)})}}};var Aa=(t={})=>t.source?t.source:t.useOnChainQuery!==void 0?t.useOnChainQuery?"onchain":"api-first":t.indexer!==void 0?t.indexer?"api-first":"onchain":"api-first",oc={rpc:"onchain",indexer:"api","indexer-first":"api-first"},ge=t=>t?.source?oc[t.source]:t?.indexer?"api-first":"onchain";var Oa=t=>{let e=new Date(t*1e3),o=new Date(t*1e3);o.setUTCHours(0,0,0,0),e.getUTCHours()>=0&&o.setUTCDate(o.getUTCDate()+1);let r=new Date().getTime();return o.getTime()-r>126144e3*1e3&&o.setUTCDate(o.getUTCDate()-1),Math.floor(o.getTime()/1e3)};var Pa=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var Ct=class extends R{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return Pa(this.context,e)}};var $t=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=Ke,timeout:r,client:n,network:a="mainnet",logger:s=me,forceAddressesInterface:c}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new Ct({api:new pe({url:o,timeout:r,client:n})}),c&&this.initializeForcedAddresses(c);}initializeForcedAddresses(e){let o=["localnet","devnet","testnet","mainnet"];Object.entries(e).forEach(([r,n])=>{if(!n){this.logger.warn(`No addresses provided for network: ${r}. Skipping initialization for this network.`);return}if(o.includes(r)){let a=r;this.addressMap.set(a,n),a===this.network&&(this.currentAddresses=n);}});}async read(e=this.addressId){let o=await this.addressApiRepo.read(e),r=n=>["localnet","devnet","testnet","mainnet"].includes(n);for(let[n,a]of Object.entries(o))r(n)&&typeof a=="object"&&(n===this.network&&(this.currentAddresses=a),this.addressMap.set(n,a));return this.addressId!==o.id&&this.logger.warn(`The addressId provided (${this.addressId}) does not match the id returned from the API (${o.id}).`),this.getAllAddresses()}get(e){if(this.currentAddresses)return e.split(".").reduce((r,n)=>typeof r=="object"?r[n]:r,this.currentAddresses)||void 0}set(e,o){if(this.currentAddresses){let r=e.split(".");r.reduce((n,a,s)=>{if(s===r.length-1)n[a]=o;else return n[a]},this.currentAddresses);}return this.currentAddresses}switchCurrentAddresses(e){return this.addressMap.has(e)&&(this.currentAddresses=this.addressMap.get(e),this.network=e),this.currentAddresses}getAddresses(e){return e?this.addressMap.get(e):this.currentAddresses??this.addressMap.get(this.network)}getAllAddresses(){return Object.fromEntries(this.addressMap)}},Ra=$t;var wt=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([m,y])=>!!y).map(([m,y])=>[m,y.decimals]),...Object.entries(t).filter(([m,y])=>!!y?.sCoinName).map(([m,y])=>[y.sCoinName,y.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([m,y])=>!!y).map(([m,y])=>[m,y?.coinType]),...Object.entries(t).filter(([m,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([m,y])=>[y.sCoinName,y.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([m,y])=>[y,m])),s=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y&&e.wormhole.has(m)).map(([m,y])=>[y.coinType,y.coinName])),c=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y).map(([m,y])=>[y.coinName,o(y.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([m,y])=>[suiKit.parseStructTag(y.sCoinType).name,y.sCoinName])),l=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([m,y])=>[y.sCoinType,y.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y&&e.suiBridge.has(y.coinName)).map(([m,y])=>[y.coinType,y.coinName])),b=Object.fromEntries(Object.entries(t).filter(([m,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([m,y])=>[y.sCoinName,y.sCoinType])),f=new Set([...Object.values(t).filter(m=>!!m).map(m=>m.sCoinName?[m.coinName,m.sCoinName]:[m.coinName]).flat()]);return {coinDecimals:Object.freeze(r),coinTypes:Object.freeze(n),coinTypeToCoinNameMap:Object.freeze(a),coinNameToOldMarketCoinTypeMap:Object.freeze(c),wormholeCoinTypeToCoinNameMap:Object.freeze(s),voloCoinTypeToCoinNameMap:Object.freeze(u),suiBridgeCoinTypeToCoinNameMap:Object.freeze(p),scoinRawNameToSCoinNameMap:Object.freeze(i),scoinTypeToSCoinNameMap:Object.freeze(l),sCoinTypes:Object.freeze(b),supportedBorrowIncentiveRewards:f}};var va={lending:new Set,borrowing:new Set,collateral:new Set,packages:new Set,scoin:new Set,spool:new Set,borrowIncentiveRewards:new Set,rewardsAsPoint:new Set,suiBridge:new Set,wormhole:new Set,layerZero:new Set,oracles:new Set,pythEndpoints:new Set,deprecated:new Set,emerging:new Set};var je=()=>Object.fromEntries(Object.entries(va).map(([t,e])=>[t,new Set(e)])),nc=t=>{let e=new Set(t),o=()=>{throw new TypeError("Cannot mutate readonly ScallopConstants whitelist")};return Object.defineProperties(e,{add:{value:o},clear:{value:o},delete:{value:o}}),Object.freeze(e)},Be=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,nc(o)]))),_e=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),xt=t=>{let e=je();for(let[o,r]of Object.entries(t))r&&(Array.isArray(r)?e[o]=new Set(r):r instanceof Set&&(e[o]=new Set(r)));return Be(e)},Gt=t=>Object.keys(t).length===0;var Ia=({address:t,logger:e,defaultValues:o})=>({async ensureAddresses({network:r,force:n,addressId:a}){let s=t.getAddresses(r);(!s||Object.keys(s).length===0||n)&&await t.read(a);},getAddresses(r){return t.getAddresses(r)},async fetchWhitelist(){let{api:r,fetchWithCache:n}=t.addressApiRepo.context,a=await(async()=>{try{return await n({queryKey:g.api.getWhiteList(),queryFn:()=>r.get("/pool/whitelist")})}catch(s){return e.warn("whitelist fetch failed; using default values",{message:s?.message}),o?.whitelist??je()}})();return xt(a)},async fetchPoolAddresses(){let{api:r,fetchWithCache:n}=t.addressApiRepo.context;return await(async()=>{try{return await n({queryKey:g.api.getPoolAddresses(),queryFn:()=>r.get("/pool/addresses")})}catch(s){return e.warn("poolAddresses fetch failed; using default values",{message:s?.message}),o?.poolAddresses??{}}})()}});var zt=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],ac=(t,e)=>Object.fromEntries(Object.entries(t).filter(([o])=>Object.values(e).some(r=>r.has(o))).filter(o=>o[1]!==void 0).map(([o,r])=>{let n=Object.fromEntries(Object.entries(r).map(([a,s])=>[a,typeof s=="boolean"?s??false:s||void 0]));return [o,n]})),sc=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&zt.every(s=>o[s].size>0)},Na=async({source:t,network:e,force:o,addressId:r,overrides:n={},current:a,parseToOldMarketCoin:s})=>{await t.ensureAddresses({network:e,force:o,addressId:r});let c=a.whitelist,i=a.poolAddresses;n.forcePoolAddressInterface&&(i=_e(n.forcePoolAddressInterface)),n.forceWhitelistInterface&&(c=xt(n.forceWhitelistInterface));let l=()=>wt({poolAddresses:i,whitelist:c,parseToOldMarketCoin:s});if(sc(t,e,c,i)&&!o)return {whitelist:c,poolAddresses:i,derived:l()};let[d,u]=await Promise.all([t.fetchWhitelist(),t.fetchPoolAddresses()]);return n.forceWhitelistInterface||(c=Be(d)),n.forcePoolAddressInterface||(i=_e(ac(u,c))),{whitelist:c,poolAddresses:i,derived:l()}};var ja=t=>({getAddresses:()=>t.getAddresses()});var Ba=t=>({getPoolAddresses:()=>t.poolAddresses});var _a=t=>({getWhitelist:()=>t.whitelist});var ic=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],cc=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],lc=(t,e)=>{let r=(e?.requiredPaths??ic).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=cc.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},Ma=(t,e)=>{let o=lc(t,e);if(!o.valid)throw new re("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var dc=(t,e)=>{let o=e.split(".").reduce((r,n)=>{if(r&&typeof r=="object"&&n in r)return r[n]},t);return typeof o=="string"&&o!==""?o:void 0},uc=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],pc=t=>{let e=t;return uc.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},Fa=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:pc(t.whitelistSource.getWhitelist()),get:n=>dc(o,n)};return Ma(r,{requiredPaths:e.requiredPaths}),r};var mc=()=>{let t=Be(je()),e=_e({});return {whitelist:t,poolAddresses:e,derived:wt({poolAddresses:e,whitelist:t,parseToOldMarketCoin:()=>""})}},Yt=class{address;logger;params;source;_state=mc();get coinDecimals(){return this._state.derived.coinDecimals}get coinNameToOldMarketCoinTypeMap(){return this._state.derived.coinNameToOldMarketCoinTypeMap}get scoinRawNameToSCoinNameMap(){return this._state.derived.scoinRawNameToSCoinNameMap}get scoinTypeToSCoinNameMap(){return this._state.derived.scoinTypeToSCoinNameMap}get wormholeCoinTypeToCoinNameMap(){return this._state.derived.wormholeCoinTypeToCoinNameMap}get voloCoinTypeToCoinNameMap(){return this._state.derived.voloCoinTypeToCoinNameMap}get suiBridgeCoinTypeToCoinNameMap(){return this._state.derived.suiBridgeCoinTypeToCoinNameMap}get coinTypes(){return this._state.derived.coinTypes}get sCoinTypes(){return this._state.derived.sCoinTypes}get coinTypeToCoinNameMap(){return this._state.derived.coinTypeToCoinNameMap}get supportedBorrowIncentiveRewards(){return this._state.derived.supportedBorrowIncentiveRewards}constructor(e){let{logger:o=me,scallopAddress:r,defaultValues:n,forcePoolAddressInterface:a,forceWhitelistInterface:s,strictInit:c,urls:i,...l}=e;this.address=r??new Ra({...l,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??Ia({address:this.address,logger:this.logger,defaultValues:n});}get url(){return this.address.url}get protocolObjectId(){return this.address.get("core.object")??"0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf"}get isInitialized(){return this.isInitializedFor("mainnet")}get whitelist(){return this._state.whitelist}get poolAddresses(){return this._state.poolAddresses}get(e){return this.address.get(e)}set(e,o){return this.address.set(e,o)}getAddresses(e){return this.address.getAddresses(e)}getAllAddresses(){return this.address.getAllAddresses()}switchCurrentAddresses(e){return this.address.switchCurrentAddresses(e)}isAddressInitialized({network:e="mainnet"}={}){let o=this.address.getAddresses(e);return !!o&&!Gt(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!Gt(this._state.poolAddresses)&&zt.every(o=>this._state.whitelist[o].size>0)}async init({network:e="mainnet",force:o=false,addressId:r,constantsParams:n=this.params}={}){this._state=await Na({source:this.source,network:e,force:o,addressId:r,overrides:{forcePoolAddressInterface:n.forcePoolAddressInterface,forceWhitelistInterface:n.forceWhitelistInterface},current:{whitelist:this._state.whitelist,poolAddresses:this._state.poolAddresses},parseToOldMarketCoin:a=>this.parseToOldMarketCoin(a)}),this.maybeAssertStrictInit();}maybeAssertStrictInit(){this.params.strictInit&&Fa({addressSource:ja(this),poolAddressSource:Ba(this),whitelistSource:_a(this)},{});}},Da=Yt;var La=10,Xt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new Da(e),e.client){let{client:o,fullnodeUrl:r,tokensPerSecond:n=La}=e;this.onchain=Nt(o,r,{tokensPerSecond:n});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=La}=e,a=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=Nt(a,r,{tokensPerSecond:n});}this.walletAddress=e.walletAddress,this.logger=e.logger??me;}get address(){return this.constants.address}isSuiBridgeAsset(e){return this.constants.whitelist.suiBridge.has(e)}isWormholeAsset(e){return this.constants.whitelist.wormhole.has(e)}isLayerZeroAsset(e){return this.constants.whitelist.layerZero.has(e)}isMarketCoin(e){let o=e.slice(1).toLowerCase();return e.charAt(0).toLowerCase()==="s"&&this.constants.whitelist.lending.has(o)}async init({force:e=false}={}){await this.constants.init({force:e});}parseCoinName(e){return e.slice(1)}parseSymbol(e){return this.isMarketCoin(e)?this.constants.poolAddresses[this.parseCoinName(e)]?.sCoinSymbol??"":this.constants.poolAddresses[e]?.symbol??""}parseCoinType(e,o=false){return o?this.constants.coinNameToOldMarketCoinTypeMap[e]??"":this.constants.coinTypes[e]??""}parseSCoinName(e){if(this.isMarketCoin(e)&&this.constants.whitelist.scoin.has(e))return e;{let o=`s${e}`;return this.constants.whitelist.scoin.has(o)?o:void 0}}parseSCoinTypeNameToMarketCoinName(e){return this.constants.scoinRawNameToSCoinNameMap[e]??e}parseSCoinType(e){return this.constants.sCoinTypes[e]??""}parseSCoinNameFromType(e){return this.constants.scoinTypeToSCoinNameMap[e]}parseUnderlyingSCoinType(e){let o=this.parseCoinName(e);return this.parseCoinType(o)}getSCoinTreasury(e){return this.address.get(`scoin.coins.${e}.treasury`)}parseMarketCoinType(e){return this.parseCoinType(this.isMarketCoin(e)?this.parseCoinName(e):e,true)}parseMarketCoinName(e){return `s${e}`}getSpoolRewardCoinName=()=>"sui";getCoinDecimal(e){return this.constants.coinDecimals[e]??0}getCoinWrappedType(e){if(this.isSuiBridgeAsset(e))return {from:"Sui Bridge",type:"Asset from Sui Bridge"};if(this.isWormholeAsset(e))return {from:"Wormhole",type:"Portal from Ethereum"};if(this.isLayerZeroAsset(e))return {from:"LayerZero",type:"Ominchain Fungible Token from LayerZero"}}parseCoinNameFromType(e){e=suiKit.normalizeStructTag(e);let{address:o,module:r,name:n,typeParams:a}=suiKit.parseStructTag(e);return o===this.constants.protocolObjectId&&r==="reserve"&&n==="MarketCoin"?this.parseMarketCoinName((typeof a[0]=="string"?suiKit.parseStructTag(a[0]):a[0]).name.toLowerCase()):this.constants.coinTypeToCoinNameMap[e]||this.constants.scoinTypeToSCoinNameMap[e]||suiKit.parseStructTag(e).name.toLowerCase()}async selectCoins({amount:e,count:o,coinType:r=suiKit.SUI_TYPE_ARG,ownerAddress:n=this.walletAddress}){if(e!==void 0&&e<=0)throw new Error("selectCoins amount must be greater than 0.");if(o!==void 0&&o<=0)throw new Error("selectCoins count must be greater than 0.");let a=[],s=e===void 0?void 0:BigInt(Math.trunc(e)),c=o??0,i=0n,l=true,d=null;for(;l&&(s===void 0?a.length<c:i<s);){let{objects:u,hasNextPage:p,cursor:b}=await this.onchain.client.listCoins({owner:n,coinType:r,cursor:d});u.sort((f,m)=>Number(BigInt(m.balance)-BigInt(f.balance)));for(let f of u)if(a.push({objectId:f.objectId,digest:f.digest,version:f.version,balance:f.balance}),i+=BigInt(f.balance),s===void 0?a.length>=c:i>=s)break;d=b,l=p;}if(!a.length)throw new Error("No valid coins found for the transaction.");return a}async mergeSimilarCoins(e,o,r,n=this.walletAddress){try{let a=await this.selectCoins({amount:Number.MAX_SAFE_INTEGER,coinType:r,ownerAddress:n});a.length>0&&e.mergeCoins(o,a.slice(0,500).map(e.objectRef));}catch{}}parseAprToApy(e,o=365){return (1+e/o)**o-1}parseApyToApr(e,o=365){return ((1+e)**(1/o)-1)*o}getUnlockAt(e,o){let r=Math.floor(new Date().getTime()/1e3),n=o?Math.max(Math.floor(o/1e3)-r,0):0,a=0;if(n===0){let s=(e??1)*86400;a=Math.min(r+s,r+126144e3);}else {let s=Math.min(e?e*86400+n:n,126144e3);a=r+s;}return Oa(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},Ea=Xt;var Tt=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var Jt=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,...n}){this.utils=e??new Ea(n),this.repos=ka({utils:this.utils,queryClient:o,queryClientConfig:r});}get logger(){return this.utils.logger}async init(e=false){await this.utils.init({force:e});}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async fetchMarkets(e){let o=e?.poolCoinNames||e?.collateralCoinNames?Array.from(new Set([...e.poolCoinNames??[],...e.collateralCoinNames??[]])):void 0,r=e?.coinPrices??await this.getPythCoinPrices({coinNames:o})??{};return this.repos.market.getMarkets({coinPrices:r,poolCoinNames:e?.poolCoinNames,collateralCoinNames:e?.collateralCoinNames,source:ge(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:Tt(r,e),collaterals:Tt(n,e)}}async getMarketPool(e,o){return (await this.getMarketPools(void 0,o)).pools[e]}async getMarketCollaterals(e=[...this.constants.whitelist.collateral],o){let{collaterals:r}=await this.fetchMarkets({...o,poolCoinNames:[],collateralCoinNames:e});return Tt(r,e)}async getMarketCollateral(e,o){return (await this.getMarketCollaterals(void 0,o))[e]}async getObligations(e=this.walletAddress){return this.repos.obligation.getObligations(e)}async queryObligation(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("queryObligation expects an object id (string) or an object reference");return this.repos.obligation.getObligationData(o)}async getObligationLocked(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new T("getObligationLocked expects an object id (string) or an object reference");return this.repos.obligation.getObligationLocked(o)}async getCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmounts({coinNames:e,address:o})}async getCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmount({coinName:e,address:o})}async getMarketCoinAmounts(e,o=this.walletAddress){let r=e??[...this.constants.whitelist.lending].map(n=>this.utils.parseMarketCoinName(n));return await this.repos.coinBalance.getMarketCoinAmounts({marketCoinNames:r,address:o})}async getMarketCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getMarketCoinAmount({marketCoinName:e,address:o})}async getSpools(e,o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.spool.getSpools({stakeCoinNames:e??[...this.constants.whitelist.spool],coinPrices:r,source:ge(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:ge(o)})}async getAllStakeAccounts(e=this.walletAddress){return await this.repos.spool.getStakeAccounts({address:e})}async getStakeAccounts(e,o=this.walletAddress){return (await this.getAllStakeAccounts(o))[e]??[]}async getStakePools(e=[...this.constants.whitelist.spool]){let o={};for(let r of e){let n=await this.repos.spool.getStakePool(r);n&&(o[r]=n);}return o}async getStakePool(e){return this.repos.spool.getStakePool(e)}async getStakeRewardPools(e=[...this.constants.whitelist.spool]){return this.repos.spool.getSpoolRewardPools(e)}async getStakeRewardPool(e){return this.repos.spool.getSpoolRewardPool(e)}async getPythCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromPyth({coinNames:o,source:"api-first"})}async getPythCoinPrice(e){return (await this.getPythCoinPrices({coinNames:[e]}))[e]}async getIndexerCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromIndexer({coinNames:o})}async getIndexerCoinPrice(e){return (await this.getIndexerCoinPrices({coinNames:[e]}))[e]}async getBorrowIncentivePools(e=[...this.constants.whitelist.lending],o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.borrowIncentive.getBorrowIncentivePools({coinNames:e,coinPrices:r})}async getBorrowIncentiveAccounts(e,o=[...this.constants.whitelist.lending]){return await this.repos.borrowIncentive.getBorrowIncentiveAccounts({obligationId:typeof e=="string"?e:e.objectId,coinNames:o})}async getLendings(e,o=this.walletAddress,r){let n=e??[...this.constants.whitelist.lending],a=n.map(m=>this.utils.parseMarketCoinName(m)),s=a.filter(m=>this.constants.whitelist.spool.has(m)),c=r?.coinPrices??await this.getPythCoinPrices({coinNames:n})??{},i=r?.marketPools??(await this.getMarketPools(n,{...r,coinPrices:c})).pools,l=await this.getSpools(s,{...r,marketPools:i,coinPrices:c}),[d,u,p,b]=await Promise.all([this.getCoinAmounts(n,o),this.getMarketCoinAmounts(a,o),this.getSCoinAmounts(a,o),this.getAllStakeAccounts(o)]),f={};for(let m of n){let y=this.utils.parseMarketCoinName(m),h=s.includes(y);f[m]=mo({coinName:m,symbol:this.utils.parseSymbol(m),coinType:this.utils.parseCoinType(m),marketCoinType:this.utils.parseMarketCoinType(m),coinDecimal:this.utils.getCoinDecimal(m)??0,coinPrice:c[m]??0,marketPool:i?.[m],spool:h?l[y]:void 0,stakeAccounts:h?b[y]??[]:[],coinAmount:d[m]??0,marketCoinAmount:u[y]??0,sCoinAmount:p[y]??0});}return f}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return V({source:ge(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)})}async getObligationAccountsByIds(e,o){return V({source:ge(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return V({source:ge(o),label:"ScallopQuery.getObligationAccountById",logger:this.logger,api:()=>this.assembleObligationAccountById(e,o,true),onchain:()=>this.assembleObligationAccountById(e,o,false)})}async resolveObligationMarketInputs(e,o){let r=e?.market??await this.getMarketPools(void 0,{indexer:o}),n=e?.coinPrices??await this.getAllCoinPrices({marketPools:r.pools});return {market:r,coinPrices:n}}async assembleObligationAccount(e,o){let{market:r,coinPrices:n,coinAmounts:a}=o,[s,c,i]=await Promise.all([this.queryObligation(e),this.getBorrowIncentivePools(void 0,{coinPrices:n,marketPools:r.pools}),this.getBorrowIncentiveAccounts(e)]);return bo({obligationId:typeof e=="string"?e:e.objectId,collateralCoinNames:Array.from(this.constants.whitelist.collateral),market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:c,borrowIncentiveAccounts:i,utils:{parseCoinNameFromType:l=>this.utils.parseCoinNameFromType(l),parseCoinType:l=>this.utils.parseCoinType(l),parseSymbol:l=>this.utils.parseSymbol(l),getCoinDecimal:l=>this.utils.getCoinDecimal(l),parseSCoinTypeNameToMarketCoinName:l=>this.utils.parseSCoinTypeNameToMarketCoinName(l)}})}async assembleObligationAccountsByOwner(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),[s,c]=await Promise.all([this.getCoinAmounts(void 0,e),this.getObligations(e)]),i=await this.repos.obligation.getObligationObjects(c.map(d=>d.id)),l={};return await Promise.allSettled(c.map(async(d,u)=>{l[d.keyId]=await this.assembleObligationAccount(i[u]??d.id,{market:n,coinPrices:a,coinAmounts:s});})),l}async assembleObligationAccountsByIds(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),s=[];return await Promise.allSettled(e.map(async c=>{let i=await this.assembleObligationAccount(c,{market:n,coinPrices:a,coinAmounts:{}});i&&s.push(i);})),s}async assembleObligationAccountById(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r);return this.assembleObligationAccount(e,{market:n,coinPrices:a,coinAmounts:{}})}async getObligationAccount(e,o=this.walletAddress,r){let n=await this.getObligationAccounts(o,r);return Object.values(n).find(a=>a?.obligationId===e)}async getTvl(e){let o=await this.getIndexerCoinPrices();return this.repos.market.getTvl({source:ge(e),coinPrices:o})}async getVeSca(e){return await this.repos.veSca.getVeSca(typeof e=="string"?e:e.objectId)}async getVeScas({walletAddress:e=this.walletAddress,excludeEmpty:o=false}={}){return await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o})}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return this.repos.referral.getVeScaKeyIdFromReferralBindings(e)}async getBindedObligation(e){return this.repos.borrowIncentive.getBindedObligation(e)}async getBindedVeScaKey(e){return this.repos.borrowIncentive.getBindedVeScaKey(e)}async getLoyaltyProgramInfos(e){let o=e??(await this.getVeScas())[0]?.keyId,r=typeof o=="string"?o:o?.objectId;return this.repos.loyaltyProgram.getLoyaltyProgramInfos(r)}async getVeScaLoyaltyProgramInfos(e){return this.repos.veScaLoyaltyProgram.getVeScaLoyaltyProgramInfos(e)}async getSCoinTotalSupply(e){return await this.repos.coinBalance.getSCoinTotalSupply(e)}async getSCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getSCoinAmounts({sCoinNames:e,address:o})}async getSCoinAmount(e,o=this.walletAddress){let r=this.utils.parseSCoinName(e);return r?await this.repos.coinBalance.getSCoinAmount({sCoinName:r,address:o}):0}async getSCoinSwapRate(e,o){if(e===o)throw new T("fromAsset and toAsset must be different");if(!this.constants.whitelist.scoin.has(e))throw new T("fromAsset is not supported");if(!this.constants.whitelist.scoin.has(o))throw new T("toAsset is not supported");let r=this.utils.parseCoinName(e),n=this.utils.parseCoinName(o),[a,s]=await Promise.all([this.getMarketPool(r),this.getMarketPool(n)]);if(!a||!s)throw new T("Failed to fetch the lendings data");if(a.conversionRate===0||s.conversionRate===0)throw new T("Conversion rate cannot be zero");let c=a.conversionRate,i=1/s.conversionRate,l=await this.getPythCoinPrices();if(!l[r]||!l[n]||l[r]===0||l[n]===0){let u=await this.getIndexerCoinPrices().catch(()=>({}));l={...l,...u};}if(!l[r]||!l[n])throw new T("Failed to fetch the coin prices");let d=l[r]/l[n];return bignumber_js.BigNumber(c).multipliedBy(d).multipliedBy(i).toNumber()}async getFlashLoanFees(e=[...this.constants.whitelist.lending]){return await this.repos.flashloan.getFlashloanFees(e)}async getPoolSupplyLimit(e){return this.repos.market.getPoolSupplyLimit(e)}async getPoolBorrowLimit(e){return this.repos.market.getPoolBorrowLimit(e)}async getIsolatedAssets(e=false){return await this.repos.isolatedAssets.getIsolatedAssets({source:Aa({useOnChainQuery:e})})}async isIsolatedAsset(e,o=false){let r=this.constants.poolAddresses[e];return r&&!o?r.isIsolated:(await this.repos.isolatedAssets.getIsolatedAssets({source:"onchain"})).includes(this.utils.parseCoinType(e))}async getAllCoinPrices(e){let o=e?.indexer??false,r=e?.coinPrices??(o?await this.getIndexerCoinPrices():await this.getPythCoinPrices()),n=e?.marketPools??(await this.getMarketPools(void 0,{coinPrices:r,indexer:o})).pools;return fo({coinPrices:r,marketPools:n,sCoinNames:[...this.constants.whitelist.scoin],parseCoinName:a=>this.utils.parseCoinName(a)})}async getPoolAddresses(e=this.address.addressId){if(!e)throw new T("apiAddressId is required");return this.repos.poolAddresses.getPoolAddresses({})}async getUserPortfolio(e){let o=e?.walletAddress??this.walletAddress,r=e?.indexer??false,n=await this.getAllCoinPrices({indexer:r}),a=await this.getMarketPools(void 0,{indexer:r,coinPrices:n}),[s,c,i]=await Promise.all([this.getLendings(void 0,o,{indexer:r,marketPools:a.pools,coinPrices:n}),this.getObligationAccounts(o,{indexer:r,market:a,coinPrices:n}),this.getVeScas({walletAddress:o,excludeEmpty:true})]);return yo({lendings:s,obligationAccounts:c,veScas:i,coinPrices:n,marketPools:a.pools})}async getPriceUpdatePolicies(){return this.repos.xOracle.getPriceUpdatePolicies()}async getAssetOracles(){return this.repos.xOracle.getAssetOracles()}async getSwitchboardOnDemandAggregatorObjectIds(e){return this.repos.xOracle.getOnDemandAggObjectIds(e)}},Va=Jt;var Zt=class{query;usePythPullModel;useOnChainXOracleList;sponsoredFeeds;suiKit;pythEndpoints;constructor({usePythPullModel:e=true,useOnChainXOracleList:o=true,sponsoredFeeds:r=[],pythEndpoints:n=[],query:a,...s}){this.suiKit=new suiKit.SuiKit({...s,fullnodeUrls:[s.fullnodeUrl]}),this.query=a??new Va({...s,walletAddress:s.walletAddress??this.suiKit.currentAddress}),this.usePythPullModel=e,this.useOnChainXOracleList=o,this.sponsoredFeeds=r,this.pythEndpoints=n;}_executor;get executor(){return this._executor??=new Je(this.suiKit)}get utils(){return this.query.utils}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async init(e=false){await this.query.init(e);}createTxBlock(e){return ur(this,e)}async selectCoin(e,o,r,n=this.walletAddress,a=false){if(o==="sui"&&!a){let[s]=e.splitSUIFromGas([r]);return {takeCoin:s}}else {let s=this.utils.parseCoinType(o),c=await this.utils.selectCoins({amount:r,coinType:s,ownerAddress:n}),i=c.reduce((u,p)=>(u+=Number(p.balance),u),0),[l,d]=e.takeAmountFromCoins(c,r);return {takeCoin:l,leftCoin:d,totalAmount:i}}}async selectMarketCoin(e,o,r,n=this.walletAddress){let a=this.utils.parseMarketCoinType(o),s=await this.utils.selectCoins({amount:r,coinType:a,ownerAddress:n}),c=s.reduce((d,u)=>(d+=Number(u.balance),d),0),[i,l]=e.takeAmountFromCoins(s,Math.min(r,c));return {takeCoin:i,leftCoin:l,totalAmount:c}}async selectSCoin(e,o,r,n=this.walletAddress){let a=this.utils.parseSCoinType(o),s=await this.utils.selectCoins({amount:r,coinType:a,ownerAddress:n}),c=s.reduce((d,u)=>(d+=Number(u.balance),d),0),[i,l]=e.takeAmountFromCoins(s,Math.min(c,r));return {takeCoin:i,leftCoin:l,totalAmount:c}}async selectSCoinOrMarketCoin(e,o,r,n=this.walletAddress){let a=r,s={sCoins:[],marketCoins:[],leftCoins:[]};try{let{leftCoin:l,takeCoin:d,totalAmount:u}=await this.selectSCoin(e,o,a,n);if(s.leftCoins.push(l),s.sCoins.push(d),a-=u,a>0){let{leftCoin:p,takeCoin:b}=await this.selectMarketCoin(e,o,r,n);e.transferObjects([p],n),s.marketCoins.push(b);}}catch{let{takeCoin:d,leftCoin:u}=await this.selectMarketCoin(e,o,r,n);s.leftCoins.push(u),s.marketCoins.push(d);}e.transferObjects(s.leftCoins,n);let c=s.marketCoins.length>0?s.marketCoins.length>1?e.mergeCoins(s.marketCoins[0],s.marketCoins.slice(1)):s.marketCoins[0]:void 0;return {sCoin:s.sCoins.length>0?s.sCoins.length>1?e.mergeCoins(s.sCoins[0],s.sCoins.slice(1)):s.sCoins[0]:void 0,marketCoin:c}}async signAndSendTxBlock(e){return await this.executor.signAndSendTxn(e)}moveCall(e,o,r,n){return e.moveCall(o,r,n)}},Ka=Zt;var eo=class{builder;collateralService;lendingService;borrowService;spoolService;veScaService;referralService;networkType;constructor({builder:e,networkType:o,...r}){this.builder=e??new Ka(r),this.collateralService=new De(this),this.lendingService=new Le(this),this.borrowService=new Ve(this),this.spoolService=new $e(this),this.veScaService=new Ge(this),this.referralService=new ze(this),this.networkType=o??"mainnet";}get query(){return this.builder.query}get utils(){return this.query.utils}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get suiKit(){return this.builder.suiKit}get onchain(){return this.utils.onchain}get executor(){return this.builder.executor}get address(){return this.builder.address}async init(e=false){await this.builder.init(e);}async openObligation(e=true){return this.borrowService.openObligation(e)}async depositCollateral(e,o,r=true,n,a,s){return this.collateralService.depositCollateral(e,o,r,n,a,s)}async withdrawCollateral(e,o,r=true,n,a,s,c){return this.collateralService.withdrawCollateral(e,o,r,n,a,s,c)}async supply(e,o,r=true,n){return this.lendingService.supply(e,o,r,n)}async supplyAndStake(e,o,r=true,n,a){return this.borrowService.supplyAndStake(e,o,r,n,a)}async withdraw(e,o,r=true,n){return this.lendingService.withdraw(e,o,r,n)}async borrow(e,o,r=true,n,a,s,c){return this.borrowService.borrow(e,o,r,n,a,s,c)}async repay(e,o,r=true,n,a,s,c){return this.borrowService.repay(e,o,r,n,a,s,c)}async flashLoan(e,o,r,n=true,a){return this.lendingService.flashLoan(e,o,r,n,a)}async createStakeAccount(e,o=true,r){return this.spoolService.createStakeAccount(e,o,r)}async stake(e,o,r=true,n,a){return this.spoolService.stake(e,o,r,n,a)}async unstake(e,o,r=true,n,a){return this.spoolService.unstake(e,o,r,n,a)}async unstakeAndWithdraw(e,o,r=true,n,a){return this.spoolService.unstakeAndWithdraw(e,o,r,n,a)}async claim(e,o=true,r,n){return this.spoolService.claim(e,o,r,n)}async stakeObligation(e,o,r=true,n){return this.borrowService.stakeObligation(e,o,r,n)}async unstakeObligation(e,o,r=true,n){return this.borrowService.unstakeObligation(e,o,r,n)}async claimBorrowIncentive(e,o,r=true,n){return this.borrowService.claimBorrowIncentive(e,o,r,n)}async migrateAllMarketCoin(e=true,o=true,r){let n=r??this.walletAddress,a=this.builder.createTxBlock();a.setSender(n);let s=[];for(let c of this.constants.whitelist.scoin){let i=[];try{let{takeCoin:l}=await this.builder.selectMarketCoin(a,c,Number.MAX_SAFE_INTEGER,n);if(l){let d=a.mintSCoin(c,l);i.push(d);}}catch(l){if(!l.toString().includes("No valid coins found for the transaction"))throw l}if(e&&this.constants.whitelist.spool.has(c))try{let l=await a.unstakeQuick(Number.MAX_SAFE_INTEGER,c);l&&i.push(l);}catch{}if(i.length>0){let l=i[0];i.length>1&&a.mergeCoins(l,i.slice(1));let d=this.utils.parseSCoinType(c);await this.utils.mergeSimilarCoins(a,l,d,n),s.push(l);}}return s.length>0&&a.transferObjects(s,n),o?await this.executor.signAndSendTxn(a):a.txBlock}async claimAllUnlockedSca(e=true,o){return this.veScaService.claimAllUnlockedSca(e,o)}async mintTestCoin(e,o,r=true,n){if(!(this.networkType==="testnet"))throw new Error("Only be used on the test network.");let s=this.builder.createTxBlock(),c=n??this.walletAddress,i=this.address.get("core.packages.testCoin.id"),l=this.address.get(`core.coins.${e}.treasury`),d=`${i}::${e}::mint`,u=s.moveCall(d,[l,o]);return s.transferObjects([u],c),r?await this.executor.signAndSendTxn(s):s.txBlock}},Sc=eo;
20
20
 
21
- exports.ScallopClient = bc;
21
+ exports.ScallopClient = Sc;