@scallop-io/sui-scallop-sdk 4.4.0-alpha.1 → 4.4.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/builder.cjs CHANGED
@@ -8,7 +8,7 @@ var jsonRpc = require('@mysten/sui/jsonRpc');
8
8
  var bignumber_js = require('bignumber.js');
9
9
  var queryCore = require('@tanstack/query-core');
10
10
  var graphql = require('@mysten/sui/graphql');
11
- var As = require('axios');
11
+ var Rs = require('axios');
12
12
  var bcs = require('@mysten/sui/bcs');
13
13
  var zod = require('zod');
14
14
  var sha3_js = require('@noble/hashes/sha3.js');
@@ -16,9 +16,9 @@ var grpc = require('@mysten/sui/grpc');
16
16
 
17
17
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
18
18
 
19
- var As__default = /*#__PURE__*/_interopDefault(As);
19
+ var Rs__default = /*#__PURE__*/_interopDefault(Rs);
20
20
 
21
- var Zt=({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 De="https://sui.apis.scallop.io",Le="https://sdk.api.scallop.io";var Ee={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Ve="0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA";var Ct="0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410";var g={api:{getAddresses:t=>["api","getAddresses",t],getWhiteList:()=>["api","getWhiteList"],getPoolAddresses:()=>["api","getPoolAddresses"],getMarkets:()=>["api","getMarkets"],getSpools:()=>["api","getSpools"],getTotalValueLocked:()=>["api","getTotalValueLocked"]},rpc:{getInspectTxn:t=>["rpc","getInspectTxn",t],getObject:t=>["rpc","getObject",t],getObjects:t=>["rpc","getObjects",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],getCoinBalancesByTypes:t=>["rpc","getCoinBalancesByTypes",t]},oracle:{getPythAllPriceFeeds:(t,e)=>["oracle","getPythAllPriceFeeds",e,t]}};[suiKit.getFullnodeUrl("mainnet")];var eo={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 re=t=>`${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`,j=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")},St=t=>{if(t<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},wt=(t,e,o)=>{Te(o),St(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}`)},ro=(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),St(r),typeof t=="number"&&t<1e9)throw new Error("Minimum top up amount is 1 SCA");o&&e&&wt(e,o,r);}},no=(t,e)=>{if(Te(e),St(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")},ao=(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 Ae=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=j(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}},so=({ctx:t,txBlock:e})=>({depositCollateralQuick:async(o,r,n,a=false)=>{let s=j(e),{obligationId:c}=await Ae(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 Ae(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=j(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=j(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 Ae(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 Ae(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=j(e),c=await Ae(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=j(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 xt=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`]});}},io=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 xt(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).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():eo,l=new Set(Object.values(i).flatMap(({primary:b,secondary:m})=>[...b,...m])),d=(b,m)=>{let f=i[b];return f&&(f.primary.includes(m)||f.secondary.includes(m))},u=[...new Set(o)],p=u.filter(b=>d(b,"pyth"));if(l.has("pyth")){let b=[];for(let m of p){let f=!n&&!s.has(m);(n||f)&&b.push(m);}b.length>0&&await io(t,b,e,c);}for(let b of u)rs(t,e,b,i[b]);},rs=(t,e,o,r)=>{let n=t.utils.parseCoinType(o);ns(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);},ns=(t,e,o,r,n,a,s,c,i,l,d,u,p,b,m)=>{let f=h=>typeof h=="string"?t.object(h):h;r=f(r),a=f(a),s=f(s),c=f(c),l=f(l),d=f(d),p=f(p),b=f(b);let y=as(t,o,r,m);return Object.entries(e).forEach(([h,C])=>{C.includes("pyth")&&ls(h,t,n,y,s,c,a,m),C.includes("supra")&&is(h,t,u,y,b,p,m),C.includes("switchboard")&&cs(h,t,i,y,d,l,m);}),ss(t,o,r,y,m),t},as=(t,e,o,r)=>{let n=`${e}::x_oracle::price_update_request`,a=[r];return t.moveCall(n,[o],a)},ss=(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},is=(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]);},ls=(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 z=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 T=class extends z{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var lo=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 po=(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=>lo(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=Zt({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=so({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={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 bo=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&n)return [n];let a=j(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)},ps=async(...t)=>{let[e,o,r,n]=t,a=j(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]},fo=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}},yo=({ctx:t,txBlock:e})=>({stakeQuick:async(o,r,n)=>{let a=j(e),s=await bo(t,e,r,n);if(s.length===0)throw new Error(`No stakeAccountIds found for user ${a}`);if(typeof o=="number"){let c=await fo(t,e,s[0],r,o,a);o-=c,o>0&&await fo(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 ps(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 bo(t,e,o,r),a=[];for(let s of n){let c=await e.claim(s,o);a.push(c);}return a}});var ho=(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=mo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=yo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Co=({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 We=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=j(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}},So=({ctx:t,txBlock:e})=>({stakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await We(t,e,o,r),c=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&(re(i)===`${Ct}::user::unstake`||re(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||re(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 We(t,e,o,r),i=!!e.txBlock.getData().commands.find(l=>l.$kind==="MoveCall"&&(re(l)===`${Ct}::user::unstake`||re(l)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||re(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 We(t,e,o,r);s&&e.unstakeObligation(n,a);},claimBorrowIncentiveQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s}=await We(t,e,r,n);return e.claimBorrowIncentive(a,s,o)}});var xo=(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=Co({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=So({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Ao=({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 ke=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=j(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]},Tt=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}},ko=({ctx:t,txBlock:e})=>({lockScaQuick:async({amountOrCoin:o,lockPeriodInDays:r,autoCheck:n=true,veScaKey:a})=>{let s=j(e),c=await ke(t,e,a),i=t.utils.getUnlockAt(r,c?.unlockAt);n&&ro(o,r,i,c?.unlockAt);let l,d=[];if(o!==void 0&&typeof o=="number"){let b=await t.utils.selectCoins({amount:o,coinType:Ve,ownerAddress:s}),[m,f]=e.takeAmountFromCoins(b.map(y=>y.objectId),o);l=m,d.push(f);}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 ke(t,e,r),s=t.utils.getUnlockAt(o,a?.unlockAt);n&&wt(o,s,a?.unlockAt),a&&e.extendLockPeriod(a.keyId,s);},extendLockAmountQuick:async({scaAmount:o,veScaKey:r,autoCheck:n=true})=>{let a=j(e),s=await ke(t,e,r);if(n&&no(o,s?.unlockAt),s){let c=await t.utils.selectCoins({amount:o,coinType:Ve,ownerAddress:a}),[i,l]=e.takeAmountFromCoins(c.map(d=>d.objectId),o);e.extendLockAmount(s.keyId,i),e.transferObjects([l],a);}},renewExpiredVeScaQuick:async({scaAmount:o,lockPeriodInDays:r,veScaKey:n,autoCheck:a=true})=>{let s=j(e),c=await ke(t,e,n),i=t.utils.getUnlockAt(r,c?.unlockAt);if(a&&ao(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:Ve,ownerAddress:s}),[u,p]=e.takeAmountFromCoins(d.map(b=>b.objectId),o);l.push(p),e.renewExpiredVeSca(c.keyId,u,i),e.transferObjects(l,s);}},redeemScaQuick:async({veScaKey:o,transferSca:r})=>{let n=j(e),a=await ke(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 Tt(t,r,t.address.get("vesca.subsTable")),s=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&re(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],j(e));return}else return c},mergeVeScaQuick:async({targetVeScaKey:o,sourceVeScaKey:r})=>{let n=t.address.get("vesca.subsTableId"),[a,s]=await Promise.all([Tt(t,o,n),Tt(t,r,n)]),c=!!e.txBlock.getData().commands.find(d=>d.$kind==="MoveCall"&&re(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 Po=(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=Ao({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=ko({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Ro=({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 Io=({ctx:t,txBlock:e})=>({claimReferralRevenueQuick:async(o,r=[...t.constants.whitelist.lending])=>{let n=j(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 jo=(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=Ro({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Io({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var No=({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 Bo=({ctx:t,txBlock:e})=>({claimLoyaltyRevenueQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=j(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,j(e)),e.transferObjects([n],r);},claimVeScaLoyaltyRewardQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=j(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimVeScaLoyaltyReward(o);e.transferObjects([n],r);}});var Mo=(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=No({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Bo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Fo=({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 Do=({ctx:t,txBlock:e})=>({mintSCoinQuick:async(o,r)=>{let n=j(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=j(e),{leftCoin:a,takeCoin:s}=await t.coins.selectSCoin(e,o,r,n);return e.transferObjects([a],n),e.burnSCoin(o,s)}});var Eo=(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=Fo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Do({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Vo=({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 Ko=(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=Vo({ctx:r,txBlock:o});return new Proxy(o,{get:(a,s)=>s in n?Reflect.get(n,s):Reflect.get(a,s)})};var Wo=["openObligation","returnObligation","openObligationEntry","depositCollateral","takeCollateral","supply","depositEntry","withdraw","withdrawEntry","borrow","borrowWithReferral","borrowEntry","repay","borrowFlashLoan","repayFlashLoan","liquidate"],Uo=["depositCollateralQuick","takeCollateralQuick","borrowQuick","borrowWithReferralQuick","supplyQuick","withdrawQuick","repayQuick","updateAssetPricesQuick","liquidateQuick"],Qo=["createStakeAccount","stake","unstake","claim","stakeQuick","unstakeQuick","claimQuick"],$o=["stakeObligation","stakeObligationWithVesca","unstakeObligation","claimBorrowIncentive","deactivateBoost","stakeObligationQuick","stakeObligationWithVeScaQuick","unstakeObligationQuick","claimBorrowIncentiveQuick"],Go=["lockSca","extendLockPeriod","extendLockAmount","renewExpiredVeSca","redeemSca","mintEmptyVeSca","splitVeSca","mergeVeSca","lockScaQuick","extendLockPeriodQuick","extendLockAmountQuick","renewExpiredVeScaQuick","redeemScaQuick","splitVeScaQuick","mergeVeScaQuick"],zo=["bindToReferral","claimReferralTicket","burnReferralTicket","claimReferralRevenue","unbindReferral","claimReferralRevenueQuick"],Yo=["claimLoyaltyRevenue","claimVeScaLoyaltyReward","claimLoyaltyRevenueQuick","claimVeScaLoyaltyRewardQuick"],Ho=["mintSCoin","burnSCoin","mintSCoinQuick","burnSCoinQuick"],Xo=["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)},Jo=t=>{let e=t;return Object.freeze({core:ue(e,[...Wo,...Uo]),spool:ue(e,Qo),borrowIncentive:ue(e,$o),vesca:ue(e,Go),referral:ue(e,zo),loyalty:ue(e,Yo),sCoin:ue(e,Ho),obligationNaming:ue(e,Xo)})},Zo=["core","spool","borrowIncentive","vesca","referral","loyalty","sCoin","obligationNaming"];var At=(t,e)=>{let o=Ko(t,e),r=Po(t,o),n=Mo(t,r),a=xo(t,n),s=jo(t,a),c=Eo(t,s),i=ho(t,c),l=po(t,i),d=new Proxy(l,{get:(b,m)=>m in r?Reflect.get(r,m):m in a?Reflect.get(a,m):m in s?Reflect.get(s,m):m in i?Reflect.get(i,m):m in n?Reflect.get(n,m):m in c?Reflect.get(c,m):m in o?Reflect.get(o,m):Reflect.get(b,m)}),u=Jo(d),p=new Set(Zo);return new Proxy(d,{get:(b,m)=>typeof m=="string"&&p.has(m)?u[m]:Reflect.get(b,m),has:(b,m)=>typeof m=="string"&&p.has(m)?true:Reflect.has(b,m)})};var er={effects:true,events:true},Ue=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:er,...e})}signAndExecuteTransaction({transaction:e,additionalSignatures:o,signer:r,derivePathParams:n}){return this.client.signAndExecuteTransaction({transaction:e,additionalSignatures:o,include:er,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 R=class extends z{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Qe=class extends z{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var ne=class extends z{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};var A=(t,e)=>{let o=e instanceof z?e.context:void 0;return t?.error(e.message,o),e},L=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()},xs=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),Ts=new Set(["notExists","dynamicFieldNotFound","deleted"]),kt=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&Ts.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ce=async(t,e)=>{try{return await xs(t,e)}catch(o){if(kt(o))return null;throw o}};var pe=class{client;constructor({url:e,httpClient:o,timeout:r=8e3}={}){this.client=o??As__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 $e=class extends pe{constructor({url:e=Le,...o}){super({url:e,...o});}};var Ge=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 ae=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var ks=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],Os=0,Ps=new Set(ks),tr=new Map;var Rs=(t,e)=>{let o=tr.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,tr.set(t,o);},Is=(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"&&Ps.has(r)?(...c)=>{let i=Date.now();return e.execute(()=>(Rs(r,Date.now()-i),s(...c)))}:s}}),vs=50,js=t=>{if(!t)return "";let e=t;return JSON.stringify(Object.keys(e).sort().map(o=>[o,e[o]]))},ze=class{client;url;pendingObjectReads=[];objectFlushScheduled=false;objectBatchWindowMs;constructor({client:e,url:o,tokensPerSecond:r,objectBatchWindowMs:n=Os}){this.client=Is(e,new Ge(r)),this.url=o,this.objectBatchWindowMs=n;}scheduleObjectFlush(){this.objectFlushScheduled||(this.objectFlushScheduled=true,this.objectBatchWindowMs===null?queueMicrotask(()=>this.flushObjectReads()):setTimeout(()=>this.flushObjectReads(),this.objectBatchWindowMs));}async getObject(e){let{objectId:o,include:r,signal:n}=e;if(n){let{objects:[s]}=await this.client.getObjects({objectIds:[o],signal:n,include:r});if(s instanceof Error)throw s;return {object:s}}let a=await new Promise((s,c)=>{this.pendingObjectReads.push({objectId:o,include:r,includeKey:js(r),resolve:s,reject:c}),this.scheduleObjectFlush();});if(a instanceof Error)throw a;return {object:a}}flushObjectReads(){this.objectFlushScheduled=false;let e=this.pendingObjectReads;this.pendingObjectReads=[];let o=new Map;for(let r of e){let n=o.get(r.includeKey);n?n.push(r):o.set(r.includeKey,[r]);}for(let r of o.values())this.dispatchObjectGroup(r);}async dispatchObjectGroup(e){let o=e[0].include,r=new Map;for(let a of e){let s=r.get(a.objectId);s?s.push(a):r.set(a.objectId,[a]);}let n=[...r.keys()];for(let a of ae(n,vs))try{let{objects:s}=await this.client.getObjects({objectIds:a,include:o});a.forEach((c,i)=>{let l=s[i]??new Error(`Object ${c} missing from batch response`);for(let d of r.get(c)??[])d.resolve(l);});}catch(s){for(let c of a)for(let i of r.get(c)??[])i.reject(s);}}};var Ot="https://graphql.mainnet.sui.io/graphql",Ye=(t,e,o)=>new ze({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond,objectBatchWindowMs:o?.objectBatchWindowMs}),or=(t={})=>{let e=t.url??Ot,o=t.client??new graphql.SuiGraphQLClient({url:e,network:"mainnet"});return Ye(o,e,{tokensPerSecond:t.tokensPerSecond})},rr=(t=Le)=>new $e({url:t}),nr=(t=De)=>new pe({url:t});var ar=["supra","switchboard","pyth"];var sr=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)}),ir=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),cr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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)}},lr=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},dr=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"),obligationNaming:t.address.get("obligationNaming.registryTableId")}}),ur=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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)}},pr=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),mr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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))}}},br=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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}}}},fr=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),yr=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")}}}),gr=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),hr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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}}}},Cr=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()}),Sr=t=>({addresses:{...ar.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 wr=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var xr=new queryCore.QueryClient(Ee);var I=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=xr,logger:o=me,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=wr(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function q(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 Ms="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",Xe=t=>typeof t=="object"&&t!==null,Fs=t=>!Xe(t)||t.$kind!=="Shared"||!("Shared"in t)||!Xe(t.Shared)?false:"initialSharedVersion"in t.Shared;function Ds(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var He=t=>{if(Array.isArray(t))return t.map(He);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return He(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=He(n);return o}return t},Ar=t=>{Ds(t);let e=t.json,o="fields"in e?e.fields:e;return He(o)},Tr=t=>Fs(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Ls=(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,X=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.getObject({objectId:r,include:a,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!c?.object)throw new Error("Failed to get object data");s=Tr(c.object);}else "objectId"in r&&"owner"in r&&(s=Tr(r));return Ls(o,{obj:s??r,mutable:n})},Es=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())]),Vs=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),qs=zod.z.object({id:Vs,name:Es,value:zod.z.unknown().optional()}),kr=t=>t.type.startsWith(Ms),Or=t=>{let{success:e}=qs.safeParse(t);return !!e},Ks=t=>typeof t=="string"?t:t.id,Ws=t=>{if(!Or(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},Us=t=>{if(typeof t=="string")return t;if(!Xe(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},Qs=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!Xe(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"},k=t=>{let e=Ar(t);return kr(t)&&typeof e=="object"?Ws(e):e},Pr=t=>{if(!kr(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=Ar(t);if(Or(e)){let o=Us(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:Ks(e.id),name:o,nameKind:Qs(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var J=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=>J(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return J(e.name)}throw new T(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},Z=(t,e)=>{try{return J(t)}catch(o){throw new T(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var Ir=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:Z(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:Z(e.type,`market.collaterals[${o}].type`)}))}};var vr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",jr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",Nr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var Pt=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)}),Rt=(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),m=bignumber_js.BigNumber(e.debtAmount).multipliedBy(b),f=m.plus(e.debtAmount),y=f.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(m.multipliedBy(e.reserveFactor)),C=h.shiftedBy(-r),x=bignumber_js.BigNumber(f).plus(Math.max(e.cashAmount-h.toNumber(),0)),O=x.shiftedBy(-r),_=bignumber_js.BigNumber(f).dividedBy(x);_=_.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 P=x.dividedBy(e.marketCoinSupplyAmount);return P=P.isFinite()&&!P.isNaN()?P: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:x.toNumber(),supplyCoin:O.toNumber(),borrowAmount:f.toNumber(),borrowCoin:y.toNumber(),reserveAmount:h.toNumber(),reserveCoin:C.toNumber(),utilizationRate:_.toNumber(),supplyApr:N.toNumber(),supplyApy:t.parseAprToApy(N.toNumber()),conversionRate:P.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},It=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)}),vt=(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()}},_r=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 jt=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=f=>{u&&!u.has(f.coinName)||(l[f.coinName]={...f,coinPrice:e[f.coinName]??f.coinPrice,coinWrappedType:a.getCoinWrappedType(f.coinName)});},m=f=>{p&&!p.has(f.coinName)||(d[f.coinName]={...f,coinPrice:e[f.coinName]??f.coinPrice,coinWrappedType:a.getCoinWrappedType(f.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(b),Object.values(i.collaterals).filter(Boolean).forEach(m),{pools:l,collaterals:d}},Nt=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 X({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}})}),m=b?.Transaction??b?.FailedTransaction;if(!m.status.success)throw A(t.logger,new R(`On-chain market query transaction failed: ${m.status.error.message}`));let f=Ir(m?.events?.[0]?.json);return Gs(t,f,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},Fr=async(t,{coinPrice:e,coinName:o})=>{let r=await jt(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw A(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]}},Dr=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await Vr(t,[o]))[o];if(!a)throw A(t.logger,new R(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await Hs(t,a),c=Pt(s),i=Rt(r,c),l=s.parsedOriginMarketCollateral?It(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,...vt(r,l)}:void 0}},Lr=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},Er=async(t,{coinPrices:e})=>{let o=await Nt(t,{coinPrices:e});return _r(o)},Gs=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 Vr(t,[...d],Ys);for(let p of e?.pools??[]){let b=p.type,m=a.parseCoinNameFromType(b),f=o[m]??0;if(!a.whitelist.lending.has(m)||i&&!i.has(m))continue;let{supplyLimit:y,borrowLimit:h,isIsolated:C}=Mr(u[m]??{}),x=Pt({...p,type:p.type,isIsolated:C,supplyLimit:y,borrowLimit:h}),O=Rt(a,x);s[m]={coinName:m,symbol:a.parseSymbol(m),marketCoinType:a.parseMarketCoinType(m),sCoinType:a.parseSCoinType(a.parseMarketCoinName(m))??"",coinWrappedType:a.getCoinWrappedType(m),coinPrice:f,...x,...O};}for(let p of e?.collaterals??[]){let b=p.type,m=a.parseCoinNameFromType(b),f=o[m]??0;if(!a.whitelist.collateral.has(m)||l&&!l.has(m))continue;let{isIsolated:y}=Mr(u[m]??{}),h=It({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:y}),C=vt(a,h);c[m]={coinName:m,symbol:a.parseSymbol(m),marketCoinType:a.parseMarketCoinType(m),coinWrappedType:a.getCoinWrappedType(m),coinPrice:f,...h,...C};}return {pools:s,collaterals:c}},zs=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Ys=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Mr=t=>({supplyLimit:t.supplyLimitKey?k(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?k(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?k(t.isolatedAssetKey):false}),Hs=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 A(t.logger,new R("Missing required market objects"));let d=k(e),u=k(n),p=k(o),b=s?k(s):{value:"0"},m=c?k(c):"0",f=i?k(i):"0",y=a?k(a):void 0,h=r?k(r):void 0,C=t.metadata.parseCoinNameFromType(`0x${u.type}`),x=l?.json?k(l):await Xs(t,C),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:x}: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:m,borrowLimit:f,isIsolated:x,parsedOriginMarketCollateral:O}},Vr=async({onchain:t,metadata:e,fetchWithCache:o},r,n=zs)=>{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=ae([...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},qr=(t,e)=>Wr(t,vr,e),Kr=(t,e)=>Wr(t,jr,e),Xs=async(t,e)=>{let o=await Ur(t,Nr,e);return o?.object?.json?k(o.object):false},Wr=async(t,e,o)=>{let r=await Ur(t,e,o);return r?.object?.json?k(r.object):"0"},Ur=({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:q(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 Je=class extends I{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 L({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>jt(this.context,a),onchain:()=>Nt(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return L({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>Fr(this.context,{coinPrice:e,coinName:o}),onchain:()=>Dr(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return qr(this.context,e)}getPoolBorrowLimit(e){return Kr(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return L({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>Lr(this.context),onchain:()=>Er(this.context,{coinPrices:o})})}};var _t=async(t,{address:e,coinType:o})=>{let{onchain:r,logger:n}=t;return L({source:"onchain",onchain:(s=>async()=>(await s.client.getBalance({owner:e,coinType:o})).balance)(r),label:"coinBalance:getBalance",logger:n})},ti=async(t,e)=>{let o=[],r=null,n=true;for(;n;){let a=await t.client.listBalances({owner:e,cursor:r,limit:50});o.push(...a.balances??[]),n=a.hasNextPage,r=a.cursor;}return o},oi=(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()});},Mt=async(t,e)=>{let{onchain:o,balanceSource:r,logger:n,queryClient:a}=t,s=await L({source:"onchain",onchain:()=>ti(o,e),label:"coinBalance:listBalances",logger:n});return s.length?s.reduce((i,l)=>{if(l.balance!=="0"){let d=utils.normalizeStructTag(l.coinType);i[d]=l,oi(a,{balance:l,coinType:d,address:e,node:r.url});}return i},{}):{}},ri=`
21
+ var no=({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 De="https://sui.apis.scallop.io",Le="https://sdk.api.scallop.io";var Ee={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Ve="0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA";var wt="0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410";var g={api:{getAddresses:t=>["api","getAddresses",t],getWhiteList:()=>["api","getWhiteList"],getPoolAddresses:()=>["api","getPoolAddresses"],getMarkets:()=>["api","getMarkets"],getSpools:()=>["api","getSpools"],getTotalValueLocked:()=>["api","getTotalValueLocked"]},rpc:{getInspectTxn:t=>["rpc","getInspectTxn",t],getObject:t=>["rpc","getObject",t],getObjects:t=>["rpc","getObjects",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],getCoinBalancesByTypes:t=>["rpc","getCoinBalancesByTypes",t]},oracle:{getPythAllPriceFeeds:(t,e)=>["oracle","getPythAllPriceFeeds",e,t]}};[suiKit.getFullnodeUrl("mainnet")];var ao={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 re=t=>`${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`,j=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")},xt=t=>{if(t<=new Date().getTime())throw new Error("veSca is expired, use renewExpiredVeScaQuick instead")},Tt=(t,e,o)=>{Te(o),xt(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}`)},co=(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),xt(r),typeof t=="number"&&t<1e9)throw new Error("Minimum top up amount is 1 SCA");o&&e&&Tt(e,o,r);}},lo=(t,e)=>{if(Te(e),xt(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")},uo=(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 Ae=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=j(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}},po=({ctx:t,txBlock:e})=>({depositCollateralQuick:async(o,r,n,a=false)=>{let s=j(e),{obligationId:c}=await Ae(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 Ae(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=j(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=j(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 Ae(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 Ae(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=j(e),c=await Ae(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=j(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 At=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`]});}},mo=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 At(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).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 bo=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():ao,l=new Set(Object.values(i).flatMap(({primary:b,secondary:m})=>[...b,...m])),d=(b,m)=>{let f=i[b];return f&&(f.primary.includes(m)||f.secondary.includes(m))},u=[...new Set(o)],p=u.filter(b=>d(b,"pyth"));if(l.has("pyth")){let b=[];for(let m of p){let f=!n&&!s.has(m);(n||f)&&b.push(m);}b.length>0&&await mo(t,b,e,c);}for(let b of u)is(t,e,b,i[b]);},is=(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,m)=>{let f=h=>typeof h=="string"?t.object(h):h;r=f(r),a=f(a),s=f(s),c=f(c),l=f(l),d=f(d),p=f(p),b=f(b);let y=ls(t,o,r,m);return Object.entries(e).forEach(([h,S])=>{S.includes("pyth")&&ms(h,t,n,y,s,c,a,m),S.includes("supra")&&us(h,t,u,y,b,p,m),S.includes("switchboard")&&ps(h,t,i,y,d,l,m);}),ds(t,o,r,y,m),t},ls=(t,e,o,r)=>{let n=`${e}::x_oracle::price_update_request`,a=[r];return t.moveCall(n,[o],a)},ds=(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},us=(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]);},ps=(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]);},ms=(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 z=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 A=class extends z{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var fo=async(t,e)=>{let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new A("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 go=(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=>fo(t,i)},coins:{selectCoin:(...i)=>t.selectCoin(...i),selectSCoinOrMarketCoin:(...i)=>t.selectSCoinOrMarketCoin(...i)},oracles:{updateOracles:(i,l,d)=>bo(t,i,l,d)},utils:{parseMarketCoinName:i=>t.utils.parseMarketCoinName(i),parseSCoinName:i=>t.utils.parseSCoinName(i)}},a=no({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 ho=({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 Co=async(...t)=>{let[e,o,r,n]=t;if(t.length===4&&n)return [n];let a=j(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)},ys=async(...t)=>{let[e,o,r,n]=t,a=j(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]},So=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}},wo=({ctx:t,txBlock:e})=>({stakeQuick:async(o,r,n)=>{let a=j(e),s=await Co(t,e,r,n);if(s.length===0)throw new Error(`No stakeAccountIds found for user ${a}`);if(typeof o=="number"){let c=await So(t,e,s[0],r,o,a);o-=c,o>0&&await So(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 ys(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 Co(t,e,o,r),a=[];for(let s of n){let c=await e.claim(s,o);a.push(c);}return a}});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:{getAllStakeAccounts:i=>t.query.getAllStakeAccounts(i)},coins:{selectMarketCoin:(...i)=>t.selectMarketCoin(...i),selectSCoin:(...i)=>t.selectSCoin(...i)}},a=ho({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=wo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Ao=({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 We=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=j(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}},ko=({ctx:t,txBlock:e})=>({stakeObligationQuick:async(o,r)=>{let{obligationId:n,obligationKey:a,obligationLocked:s}=await We(t,e,o,r),c=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&(re(i)===`${wt}::user::unstake`||re(i)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||re(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 We(t,e,o,r),i=!!e.txBlock.getData().commands.find(l=>l.$kind==="MoveCall"&&(re(l)===`${wt}::user::unstake`||re(l)===`${t.address.get("borrowIncentive.id")}::user::unstake_v2`||re(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 We(t,e,o,r);s&&e.unstakeObligation(n,a);},claimBorrowIncentiveQuick:async(o,r,n)=>{let{obligationId:a,obligationKey:s}=await We(t,e,r,n);return e.claimBorrowIncentive(a,s,o)}});var Po=(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=Ao({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=ko({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var vo=({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 ke=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=j(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]},kt=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}},Io=({ctx:t,txBlock:e})=>({lockScaQuick:async({amountOrCoin:o,lockPeriodInDays:r,autoCheck:n=true,veScaKey:a})=>{let s=j(e),c=await ke(t,e,a),i=t.utils.getUnlockAt(r,c?.unlockAt);n&&co(o,r,i,c?.unlockAt);let l,d=[];if(o!==void 0&&typeof o=="number"){let b=await t.utils.selectCoins({amount:o,coinType:Ve,ownerAddress:s}),[m,f]=e.takeAmountFromCoins(b.map(y=>y.objectId),o);l=m,d.push(f);}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 ke(t,e,r),s=t.utils.getUnlockAt(o,a?.unlockAt);n&&Tt(o,s,a?.unlockAt),a&&e.extendLockPeriod(a.keyId,s);},extendLockAmountQuick:async({scaAmount:o,veScaKey:r,autoCheck:n=true})=>{let a=j(e),s=await ke(t,e,r);if(n&&lo(o,s?.unlockAt),s){let c=await t.utils.selectCoins({amount:o,coinType:Ve,ownerAddress:a}),[i,l]=e.takeAmountFromCoins(c.map(d=>d.objectId),o);e.extendLockAmount(s.keyId,i),e.transferObjects([l],a);}},renewExpiredVeScaQuick:async({scaAmount:o,lockPeriodInDays:r,veScaKey:n,autoCheck:a=true})=>{let s=j(e),c=await ke(t,e,n),i=t.utils.getUnlockAt(r,c?.unlockAt);if(a&&uo(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:Ve,ownerAddress:s}),[u,p]=e.takeAmountFromCoins(d.map(b=>b.objectId),o);l.push(p),e.renewExpiredVeSca(c.keyId,u,i),e.transferObjects(l,s);}},redeemScaQuick:async({veScaKey:o,transferSca:r})=>{let n=j(e),a=await ke(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 kt(t,r,t.address.get("vesca.subsTable")),s=!!e.txBlock.getData().commands.find(i=>i.$kind==="MoveCall"&&re(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],j(e));return}else return c},mergeVeScaQuick:async({targetVeScaKey:o,sourceVeScaKey:r})=>{let n=t.address.get("vesca.subsTableId"),[a,s]=await Promise.all([kt(t,o,n),kt(t,r,n)]),c=!!e.txBlock.getData().commands.find(d=>d.$kind==="MoveCall"&&re(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 No=(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=vo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Io({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Bo=({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 _o=({ctx:t,txBlock:e})=>({claimReferralRevenueQuick:async(o,r=[...t.constants.whitelist.lending])=>{let n=j(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 Fo=(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=Bo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=_o({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Do=({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 Lo=({ctx:t,txBlock:e})=>({claimLoyaltyRevenueQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=j(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,j(e)),e.transferObjects([n],r);},claimVeScaLoyaltyRewardQuick:async o=>{o=o??(await t.reads.getVeScas())[0]?.keyId;let r=j(e);if(!o)throw new Error(`No veScaKey found for user ${r}`);let n=e.claimVeScaLoyaltyReward(o);e.transferObjects([n],r);}});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={utils:t.utils,reads:{getVeScas:(...i)=>t.query.getVeScas(...i)},constants:{coinTypes:t.constants.coinTypes}},a=Do({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Lo({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var qo=({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 Ko=({ctx:t,txBlock:e})=>({mintSCoinQuick:async(o,r)=>{let n=j(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=j(e),{leftCoin:a,takeCoin:s}=await t.coins.selectSCoin(e,o,r,n);return e.transferObjects([a],n),e.burnSCoin(o,s)}});var Uo=(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=qo({ctx:r,txBlock:o}),s=new Proxy(o,{get:(i,l)=>l in a?Reflect.get(a,l):Reflect.get(i,l)}),c=Ko({ctx:n,txBlock:s});return new Proxy(s,{get:(i,l)=>l in c?Reflect.get(c,l):Reflect.get(i,l)})};var Qo=({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 Go=(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=Qo({ctx:r,txBlock:o});return new Proxy(o,{get:(a,s)=>s in n?Reflect.get(n,s):Reflect.get(a,s)})};var zo=["openObligation","returnObligation","openObligationEntry","depositCollateral","takeCollateral","supply","depositEntry","withdraw","withdrawEntry","borrow","borrowWithReferral","borrowEntry","repay","borrowFlashLoan","repayFlashLoan","liquidate"],Yo=["depositCollateralQuick","takeCollateralQuick","borrowQuick","borrowWithReferralQuick","supplyQuick","withdrawQuick","repayQuick","updateAssetPricesQuick","liquidateQuick"],Ho=["createStakeAccount","stake","unstake","claim","stakeQuick","unstakeQuick","claimQuick"],Xo=["stakeObligation","stakeObligationWithVesca","unstakeObligation","claimBorrowIncentive","deactivateBoost","stakeObligationQuick","stakeObligationWithVeScaQuick","unstakeObligationQuick","claimBorrowIncentiveQuick"],Jo=["lockSca","extendLockPeriod","extendLockAmount","renewExpiredVeSca","redeemSca","mintEmptyVeSca","splitVeSca","mergeVeSca","lockScaQuick","extendLockPeriodQuick","extendLockAmountQuick","renewExpiredVeScaQuick","redeemScaQuick","splitVeScaQuick","mergeVeScaQuick"],Zo=["bindToReferral","claimReferralTicket","burnReferralTicket","claimReferralRevenue","unbindReferral","claimReferralRevenueQuick"],er=["claimLoyaltyRevenue","claimVeScaLoyaltyReward","claimLoyaltyRevenueQuick","claimVeScaLoyaltyRewardQuick"],tr=["mintSCoin","burnSCoin","mintSCoinQuick","burnSCoinQuick"],or=["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)},rr=t=>{let e=t;return Object.freeze({core:ue(e,[...zo,...Yo]),spool:ue(e,Ho),borrowIncentive:ue(e,Xo),vesca:ue(e,Jo),referral:ue(e,Zo),loyalty:ue(e,er),sCoin:ue(e,tr),obligationNaming:ue(e,or)})},nr=["core","spool","borrowIncentive","vesca","referral","loyalty","sCoin","obligationNaming"];var Ot=(t,e)=>{let o=Go(t,e),r=No(t,o),n=Vo(t,r),a=Po(t,n),s=Fo(t,a),c=Uo(t,s),i=To(t,c),l=go(t,i),d=new Proxy(l,{get:(b,m)=>m in r?Reflect.get(r,m):m in a?Reflect.get(a,m):m in s?Reflect.get(s,m):m in i?Reflect.get(i,m):m in n?Reflect.get(n,m):m in c?Reflect.get(c,m):m in o?Reflect.get(o,m):Reflect.get(b,m)}),u=rr(d),p=new Set(nr);return new Proxy(d,{get:(b,m)=>typeof m=="string"&&p.has(m)?u[m]:Reflect.get(b,m),has:(b,m)=>typeof m=="string"&&p.has(m)?true:Reflect.has(b,m)})};var ar={effects:true,events:true},Ue=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:ar,...e})}signAndExecuteTransaction({transaction:e,additionalSignatures:o,signer:r,derivePathParams:n}){return this.client.signAndExecuteTransaction({transaction:e,additionalSignatures:o,include:ar,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=class extends z{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Qe=class extends z{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var ne=class extends z{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};var T=(t,e)=>{let o=e instanceof z?e.context:void 0;return t?.error(e.message,o),e},L=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()},Os=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),Ps=new Set(["notExists","dynamicFieldNotFound","deleted"]),Pt=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&Ps.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ce=async(t,e)=>{try{return await Os(t,e)}catch(o){if(Pt(o))return null;throw o}};var pe=class{client;constructor({url:e,httpClient:o,timeout:r=8e3}={}){this.client=o??Rs__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 $e=class extends pe{constructor({url:e=Le,...o}){super({url:e,...o});}};var Ge=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 ae=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var vs=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],Is=0,js=new Set(vs),sr=new Map;var Ns=(t,e)=>{let o=sr.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,sr.set(t,o);},Bs=(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"&&js.has(r)?(...c)=>{let i=Date.now();return e.execute(()=>(Ns(r,Date.now()-i),s(...c)))}:s}}),_s=50,Ms=t=>{if(!t)return "";let e=t;return JSON.stringify(Object.keys(e).sort().map(o=>[o,e[o]]))},ze=class{client;url;pendingObjectReads=[];objectFlushScheduled=false;objectBatchWindowMs;constructor({client:e,url:o,tokensPerSecond:r,objectBatchWindowMs:n=Is}){this.client=Bs(e,new Ge(r)),this.url=o,this.objectBatchWindowMs=n;}scheduleObjectFlush(){this.objectFlushScheduled||(this.objectFlushScheduled=true,this.objectBatchWindowMs===null?queueMicrotask(()=>this.flushObjectReads()):setTimeout(()=>this.flushObjectReads(),this.objectBatchWindowMs));}async getObject(e){let{objectId:o,include:r,signal:n}=e;if(n){let{objects:[s]}=await this.client.getObjects({objectIds:[o],signal:n,include:r});if(s instanceof Error)throw s;return {object:s}}let a=await new Promise((s,c)=>{this.pendingObjectReads.push({objectId:o,include:r,includeKey:Ms(r),resolve:s,reject:c}),this.scheduleObjectFlush();});if(a instanceof Error)throw a;return {object:a}}flushObjectReads(){this.objectFlushScheduled=false;let e=this.pendingObjectReads;this.pendingObjectReads=[];let o=new Map;for(let r of e){let n=o.get(r.includeKey);n?n.push(r):o.set(r.includeKey,[r]);}for(let r of o.values())this.dispatchObjectGroup(r);}async dispatchObjectGroup(e){let o=e[0].include,r=new Map;for(let a of e){let s=r.get(a.objectId);s?s.push(a):r.set(a.objectId,[a]);}let n=[...r.keys()];for(let a of ae(n,_s))try{let{objects:s}=await this.client.getObjects({objectIds:a,include:o});a.forEach((c,i)=>{let l=s[i]??new Error(`Object ${c} missing from batch response`);for(let d of r.get(c)??[])d.resolve(l);});}catch(s){for(let c of a)for(let i of r.get(c)??[])i.reject(s);}}};var Rt="https://graphql.mainnet.sui.io/graphql",Ye=(t,e,o)=>new ze({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond,objectBatchWindowMs:o?.objectBatchWindowMs}),ir=(t={})=>{let e=t.url??Rt,o=t.client??new graphql.SuiGraphQLClient({url:e,network:"mainnet"});return Ye(o,e,{tokensPerSecond:t.tokensPerSecond})},cr=(t=Le)=>new $e({url:t}),lr=(t=De)=>new pe({url:t});var dr=["supra","switchboard","pyth"];var ur=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)}),pr=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),mr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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)}},br=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},fr=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"),obligationNaming:t.address.get("obligationNaming.registryTableId")}}),yr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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)}},gr=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),hr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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))}}},Cr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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}}}},Sr=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),wr=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")}}}),xr=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),Tr=t=>{let e=t.address.getAddresses();if(!e)throw new ne("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}}}},Ar=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()}),kr=t=>({addresses:{...dr.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 Or=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var Pr=new queryCore.QueryClient(Ee);var v=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=Pr,logger:o=me,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=Or(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function q(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 Es="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",Xe=t=>typeof t=="object"&&t!==null,Vs=t=>!Xe(t)||t.$kind!=="Shared"||!("Shared"in t)||!Xe(t.Shared)?false:"initialSharedVersion"in t.Shared;function qs(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var He=t=>{if(Array.isArray(t))return t.map(He);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return He(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=He(n);return o}return t},vr=t=>{qs(t);let e=t.json,o="fields"in e?e.fields:e;return He(o)},Rr=t=>Vs(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Ks=(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,Y=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.getObject({objectId:r,include:a,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!c?.object)throw new Error("Failed to get object data");s=Rr(c.object);}else "objectId"in r&&"owner"in r&&(s=Rr(r));return Ks(o,{obj:s??r,mutable:n})},Ws=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())]),Us=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),Qs=zod.z.object({id:Us,name:Ws,value:zod.z.unknown().optional()}),Ir=t=>t.type.startsWith(Es),jr=t=>{let{success:e}=Qs.safeParse(t);return !!e},$s=t=>typeof t=="string"?t:t.id,Gs=t=>{if(!jr(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},zs=t=>{if(typeof t=="string")return t;if(!Xe(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},Ys=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!Xe(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"},P=t=>{let e=vr(t);return Ir(t)&&typeof e=="object"?Gs(e):e},Nr=t=>{if(!Ir(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=vr(t);if(jr(e)){let o=zs(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:$s(e.id),name:o,nameKind:Ys(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var J=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=>J(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return J(e.name)}throw new A(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},Z=(t,e)=>{try{return J(t)}catch(o){throw new A(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var _r=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:Z(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:Z(e.type,`market.collaterals[${o}].type`)}))}};var Mr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",Fr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",Dr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var vt=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)}),It=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new A(`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),m=bignumber_js.BigNumber(e.debtAmount).multipliedBy(b),f=m.plus(e.debtAmount),y=f.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(m.multipliedBy(e.reserveFactor)),S=h.shiftedBy(-r),C=bignumber_js.BigNumber(f).plus(Math.max(e.cashAmount-h.toNumber(),0)),O=C.shiftedBy(-r),F=bignumber_js.BigNumber(f).dividedBy(C);F=F.isFinite()?F:bignumber_js.BigNumber(0);let N=bignumber_js.BigNumber(l).multipliedBy(F).multipliedBy(1-e.reserveFactor);N=N.isFinite()?N:bignumber_js.BigNumber(0);let R=C.dividedBy(e.marketCoinSupplyAmount);return R=R.isFinite()&&!R.isNaN()?R: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:C.toNumber(),supplyCoin:O.toNumber(),borrowAmount:f.toNumber(),borrowCoin:y.toNumber(),reserveAmount:h.toNumber(),reserveCoin:S.toNumber(),utilizationRate:F.toNumber(),supplyApr:N.toNumber(),supplyApy:t.parseAprToApy(N.toNumber()),conversionRate:R.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},jt=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)}),Nt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new A(`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()}},Er=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 Bt=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=f=>{u&&!u.has(f.coinName)||(l[f.coinName]={...f,coinPrice:e[f.coinName]??f.coinPrice,coinWrappedType:a.getCoinWrappedType(f.coinName)});},m=f=>{p&&!p.has(f.coinName)||(d[f.coinName]={...f,coinPrice:e[f.coinName]??f.coinPrice,coinWrappedType:a.getCoinWrappedType(f.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(b),Object.values(i.collaterals).filter(Boolean).forEach(m),{pools:l,collaterals:d}},_t=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 Y({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}})}),m=b?.Transaction??b?.FailedTransaction;if(!m.status.success)throw T(t.logger,new k(`On-chain market query transaction failed: ${m.status.error.message}`));let f=_r(m?.events?.[0]?.json);return Xs(t,f,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},qr=async(t,{coinPrice:e,coinName:o})=>{let r=await Bt(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw T(t.logger,new A(`Market pool for ${o} not found in indexer data`,{context:{coinName:o}}));return {pool:r.pools[o],collateral:r.collaterals[o]}},Kr=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await Qr(t,[o]))[o];if(!a)throw T(t.logger,new k(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await ei(t,a),c=vt(s),i=It(r,c),l=s.parsedOriginMarketCollateral?jt(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,...Nt(r,l)}:void 0}},Wr=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},Ur=async(t,{coinPrices:e})=>{let o=await _t(t,{coinPrices:e});return Er(o)},Xs=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 Qr(t,[...d],Zs);for(let p of e?.pools??[]){let b=p.type,m=a.parseCoinNameFromType(b),f=o[m]??0;if(!a.whitelist.lending.has(m)||i&&!i.has(m))continue;let{supplyLimit:y,borrowLimit:h,isIsolated:S}=Vr(u[m]??{}),C=vt({...p,type:p.type,isIsolated:S,supplyLimit:y,borrowLimit:h}),O=It(a,C);s[m]={coinName:m,symbol:a.parseSymbol(m),marketCoinType:a.parseMarketCoinType(m),sCoinType:a.parseSCoinType(a.parseMarketCoinName(m))??"",coinWrappedType:a.getCoinWrappedType(m),coinPrice:f,...C,...O};}for(let p of e?.collaterals??[]){let b=p.type,m=a.parseCoinNameFromType(b),f=o[m]??0;if(!a.whitelist.collateral.has(m)||l&&!l.has(m))continue;let{isIsolated:y}=Vr(u[m]??{}),h=jt({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:y}),S=Nt(a,h);c[m]={coinName:m,symbol:a.parseSymbol(m),marketCoinType:a.parseMarketCoinType(m),coinWrappedType:a.getCoinWrappedType(m),coinPrice:f,...h,...S};}return {pools:s,collaterals:c}},Js=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Zs=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Vr=t=>({supplyLimit:t.supplyLimitKey?P(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?P(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?P(t.isolatedAssetKey):false}),ei=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 T(t.logger,new k("Missing required market objects"));let d=P(e),u=P(n),p=P(o),b=s?P(s):{value:"0"},m=c?P(c):"0",f=i?P(i):"0",y=a?P(a):void 0,h=r?P(r):void 0,S=t.metadata.parseCoinNameFromType(`0x${u.type}`),C=l?.json?P(l):await ti(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:C}: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:m,borrowLimit:f,isIsolated:C,parsedOriginMarketCollateral:O}},Qr=async({onchain:t,metadata:e,fetchWithCache:o},r,n=Js)=>{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=ae([...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},$r=(t,e)=>zr(t,Mr,e),Gr=(t,e)=>zr(t,Fr,e),ti=async(t,e)=>{let o=await Yr(t,Dr,e);return o?.object?.json?P(o.object):false},zr=async(t,e,o)=>{let r=await Yr(t,e,o);return r?.object?.json?P(r.object):"0"},Yr=({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:q(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 Je=class extends v{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 L({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>Bt(this.context,a),onchain:()=>_t(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return L({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>qr(this.context,{coinPrice:e,coinName:o}),onchain:()=>Kr(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return $r(this.context,e)}getPoolBorrowLimit(e){return Gr(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return L({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>Wr(this.context),onchain:()=>Ur(this.context,{coinPrices:o})})}};var Ft=async(t,{address:e,coinType:o})=>{let{onchain:r,logger:n}=t;return L({source:"onchain",onchain:(s=>async()=>(await s.client.getBalance({owner:e,coinType:o})).balance)(r),label:"coinBalance:getBalance",logger:n})},ai=async(t,e)=>{let o=[],r=null,n=true;for(;n;){let a=await t.client.listBalances({owner:e,cursor:r,limit:50});o.push(...a.balances??[]),n=a.hasNextPage,r=a.cursor;}return o},si=(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()});},Dt=async(t,e)=>{let{onchain:o,balanceSource:r,logger:n,queryClient:a}=t,s=await L({source:"onchain",onchain:()=>ai(o,e),label:"coinBalance:listBalances",logger:n});return s.length?s.reduce((i,l)=>{if(l.balance!=="0"){let d=utils.normalizeStructTag(l.coinType);i[d]=l,si(a,{balance:l,coinType:d,address:e,node:r.url});}return i},{}):{}},ii=`
22
22
  query CoinBalancesByTypes($address: SuiAddress!, $coinTypes: [String!]!) {
23
23
  address(address: $address) {
24
24
  multiGetBalances(keys: $coinTypes) {
@@ -31,7 +31,7 @@ var Zt=({ctx:t,txBlock:e})=>{let o={protocolPkg:t.address.get("core.packages.pro
31
31
  }
32
32
  }
33
33
  }
34
- `,Qr=async(t,e)=>{let{graphqlClient:o,balanceSource:r,fetchWithCache:n,logger:a}=t,{address:s,coinTypes:c}=e;if(!c.length)return {};let i=c.map(d=>utils.normalizeStructTag(d));return (await n({queryKey:g.rpc.getCoinBalancesByTypes({node:r.url,address:s,coinTypes:[...i].sort()}),queryFn:async()=>{let d=await o.query({query:ri,variables:{address:s,coinTypes:i}});if(d.errors?.length)throw A(a,new R(`GraphQL multiGetBalances failed: ${d.errors[0].message}`,{context:{address:s,coinTypes:i}}));return d.data?.address?.multiGetBalances??[]}})).reduce((d,u)=>{let p=utils.normalizeStructTag(u.coinType.repr);return d[p]={coinType:p,balance:u.totalBalance??"0",coinBalance:u.coinBalance??"0",addressBalance:u.addressBalance??"0"},d},{})},$r=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,coinNames:d=[...c.whitelist.lending.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Mt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},Gr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,coinName:i}=e,l=s.parseCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>_t({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.balance??0)},zr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,sCoinNames:d=[...c.whitelist.scoin.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Mt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseSCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},Yr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,sCoinName:i}=e,l=s.parseSCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>_t({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.balance??0)},Hr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,marketCoinNames:d=[...c.whitelist.scoin.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Mt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseMarketCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},Xr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,marketCoinName:i}=e,l=s.parseMarketCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>_t({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.balance??0)},Jr=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 A(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.getObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!b.object)throw A(t.logger,new R(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let m=[await X({onchain:o,fetchWithCache:n},{tx:p,objectId:b.object})],f=[s(e),c(e)].filter(x=>!!x);p.moveCall(d,m,f);let y={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:m,typeArgs:f,node:o.url,...y}),queryFn:()=>o.client.simulateTransaction({...y,transaction:p.txBlock})}),C=h?.commandResults;if(!C)throw A(t.logger,new R(`Failed to query total supply for ${e}: ${h[h.$kind]?.status.error?.message}`,{context:{sCoinName:e}}));if(C&&C[0]?.returnValues&&C[0].returnValues[0]){let x=C[0].returnValues[0].bcs,O=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(x)).shiftedBy(-O).toNumber()}return 0};var Ze=class extends I{onchain;balanceSource;graphqlClient;constructor({onchain:e,balanceSource:o,graphqlClient:r,...n}){super(n),this.onchain=e,this.balanceSource=o,this.graphqlClient=r;}get context(){return {...this.baseContext,onchain:this.onchain,balanceSource:this.balanceSource,graphqlClient:this.graphqlClient,queryClient:this.queryClient}}getCoinAmounts(e){return $r(this.context,e)}getCoinAmount(e){return Gr(this.context,e)}getCoinBalances(e){return Qr(this.context,e)}getSCoinAmounts(e){return zr(this.context,e)}getSCoinAmount(e){return Yr(this.context,e)}getSCoinTotalSupply(e){return Jr(this.context,e)}getMarketCoinAmounts(e){return Hr(this.context,e)}getMarketCoinAmount(e){return Xr(this.context,e)}};var Zr="0x00481a93b819d744a7d79ecdc6c62c74f2f7cb4779316c4df640415817ac61bb";var si=async(t,{assetTypeMap:e})=>{let{onchain:o,fetchWithCache:r}=t,n=null,a=false,s=[];do{let l={parentId:Zr,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},en=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 si(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,c)=>{if(c){let{name:i}=Pr(c),l=`0x${i}`,d=n[l];if(!d)return s;let u=+k(c);s[d]=u/1e4;}return s},{})};var et=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getFlashloanFees(e){return en(this.context,{assetNames:e})}};var on=t=>{let o=k(t).ownership?.of;if(!o)throw new T(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var rn=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:Z(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:Z(e.type,`obligation.debts[${o}].type`)}))}},nn=(t,e)=>{let o=bcs.bcs.Address.serialize(t).toBytes(),r=bcs.bcs.Address.serialize(e).toBytes(),n=new Uint8Array(o.length+r.length);n.set(o,0),n.set(r,o.length);let a=sha3_js.sha3_256(n);return `0x${Array.from(a).map(c=>c.toString(16).padStart(2,"0")).join("")}`};var an=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},sn=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 A(t.logger,new R(`Failed to fetch object ${y}`,{context:{objectId:y}}));return X({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],m=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:b,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=m.Transaction??m.FailedTransaction;if(!f.status.success)throw A(t.logger,new R(`Failed to query obligation data for obligationId ${e}: ${f.status.error.message}`,{context:{obligationId:e}}));return rn(f?.events?.[0]?.json)},cn=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 !!k(a.object)?.lock_key},ln=async(t,{address:e})=>{let o=await an(t,{address:e}),r=o.map(on),n=await Ft(t,r);return o.map((a,s)=>{let c=n[s],i=c?k(c):void 0;return {id:r[s],keyId:a.objectId,locked:!!i?.lock_key}})},Ft=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)},dn=async(t,e)=>{let{metadata:{addresses:o},fetchWithCache:r,onchain:n}=t,a=o.obligationNaming.registryTableId,s=await an(t,{address:e}),c=await Promise.all(s.map(async i=>{let l=nn(i.objectId,e),d={parentId:a,name:q({type:"0x2::object::ID",value:l}),include:{json:true}};try{let{dynamicField:u}=await r({queryKey:g.rpc.getDynamicFieldObject({...d,node:n.url}),queryFn:()=>n.client.getDynamicField(d)});return [i.objectId,bcs.bcs.string().parse(u.value.bcs)]}catch{return null}}));return Object.fromEntries(c.filter(i=>i!==null))};var tt=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return ln(this.context,{address:e})}getObligationData(e){return sn(this.context,e)}getObligationLocked(e){return cn(this.context,e)}getObligationObjects(e){return Ft(this.context,e)}getObligationNames(e){return dn(this.context,e)}};var di=t=>({pointType:J(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)}),un=(t,e)=>({poolType:J(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=di(r),a=t(n.pointType);return o[a]=n,o},{})}),pn=(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),m=b.multipliedBy(r),f=365*24*60*60,y=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(y).multipliedBy(f).multipliedBy(e),C=bignumber_js.BigNumber(1e12),x=bignumber_js.BigNumber(t.baseWeight).dividedBy(C),O=h.multipliedBy(x).dividedBy(m).isFinite()&&t.points>0?h.multipliedBy(x).dividedBy(m).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:m.toNumber(),rewardApr:O,rewardPerSec:y.toNumber()}},ui=t=>({pointType:J(t.point_type),weightedAmount:Number(t.weighted_amount),points:Number(t.points),totalPoints:Number(t.total_points),index:Number(t.index)}),mn=(t,e)=>({poolType:J(e.pool_type),debtAmount:Number(e.debt_amount),pointList:e.points_list.reduce((o,r)=>{let n=ui(r),a=t(n.pointType);return o[a]=n,o},{})}),bn=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:Z(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:Z(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:Z(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:Z(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var pi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),mi=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),yn=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:mi,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(pi)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var hn=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.getObject({...l,node:r.url}),queryFn:()=>r.getObject(l)});if(!d.object)throw A(t.logger,new R(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await X({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}})}),m=b?.Transaction??b?.FailedTransaction,f=bn(m?.events?.[0]?.json),y=e??[...n.whitelist.lending.values()],h={};for(let C of f?.incentive_pools??[]){let x={},O=un(n.parseCoinNameFromType,C),_=C.pool_type,N=n.parseCoinNameFromType(_),P=o[N]??0,w=n.getCoinDecimal(N);if(w===void 0)throw A(t.logger,new T(`Coin decimal not found for ${N}`,{context:{poolCoinName:N}}));if(!y.includes(N))continue;for(let[E,$]of Object.entries(O.poolPoints)){if(!$)continue;let de=$.pointType,te=n.parseCoinNameFromType(de),ie=n.getCoinDecimal(te);if(ie===void 0)throw A(t.logger,new T(`Coin decimal not found for ${te}`,{context:{poolCoinName:te}}));let V=o[te]??0,Se=n.parseSymbol(te),U=pn($,V,ie,P,w),Y=$.points<=U.accumulatedPoints;$.points>U.accumulatedPoints&&(x[E]={symbol:Se,coinName:te,coinType:de,coinDecimal:ie,coinPrice:V,points:$.points,distributedPoint:$.distributedPoint,weightedAmount:$.weightedAmount,...U,...Y?{rewardApr:0}:{}});}let B=bignumber_js.BigNumber(O.staked),v=B.shiftedBy(-w),M=v.multipliedBy(P);h[N]={coinName:N,symbol:n.parseSymbol(N),coinType:_,coinDecimal:w,coinPrice:P,stakedAmount:B.toNumber(),stakedCoin:v.toNumber(),stakedValue:M.toNumber(),points:x};}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,C)=>{let x=await n({queryKey:g.rpc.getObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!x.object)throw A(t.logger,new R(`Failed to fetch object ${h}`,{context:{objectId:h}}));return X({onchain:a,fetchWithCache:n},{tx:c,mutable:C,objectId:x.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}})}),m=b?.Transaction??b?.FailedTransaction,f=fn(m?.events?.[0]?.json),y=e??[...r.whitelist.lending.values()];return f?f.pool_records.reduce((h,C)=>{let x=mn(r.parseCoinNameFromType,C),O=x.poolType,_=r.parseCoinNameFromType(O);return y.includes(_)&&(h[_]=x),h},{}):{}},Sn=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 A(t.logger,new R(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let l=k(i.object).accounts.id,d=await ce(t,{parentId:l,name:q({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?yn.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},wn=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 A(t.logger,new R(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let l=k(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ce(t,{parentId:l,name:q({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var ot=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return hn(this.context,e)}getBorrowIncentiveAccounts(e){return Cn(this.context,e)}getBindedVeScaKey(e){return Sn(this.context,e)}getBindedObligation(e){return wn(this.context,e)}};var xn="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var An=bcs.bcs.bool(),kn=bcs.bcs.string();var yi=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,n=false,a=null,s=i=>i.name.type===xn,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)?An.parse(b.valueType.bcs):false).map(b=>`0x${kn.parse(b.name.bcs)}`);c.push(...p),a=u,n=d;}while(n);return c},On=async t=>yi(t),Pn=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 rt=class extends I{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 L({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>Pn(this.context),onchain:()=>On(this.context)})}};var Rn=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var Ci=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},Si=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(C,x)=>{let O=await o({queryKey:g.rpc.getObject({node:e.url,objectId:C}),queryFn:()=>e.getObject({objectId:C})});if(!O.object)throw A(t.logger,new R(`Failed to fetch object ${C}`,{context:{objectId:C}}));return X({onchain:e,fetchWithCache:o},{tx:c,mutable:x,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`,m=[l,c.txBlock.object.clock()];c.moveCall(u,p),c.moveCall(b,m);let y=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:m,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:c.txBlock,include:{commandResults:true}})}))?.commandResults;if(!y)throw A(t.logger,new R("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=y[1]?.returnValues?.[0].bcs;if(!h)throw A(t.logger,new R("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},Oe=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:q({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=Rn.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 Ci(t,e),n=(await Promise.all(r.map(a=>Oe(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},vn=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:q(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(kt(i))return null;throw i}}});if(!s?.object)return false;let c=k(s.object);return Array.isArray(c?.contents)&&c.contents.length>0},jn=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=k(a.object),c=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await Si(t)).shiftedBy(-9).toNumber(),l=c>0?i/c*4:0;return {totalLockedSca:c,totalVeSca:i,averageLockingPeriod:l,averageLockingPeriodUnit:"year"}};var at=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return Oe(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return In(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return jn(this.context)}isVeScaKeyInSubsTable(e,o){return vn(this.context,{veScaKey:e,tableId:o})}};var Nn=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 Bn=bcs.bcs.u64();var Ai=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 A(t.logger,new R("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},ki=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={parentId:o,name:q({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(Bn.parse(s.bcs)).shiftedBy(-9).toNumber()},_n=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await Ai(t,r),{data:a,success:s}=Nn.safeParse(n.json);return s?{pendingReward:e?await ki(t,{veScaKey:e,tableId:a.userRewardTableId}).catch(()=>0):0,totalPoolReward:a.totalPoolReward,isClaimEnabled:a.isClaimEnabled}:{pendingReward:0,totalPoolReward:0,isClaimEnabled:false}};var st=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return _n(this.context,e)}};var Lt=t=>t.startsWith("0x")?t:`0x${t}`;var Oi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Pi=t=>bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(t)}),Mn=Pi(Oi);var Ri=3,Fn=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:m,hasNextPage:f}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});l=m,d=f,b.forEach(y=>{let h=Lt(bcs.bcs.string().parse(y.name.bcs)),C=s(h),x=Mn.parse(y.value.bcs);u[C]||(u[C]=[]),x.contents.forEach(({name:O})=>{let _=i[Lt(O)];_&&u[C].push(_);});});}while(d);return u},Dn=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([Fn(t,e.oracles.primaryPriceUpdatePolicyVecsetId),Fn(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},Ln=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}},En=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>Ri){let i=new Map;for(let d of s){let u=r(d.coinName);if(!u)throw A(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 A(t.logger,new R(`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 A(t.logger,new T(`Invalid coin name: ${l}`,{context:{coinName:l}}));let u=await ce(t,{parentId:a,name:q({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw A(t.logger,new R(`No on-demand aggregator found for ${d}`,{context:{coinType:d}}));c[i]=bcs.bcs.Address.parse(u.dynamicField.value.bcs);})),c},Ii=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=Ii(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 ct=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getAssetOracles(){return Dn(this.context)}getPriceUpdatePolicies(){return Ln(this.context)}getOnDemandAggObjectIds(e){return En(this.context,e)}};var Vn=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=k(e),n=k(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}},Kn=(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),m=bignumber_js.BigNumber(t.staked),f=m.shiftedBy(-o),y=f.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:m.toNumber(),stakedCoin:f.toNumber(),stakedValue:y.toNumber()}},Wn=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)}),Un=(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),m=b.multipliedBy(r),f=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),y=f.dividedBy(o.stakedValue).isFinite()?f.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:m.toNumber(),rewardPerSec:a.toNumber()}},Qn=t=>({...t,stakeType:Bi(t.stakeType)}),Bi=t=>{try{return J(t)}catch(e){throw new T("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Et=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},{})},$n=async(t,{coinPrices:e,stakeCoinName:o})=>(await Et(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,Gn=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 Yn(t,a);return (await Promise.allSettled(n.map((i,l)=>Vt(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[l]]})))).reduce((i,l,d)=>(l.status==="fulfilled"&&l.value&&(i[n[d]]=l.value),i),{})},Vt=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),c=Qn(qn(r??(await Yn(t,[a]))[a])),i=Vn(c),l=e[o]??0,d=Kn(i,l,n.getCoinDecimal(o)),u=Wn(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,...Un(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 _i(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=k(l),m=utils.normalizeStructTag(u),f=i[m],y=s[f];y&&y.push({id:d,type:m,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=>Mi(t,{stakeCoinName:r})))).reduce((r,n,a)=>(n.status==="fulfilled"&&(r[e[a]]=n.value),r),{}),_i=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},Yn=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=ae([...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},{})},Mi=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=k(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)}},Hn=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=k(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 lt=class extends I{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 L({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Et(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>Gn(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return L({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>$n(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>Vt(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 Hn(this.context,e)}};var Xn=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 Jn=bcs.bcs.u64();var Li=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,{veScaRewardTableId:a}=r.veScaLoyaltyProgram,s={parentId:a,name:q({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(Jn.parse(c.bcs)).shiftedBy(-9).toNumber()},Ei=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 A(t.logger,new R("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Zn=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await Ei(t,r),{data:a,success:s}=Xn.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let c=await Oe(t,a.reserveVeScaKey),i=e?await Li(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 dt=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return Zn(this.context,e)}};var ea=bcs.bcs.Address;var ta=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:q({type:"address",value:e})},n=await ce(t,r);return n?ea.parse(n.dynamicField.value.bcs):null};var ut=class extends I{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return ta(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()}),oa=zod.z.object({id:zod.z.string(),size:zod.z.string()}),ra=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:oa,underlying_balances:oa})});var we="0x1::type_name::TypeName",na="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",aa="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",sa="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",ia="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var ca=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),{})},qi=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=qi(u);p&&r.has(p)&&(s[p]=u.fieldId);}c=d.cursor,i=d.hasNextPage;}while(i);return s},Ki=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 ae(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),{})},Wi=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},la=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=ra.safeParse(u?.json);if(!p.success)throw A(t.logger,new T("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let b=p.data,m=b.vault.balance_sheets.table.id,f=b.collateral_stats.table.id,y=b.borrow_dynamics.table.id,h=b.interest_models.table.id,C=b.risk_models.table.id,x=b.vault.flash_loan_fees.table.id,O=new Set(e),_=Object.entries(l).filter(U=>{let[Y,ge]=U;return ge?.coinType?O.size===0||O.has(Y):false});if(_.length===0)throw A(t.logger,new R("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let N=await Wi(t,new Set(_.map(([,U])=>U.coinType)),x),P=new Set(_.map(([,U])=>U.coinType.slice(2))),[w,B,v,M,E,$,de,te,ie]=await Promise.all([le(t,{parentId:m,type:we,coinTypeKeys:P}),le(t,{parentId:f,type:we,coinTypeKeys:P}),le(t,{parentId:y,type:we,coinTypeKeys:P}),le(t,{parentId:h,type:we,coinTypeKeys:P}),le(t,{parentId:C,type:we,coinTypeKeys:P}),le(t,{parentId:i,type:na,coinTypeKeys:P}),le(t,{parentId:i,type:aa,coinTypeKeys:P}),le(t,{parentId:i,type:sa,coinTypeKeys:P}),le(t,{parentId:i,type:ia,coinTypeKeys:P})]),V=await Ki(t,{lendingPool:w,collateralPool:B,borrowDynamic:v,interestModel:M,riskModel:E,borrowFee:$,supplyLimit:de,borrowLimit:te,isolatedAsset:ie}),Se={};for(let[U,Y]of _){let{coinType:ge}=Y,oe=ge.slice(2),ht=V.lendingPool[oe],Wa=V.collateralPool[oe],Ua=V.borrowDynamic[oe],Qa=V.interestModel[oe],$a=V.riskModel[oe],Ga=V.borrowFee[oe],za=V.supplyLimit[oe],Ya=V.borrowLimit[oe],Ht=V.isolatedAsset[oe]?.json,Me=`s${U}`,Xt=s.pools[Me],Fe=c.coins[Me],Jt=Y.oracle?.pyth;Se[U]={coinName:U,symbol:Y.symbol,coinType:ge,coinMetadataId:Y.metaData,decimals:Y.decimals,lendingPoolAddress:ht?.objectId??"",collateralPoolAddress:Wa?.objectId??"",borrowDynamic:Ua?.objectId??"",interestModel:Qa?.objectId??"",riskModel:$a?.objectId,borrowFeeKey:Ga?.objectId??"",supplyLimitKey:za?.objectId??"",borrowLimitKey:Ya?.objectId??"",isolatedAssetKey:Ht?.id??"",isIsolated:Ht?.value??false,spool:Xt?.id??"",spoolReward:Xt?.rewardPoolId??"",spoolName:Me,sCoinName:Me,sCoinType:Fe?.coinType??"",sCoinTreasury:Fe?.treasury??"",sCoinMetadataId:Fe?.metaData??"",sCoinSymbol:Fe?.symbol??"",pythFeed:Jt?.feed??"",pythFeedObjectId:Jt?.feedObject??"",flashloanFeeObject:N[ge]??""};}return Se};var pt=class extends I{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 L({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>ca(this.context,{poolNames:e}),onchain:()=>la(this.context,{poolNames:e})})}};var da="https://hermes.pyth.network";var ua=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 ma=({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 ba=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a},priceTimeout:s}=t,c=Array.from(new Set(Object.values(r.coins).map(d=>d?.oracle?.pyth?.feed).filter(d=>!!d))).sort(),i=await o({queryKey:g.oracle.getPythAllPriceFeeds(n,c),staleTime:s,gcTime:s,queryFn:async()=>{let d=new pythSuiJs.SuiPriceServiceConnection(n,a),{parsed:u}=await d.getLatestPriceUpdates(c,{parsed:true,ignoreInvalidPriceIds:true});if(!u)throw A(t.logger,new Qe("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:c}}));let p={};for(let b of u)p[b.id]=bignumber_js.BigNumber(b.price.price).shiftedBy(b.price.expo).toNumber();return p}}),l={};for(let d of e){let u=r.coins[d]?.oracle?.pyth?.feed;l[d]=(u!==void 0?i[u]:void 0)??0;}return l},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},ya=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))},ga=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 ae(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 A(t.logger,new R("Failed to fetch price feed object on chain",{cause:p}));let{data:b,success:m}=ua.safeParse(p.json);if(!m)throw A(t.logger,new T("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:f}=b.price_info;c.set(p.objectId,ma(f.price).toNumber());}}let i={};for(let[l,d]of a)i[l]=(d!==void 0?c.get(d):void 0)??0;return i},ha=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 mt=class extends I{config;indexer;onchain;priceTimeout;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,priceTimeout:n,...a}){super(a),this.config=e??{endpoint:da,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r,this.priceTimeout=n??5e3;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config,priceTimeout:this.priceTimeout}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return L({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>ba(this.context,e),onchain:()=>ga(this.context,e)})}getPythFeedObject(e){return fa(this.context,e)}getPythFeedObjects(e){return ya(this.context,e)}getPricesFromIndexer(e){return ha(this.context,e)}};var Ca=t=>{let{utils:e,indexerUrl:o,priceTimeout:r,graphqlUrl:n,graphqlClient:a,queryClientConfig:s=Ee}=t,c=e.onchain,i=rr(o),l=n??Ot,d=a??new graphql.SuiGraphQLClient({url:l,network:"mainnet"}),u=or({client:d,url:l}),p=t.queryClient??new queryCore.QueryClient(s),b=e.logger,m={onchain:c,queryClient:p,logger:b},f,y,h,C,x,O,_,N,P,w,B,v,M,E;return {get market(){return f??=new Je({...m,indexer:i,addresses:ir(e),metadata:sr(e)})},get coinBalance(){return y??=new Ze({...m,balanceSource:u,graphqlClient:d,metadata:cr(e)})},get flashloan(){return h??=new et({...m,metadata:lr(e)})},get obligation(){return C??=new tt({...m,metadata:dr(e)})},get borrowIncentive(){return x??=new ot({...m,metadata:ur(e)})},get isolatedAssets(){return O??=new rt({...m,metadata:fr(e)})},get veSca(){return _??=new at({...m,metadata:yr(e)})},get loyaltyProgram(){return N??=new st({...m,metadata:gr(e)})},get xOracle(){return P??=new ct({...m,metadata:Sr(e)})},get spool(){return w??=new lt({...m,indexer:i,metadata:Cr(e)})},get veScaLoyaltyProgram(){return B??=new dt({...m,metadata:hr(e)})},get referral(){return v??=new ut({...m,metadata:pr(e)})},get price(){return M??=new mt({...m,indexer:i,metadata:mr(e),priceTimeout:r})},get poolAddresses(){return E??=new pt({...m,api:nr(),metadata:br(e)})}}};var Sa=(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",Yi={rpc:"onchain",indexer:"api","indexer-first":"api-first"},ye=t=>t?.source?Yi[t.source]:t?.indexer?"api-first":"onchain";var ve=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var bt=(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 Ji=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})),Zi=(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}))}))})),je="sui",ec="SUI",tc=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[je]?o[je].pendingRewardInCoin+=r.availableClaimCoin:o[je]={symbol:ec,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[je]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),oc=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),{}),rc=(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})),nc=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}},ac=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)}},sc=1e9,ic=bignumber_js.BigNumber(1e12),cc=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(sc).toNumber(),0):1,l=c.multipliedBy(i).plus(a.points),d=l.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(ic),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),b=p.isFinite()?p.toNumber():1,m=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:m,boostedRewardApr:m*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}},lc=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)}},dc=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()}},uc=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):ve(e.multipliedBy(bt(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()}},pc=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(bt(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)?ve(o.multipliedBy(bt(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()}},Ta=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),m=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),C=bignumber_js.BigNumber(0),x=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0),_=bignumber_js.BigNumber(0);if(i)for(let ie of l){let V=bignumber_js.BigNumber(ie.staked),Se=V.shiftedBy(-i.coinDecimal),U=V.multipliedBy(c?.conversionRate??1),Y=U.shiftedBy(-i.coinDecimal),ge=Y.multipliedBy(i.coinPrice);b=b.plus(V),m=m.plus(Se),f=f.plus(U),y=y.plus(Y),h=h.plus(ge),C=C.plus(V),x=C.shiftedBy(-i.coinDecimal);let ht=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-ie.index).dividedBy(1e9):1;O=O.plus(V.multipliedBy(ht).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),P=N.shiftedBy(-a),w=P.multipliedBy(s??0),B=bignumber_js.BigNumber(s??0).multipliedBy(c?.conversionRate??1),v=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),M=v.shiftedBy(-a),E=bignumber_js.BigNumber(d),$=E.shiftedBy(-a),de=ve(N,c?.supplyAmount??1/0).plus(f),te=ve(P,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(f).toNumber(),suppliedCoin:P.plus(y).toNumber(),suppliedValue:w.plus(h).toNumber(),stakedMarketAmount:b.toNumber(),stakedMarketCoin:m.toNumber(),stakedAmount:f.toNumber(),stakedCoin:y.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:v.toNumber(),unstakedMarketCoin:M.toNumber(),unstakedAmount:N.toNumber(),unstakedCoin:P.toNumber(),unstakedValue:w.toNumber(),availableSupplyAmount:E.toNumber(),availableSupplyCoin:$.toNumber(),availableWithdrawAmount:de.toNumber(),availableWithdrawCoin:te.toNumber(),availableStakeAmount:v.toNumber(),availableStakeCoin:M.toNumber(),availableUnstakeAmount:C.toNumber(),availableUnstakeCoin:x.toNumber(),availableClaimAmount:O.toNumber(),availableClaimCoin:_.toNumber(),isIsolated:c?c.isIsolated:false}},Aa=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,m=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=0,C=0,x=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0);for(let w of o){let B=s?.collaterals.find(E=>l.parseCoinNameFromType(E.type)===w),v=r.collaterals[w];if(!v)continue;let M=ac({assetCoinName:w,coinType:l.parseCoinType(w),symbol:l.parseSymbol(w),coinDecimal:l.getCoinDecimal(w),coinPrice:n?.[w]??0,coinAmount:a?.[w]??0,marketCollateral:v,depositedRawAmount:B?.amount});m=m.plus(M.depositedValue),f=f.plus(M.borrowCapacityValue),y=y.plus(M.requiredCollateralValue),M.isDeposited&&b++,d[w]=M.entry;}for(let[w,B]of Object.entries(i)){if(!B)continue;let v=c[w];if(!v)continue;let M=cc({borrowIncentivePool:v,borrowIncentiveAccount:B,toMarketCoinName:E=>l.parseSCoinTypeNameToMarketCoinName(E)});M.contributesRewardedPool&&C++,p[w]={coinName:v.coinName,coinType:v.coinType,symbol:v.symbol,coinDecimal:v.coinDecimal,coinPrice:v.coinPrice,rewards:M.rewards};}let _=[...new Set(Object.values(r.pools).filter(w=>!!w).map(w=>w.coinName))];for(let w of _){let B=s?.debts.find(E=>l.parseCoinNameFromType(E.type)===w),v=r.pools[w];if(!v)continue;let M=lc({assetCoinName:w,coinType:l.parseCoinType(w),symbol:l.parseSymbol(w),coinDecimal:l.getCoinDecimal(w),coinPrice:n?.[w]??0,coinAmount:a?.[w]??0,marketPool:v,debt:B?{amount:B.amount,borrowIndex:B.borrowIndex}:void 0,rewards:p[w]?.rewards});x=x.plus(M.borrowedValue),O=O.plus(M.borrowedValueWithWeight),M.isBorrowed&&h++,u[w]=M.entry;}let N=dc({totalDepositedValue:m,totalBorrowedValue:x,totalBorrowCapacityValue:f,totalBorrowedValueWithWeight:O,totalRequiredCollateralValue:y}),P={obligationId:e,totalDepositedValue:m.toNumber(),totalBorrowedValue:x.toNumber(),totalBalanceValue:N.accountBalanceValue,totalBorrowCapacityValue:f.toNumber(),totalAvailableCollateralValue:N.availableCollateralValue,totalBorrowedValueWithWeight:O.toNumber(),totalRequiredCollateralValue:N.requiredCollateralValue,totalUnhealthyCollateralValue:N.unhealthyCollateralValue,totalRiskLevel:N.riskLevel,totalDepositedPools:b,totalBorrowedPools:h,totalRewardedPools:C,collaterals:d,debts:u,borrowIncentives:p};for(let[w,B]of Object.entries(P.collaterals)){if(!B)continue;let v=r.collaterals[w];if(!v)continue;let{availableWithdrawAmount:M,availableWithdrawCoin:E}=uc({obligationCollateral:B,marketCollateral:v,totalAvailableCollateralValue:P.totalAvailableCollateralValue,totalBorrowedValueWithWeight:P.totalBorrowedValueWithWeight});B.availableWithdrawAmount=M,B.availableWithdrawCoin=E;}for(let[w,B]of Object.entries(P.debts)){if(!B)continue;let v=r.pools[w];if(!v)continue;let{availableBorrowAmount:M,availableBorrowCoin:E,requiredRepayAmount:$,requiredRepayCoin:de}=pc({obligationDebt:B,marketPool:v,totalAvailableCollateralValue:P.totalAvailableCollateralValue});B.availableBorrowAmount=M,B.availableBorrowCoin=E,B.requiredRepayAmount=$,B.requiredRepayCoin=de;}return P},ka=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=Ji(e),c=Zi(o,a),i=tc(e,n),l=oc(o),d=rc(r,n.sca??0);return {...nc({parsedLendings:s,parsedObligationAccounts:c,parsedVeScas:d}),lendings:s,borrowings:c,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:je,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(l).map(([p,b])=>({coinName:p,...b,pendingRewardInUsd:b.coinPrice*b.pendingRewardInCoin}))},veScas:d}},Oa=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 Pa=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 Ra=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var ft=class extends I{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return Ra(this.context,e)}};var Kt=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=De,timeout:r,httpClient:n,network:a="mainnet",logger:s=me,forceAddressesInterface:c}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new ft({api:new pe({url:o,timeout:r,httpClient: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)}},Ia=Kt;var yt=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[f,y.decimals]),...Object.entries(t).filter(([f,y])=>!!y?.sCoinName).map(([f,y])=>[y.sCoinName,y.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[f,y?.coinType]),...Object.entries(t).filter(([f,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([f,y])=>[y.sCoinName,y.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([f,y])=>[y,f])),s=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&e.wormhole.has(f)).map(([f,y])=>[y.coinType,y.coinName])),c=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[y.coinName,o(y.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([f,y])=>[suiKit.parseStructTag(y.sCoinType).name,y.sCoinName])),l=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([f,y])=>[y.sCoinType,y.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&e.suiBridge.has(y.coinName)).map(([f,y])=>[y.coinType,y.coinName])),b=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([f,y])=>[y.sCoinName,y.sCoinType])),m=new Set([...Object.values(t).filter(f=>!!f).map(f=>f.sCoinName?[f.coinName,f.sCoinName]:[f.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:m}};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 Ne=()=>Object.fromEntries(Object.entries(va).map(([t,e])=>[t,new Set(e)])),bc=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,bc(o)]))),_e=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),xe=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)},Wt=t=>Object.keys(t).length===0;var ja=({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 xe(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 Ut=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],fc=(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]})),yc=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&Ut.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=xe(n.forceWhitelistInterface));let l=()=>yt({poolAddresses:i,whitelist:c,parseToOldMarketCoin:s});if(yc(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(fc(u,c))),{whitelist:c,poolAddresses:i,derived:l()}};var Ba=t=>({getAddresses:()=>t.getAddresses()});var _a=t=>({getPoolAddresses:()=>t.poolAddresses});var Ma=t=>({getWhitelist:()=>t.whitelist});var gc=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],hc=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],Cc=(t,e)=>{let r=(e?.requiredPaths??gc).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=hc.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},Fa=(t,e)=>{let o=Cc(t,e);if(!o.valid)throw new ne("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var Sc=(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},wc=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],xc=t=>{let e=t;return wc.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},Da=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:xc(t.whitelistSource.getWhitelist()),get:n=>Sc(o,n)};return Fa(r,{requiredPaths:e.requiredPaths}),r};var La=t=>{let e=t?.forceWhitelistInterface?xe(t.forceWhitelistInterface):Be(Ne()),o=_e(t?.forcePoolAddressInterface??{});return {whitelist:e,poolAddresses:o,derived:yt({poolAddresses:o,whitelist:e,parseToOldMarketCoin:t?.parseToOldMarketCoin??(()=>"")})}},Qt=class{address;logger;params;source;_state=La();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 Ia({...l,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??ja({address:this.address,logger:this.logger,defaultValues:n}),(s||a)&&(this._state=La({forceWhitelistInterface:s,forcePoolAddressInterface:a,parseToOldMarketCoin:d=>this.parseToOldMarketCoin(d)}));}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&&!Wt(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!Wt(this._state.poolAddresses)&&Ut.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&&Da({addressSource:Ba(this),poolAddressSource:_a(this),whitelistSource:Ma(this)},{});}},Ea=Qt;var Va=10,Gt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new Ea(e),e.suiClient){let{suiClient:o,fullnodeUrl:r,tokensPerSecond:n=Va,objectBatchWindowMs:a}=e;this.onchain=Ye(o,r,{tokensPerSecond:n,objectBatchWindowMs:a});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=Va,objectBatchWindowMs:a}=e,s=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=Ye(s,r,{tokensPerSecond:n,objectBatchWindowMs:a});}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((m,f)=>Number(BigInt(f.balance)-BigInt(m.balance)));for(let m of u)if(a.push({objectId:m.objectId,digest:m.digest,version:m.version,balance:m.balance}),i+=BigInt(m.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 Pa(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},qa=Gt;var gt=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var zt=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,priceTimeout:n,graphqlUrl:a,graphqlClient:s,...c}){this.utils=e??new qa(c),this.repos=Ca({utils:this.utils,queryClient:o,queryClientConfig:r,priceTimeout:n,graphqlUrl:a,graphqlClient:s});}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:ye(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:gt(r,e),collaterals:gt(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 gt(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 getObligationNames(e=this.walletAddress){return this.repos.obligation.getObligationNames(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 o?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 getCoinBalances(e,o=this.walletAddress){return o?await this.repos.coinBalance.getCoinBalances({coinTypes:e,address:o}):{}}async getMarketCoinAmounts(e,o=this.walletAddress){if(!o)return {};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:ye(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:ye(o)})}async getAllStakeAccounts(e=this.walletAddress){return e?await this.repos.spool.getStakeAccounts({address:e}):{}}async getStakeAccounts(e,o=this.walletAddress){return o?(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(f=>this.utils.parseMarketCoinName(f)),s=a.filter(f=>this.constants.whitelist.spool.has(f)),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)]),m={};for(let f of n){let y=this.utils.parseMarketCoinName(f),h=s.includes(y);m[f]=Ta({coinName:f,symbol:this.utils.parseSymbol(f),coinType:this.utils.parseCoinType(f),marketCoinType:this.utils.parseMarketCoinType(f),coinDecimal:this.utils.getCoinDecimal(f)??0,coinPrice:c[f]??0,marketPool:i?.[f],spool:h?l[y]:void 0,stakeAccounts:h?b[y]??[]:[],coinAmount:d[f]??0,marketCoinAmount:u[y]??0,sCoinAmount:p[y]??0});}return m}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return e?L({source:ye(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)}):{}}async getObligationAccountsByIds(e,o){return L({source:ye(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return L({source:ye(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 Aa({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:ye(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 e?await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o}):[]}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return e?this.repos.referral.getVeScaKeyIdFromReferralBindings(e):null}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 o?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:Sa({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 Oa({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;if(!o)throw new T("walletAddress is required");let 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 ka({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)}},Ka=zt;var Yt=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 Ka({...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 Ue(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 At(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.map(u=>u.objectId),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.map(d=>d.objectId),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.map(d=>d.objectId),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)}},Rc=Yt;
34
+ `,Hr=async(t,e)=>{let{graphqlClient:o,balanceSource:r,fetchWithCache:n,logger:a}=t,{address:s,coinTypes:c}=e;if(!c.length)return {};let i=c.map(d=>utils.normalizeStructTag(d));return (await n({queryKey:g.rpc.getCoinBalancesByTypes({node:r.url,address:s,coinTypes:[...i].sort()}),queryFn:async()=>{let d=await o.query({query:ii,variables:{address:s,coinTypes:i}});if(d.errors?.length)throw T(a,new k(`GraphQL multiGetBalances failed: ${d.errors[0].message}`,{context:{address:s,coinTypes:i}}));return d.data?.address?.multiGetBalances??[]}})).reduce((d,u)=>{let p=utils.normalizeStructTag(u.coinType.repr);return d[p]={coinType:p,balance:u.totalBalance??"0",coinBalance:u.coinBalance??"0",addressBalance:u.addressBalance??"0"},d},{})},Xr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,coinNames:d=[...c.whitelist.lending.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Dt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},Jr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,coinName:i}=e,l=s.parseCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>Ft({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.balance??0)},Zr=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,sCoinNames:d=[...c.whitelist.scoin.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Dt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseSCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},en=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,sCoinName:i}=e,l=s.parseSCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>Ft({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.balance??0)},tn=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,graphqlClient:a,logger:s,metadata:c,queryClient:i}=t,{address:l,marketCoinNames:d=[...c.whitelist.scoin.values()]}=e,u=await o({queryKey:g.rpc.getAllCoinBalances({node:n.url,activeAddress:l}),queryFn:()=>Dt({onchain:r,balanceSource:n,logger:s,queryClient:i},l)});return d.reduce((b,m)=>{let f=c.parseMarketCoinType(m);return b[m]=f?Number(u[f]?.balance??0):0,b},{})},on=async(t,e)=>{let{fetchWithCache:o,onchain:r,balanceSource:n,logger:a,metadata:s}=t,{address:c,marketCoinName:i}=e,l=s.parseMarketCoinType(i);if(!l)return 0;let d=await o({queryKey:g.rpc.getCoinBalance({node:n.url,address:c,coinType:l}),queryFn:()=>Ft({onchain:r,logger:a},{address:c,coinType:l})});return Number(d?.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 T(t.logger,new A(`Treasury address not found for sCoin: ${e}`,{context:{sCoinName:e}}));let p=new suiKit.SuiTxBlock,b=await n({queryKey:g.rpc.getObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!b.object)throw T(t.logger,new k(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let m=[await Y({onchain:o,fetchWithCache:n},{tx:p,objectId:b.object})],f=[s(e),c(e)].filter(C=>!!C);p.moveCall(d,m,f);let y={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:m,typeArgs:f,node:o.url,...y}),queryFn:()=>o.client.simulateTransaction({...y,transaction:p.txBlock})}),S=h?.commandResults;if(!S)throw T(t.logger,new k(`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 C=S[0].returnValues[0].bcs,O=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(C)).shiftedBy(-O).toNumber()}return 0};var Ze=class extends v{onchain;balanceSource;graphqlClient;constructor({onchain:e,balanceSource:o,graphqlClient:r,...n}){super(n),this.onchain=e,this.balanceSource=o,this.graphqlClient=r;}get context(){return {...this.baseContext,onchain:this.onchain,balanceSource:this.balanceSource,graphqlClient:this.graphqlClient,queryClient:this.queryClient}}getCoinAmounts(e){return Xr(this.context,e)}getCoinAmount(e){return Jr(this.context,e)}getCoinBalances(e){return Hr(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 di=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 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},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 di(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,c)=>{if(c){let{name:i}=Nr(c),l=`0x${i}`,d=n[l];if(!d)return s;let u=+P(c);s[d]=u/1e4;}return s},{})};var et=class extends v{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 cn=t=>{let o=P(t).ownership?.of;if(!o)throw new A(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var Lt=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:Z(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:Z(e.type,`obligation.debts[${o}].type`)}))}},ln=(t,e)=>{let o=bcs.bcs.Address.serialize(t).toBytes(),r=bcs.bcs.Address.serialize(e).toBytes(),n=new Uint8Array(o.length+r.length);n.set(o,0),n.set(r,o.length);let a=sha3_js.sha3_256(n);return `0x${Array.from(a).map(c=>c.toString(16).padStart(2,"0")).join("")}`};var un=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},tt=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}),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 T(t.logger,new k(`Failed to fetch object ${y}`,{context:{objectId:y}}));return Y({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],m=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:b,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=m.Transaction??m.FailedTransaction;if(!f.status.success)throw T(t.logger,new k(`Failed to query obligation data for obligationId ${e}: ${f.status.error.message}`,{context:{obligationId:e}}));return Lt(f?.events?.[0]?.json)},pn=async(t,e)=>{if(e.length===0)return {};if(e.length===1){let o=e[0];return {[o]:await tt(t,o)}}try{return await mi(t,e)}catch(o){t.logger?.warn("Batched obligation_data query failed; falling back to per-obligation",{obligations:e.length,error:o instanceof Error?o.message:String(o)});let r=await Promise.all(e.map(async n=>{try{return [n,await tt(t,n)]}catch{return [n,void 0]}}));return Object.fromEntries(r)}},mi=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=async C=>{let O=await r({queryKey:g.rpc.getObject({objectId:C,node:o.url}),queryFn:()=>o.getObject({objectId:C})});if(!O.object)throw T(t.logger,new k(`Failed to fetch object ${C}`,{context:{objectId:C}}));return Y({onchain:o,fetchWithCache:r},{tx:l,mutable:false,objectId:O.object})},[u,p]=await Promise.all([d(s),d(c)]),b=l.txBlock.object.clock(),m=await Promise.all(e.map(C=>d(C)));for(let C of m)l.moveCall(i,[u,p,C,b]);let f=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s,c,...e],node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),y=f.Transaction??f.FailedTransaction;if(!y.status.success)throw new k(`Batched obligation_data query failed: ${y.status.error?.message??"unknown"}`,{context:{obligationIds:e}});let h=y.events??[];if(h.length!==e.length)throw new k(`Batched obligation_data returned ${h.length} events for ${e.length} obligations`,{context:{obligationIds:e}});let S={};return e.forEach((C,O)=>{S[C]=Lt(h[O]?.json);}),S},mn=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 !!P(a.object)?.lock_key},bn=async(t,{address:e})=>{let o=await un(t,{address:e}),r=o.map(cn),n=await Et(t,r);return o.map((a,s)=>{let c=n[s],i=c?P(c):void 0;return {id:r[s],keyId:a.objectId,locked:!!i?.lock_key}})},Et=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)},fn=async(t,e)=>{let{metadata:{addresses:o},fetchWithCache:r,onchain:n}=t,a=o.obligationNaming.registryTableId,s=await un(t,{address:e}),c=await Promise.all(s.map(async i=>{let l=ln(i.objectId,e),d={parentId:a,name:q({type:"0x2::object::ID",value:l}),include:{json:true}};try{let{dynamicField:u}=await r({queryKey:g.rpc.getDynamicFieldObject({...d,node:n.url}),queryFn:()=>n.client.getDynamicField(d)});return [i.objectId,bcs.bcs.string().parse(u.value.bcs)]}catch{return null}}));return Object.fromEntries(c.filter(i=>i!==null))};var ot=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return bn(this.context,{address:e})}getObligationData(e){return tt(this.context,e)}getObligationsData(e){return pn(this.context,e)}getObligationLocked(e){return mn(this.context,e)}getObligationObjects(e){return Et(this.context,e)}getObligationNames(e){return fn(this.context,e)}};var bi=t=>({pointType:J(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)}),yn=(t,e)=>({poolType:J(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=bi(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),m=b.multipliedBy(r),f=365*24*60*60,y=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(y).multipliedBy(f).multipliedBy(e),S=bignumber_js.BigNumber(1e12),C=bignumber_js.BigNumber(t.baseWeight).dividedBy(S),O=h.multipliedBy(C).dividedBy(m).isFinite()&&t.points>0?h.multipliedBy(C).dividedBy(m).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:m.toNumber(),rewardApr:O,rewardPerSec:y.toNumber()}},fi=t=>({pointType:J(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:J(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},{})}),Cn=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:Z(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:Z(r.point_type,`borrowIncentive.incentive_pools[${o}].points[${n}].point_type`)}))}))}},Vt=t=>{if(t)return {...t,pool_records:(t.pool_records??[]).map((e,o)=>({...e,pool_type:Z(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:Z(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var yi=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),gi=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),Sn=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:gi,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(yi)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var wn=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.getObject({...l,node:r.url}),queryFn:()=>r.getObject(l)});if(!d.object)throw T(t.logger,new k(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await Y({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}})}),m=b?.Transaction??b?.FailedTransaction,f=Cn(m?.events?.[0]?.json),y=e??[...n.whitelist.lending.values()],h={};for(let S of f?.incentive_pools??[]){let C={},O=yn(n.parseCoinNameFromType,S),F=S.pool_type,N=n.parseCoinNameFromType(F),R=o[N]??0,x=n.getCoinDecimal(N);if(x===void 0)throw T(t.logger,new A(`Coin decimal not found for ${N}`,{context:{poolCoinName:N}}));if(!y.includes(N))continue;for(let[E,$]of Object.entries(O.poolPoints)){if(!$)continue;let de=$.pointType,te=n.parseCoinNameFromType(de),ie=n.getCoinDecimal(te);if(ie===void 0)throw T(t.logger,new A(`Coin decimal not found for ${te}`,{context:{poolCoinName:te}}));let V=o[te]??0,Se=n.parseSymbol(te),U=gn($,V,ie,R,x),H=$.points<=U.accumulatedPoints;$.points>U.accumulatedPoints&&(C[E]={symbol:Se,coinName:te,coinType:de,coinDecimal:ie,coinPrice:V,points:$.points,distributedPoint:$.distributedPoint,weightedAmount:$.weightedAmount,...U,...H?{rewardApr:0}:{}});}let B=bignumber_js.BigNumber(O.staked),I=B.shiftedBy(-x),_=I.multipliedBy(R);h[N]={coinName:N,symbol:n.parseSymbol(N),coinType:F,coinDecimal:x,coinPrice:R,stakedAmount:B.toNumber(),stakedCoin:I.toNumber(),stakedValue:_.toNumber(),points:C};}return h},rt=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 C=await n({queryKey:g.rpc.getObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!C.object)throw T(t.logger,new k(`Failed to fetch object ${h}`,{context:{objectId:h}}));return Y({onchain:a,fetchWithCache:n},{tx:c,mutable:S,objectId:C.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}})}),m=b?.Transaction??b?.FailedTransaction,f=Vt(m?.events?.[0]?.json),y=e??[...r.whitelist.lending.values()];return xn(r,f,y)},xn=(t,e,o)=>e?e.pool_records.reduce((r,n)=>{let a=hn(t.parseCoinNameFromType,n),s=t.parseCoinNameFromType(a.poolType);return o.includes(s)&&(r[s]=a),r},{}):{},Tn=async(t,{obligationIds:e,coinNames:o})=>{if(e.length===0)return {};if(e.length===1){let r=e[0];return {[r]:await rt(t,{obligationId:r,coinNames:o})}}try{return await Si(t,{obligationIds:e,coinNames:o})}catch(r){t.logger?.warn("Batched incentive_account_data query failed; falling back to per-obligation",{obligations:e.length,error:r instanceof Error?r.message:String(r)});let n=await Promise.all(e.map(async a=>{try{return [a,await rt(t,{obligationId:a,coinNames:o})]}catch{return [a,{}]}}));return Object.fromEntries(n)}},Si=async(t,{obligationIds:e,coinNames:o})=>{let{metadata:r,fetchWithCache:n,onchain:a}=t,{borrowIncentive:s}=r.addresses,c=`${s.query}::incentive_account_query::incentive_account_data`,i=new suiKit.SuiTxBlock,l=async(h,S)=>{let C=await n({queryKey:g.rpc.getObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!C.object)throw T(t.logger,new k(`Failed to fetch object ${h}`,{context:{objectId:h}}));return Y({onchain:a,fetchWithCache:n},{tx:i,mutable:S,objectId:C.object})},d=await l(s.incentiveAccounts,true),u=await Promise.all(e.map(h=>l(h,true)));for(let h of u)i.moveCall(c,[d,h],[]);let p=await n({queryKey:g.rpc.getInspectTxn({queryTarget:c,args:[s.incentiveAccounts,...e],node:a.url}),queryFn:()=>a.client.simulateTransaction({transaction:i.txBlock,include:{events:true}})}),b=p?.Transaction??p?.FailedTransaction;if(!b?.status?.success)throw new k(`Batched incentive_account_data query failed: ${b?.status?.error?.message??"unknown"}`,{context:{obligationIds:e}});let m=b.events??[];if(m.length!==e.length)throw new k(`Batched incentive_account_data returned ${m.length} events for ${e.length} obligations`,{context:{obligationIds:e}});let f=o??[...r.whitelist.lending.values()],y={};return e.forEach((h,S)=>{let C=Vt(m[S]?.json);y[h]=xn(r,C,f);}),y},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 T(t.logger,new k(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let l=P(i.object).accounts.id,d=await ce(t,{parentId:l,name:q({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?Sn.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},kn=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 T(t.logger,new k(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let l=P(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ce(t,{parentId:l,name:q({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var nt=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return wn(this.context,e)}getBorrowIncentiveAccounts(e){return rt(this.context,e)}getBorrowIncentiveAccountsBatch(e){return Tn(this.context,e)}getBindedVeScaKey(e){return An(this.context,e)}getBindedObligation(e){return kn(this.context,e)}};var On="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var Rn=bcs.bcs.bool(),vn=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===On,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)?Rn.parse(b.valueType.bcs):false).map(b=>`0x${vn.parse(b.name.bcs)}`);c.push(...p),a=u,n=d;}while(n);return c},In=async t=>wi(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 at=class extends v{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 L({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>jn(this.context),onchain:()=>In(this.context)})}};var Nn=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var Ai=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},ki=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,C)=>{let O=await o({queryKey:g.rpc.getObject({node:e.url,objectId:S}),queryFn:()=>e.getObject({objectId:S})});if(!O.object)throw T(t.logger,new k(`Failed to fetch object ${S}`,{context:{objectId:S}}));return Y({onchain:e,fetchWithCache:o},{tx:c,mutable:C,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`,m=[l,c.txBlock.object.clock()];c.moveCall(u,p),c.moveCall(b,m);let y=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:m,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:c.txBlock,include:{commandResults:true}})}))?.commandResults;if(!y)throw T(t.logger,new k("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=y[1]?.returnValues?.[0].bcs;if(!h)throw T(t.logger,new k("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},Oe=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:q({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=Nn.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()}},Bn=async(t,{address:e,excludeEmpty:o})=>{let r=await Ai(t,e),n=(await Promise.all(r.map(a=>Oe(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},_n=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:q(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(Pt(i))return null;throw i}}});if(!s?.object)return false;let c=P(s.object);return Array.isArray(c?.contents)&&c.contents.length>0},Mn=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=P(a.object),c=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await ki(t)).shiftedBy(-9).toNumber(),l=c>0?i/c*4:0;return {totalLockedSca:c,totalVeSca:i,averageLockingPeriod:l,averageLockingPeriodUnit:"year"}};var it=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return Oe(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return Bn(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return Mn(this.context)}isVeScaKeyInSubsTable(e,o){return _n(this.context,{veScaKey:e,tableId:o})}};var Fn=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 Dn=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 T(t.logger,new k("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:q({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(Dn.parse(s.bcs)).shiftedBy(-9).toNumber()},Ln=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await vi(t,r),{data:a,success:s}=Fn.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 ct=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return Ln(this.context,e)}};var Wt=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)}),En=Ni(ji);var Bi=3,Vn=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:m,hasNextPage:f}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});l=m,d=f,b.forEach(y=>{let h=Wt(bcs.bcs.string().parse(y.name.bcs)),S=s(h),C=En.parse(y.value.bcs);u[S]||(u[S]=[]),C.contents.forEach(({name:O})=>{let F=i[Wt(O)];F&&u[S].push(F);});});}while(d);return u},qn=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([Vn(t,e.oracles.primaryPriceUpdatePolicyVecsetId),Vn(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},Kn=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}},Wn=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 T(t.logger,new A(`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 T(t.logger,new k(`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 T(t.logger,new A(`Invalid coin name: ${l}`,{context:{coinName:l}}));let u=await ce(t,{parentId:a,name:q({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw T(t.logger,new k(`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 dt=class extends v{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 Kn(this.context)}getOnDemandAggObjectIds(e){return Wn(this.context,e)}};var Un=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 A("spool or spoolReward is undefined");let r=P(e),n=P(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}},$n=(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),m=bignumber_js.BigNumber(t.staked),f=m.shiftedBy(-o),y=f.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:m.toNumber(),stakedCoin:f.toNumber(),stakedValue:y.toNumber()}},Gn=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)}),zn=(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),m=b.multipliedBy(r),f=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),y=f.dividedBy(o.stakedValue).isFinite()?f.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:m.toNumber(),rewardPerSec:a.toNumber()}},Yn=t=>({...t,stakeType:Li(t.stakeType)}),Li=t=>{try{return J(t)}catch(e){throw new A("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Ut=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},{})},Hn=async(t,{coinPrices:e,stakeCoinName:o})=>(await Ut(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,Xn=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 Zn(t,a);return (await Promise.allSettled(n.map((i,l)=>Qt(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[l]]})))).reduce((i,l,d)=>(l.status==="fulfilled"&&l.value&&(i[n[d]]=l.value),i),{})},Qt=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),c=Yn(Qn(r??(await Zn(t,[a]))[a])),i=Un(c),l=e[o]??0,d=$n(i,l,n.getCoinDecimal(o)),u=Gn(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,...zn(i,u,d,p,n.getCoinDecimal(s))}},Jn=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 b=P(l),m=utils.normalizeStructTag(u),f=i[m],y=s[f];y&&y.push({id:d,type:m,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},$t=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},Zn=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=ae([...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=P(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)}},ea=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=P(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 ut=class extends v{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 L({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Ut(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>Xn(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return L({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>Hn(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>Qt(this.context,{stakeCoinName:e,coinPrices:o})})}getStakeAccounts(e){return Jn(this.context,e)}async getStakeAccountsByPool(e,o){return (await this.getStakeAccounts({address:e,stakeCoinNames:[o]}))[o]||[]}getSpoolRewardPools(e){return $t(this.context,{stakeCoinNames:e})}getSpoolRewardPool(e){return $t(this.context,{stakeCoinNames:[e]}).then(o=>o[e])}getStakePool(e){return ea(this.context,e)}};var ta=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 oa=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:q({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(oa.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 T(t.logger,new k("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},ra=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await Ui(t,r),{data:a,success:s}=ta.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let c=await Oe(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 pt=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return ra(this.context,e)}};var na=bcs.bcs.Address;var aa=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:q({type:"address",value:e})},n=await ce(t,r);return n?na.parse(n.dynamicField.value.bcs):null};var mt=class extends v{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return aa(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()}),sa=zod.z.object({id:zod.z.string(),size:zod.z.string()}),ia=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:sa,underlying_balances:sa})});var we="0x1::type_name::TypeName",ca="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",la="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",da="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",ua="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var pa=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 ae(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},ma=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=ia.safeParse(u?.json);if(!p.success)throw T(t.logger,new A("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let b=p.data,m=b.vault.balance_sheets.table.id,f=b.collateral_stats.table.id,y=b.borrow_dynamics.table.id,h=b.interest_models.table.id,S=b.risk_models.table.id,C=b.vault.flash_loan_fees.table.id,O=new Set(e),F=Object.entries(l).filter(U=>{let[H,ge]=U;return ge?.coinType?O.size===0||O.has(H):false});if(F.length===0)throw T(t.logger,new k("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let N=await zi(t,new Set(F.map(([,U])=>U.coinType)),C),R=new Set(F.map(([,U])=>U.coinType.slice(2))),[x,B,I,_,E,$,de,te,ie]=await Promise.all([le(t,{parentId:m,type:we,coinTypeKeys:R}),le(t,{parentId:f,type:we,coinTypeKeys:R}),le(t,{parentId:y,type:we,coinTypeKeys:R}),le(t,{parentId:h,type:we,coinTypeKeys:R}),le(t,{parentId:S,type:we,coinTypeKeys:R}),le(t,{parentId:i,type:ca,coinTypeKeys:R}),le(t,{parentId:i,type:la,coinTypeKeys:R}),le(t,{parentId:i,type:da,coinTypeKeys:R}),le(t,{parentId:i,type:ua,coinTypeKeys:R})]),V=await Gi(t,{lendingPool:x,collateralPool:B,borrowDynamic:I,interestModel:_,riskModel:E,borrowFee:$,supplyLimit:de,borrowLimit:te,isolatedAsset:ie}),Se={};for(let[U,H]of F){let{coinType:ge}=H,oe=ge.slice(2),St=V.lendingPool[oe],Ga=V.collateralPool[oe],za=V.borrowDynamic[oe],Ya=V.interestModel[oe],Ha=V.riskModel[oe],Xa=V.borrowFee[oe],Ja=V.supplyLimit[oe],Za=V.borrowLimit[oe],to=V.isolatedAsset[oe]?.json,Me=`s${U}`,oo=s.pools[Me],Fe=c.coins[Me],ro=H.oracle?.pyth;Se[U]={coinName:U,symbol:H.symbol,coinType:ge,coinMetadataId:H.metaData,decimals:H.decimals,lendingPoolAddress:St?.objectId??"",collateralPoolAddress:Ga?.objectId??"",borrowDynamic:za?.objectId??"",interestModel:Ya?.objectId??"",riskModel:Ha?.objectId,borrowFeeKey:Xa?.objectId??"",supplyLimitKey:Ja?.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[ge]??""};}return Se};var bt=class extends v{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 L({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>pa(this.context,{poolNames:e}),onchain:()=>ma(this.context,{poolNames:e})})}};var ba="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 ga=({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 ha=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a},priceTimeout:s}=t,c=Array.from(new Set(Object.values(r.coins).map(d=>d?.oracle?.pyth?.feed).filter(d=>!!d))).sort(),i=await o({queryKey:g.oracle.getPythAllPriceFeeds(n,c),staleTime:s,gcTime:s,queryFn:async()=>{let d=new pythSuiJs.SuiPriceServiceConnection(n,a),{parsed:u}=await d.getLatestPriceUpdates(c,{parsed:true,ignoreInvalidPriceIds:true});if(!u)throw T(t.logger,new Qe("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:c}}));let p={};for(let b of u)p[b.id]=bignumber_js.BigNumber(b.price.price).shiftedBy(b.price.expo).toNumber();return p}}),l={};for(let d of e){let u=r.coins[d]?.oracle?.pyth?.feed;l[d]=(u!==void 0?i[u]:void 0)??0;}return l},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},Sa=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))},wa=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 ae(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 T(t.logger,new k("Failed to fetch price feed object on chain",{cause:p}));let{data:b,success:m}=fa.safeParse(p.json);if(!m)throw T(t.logger,new A("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:f}=b.price_info;c.set(p.objectId,ga(f.price).toNumber());}}let i={};for(let[l,d]of a)i[l]=(d!==void 0?c.get(d):void 0)??0;return i},xa=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 ft=class extends v{config;indexer;onchain;priceTimeout;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,priceTimeout:n,...a}){super(a),this.config=e??{endpoint:ba,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r,this.priceTimeout=n??5e3;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config,priceTimeout:this.priceTimeout}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return L({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>ha(this.context,e),onchain:()=>wa(this.context,e)})}getPythFeedObject(e){return Ca(this.context,e)}getPythFeedObjects(e){return Sa(this.context,e)}getPricesFromIndexer(e){return xa(this.context,e)}};var Ta=t=>{let{utils:e,indexerUrl:o,priceTimeout:r,graphqlUrl:n,graphqlClient:a,queryClientConfig:s=Ee}=t,c=e.onchain,i=cr(o),l=n??Rt,d=a??new graphql.SuiGraphQLClient({url:l,network:"mainnet"}),u=ir({client:d,url:l}),p=t.queryClient??new queryCore.QueryClient(s),b=e.logger,m={onchain:c,queryClient:p,logger:b},f,y,h,S,C,O,F,N,R,x,B,I,_,E;return {get market(){return f??=new Je({...m,indexer:i,addresses:pr(e),metadata:ur(e)})},get coinBalance(){return y??=new Ze({...m,balanceSource:u,graphqlClient:d,metadata:mr(e)})},get flashloan(){return h??=new et({...m,metadata:br(e)})},get obligation(){return S??=new ot({...m,metadata:fr(e)})},get borrowIncentive(){return C??=new nt({...m,metadata:yr(e)})},get isolatedAssets(){return O??=new at({...m,metadata:Sr(e)})},get veSca(){return F??=new it({...m,metadata:wr(e)})},get loyaltyProgram(){return N??=new ct({...m,metadata:xr(e)})},get xOracle(){return R??=new dt({...m,metadata:kr(e)})},get spool(){return x??=new ut({...m,indexer:i,metadata:Ar(e)})},get veScaLoyaltyProgram(){return B??=new pt({...m,metadata:Tr(e)})},get referral(){return I??=new mt({...m,metadata:gr(e)})},get price(){return _??=new ft({...m,indexer:i,metadata:hr(e),priceTimeout:r})},get poolAddresses(){return E??=new bt({...m,api:lr(),metadata:Cr(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",ec={rpc:"onchain",indexer:"api","indexer-first":"api-first"},ye=t=>t?.source?ec[t.source]:t?.indexer?"api-first":"onchain";var Ie=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var yt=(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 rc=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})),nc=(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}))}))})),je="sui",ac="SUI",sc=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[je]?o[je].pendingRewardInCoin+=r.availableClaimCoin:o[je]={symbol:ac,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[je]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),ic=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),{}),cc=(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})),lc=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}},dc=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)}},uc=1e9,pc=bignumber_js.BigNumber(1e12),mc=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(uc).toNumber(),0):1,l=c.multipliedBy(i).plus(a.points),d=l.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(pc),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),b=p.isFinite()?p.toNumber():1,m=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:m,boostedRewardApr:m*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}},bc=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)}},fc=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()}},yc=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):Ie(e.multipliedBy(yt(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()}},gc=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(yt(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)?Ie(o.multipliedBy(yt(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()}},Pa=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),m=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),S=bignumber_js.BigNumber(0),C=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0),F=bignumber_js.BigNumber(0);if(i)for(let ie of l){let V=bignumber_js.BigNumber(ie.staked),Se=V.shiftedBy(-i.coinDecimal),U=V.multipliedBy(c?.conversionRate??1),H=U.shiftedBy(-i.coinDecimal),ge=H.multipliedBy(i.coinPrice);b=b.plus(V),m=m.plus(Se),f=f.plus(U),y=y.plus(H),h=h.plus(ge),S=S.plus(V),C=S.shiftedBy(-i.coinDecimal);let St=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-ie.index).dividedBy(1e9):1;O=O.plus(V.multipliedBy(St).plus(ie.points).multipliedBy(i.exchangeRateNumerator).dividedBy(i.exchangeRateDenominator)),F=O.shiftedBy(-i.rewardCoinDecimal);}let N=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)).multipliedBy(c?.conversionRate??1),R=N.shiftedBy(-a),x=R.multipliedBy(s??0),B=bignumber_js.BigNumber(s??0).multipliedBy(c?.conversionRate??1),I=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),_=I.shiftedBy(-a),E=bignumber_js.BigNumber(d),$=E.shiftedBy(-a),de=Ie(N,c?.supplyAmount??1/0).plus(f),te=Ie(R,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(f).toNumber(),suppliedCoin:R.plus(y).toNumber(),suppliedValue:x.plus(h).toNumber(),stakedMarketAmount:b.toNumber(),stakedMarketCoin:m.toNumber(),stakedAmount:f.toNumber(),stakedCoin:y.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:I.toNumber(),unstakedMarketCoin:_.toNumber(),unstakedAmount:N.toNumber(),unstakedCoin:R.toNumber(),unstakedValue:x.toNumber(),availableSupplyAmount:E.toNumber(),availableSupplyCoin:$.toNumber(),availableWithdrawAmount:de.toNumber(),availableWithdrawCoin:te.toNumber(),availableStakeAmount:I.toNumber(),availableStakeCoin:_.toNumber(),availableUnstakeAmount:S.toNumber(),availableUnstakeCoin:C.toNumber(),availableClaimAmount:O.toNumber(),availableClaimCoin:F.toNumber(),isIsolated:c?c.isIsolated:false}},Ra=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,m=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),y=bignumber_js.BigNumber(0),h=0,S=0,C=bignumber_js.BigNumber(0),O=bignumber_js.BigNumber(0);for(let x of o){let B=s?.collaterals.find(E=>l.parseCoinNameFromType(E.type)===x),I=r.collaterals[x];if(!I)continue;let _=dc({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketCollateral:I,depositedRawAmount:B?.amount});m=m.plus(_.depositedValue),f=f.plus(_.borrowCapacityValue),y=y.plus(_.requiredCollateralValue),_.isDeposited&&b++,d[x]=_.entry;}for(let[x,B]of Object.entries(i)){if(!B)continue;let I=c[x];if(!I)continue;let _=mc({borrowIncentivePool:I,borrowIncentiveAccount:B,toMarketCoinName:E=>l.parseSCoinTypeNameToMarketCoinName(E)});_.contributesRewardedPool&&S++,p[x]={coinName:I.coinName,coinType:I.coinType,symbol:I.symbol,coinDecimal:I.coinDecimal,coinPrice:I.coinPrice,rewards:_.rewards};}let F=[...new Set(Object.values(r.pools).filter(x=>!!x).map(x=>x.coinName))];for(let x of F){let B=s?.debts.find(E=>l.parseCoinNameFromType(E.type)===x),I=r.pools[x];if(!I)continue;let _=bc({assetCoinName:x,coinType:l.parseCoinType(x),symbol:l.parseSymbol(x),coinDecimal:l.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketPool:I,debt:B?{amount:B.amount,borrowIndex:B.borrowIndex}:void 0,rewards:p[x]?.rewards});C=C.plus(_.borrowedValue),O=O.plus(_.borrowedValueWithWeight),_.isBorrowed&&h++,u[x]=_.entry;}let N=fc({totalDepositedValue:m,totalBorrowedValue:C,totalBorrowCapacityValue:f,totalBorrowedValueWithWeight:O,totalRequiredCollateralValue:y}),R={obligationId:e,totalDepositedValue:m.toNumber(),totalBorrowedValue:C.toNumber(),totalBalanceValue:N.accountBalanceValue,totalBorrowCapacityValue:f.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(R.collaterals)){if(!B)continue;let I=r.collaterals[x];if(!I)continue;let{availableWithdrawAmount:_,availableWithdrawCoin:E}=yc({obligationCollateral:B,marketCollateral:I,totalAvailableCollateralValue:R.totalAvailableCollateralValue,totalBorrowedValueWithWeight:R.totalBorrowedValueWithWeight});B.availableWithdrawAmount=_,B.availableWithdrawCoin=E;}for(let[x,B]of Object.entries(R.debts)){if(!B)continue;let I=r.pools[x];if(!I)continue;let{availableBorrowAmount:_,availableBorrowCoin:E,requiredRepayAmount:$,requiredRepayCoin:de}=gc({obligationDebt:B,marketPool:I,totalAvailableCollateralValue:R.totalAvailableCollateralValue});B.availableBorrowAmount=_,B.availableBorrowCoin=E,B.requiredRepayAmount=$,B.requiredRepayCoin=de;}return R},va=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=rc(e),c=nc(o,a),i=sc(e,n),l=ic(o),d=cc(r,n.sca??0);return {...lc({parsedLendings:s,parsedObligationAccounts:c,parsedVeScas:d}),lendings:s,borrowings:c,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:je,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(l).map(([p,b])=>({coinName:p,...b,pendingRewardInUsd:b.coinPrice*b.pendingRewardInCoin}))},veScas:d}},Ia=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 ja=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 Na=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var gt=class extends v{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return Na(this.context,e)}};var Gt=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=De,timeout:r,httpClient:n,network:a="mainnet",logger:s=me,forceAddressesInterface:c}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new gt({api:new pe({url:o,timeout:r,httpClient: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)}},Ba=Gt;var ht=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[f,y.decimals]),...Object.entries(t).filter(([f,y])=>!!y?.sCoinName).map(([f,y])=>[y.sCoinName,y.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[f,y?.coinType]),...Object.entries(t).filter(([f,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([f,y])=>[y.sCoinName,y.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([f,y])=>[y,f])),s=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&e.wormhole.has(f)).map(([f,y])=>[y.coinType,y.coinName])),c=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y).map(([f,y])=>[y.coinName,o(y.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([f,y])=>[suiKit.parseStructTag(y.sCoinType).name,y.sCoinName])),l=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinType&&y.sCoinName).map(([f,y])=>[y.sCoinType,y.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&e.suiBridge.has(y.coinName)).map(([f,y])=>[y.coinType,y.coinName])),b=Object.fromEntries(Object.entries(t).filter(([f,y])=>!!y&&y.sCoinName&&y.sCoinType).map(([f,y])=>[y.sCoinName,y.sCoinType])),m=new Set([...Object.values(t).filter(f=>!!f).map(f=>f.sCoinName?[f.coinName,f.sCoinName]:[f.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:m}};var _a={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(_a).map(([t,e])=>[t,new Set(e)])),Cc=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,Cc(o)]))),_e=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),xe=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)},zt=t=>Object.keys(t).length===0;var Ma=({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 xe(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 Yt=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],Sc=(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]})),wc=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&Yt.every(s=>o[s].size>0)},Fa=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=xe(n.forceWhitelistInterface));let l=()=>ht({poolAddresses:i,whitelist:c,parseToOldMarketCoin:s});if(wc(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(Sc(u,c))),{whitelist:c,poolAddresses:i,derived:l()}};var Da=t=>({getAddresses:()=>t.getAddresses()});var La=t=>({getPoolAddresses:()=>t.poolAddresses});var Ea=t=>({getWhitelist:()=>t.whitelist});var xc=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],Tc=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],Ac=(t,e)=>{let r=(e?.requiredPaths??xc).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=Tc.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},Va=(t,e)=>{let o=Ac(t,e);if(!o.valid)throw new ne("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var kc=(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},Oc=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],Pc=t=>{let e=t;return Oc.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},qa=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:Pc(t.whitelistSource.getWhitelist()),get:n=>kc(o,n)};return Va(r,{requiredPaths:e.requiredPaths}),r};var Ka=t=>{let e=t?.forceWhitelistInterface?xe(t.forceWhitelistInterface):Be(Ne()),o=_e(t?.forcePoolAddressInterface??{});return {whitelist:e,poolAddresses:o,derived:ht({poolAddresses:o,whitelist:e,parseToOldMarketCoin:t?.parseToOldMarketCoin??(()=>"")})}},Ht=class{address;logger;params;source;_state=Ka();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 Ba({...l,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??Ma({address:this.address,logger:this.logger,defaultValues:n}),(s||a)&&(this._state=Ka({forceWhitelistInterface:s,forcePoolAddressInterface:a,parseToOldMarketCoin:d=>this.parseToOldMarketCoin(d)}));}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&&!zt(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!zt(this._state.poolAddresses)&&Yt.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 Fa({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&&qa({addressSource:Da(this),poolAddressSource:La(this),whitelistSource:Ea(this)},{});}},Wa=Ht;var Ua=10,Jt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new Wa(e),e.suiClient){let{suiClient:o,fullnodeUrl:r,tokensPerSecond:n=Ua,objectBatchWindowMs:a}=e;this.onchain=Ye(o,r,{tokensPerSecond:n,objectBatchWindowMs:a});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=Ua,objectBatchWindowMs:a}=e,s=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=Ye(s,r,{tokensPerSecond:n,objectBatchWindowMs:a});}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((m,f)=>Number(BigInt(f.balance)-BigInt(m.balance)));for(let m of u)if(a.push({objectId:m.objectId,digest:m.digest,version:m.version,balance:m.balance}),i+=BigInt(m.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 ja(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},Qa=Jt;var Ct=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var Zt=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,priceTimeout:n,graphqlUrl:a,graphqlClient:s,...c}){this.utils=e??new Qa(c),this.repos=Ta({utils:this.utils,queryClient:o,queryClientConfig:r,priceTimeout:n,graphqlUrl:a,graphqlClient:s});}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:ye(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:Ct(r,e),collaterals:Ct(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 Ct(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 getObligationNames(e=this.walletAddress){return this.repos.obligation.getObligationNames(e)}async queryObligation(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new A("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 A("getObligationLocked expects an object id (string) or an object reference");return this.repos.obligation.getObligationLocked(o)}async getCoinAmounts(e,o=this.walletAddress){return o?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 getCoinBalances(e,o=this.walletAddress){return o?await this.repos.coinBalance.getCoinBalances({coinTypes:e,address:o}):{}}async getMarketCoinAmounts(e,o=this.walletAddress){if(!o)return {};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:ye(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:ye(o)})}async getAllStakeAccounts(e=this.walletAddress){return e?await this.repos.spool.getStakeAccounts({address:e}):{}}async getStakeAccounts(e,o=this.walletAddress){return o?(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(f=>this.utils.parseMarketCoinName(f)),s=a.filter(f=>this.constants.whitelist.spool.has(f)),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)]),m={};for(let f of n){let y=this.utils.parseMarketCoinName(f),h=s.includes(y);m[f]=Pa({coinName:f,symbol:this.utils.parseSymbol(f),coinType:this.utils.parseCoinType(f),marketCoinType:this.utils.parseMarketCoinType(f),coinDecimal:this.utils.getCoinDecimal(f)??0,coinPrice:c[f]??0,marketPool:i?.[f],spool:h?l[y]:void 0,stakeAccounts:h?b[y]??[]:[],coinAmount:d[f]??0,marketCoinAmount:u[y]??0,sCoinAmount:p[y]??0});}return m}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return e?L({source:ye(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)}):{}}async getObligationAccountsByIds(e,o){return L({source:ye(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return L({source:ye(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,r){let{market:n,coinPrices:a,coinAmounts:s}=o,[c,i,l]=await Promise.all([r?Promise.resolve(r.obligationQuery):this.queryObligation(e),this.getBorrowIncentivePools(void 0,{coinPrices:a,marketPools:n.pools}),r?Promise.resolve(r.borrowIncentiveAccounts):this.getBorrowIncentiveAccounts(e)]);return Ra({obligationId:typeof e=="string"?e:e.objectId,collateralCoinNames:Array.from(this.constants.whitelist.collateral),market:n,coinPrices:a,coinAmounts:s,obligationQuery:c,borrowIncentivePools:i,borrowIncentiveAccounts:l,utils:{parseCoinNameFromType:d=>this.utils.parseCoinNameFromType(d),parseCoinType:d=>this.utils.parseCoinType(d),parseSymbol:d=>this.utils.parseSymbol(d),getCoinDecimal:d=>this.utils.getCoinDecimal(d),parseSCoinTypeNameToMarketCoinName:d=>this.utils.parseSCoinTypeNameToMarketCoinName(d)}})}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=c.map(b=>b.id),[l,d,u]=await Promise.all([this.repos.obligation.getObligationObjects(i),this.repos.obligation.getObligationsData(i),this.repos.borrowIncentive.getBorrowIncentiveAccountsBatch({obligationIds:i,coinNames:[...this.constants.whitelist.lending]})]),p={};return await Promise.allSettled(c.map(async(b,m)=>{p[b.keyId]=await this.assembleObligationAccount(l[m]??b.id,{market:n,coinPrices:a,coinAmounts:s},{obligationQuery:d[b.id],borrowIncentiveAccounts:u[b.id]??{}});})),p}async assembleObligationAccountsByIds(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),[s,c]=await Promise.all([this.repos.obligation.getObligationsData(e),this.repos.borrowIncentive.getBorrowIncentiveAccountsBatch({obligationIds:e,coinNames:[...this.constants.whitelist.lending]})]),i=[];return await Promise.allSettled(e.map(async l=>{let d=await this.assembleObligationAccount(l,{market:n,coinPrices:a,coinAmounts:{}},{obligationQuery:s[l],borrowIncentiveAccounts:c[l]??{}});d&&i.push(d);})),i}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:ye(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 e?await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o}):[]}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return e?this.repos.referral.getVeScaKeyIdFromReferralBindings(e):null}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 o?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 A("fromAsset and toAsset must be different");if(!this.constants.whitelist.scoin.has(e))throw new A("fromAsset is not supported");if(!this.constants.whitelist.scoin.has(o))throw new A("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 A("Failed to fetch the lendings data");if(a.conversionRate===0||s.conversionRate===0)throw new A("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 A("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 Ia({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 A("apiAddressId is required");return this.repos.poolAddresses.getPoolAddresses({})}async getUserPortfolio(e){let o=e?.walletAddress??this.walletAddress;if(!o)throw new A("walletAddress is required");let 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 va({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)}},$a=Zt;var eo=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 $a({...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 Ue(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 Ot(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.map(u=>u.objectId),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.map(d=>d.objectId),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.map(d=>d.objectId),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)}},Bc=eo;
35
35
 
36
- exports.ScallopBuilder = Rc;
37
- exports.newScallopTxBlock = At;
36
+ exports.ScallopBuilder = Bc;
37
+ exports.newScallopTxBlock = Ot;