@scallop-io/sui-scallop-sdk 4.2.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -139
- package/dist/builder.cjs +5 -4
- package/dist/builder.d.cts +2 -2
- package/dist/builder.d.ts +2 -2
- package/dist/builder.js +2 -2
- package/dist/chunk-FNZDTB3A.js +16 -0
- package/dist/chunk-UCRLKWQI.js +11 -0
- package/dist/{chunk-4IC4UXW5.js → chunk-ZAFUZGSI.js} +2 -2
- package/dist/client.cjs +5 -4
- package/dist/client.d.cts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +3 -3
- package/dist/index.cjs +21 -20
- package/dist/index.d.cts +2 -5
- package/dist/index.d.ts +2 -5
- package/dist/index.js +4 -4
- package/dist/{query-CXvcpnYj.d.ts → query-b84awDFp.d.ts} +25 -7
- package/dist/query.cjs +5 -4
- package/dist/query.d.cts +1 -1
- package/dist/query.d.ts +1 -1
- package/dist/query.js +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +4 -2
- package/src/constants/queryKeys.ts +0 -12
- package/src/constants/testAddress.ts +2 -0
- package/src/datasources/api.ts +3 -3
- package/src/models/scallopAddress/const.ts +1 -0
- package/src/models/scallopAddress/index.ts +2 -2
- package/src/models/scallopAddress/types.ts +1 -0
- package/src/models/scallopQuery/index.ts +10 -0
- package/src/models/scallopUtils/index.ts +3 -3
- package/src/models/scallopUtils/types.ts +1 -1
- package/src/repositories/obligation/helpers.ts +59 -0
- package/src/repositories/obligation/index.ts +5 -0
- package/src/repositories/obligation/types.ts +17 -1
- package/src/repositories/obligation/utils.ts +22 -0
- package/src/repositories/price/helpers.ts +7 -2
- package/src/repositories/price/types.ts +2 -2
- package/src/repositories/wiring/metadata.ts +1 -0
- package/src/txBuilders/oracles/pyth.ts +1 -5
- package/dist/chunk-3T4T4AON.js +0 -15
- package/dist/chunk-6YLMI74S.js +0 -11
package/dist/query.cjs
CHANGED
|
@@ -2,18 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
var bignumber_js = require('bignumber.js');
|
|
4
4
|
var queryCore = require('@tanstack/query-core');
|
|
5
|
-
var
|
|
5
|
+
var kn = require('axios');
|
|
6
6
|
var suiKit = require('@scallop-io/sui-kit');
|
|
7
7
|
var bcs = require('@mysten/sui/bcs');
|
|
8
8
|
var zod = require('zod');
|
|
9
9
|
var utils = require('@mysten/sui/utils');
|
|
10
|
+
var sha3_js = require('@noble/hashes/sha3.js');
|
|
10
11
|
var pythSuiJs = require('@pythnetwork/pyth-sui-js');
|
|
11
12
|
var grpc = require('@mysten/sui/grpc');
|
|
12
13
|
|
|
13
14
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
15
|
|
|
15
|
-
var
|
|
16
|
+
var kn__default = /*#__PURE__*/_interopDefault(kn);
|
|
16
17
|
|
|
17
|
-
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 k=class extends z{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Ie=class extends z{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var O=class extends z{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var te=class extends z{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};var g={api:{getAddresses:t=>["api","getAddresses",t],getWhiteList:()=>["api","getWhiteList"],getPoolAddresses:()=>["api","getPoolAddresses"],getMarkets:()=>["api","getMarkets"],getSpools:()=>["api","getSpools"],getBorrowIncentivePools:()=>["api","getBorrowIncentivePools"],getTotalValueLocked:()=>["api","getTotalValueLocked"]},rpc:{getInspectTxn:t=>["rpc","getInspectTxn",t],getObject:t=>["rpc","getObject",t],getObjects:t=>["rpc","getObjects",t],getSharedObject:t=>["rpc","getSharedObject",t],getOwnedObjects:t=>["rpc","getOwnedObjects",t],getDynamicFields:t=>["rpc","getDynamicFields",t],getDynamicFieldObject:t=>["rpc","getDynamicFieldObject",t],getTotalVeScaTreasuryAmount:t=>["rpc","getTotalVeScaTreasuryAmount",{...t,refreshArgs:t?.refreshArgs?JSON.stringify(t?.refreshArgs):void 0,veScaAmountArgs:t?.veScaAmountArgs?JSON.stringify(t?.veScaAmountArgs):void 0}],getCoinBalance:t=>["rpc","getCoinBalance",t],getAllCoinBalances:t=>["rpc","getAllCoinBalances",t],getNormalizedMoveFunction:t=>["rpc","getNormalizedMoveCall",t]},oracle:{getPythLatestPriceFeeds:(t,e)=>["oracle","getPythPriceIds",e,t],getCoinPrices:t=>["oracle","getCoinPrices",t]}};var A=(t,e)=>{let o=e instanceof z?e.context:void 0;return t?.error(e.message,o),e},E=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()},wn=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),xn=new Set(["notExists","dynamicFieldNotFound","deleted"]),st=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&xn.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ne=async(t,e)=>{try{return await wn(t,e)}catch(o){if(st(o))return null;throw o}};var Ne="https://sui.apis.scallop.io",je="https://sdk.api.scallop.io";var ce=class{client;constructor({url:e,client:o,timeout:r=8e3}={}){this.client=o??An__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 ve=class extends ce{constructor({url:e=je,...o}){super({url:e,...o});}};var Be=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 On=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],Pn=new Set(On),Bt=new Map;var Tn=(t,e)=>{let o=Bt.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,Bt.set(t,o);},kn=(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"&&Pn.has(r)?(...l)=>{let i=Date.now();return e.execute(()=>(Tn(r,Date.now()-i),s(...l)))}:s}}),_e=class{client;url;constructor({client:e,url:o,tokensPerSecond:r}){this.client=kn(e,new Be(r)),this.url=o;}async getObject(e){let{objectId:o}=e,{objects:[r]}=await this.client.getObjects({objectIds:[o],signal:e.signal,include:e.include});if(r instanceof Error)throw r;return {object:r}}};var it=(t,e,o)=>new _e({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond}),_t=(t=je)=>new ve({url:t}),Ft=(t=Ne)=>new ce({url:t});var Dt=["supra","switchboard","pyth"];var Mt=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)}),Lt=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),Et=t=>{let e=t.address.getAddresses();if(!e)throw new te("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)}},Vt=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},qt=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")}}),Kt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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)}},Wt=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),Ut=t=>{let e=t.address.getAddresses();if(!e)throw new te("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))}}},Qt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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}}}},$t=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),zt=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")}}}),Yt=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),Gt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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}}}},Ht=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()}),Xt=t=>({addresses:{...Dt.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 le={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}};var Jt=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var Fe={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Zt=new queryCore.QueryClient(Fe);var R=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=Zt,logger:o=le,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=Jt(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function W(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 ue=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var Nn="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",Me=t=>typeof t=="object"&&t!==null,jn=t=>!Me(t)||t.$kind!=="Shared"||!("Shared"in t)||!Me(t.Shared)?false:"initialSharedVersion"in t.Shared;function vn(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var De=t=>{if(Array.isArray(t))return t.map(De);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return De(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=De(n);return o}return t},to=t=>{vn(t);let e=t.json,o="fields"in e?e.fields:e;return De(o)},eo=t=>jn(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Bn=(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,G=async({onchain:t,fetchWithCache:e},{tx:o,objectId:r,mutable:n=false,include:a})=>{let s;if(typeof r=="string"){let l=await e({queryKey:g.rpc.getSharedObject({objectId:r,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!l?.object)throw new Error("Failed to get object data");s=eo(l.object);}else "objectId"in r&&"owner"in r&&(s=eo(r));return Bn(o,{obj:s??r,mutable:n})},_n=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())]),Fn=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),Dn=zod.z.object({id:Fn,name:_n,value:zod.z.unknown().optional()}),oo=t=>t.type.startsWith(Nn),ro=t=>{let{success:e}=Dn.safeParse(t);return !!e},Mn=t=>typeof t=="string"?t:t.id,Ln=t=>{if(!ro(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},En=t=>{if(typeof t=="string")return t;if(!Me(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},Vn=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!Me(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=to(t);return oo(t)&&typeof e=="object"?Ln(e):e},no=t=>{if(!oo(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=to(t);if(ro(e)){let o=En(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:Mn(e.id),name:o,nameKind:Vn(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var H=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=>H(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return H(e.name)}throw new O(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},X=(t,e)=>{try{return H(t)}catch(o){throw new O(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var so=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:X(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:X(e.type,`market.collaterals[${o}].type`)}))}};var io="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",co="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",lo="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var ct=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)}),lt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new O(`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,l=e.borrowRateOnMidKink*n/e.borrowRateScale,i=e.maxBorrowRate*n/e.borrowRateScale,c=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),y=bignumber_js.BigNumber(p).dividedBy(e.borrowIndex).minus(1),f=bignumber_js.BigNumber(e.debtAmount).multipliedBy(y),b=f.plus(e.debtAmount),m=b.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(f.multipliedBy(e.reserveFactor)),S=h.shiftedBy(-r),w=bignumber_js.BigNumber(b).plus(Math.max(e.cashAmount-h.toNumber(),0)),T=w.shiftedBy(-r),B=bignumber_js.BigNumber(b).dividedBy(w);B=B.isFinite()?B:bignumber_js.BigNumber(0);let N=bignumber_js.BigNumber(c).multipliedBy(B).multipliedBy(1-e.reserveFactor);N=N.isFinite()?N:bignumber_js.BigNumber(0);let I=w.dividedBy(e.marketCoinSupplyAmount);return I=I.isFinite()&&!I.isNaN()?I:bignumber_js.BigNumber(1),{baseBorrowApr:a,baseBorrowApy:t.parseAprToApy(a),borrowAprOnHighKink:s,borrowApyOnHighKink:t.parseAprToApy(s),borrowAprOnMidKink:l,borrowApyOnMidKink:t.parseAprToApy(l),coinDecimal:r,maxBorrowApr:i,maxBorrowApy:t.parseAprToApy(i),borrowApr:Math.min(c,i),borrowApy:Math.min(t.parseAprToApy(c),t.parseAprToApy(i)),borrowIndex:p.toNumber(),growthInterest:y.toNumber(),supplyAmount:w.toNumber(),supplyCoin:T.toNumber(),borrowAmount:b.toNumber(),borrowCoin:m.toNumber(),reserveAmount:h.toNumber(),reserveCoin:S.toNumber(),utilizationRate:B.toNumber(),supplyApr:N.toNumber(),supplyApy:t.parseAprToApy(N.toNumber()),conversionRate:I.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},dt=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)}),ut=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new O(`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()}},po=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 pt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{indexer:n,metadata:a,fetchWithCache:s}=t,l="api/market/migrate",i=await s({queryFn:()=>n.get(l),queryKey:g.api.getMarkets()}),c={},d={},u=o?new Set(o):void 0,p=r?new Set(r):void 0,y=b=>{u&&!u.has(b.coinName)||(c[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});},f=b=>{p&&!p.has(b.coinName)||(d[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(y),Object.values(i.collaterals).filter(Boolean).forEach(f),{pools:c,collaterals:d}},mt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{onchain:n,addresses:a,fetchWithCache:s}=t,{queryPackageId:l,market:i}=a,c=new suiKit.SuiTxBlock,d=`${l}::market_query::market_data`,p=[await G({onchain:n,fetchWithCache:s},{tx:c,mutable:true,objectId:i})];c.moveCall(d,p);let y=await s({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:p.map(m=>typeof m=="object"&&"objectId"in m?m.objectId:m),typeArgs:[],node:n.url}),queryFn:()=>n.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction;if(!f.status.success)throw A(t.logger,new k(`On-chain market query transaction failed: ${f.status.error.message}`));let b=so(f?.events?.[0]?.json);return Kn(t,b,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},bo=async(t,{coinPrice:e,coinName:o})=>{let r=await pt(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw A(t.logger,new O(`Market pool for ${o} not found in indexer data`,{context:{coinName:o}}));return {pool:r.pools[o],collateral:r.collaterals[o]}},yo=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await ho(t,[o]))[o];if(!a)throw A(t.logger,new k(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await Qn(t,a),l=ct(s),i=lt(r,l),c=s.parsedOriginMarketCollateral?dt(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:l.highKink,midKink:l.midKink,reserveFactor:l.reserveFactor,borrowWeight:l.borrowWeight,borrowFee:l.borrowFee,marketCoinSupplyAmount:l.marketCoinSupplyAmount,minBorrowAmount:l.minBorrowAmount,...i},collateral:c?{...d(),coinWrappedType:r.getCoinWrappedType(o),coinPrice:e,collateralFactor:c.collateralFactor,liquidationFactor:c.liquidationFactor,liquidationDiscount:c.liquidationDiscount,liquidationPenalty:c.liquidationPenalty,liquidationReserveFactor:c.liquidationReserveFactor,...ut(r,c)}:void 0}},fo=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},go=async(t,{coinPrices:e})=>{let o=await mt(t,{coinPrices:e});return po(o)},Kn=async(t,e,{coinPrices:o,poolCoinNames:r,collateralCoinNames:n})=>{let{metadata:a}=t,s={},l={},i=r?new Set(r):void 0,c=n?new Set(n):void 0,d=new Set;for(let p of e?.pools??[]){let y=a.parseCoinNameFromType(p.type);a.whitelist.lending.has(y)&&(i&&!i.has(y)||d.add(y));}for(let p of e?.collaterals??[]){let y=a.parseCoinNameFromType(p.type);a.whitelist.collateral.has(y)&&(c&&!c.has(y)||d.add(y));}let u=await ho(t,[...d],Un);for(let p of e?.pools??[]){let y=p.type,f=a.parseCoinNameFromType(y),b=o[f]??0;if(!a.whitelist.lending.has(f)||i&&!i.has(f))continue;let{supplyLimit:m,borrowLimit:h,isIsolated:S}=mo(u[f]??{}),w=ct({...p,type:p.type,isIsolated:S,supplyLimit:m,borrowLimit:h}),T=lt(a,w);s[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),sCoinType:a.parseSCoinType(a.parseMarketCoinName(f))??"",coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...w,...T};}for(let p of e?.collaterals??[]){let y=p.type,f=a.parseCoinNameFromType(y),b=o[f]??0;if(!a.whitelist.collateral.has(f)||c&&!c.has(f))continue;let{isIsolated:m}=mo(u[f]??{}),h=dt({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:m}),S=ut(a,h);l[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...h,...S};}return {pools:s,collaterals:l}},Wn=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Un=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],mo=t=>({supplyLimit:t.supplyLimitKey?P(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?P(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?P(t.isolatedAssetKey):false}),Qn=async(t,{balanceSheet:e,borrowDynamic:o,collateralStat:r,interestModel:n,riskModel:a,borrowFeeKey:s,supplyLimitKey:l,borrowLimitKey:i,isolatedAssetKey:c})=>{if(!e||!o||!n)throw A(t.logger,new k("Missing required market objects"));let d=P(e),u=P(n),p=P(o),y=s?P(s):{value:"0"},f=l?P(l):"0",b=i?P(i):"0",m=a?P(a):void 0,h=r?P(r):void 0,S=t.metadata.parseCoinNameFromType(`0x${u.type}`),w=c?.json?P(c):await $n(t,S),T=m&&h?{type:u.type,collateralFactor:m.collateral_factor,liquidationFactor:m.liquidation_factor,liquidationPenalty:m.liquidation_penalty,liquidationDiscount:m.liquidation_discount,liquidationReserveFactor:m.liquidation_revenue_factor,maxCollateralAmount:m.max_collateral_amount,totalCollateralAmount:h.amount,isIsolated:w}:void 0;return {type:u.type,maxBorrowRate:u.max_borrow_rate,interestRate:p.interest_rate,interestRateScale:p.interest_rate_scale,borrowIndex:p.borrow_index,lastUpdated:p.last_updated,cash:d.cash,debt:d.debt,marketCoinSupply:d.market_coin_supply,reserve:d.revenue,reserveFactor:u.revenue_factor,borrowWeight:u.borrow_weight,borrowFeeRate:y,baseBorrowRatePerSec:u.base_borrow_rate_per_sec,borrowRateOnHighKink:u.borrow_rate_on_high_kink,borrowRateOnMidKink:u.borrow_rate_on_mid_kink,highKink:u.high_kink,midKink:u.mid_kink,minBorrowAmount:u.min_borrow_amount,supplyLimit:f,borrowLimit:b,isIsolated:w,parsedOriginMarketCollateral:T}},ho=async({onchain:t,metadata:e,fetchWithCache:o},r,n=Wn)=>{let a=[];for(let d of r){let u=e.poolAddresses[d];for(let p of n){let y=u?.[p];y&&a.push(y);}}let s=[],l=ue([...new Set(a)],50);for(let d of l){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),{}),c={};for(let d of r){let u=e.poolAddresses[d];c[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 c},Co=(t,e)=>wo(t,io,e),So=(t,e)=>wo(t,co,e),$n=async(t,e)=>{let o=await xo(t,lo,e);return o?.object?.json?P(o.object):false},wo=async(t,e,o)=>{let r=await xo(t,e,o);return r?.object?.json?P(r.object):"0"},xo=({onchain:t,addresses:e,metadata:o,fetchWithCache:r},n,a)=>{let s=o.parseCoinType(a).slice(2),l={type:n,value:s};return r({queryKey:g.rpc.getDynamicFieldObject({parentId:e.market,name:l,node:t.url}),queryFn:async()=>{try{let{dynamicField:i}=await t.client.getDynamicField({parentId:e.market,name:W(l)});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 Le=class extends R{indexer;addresses;onchain;constructor({indexer:e,addresses:o,onchain:r,...n}){super(n),this.indexer=e,this.addresses=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,addresses:this.addresses}}getMarkets({coinPrices:e,poolCoinNames:o,collateralCoinNames:r,source:n="api-first"}){let a={coinPrices:e,poolCoinNames:o,collateralCoinNames:r};return E({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>pt(this.context,a),onchain:()=>mt(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return E({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>bo(this.context,{coinPrice:e,coinName:o}),onchain:()=>yo(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return Co(this.context,e)}getPoolBorrowLimit(e){return So(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return E({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>fo(this.context),onchain:()=>go(this.context,{coinPrices:o})})}};var bt=async(t,{address:e,coinType:o})=>{let{onchain:r}=t;return (await r.client.getBalance({owner:e,coinType:o})).balance},Xn=(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()});},yt=async(t,e)=>{let{onchain:o,queryClient:r}=t,n=[],a=null,s=true;for(;s;){let i=await o.client.listBalances({owner:e,cursor:a,limit:50});n.push(...i.balances??[]),s=i.hasNextPage,a=i.cursor;}return n.length?n.reduce((i,c)=>{if(c.balance!=="0"){let d=utils.normalizeStructTag(c.coinType);i[d]=c,Xn(r,{balance:c,coinType:d,address:e,node:o.url});}return i},{}):{}},Ao=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,coinNames:l=[...n.whitelist.lending.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},Oo=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,coinName:s}=e,l=n.parseCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},Po=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,sCoinNames:l=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseSCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},To=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,sCoinName:s}=e,l=n.parseSCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},ko=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,marketCoinNames:l=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseMarketCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},Ro=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,marketCoinName:s}=e,l=n.parseMarketCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},Io=async(t,e)=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,{getCoinDecimal:a,parseSCoinType:s,parseUnderlyingSCoinType:l,parseCoinName:i,addresses:{scoin:c}}=r,d=`${c.id}::s_coin_converter::total_supply`,u=c.coins[e]?.treasury;if(!u)throw A(t.logger,new O(`Treasury address not found for sCoin: ${e}`,{context:{sCoinName:e}}));let p=new suiKit.SuiTxBlock,y=await n({queryKey:g.rpc.getSharedObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!y.object)throw A(t.logger,new k(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let f=[await G({onchain:o,fetchWithCache:n},{tx:p,objectId:y.object})],b=[s(e),l(e)].filter(w=>!!w);p.moveCall(d,f,b);let m={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:f,typeArgs:b,node:o.url,...m}),queryFn:()=>o.client.simulateTransaction({...m,transaction:p.txBlock})}),S=h?.commandResults;if(!S)throw A(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 w=S[0].returnValues[0].bcs,T=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(w)).shiftedBy(-T).toNumber()}return 0};var Ee=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain,queryClient:this.queryClient}}getCoinAmounts(e){return Ao(this.context,e)}getCoinAmount(e){return Oo(this.context,e)}getSCoinAmounts(e){return Po(this.context,e)}getSCoinAmount(e){return To(this.context,e)}getSCoinTotalSupply(e){return Io(this.context,e)}getMarketCoinAmounts(e){return ko(this.context,e)}getMarketCoinAmount(e){return Ro(this.context,e)}};var No="0x00481a93b819d744a7d79ecdc6c62c74f2f7cb4779316c4df640415817ac61bb";var ea=async(t,{assetTypeMap:e})=>{let{onchain:o,fetchWithCache:r}=t,n=null,a=false,s=[];do{let c={parentId:No,limit:50,cursor:n},d=await r({queryKey:g.rpc.getDynamicFields(c),queryFn:()=>o.client.listDynamicFields(c)});if(!d)break;let u=d.dynamicFields.filter(p=>{let y=`0x${bcs.bcs.string().parse(p.name.bcs)}`;return !!e[y]}).map(p=>p.fieldId);s.push(...u),a=d.hasNextPage,n=d.cursor;}while(a);if(s.length===0)return [];let l={json:true},{objects:i}=await r({queryKey:g.rpc.getObjects({node:o.url,objectIds:s}),queryFn:()=>o.client.getObjects({objectIds:s,include:l})});return i},jo=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 ea(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,l)=>{if(l){let{name:i}=no(l),c=`0x${i}`,d=n[c];if(!d)return s;let u=+P(l);s[d]=u/1e4;}return s},{})};var Ve=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getFlashloanFees(e){return jo(this.context,{assetNames:e})}};var vo=t=>{let o=P(t).ownership?.of;if(!o)throw new O(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var Bo=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:X(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:X(e.type,`obligation.debts[${o}].type`)}))}};var oa=async(t,{address:e})=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,a=`${r.addresses.protocolObjectId}::obligation::ObligationKey`,s=[],l=false,i=null;do{let c={owner:e,type:a,include:{json:true},limit:50,cursor:i},d=await n({queryKey:g.rpc.getOwnedObjects(c),queryFn:()=>o.client.listOwnedObjects(c)});s.push(...d.objects),d.hasNextPage&&d.cursor?(l=true,i=d.cursor):l=false;}while(l);return s},_o=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{queryPackageId:a,version:s,market:l}=n.addresses,i=`${a}::obligation_query::obligation_data`,c=new suiKit.SuiTxBlock,d=m=>({objectId:m,include:{json:false,content:false}}),u=async m=>{let h=await r({queryKey:g.rpc.getObject({...d(m),node:o.url}),queryFn:()=>o.getObject(d(m))});if(!h.object)throw A(t.logger,new k(`Failed to fetch object ${m}`,{context:{objectId:m}}));return G({onchain:o,fetchWithCache:r},{tx:c,mutable:false,objectId:h.object})},p=await Promise.all([u(s),u(l),u(e)]);c.moveCall(i,[...p,c.txBlock.object.clock()]);let y=[s,l,e],f=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:y,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),b=f.Transaction??f.FailedTransaction;if(!b.status.success)throw A(t.logger,new k(`Failed to query obligation data for obligationId ${e}: ${b.status.error.message}`,{context:{obligationId:e}}));return Bo(b?.events?.[0]?.json)},Fo=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},Do=async(t,{address:e})=>{let o=await oa(t,{address:e}),r=o.map(vo),n=await ft(t,r);return o.map((a,s)=>{let l=n[s],i=l?P(l):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)};var qe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return Do(this.context,{address:e})}getObligationData(e){return _o(this.context,e)}getObligationLocked(e){return Fo(this.context,e)}getObligationObjects(e){return ft(this.context,e)}};var ra=t=>({pointType:H(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)}),Mo=(t,e)=>({poolType:H(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=ra(r),a=t(n.pointType);return o[a]=n,o},{})}),Lo=(t,e,o,r,n)=>{let s=bignumber_js.BigNumber(t.distributedPointPerPeriod).dividedBy(t.period),l=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),i=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(l).multipliedBy(t.distributedPointPerPeriod),bignumber_js.BigNumber(t.points)),c=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),y=p.shiftedBy(-1*n),f=y.multipliedBy(r),b=365*24*60*60,m=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(m).multipliedBy(b).multipliedBy(e),S=bignumber_js.BigNumber(1e12),w=bignumber_js.BigNumber(t.baseWeight).dividedBy(S),T=h.multipliedBy(w).dividedBy(f).isFinite()&&t.points>0?h.multipliedBy(w).dividedBy(f).toNumber():1/0;return {distributedPointPerSec:s.toNumber(),accumulatedPoints:i.toNumber(),currentPointIndex:c.toNumber(),currentTotalDistributedPoint:d.toNumber(),baseWeight:u.toNumber(),weightedStakedAmount:p.toNumber(),weightedStakedCoin:y.toNumber(),weightedStakedValue:f.toNumber(),rewardApr:T,rewardPerSec:m.toNumber()}},na=t=>({pointType:H(t.point_type),weightedAmount:Number(t.weighted_amount),points:Number(t.points),totalPoints:Number(t.total_points),index:Number(t.index)}),Eo=(t,e)=>({poolType:H(e.pool_type),debtAmount:Number(e.debt_amount),pointList:e.points_list.reduce((o,r)=>{let n=na(r),a=t(n.pointType);return o[a]=n,o},{})}),Vo=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:X(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:X(r.point_type,`borrowIncentive.incentive_pools[${o}].points[${n}].point_type`)}))}))}},qo=t=>{if(t)return {...t,pool_records:(t.pool_records??[]).map((e,o)=>({...e,pool_type:X(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:X(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var aa=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),sa=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),Ko=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:sa,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(aa)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var Uo=async(t,{coinNames:e,coinPrices:o})=>{let{onchain:r,metadata:n,fetchWithCache:a}=t,{borrowIncentive:s}=n.addresses,l=new suiKit.SuiTxBlock,i=`${s.query}::incentive_pools_query::incentive_pools_data`,c={objectId:s.incentivePools},d=await a({queryKey:g.rpc.getSharedObject({...c,node:r.url}),queryFn:()=>r.getObject(c)});if(!d.object)throw A(t.logger,new k(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await G({onchain:r,fetchWithCache:a},{tx:l,mutable:true,objectId:d.object})];l.moveCall(i,p,[]);let y=await a({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentivePools],node:r.url}),queryFn:()=>r.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction,b=Vo(f?.events?.[0]?.json),m=e??[...n.whitelist.lending.values()],h={};for(let S of b?.incentive_pools??[]){let w={},T=Mo(n.parseCoinNameFromType,S),B=S.pool_type,N=n.parseCoinNameFromType(B),I=o[N]??0,x=n.getCoinDecimal(N);if(x===void 0)throw A(t.logger,new O(`Coin decimal not found for ${N}`,{context:{poolCoinName:N}}));if(!m.includes(N))continue;for(let[q,Q]of Object.entries(T.poolPoints)){if(!Q)continue;let ie=Q.pointType,Z=n.parseCoinNameFromType(ie),re=n.getCoinDecimal(Z);if(re===void 0)throw A(t.logger,new O(`Coin decimal not found for ${Z}`,{context:{poolCoinName:Z}}));let M=o[Z]??0,fe=n.parseSymbol(Z),K=Lo(Q,M,re,I,x),Y=Q.points<=K.accumulatedPoints;Q.points>K.accumulatedPoints&&(w[q]={symbol:fe,coinName:Z,coinType:ie,coinDecimal:re,coinPrice:M,points:Q.points,distributedPoint:Q.distributedPoint,weightedAmount:Q.weightedAmount,...K,...Y?{rewardApr:0}:{}});}let v=bignumber_js.BigNumber(T.staked),j=v.shiftedBy(-x),F=j.multipliedBy(I);h[N]={coinName:N,symbol:n.parseSymbol(N),coinType:B,coinDecimal:x,coinPrice:I,stakedAmount:v.toNumber(),stakedCoin:j.toNumber(),stakedValue:F.toNumber(),points:w};}return h},Qo=async(t,{coinNames:e,obligationId:o})=>{let{metadata:r,fetchWithCache:n,onchain:a}=t,{borrowIncentive:s}=r.addresses,l=new suiKit.SuiTxBlock,i=`${s.query}::incentive_account_query::incentive_account_data`,c=async(h,S)=>{let w=await n({queryKey:g.rpc.getSharedObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!w.object)throw A(t.logger,new k(`Failed to fetch object ${h}`,{context:{objectId:h}}));return G({onchain:a,fetchWithCache:n},{tx:l,mutable:S,objectId:w.object})},[d,u]=await Promise.all([c(s.incentiveAccounts,true),c(o,true)]),p=[d,u];l.moveCall(i,p,[]);let y=await n({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentiveAccounts,o],node:a.url}),queryFn:()=>a.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction,b=qo(f?.events?.[0]?.json),m=e??[...r.whitelist.lending.values()];return b?b.pool_records.reduce((h,S)=>{let w=Eo(r.parseCoinNameFromType,S),T=w.poolType,B=r.parseCoinNameFromType(T);return m.includes(B)&&(h[B]=w),h},{}):{}},$o=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,core:s}=n,l={objectId:a.incentiveAccounts,include:{json:true}},i=await r({queryKey:g.rpc.getObject(l),queryFn:()=>o.getObject(l)});if(!i.object)throw A(t.logger,new k(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let c=P(i.object).accounts.id,d=await ne(t,{parentId:c,name:W({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?Ko.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},zo=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,vesca:s}=n,l={objectId:a.incentivePools,include:{json:true}},i=await r({queryKey:g.rpc.getObject(l),queryFn:()=>o.getObject(l)});if(!i.object)throw A(t.logger,new k(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let c=P(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ne(t,{parentId:c,name:W({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var Ke=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return Uo(this.context,e)}getBorrowIncentiveAccounts(e){return Qo(this.context,e)}getBindedVeScaKey(e){return $o(this.context,e)}getBindedObligation(e){return zo(this.context,e)}};var Yo="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var Ho=bcs.bcs.bool(),Xo=bcs.bcs.string();var la=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,n=false,a=null,s=i=>i.name.type===Yo,l=[];do{let i={parentId:r.market,cursor:a,limit:50,include:{value:true}},{dynamicFields:c,hasNextPage:d,cursor:u}=await o({queryKey:g.rpc.getDynamicFields({...i,node:e.url}),queryFn:()=>e.client.listDynamicFields(i)}),p=c.filter(y=>s(y)?Ho.parse(y.valueType.bcs):false).map(y=>`0x${Xo.parse(y.name.bcs)}`);l.push(...p),a=u,n=d;}while(n);return l},Jo=async t=>la(t),Zo=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 We=class extends R{onchain;constructor(e){let{onchain:o,...r}=e;super(r),this.onchain=o;}get context(){return {...this.baseContext,onchain:this.onchain}}getIsolatedAssets({source:e}){return E({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>Zo(this.context),onchain:()=>Jo(this.context)})}};var er=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var pa=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=`${n.veSca.object}::ve_sca::VeScaKey`,s=[],l=false,i=null;do{let c={owner:e,type:a,include:{json:true},cursor:i,limit:50},d=await r({queryKey:g.rpc.getOwnedObjects({...c,node:o.url}),queryFn:()=>o.client.listOwnedObjects(c)});s.push(...d.objects),d.hasNextPage&&d.cursor?(l=true,i=d.cursor):l=false;}while(l);return s},ma=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,{id:n,config:a,treasury:s}=r.veSca,l=new suiKit.SuiTxBlock,i=async(S,w)=>{let T=await o({queryKey:g.rpc.getSharedObject({node:e.url,objectId:S}),queryFn:()=>e.getObject({objectId:S})});if(!T.object)throw A(t.logger,new k(`Failed to fetch object ${S}`,{context:{objectId:S}}));return G({onchain:e,fetchWithCache:o},{tx:l,mutable:w,objectId:T.object})},[c,d]=await Promise.all([i(s,true),i(a,false)]),u=`${n}::treasury::refresh`,p=[d,c,l.txBlock.object.clock()],y=`${n}::treasury::total_ve_sca_amount`,f=[c,l.txBlock.object.clock()];l.moveCall(u,p),l.moveCall(y,f);let m=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:f,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:l.txBlock,include:{commandResults:true}})}))?.commandResults;if(!m)throw A(t.logger,new k("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=m[1]?.returnValues?.[0].bcs;if(!h)throw A(t.logger,new k("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},he=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:W({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 l=s.value.bcs,i=er.parse(l),c=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(c/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()}},tr=async(t,{address:e,excludeEmpty:o})=>{let r=await pa(t,e),n=(await Promise.all(r.map(a=>he(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},or=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:W(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(st(i))return null;throw i}}});if(!s?.object)return false;let l=P(s.object);return Array.isArray(l?.contents)&&l.contents.length>0},rr=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),l=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await ma(t)).shiftedBy(-9).toNumber(),c=l>0?i/l*4:0;return {totalLockedSca:l,totalVeSca:i,averageLockingPeriod:c,averageLockingPeriodUnit:"year"}};var Qe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return he(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return tr(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return rr(this.context)}isVeScaKeyInSubsTable(e,o){return or(this.context,{veScaKey:e,tableId:o})}};var nr=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 ar=bcs.bcs.u64();var ga=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 k("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},ha=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={parentId:o,name:W({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(ar.parse(s.bcs)).shiftedBy(-9).toNumber()},sr=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await ga(t,r),{data:a,success:s}=nr.safeParse(n.json);return s?{pendingReward:e?await ha(t,{veScaKey:e,tableId:a.userRewardTableId}).catch(()=>0):0,totalPoolReward:a.totalPoolReward,isClaimEnabled:a.isClaimEnabled}:{pendingReward:0,totalPoolReward:0,isClaimEnabled:false}};var $e=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return sr(this.context,e)}};var ht=t=>t.startsWith("0x")?t:`0x${t}`;var Ca=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Sa=t=>bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(t)}),ir=Sa(Ca);var wa=3,cr=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{addresses:a,parseCoinNameFromType:s}=n,l=50,i={[`${a.pyth.object}::rule::Rule`]:"pyth",[`${a.supra.object}::rule::Rule`]:"supra",[`${a.switchboard.object}::rule::Rule`]:"switchboard"},c=null,d=true,u={};do{let p={parentId:e,cursor:c,limit:l,include:{value:true}},{dynamicFields:y,cursor:f,hasNextPage:b}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});c=f,d=b,y.forEach(m=>{let h=ht(bcs.bcs.string().parse(m.name.bcs)),S=s(h),w=ir.parse(m.value.bcs);u[S]||(u[S]=[]),w.contents.forEach(({name:T})=>{let B=i[ht(T)];B&&u[S].push(B);});});}while(d);return u},lr=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([cr(t,e.oracles.primaryPriceUpdatePolicyVecsetId),cr(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},dr=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([ne(t,{parentId:e.oracles.primaryPriceUpdatePolicyObject,name:{type:o,bcs:r}}),ne(t,{parentId:e.oracles.secondaryPriceUpdatePolicyObject,name:{type:o,bcs:r}})]);return {primary:n,secondary:a}},ur=async(t,e)=>{let{addresses:o,parseCoinType:r,getSwitchboardAggAddress:n}=t.metadata,a=o.oracles.switchboardRegistryTableId,s=[],l=e.map((i,c)=>{let d=n(i);return d||(s.push({idx:c,coinName:i}),null)});if(s.length===0)return l;if(s.length>wa){let i=new Map;for(let d of s){let u=r(d.coinName);if(!u)throw A(t.logger,new O(`Invalid coin name: ${d.coinName}`,{context:{coinName:d.coinName}}));i.set(u.slice(2),d);}let c=await Aa(t,a,i);for(let[d,{idx:u}]of i){let p=c[d];if(!p)throw A(t.logger,new k(`No on-demand aggregator found for 0x${d}`,{context:{coinTypeKey:d}}));l[u]=p;}return l}return await Promise.all(s.map(async({idx:i,coinName:c})=>{let d=r(c);if(!d)throw A(t.logger,new O(`Invalid coin name: ${c}`,{context:{coinName:c}}));let u=await ne(t,{parentId:a,name:W({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw A(t.logger,new k(`No on-demand aggregator found for ${d}`,{context:{coinType:d}}));l[i]=bcs.bcs.Address.parse(u.dynamicField.value.bcs);})),l},xa=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}}},Aa=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,l=false;do{let i={parentId:e,cursor:s,limit:50,include:{value:true}},c=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});for(let d of c.dynamicFields){let u=xa(d);if(!u||!o.has(u))continue;let p=d.value?.bcs;p&&(a[u]=bcs.bcs.Address.parse(p));}s=c.cursor,l=c.hasNextPage&&Object.keys(a).length<o.size;}while(l);return a};var Ye=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getAssetOracles(){return lr(this.context)}getPriceUpdatePolicies(){return dr(this.context)}getOnDemandAggObjectIds(e){return ur(this.context,e)}};var pr=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)}),mr=(t={})=>{let{spool:e,spoolReward:o}=t;if(!e||!o)throw new O("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}},br=(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),l=t.createdAt,i=s.plus(t.lastUpdate).integerValue().toNumber(),c=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(c).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),y=bignumber_js.BigNumber(t.distributedPoint).plus(u),f=bignumber_js.BigNumber(t.staked),b=f.shiftedBy(-o),m=b.multipliedBy(e);return {distributedPointPerSec:n.toNumber(),accumulatedPoints:u.toNumber(),currentPointIndex:p.toNumber(),currentTotalDistributedPoint:y.toNumber(),startDate:new Date(l*1e3),endDate:new Date(i*1e3),stakedAmount:f.toNumber(),stakedCoin:b.toNumber(),stakedValue:m.toNumber()}},yr=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)}),fr=(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),l=s.shiftedBy(-n),i=l.multipliedBy(r),c=bignumber_js.BigNumber(e.rewards),d=c.shiftedBy(-n),u=d.multipliedBy(r),p=bignumber_js.BigNumber(e.claimedRewards),y=p.shiftedBy(-n),f=y.multipliedBy(r),b=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),m=b.dividedBy(o.stakedValue).isFinite()?b.dividedBy(o.stakedValue).toNumber():1/0;return (t.maxPoint<=t.distributedPoint||t.pointPerPeriod===0)&&(m=1/0),{rewardApr:m,totalRewardAmount:s.toNumber(),totalRewardCoin:l.toNumber(),totalRewardValue:i.toNumber(),remaindRewardAmount:c.toNumber(),remaindRewardCoin:d.toNumber(),remaindRewardValue:u.toNumber(),claimedRewardAmount:p.toNumber(),claimedRewardCoin:y.toNumber(),claimedRewardValue:f.toNumber(),rewardPerSec:a.toNumber()}},gr=t=>({...t,stakeType:Ta(t.stakeType)}),Ta=t=>{try{return H(t)}catch(e){throw new O("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Ct=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")}),l=o?new Set(o):a.whitelist.spool,i=a.getSpoolRewardCoinName();return s.reduce((c,d)=>{if(!l.has(d.marketCoinName))return c;let u=a.parseCoinName(d.marketCoinName);return c[d.marketCoinName]={...d,coinPrice:e[u]??d.coinPrice,marketCoinPrice:e[d.marketCoinName]??d.marketCoinPrice,rewardCoinPrice:e[i]??d.rewardCoinPrice},c},{})},hr=async(t,{coinPrices:e,stakeCoinName:o})=>(await Ct(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,Cr=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 wr(t,a);return (await Promise.allSettled(n.map((i,c)=>St(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[c]]})))).reduce((i,c,d)=>(c.status==="fulfilled"&&c.value&&(i[n[d]]=c.value),i),{})},St=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),l=gr(mr(r??(await wr(t,[a]))[a])),i=pr(l),c=e[o]??0,d=br(i,c,n.getCoinDecimal(o)),u=yr(l),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:c,rewardCoinPrice:p,maxPoint:i.maxPoint,distributedPoint:i.distributedPoint,maxStake:i.maxStake,...d,exchangeRateNumerator:u.exchangeRateNumerator,exchangeRateDenominator:u.exchangeRateDenominator,...fr(i,u,d,p,n.getCoinDecimal(s))}},Sr=async(t,{address:e,stakeCoinNames:o})=>{let{metadata:r}=t,n=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount`,a=await ka(t,{address:e,stakeAccountType:n}),s=(o??[...r.whitelist.spool.values()]).reduce((c,d)=>(c[d]=[],c),{}),l=Object.keys(s).reduce((c,d)=>{let u=r.parseCoinName(d),p=r.parseMarketCoinType(u);return c[d]=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount<${p}>`,c},{}),i=Object.entries(l).reduce((c,[d,u])=>(c[u]=d,c),{});for(let c of a){let{objectId:d,type:u,json:p}=c;if(!d||!u||!p)continue;let y=P(c),f=utils.normalizeStructTag(u),b=i[f],m=s[b];m&&m.push({id:d,type:f,stakePoolId:String(y.spool_id),stakeType:utils.normalizeStructTag(String(y.stake_type)),staked:Number(y.stakes),index:Number(y.index),points:Number(y.points),totalPoints:Number(y.total_points)});}return s},wt=async(t,{stakeCoinNames:e})=>(await Promise.allSettled(e.map(r=>Ra(t,{stakeCoinName:r})))).reduce((r,n,a)=>(n.status==="fulfilled"&&(r[e[a]]=n.value),r),{}),ka=async(t,{address:e,stakeAccountType:o})=>{let{onchain:r,fetchWithCache:n}=t,a=false,s=null,l=[];do{let i={owner:e,type:o,include:{json:true},cursor:s,limit:50},c=await n({queryKey:g.rpc.getOwnedObjects(i),queryFn:()=>r.client.listOwnedObjects(i)});c.objects&&l.push(...c.objects),c.hasNextPage&&c.cursor?(a=true,s=c.cursor):a=false;}while(a);return l},wr=async({onchain:t,metadata:e,fetchWithCache:o},r)=>{let n=["spool","spoolReward","sCoinTreasury"],a=r.flatMap(c=>{let d=e.poolAddresses[c];return n.flatMap(u=>{let p=d?.[u];return p?[p]:[]})}),s=[],l=ue([...new Set(a)],50);for(let c of l){let d=await o({queryKey:g.rpc.getObjects({objectIds:c,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:c,include:{json:true}})});s.push(...d.objects.filter(u=>!(u instanceof Error)));}let i=s.reduce((c,d)=>(c[d.objectId]=d,c),{});return r.reduce((c,d)=>{let u=e.poolAddresses[d];return c[d]={spool:i[u?.spool??""],spoolReward:i[u?.spoolReward??""]},c},{})},Ra=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 c=P(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),stakePoolId:String(c.spool_id),ratioNumerator:Number(c.exchange_rate_numerator),ratioDenominator:Number(c.exchange_rate_denominator),rewards:Number(c.rewards),claimedRewards:Number(c.claimed_rewards)}},xr=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 c=P(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),maxPoint:Number(c.max_distributed_point),distributedPoint:Number(c.distributed_point),pointPerPeriod:Number(c.distributed_point_per_period),period:Number(c.point_distribution_time),maxStake:Number(c.max_stakes),stakeType:utils.normalizeStructTag(String(c.stake_type)),totalStaked:Number(c.stakes),index:Number(c.index),createdAt:Number(c.created_at),lastUpdate:Number(c.last_update)}};var Ge=class extends R{indexer;onchain;constructor({indexer:e,onchain:o,...r}){super(r),this.indexer=e,this.onchain=o;}get context(){return {...this.baseContext,indexer:this.indexer,onchain:this.onchain}}getSpools({stakeCoinNames:e,coinPrices:o,source:r="api-first"}){return E({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Ct(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>Cr(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return E({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>hr(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>St(this.context,{stakeCoinName:e,coinPrices:o})})}getStakeAccounts(e){return Sr(this.context,e)}async getStakeAccountsByPool(e,o){return (await this.getStakeAccounts({address:e,stakeCoinNames:[o]}))[o]||[]}getSpoolRewardPools(e){return wt(this.context,{stakeCoinNames:e})}getSpoolRewardPool(e){return wt(this.context,{stakeCoinNames:[e]}).then(o=>o[e])}getStakePool(e){return xr(this.context,e)}};var Ar=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 Or=bcs.bcs.u64();var ja=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,{veScaRewardTableId:a}=r.veScaLoyaltyProgram,s={parentId:a,name:W({type:"0x2::object::ID",value:e})},{dynamicField:{value:l}}=await n({queryKey:g.rpc.getDynamicFieldObject({...s,node:o.url}),queryFn:()=>o.client.getDynamicField(s)});return bignumber_js.BigNumber(Or.parse(l.bcs)).shiftedBy(-9).toNumber()},va=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 k("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Pr=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await va(t,r),{data:a,success:s}=Ar.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let l=await he(t,a.reserveVeScaKey),i=e?await ja(t,e).catch(()=>0):0,c=Math.max((l?.unlockAt??0)-Date.now(),0);return {pendingScaReward:i,pendingVeScaReward:i*(Math.floor(c/1e3)/126144e3),totalPoolReward:l?.currentVeScaBalance??0,isClaimEnabled:a.isClaimEnabled}};var He=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return Pr(this.context,e)}};var Tr=bcs.bcs.Address;var kr=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:W({type:"address",value:e})},n=await ne(t,r);return n?Tr.parse(n.dynamicField.value.bcs):null};var Xe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return kr(this.context,e)}};var oe=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()}),Rr=zod.z.object({id:zod.z.string(),size:zod.z.string()}),Ir=zod.z.object({asset_active_states:zod.z.object({base:oe,collateral:oe}),borrow_dynamics:oe,collateral_stats:oe,id:zod.z.string(),interest_models:oe,limiters:oe,reward_factors:oe,risk_models:oe,vault:zod.z.object({balance_sheets:oe,flash_loan_fees:oe,id:zod.z.string(),market_coin_supplies:Rr,underlying_balances:Rr})});var ge="0x1::type_name::TypeName",Nr="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",jr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",vr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",Br="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var _r=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,[l,i])=>(o.has(l)&&(s[l]=i),s),{})},_a=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}},se=async(t,{parentId:e,type:o,coinTypeKeys:r})=>{let{onchain:n,fetchWithCache:a}=t,s={},l=null,i=false;do{let c={parentId:e,cursor:l,limit:50},d=await a({queryKey:g.rpc.getDynamicFields({...c,node:n.url}),queryFn:()=>n.client.listDynamicFields(c)});for(let u of d.dynamicFields){if(u.name.type!==o)continue;let p=_a(u);p&&r.has(p)&&(s[p]=u.fieldId);}l=d.cursor,i=d.hasNextPage;}while(i);return s},Fa=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 ue(n,50)){let{objects:l}=await r({queryKey:g.rpc.getObjects({objectIds:s,node:o.url}),queryFn:()=>o.client.getObjects({objectIds:s,include:{json:true}})});for(let i of l)i instanceof Error||(a[i.objectId]=i);}return Object.entries(e).reduce((s,[l,i])=>(s[l]=Object.entries(i).reduce((c,[d,u])=>{let p=a[u];return c[d]=p?{objectId:p.objectId,json:p.json}:void 0,c},{}),s),{})},Da=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,l=false;do{let i={parentId:o,limit:50,cursor:s},c=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});if(!c)break;for(let d of c.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=c.cursor,l=c.hasNextPage;}while(l);return a},Fr=async(t,{poolNames:e=[]})=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{core:a,spool:s,scoin:l}=n,{market:i,coins:c}=a,d={objectId:i,include:{json:true}},{object:u}=await r({queryKey:g.rpc.getObject({...d,node:o.url}),queryFn:()=>o.getObject(d)}),p=Ir.safeParse(u?.json);if(!p.success)throw A(t.logger,new O("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let y=p.data,f=y.vault.balance_sheets.table.id,b=y.collateral_stats.table.id,m=y.borrow_dynamics.table.id,h=y.interest_models.table.id,S=y.risk_models.table.id,w=y.vault.flash_loan_fees.table.id,T=new Set(e),B=Object.entries(c).filter(K=>{let[Y,be]=K;return be?.coinType?T.size===0||T.has(Y):false});if(B.length===0)throw A(t.logger,new k("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let N=await Da(t,new Set(B.map(([,K])=>K.coinType)),w),I=new Set(B.map(([,K])=>K.coinType.slice(2))),[x,v,j,F,q,Q,ie,Z,re]=await Promise.all([se(t,{parentId:f,type:ge,coinTypeKeys:I}),se(t,{parentId:b,type:ge,coinTypeKeys:I}),se(t,{parentId:m,type:ge,coinTypeKeys:I}),se(t,{parentId:h,type:ge,coinTypeKeys:I}),se(t,{parentId:S,type:ge,coinTypeKeys:I}),se(t,{parentId:i,type:Nr,coinTypeKeys:I}),se(t,{parentId:i,type:jr,coinTypeKeys:I}),se(t,{parentId:i,type:vr,coinTypeKeys:I}),se(t,{parentId:i,type:Br,coinTypeKeys:I})]),M=await Fa(t,{lendingPool:x,collateralPool:v,borrowDynamic:j,interestModel:F,riskModel:q,borrowFee:Q,supplyLimit:ie,borrowLimit:Z,isolatedAsset:re}),fe={};for(let[K,Y]of B){let{coinType:be}=Y,ee=be.slice(2),at=M.lendingPool[ee],bn=M.collateralPool[ee],yn=M.borrowDynamic[ee],fn=M.interestModel[ee],gn=M.riskModel[ee],hn=M.borrowFee[ee],Cn=M.supplyLimit[ee],Sn=M.borrowLimit[ee],Nt=M.isolatedAsset[ee]?.json,ke=`s${K}`,jt=s.pools[ke],Re=l.coins[ke],vt=Y.oracle?.pyth;fe[K]={coinName:K,symbol:Y.symbol,coinType:be,coinMetadataId:Y.metaData,decimals:Y.decimals,lendingPoolAddress:at?.objectId??"",collateralPoolAddress:bn?.objectId??"",borrowDynamic:yn?.objectId??"",interestModel:fn?.objectId??"",riskModel:gn?.objectId,borrowFeeKey:hn?.objectId??"",supplyLimitKey:Cn?.objectId??"",borrowLimitKey:Sn?.objectId??"",isolatedAssetKey:Nt?.id??"",isIsolated:Nt?.value??false,spool:jt?.id??"",spoolReward:jt?.rewardPoolId??"",spoolName:ke,sCoinName:ke,sCoinType:Re?.coinType??"",sCoinTreasury:Re?.treasury??"",sCoinMetadataId:Re?.metaData??"",sCoinSymbol:Re?.symbol??"",pythFeed:vt?.feed??"",pythFeedObjectId:vt?.feedObject??"",flashloanFeeObject:N[be]??""};}return fe};var Je=class extends R{api;onchain;constructor({api:e,onchain:o,...r}){super(r),this.api=e,this.onchain=o;}get context(){return {...this.baseContext,api:this.api,onchain:this.onchain}}getPoolAddresses({poolNames:e,source:o="api"}){return E({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>_r(this.context,{poolNames:e}),onchain:()=>Fr(this.context,{poolNames:e})})}};var Dr="https://hermes.pyth.network";var Mr=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 Er=({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 Vr=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a}}=t,s=new Map(e.map(d=>[d,r.coins[d]?.oracle?.pyth?.feed])),l=Array.from(new Set(s.values())).filter(d=>!!d),c=await new pythSuiJs.SuiPriceServiceConnection(n,a).getLatestPriceFeeds(l);if(!c)throw A(t.logger,new Ie("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:l}}));return await o({queryKey:g.oracle.getPythLatestPriceFeeds(n,l),queryFn:()=>{let d=new Map;for(let p of c)d.set(p.id,p.getPriceUnchecked().getPriceAsNumberUnchecked());let u={};for(let[p,y]of s)u[p]=(y!==void 0?d.get(y):void 0)??0;return u}})},qr=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},Kr=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))},Wr=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=new Map(e.map(c=>[c,n.coins[c]?.oracle?.pyth?.feedObject])),s=Array.from(new Set(a.values())).filter(c=>!!c),l=new Map;for(let c of ue(s,50)){let d={objectIds:c,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 k("Failed to fetch price feed object on chain",{cause:p}));let{data:y,success:f}=Mr.safeParse(p.json);if(!f)throw A(t.logger,new O("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:b}=y.price_info;l.set(p.objectId,Er(b.price).toNumber());}}let i={};for(let[c,d]of a)i[c]=(d!==void 0?l.get(d):void 0)??0;return i},Ur=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,l)=>(e.includes(l.coinName)&&(s[l.coinName]=l.coinPrice),s),{})};var Ze=class extends R{config;indexer;onchain;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,...n}){super(n),this.config=e??{endpoint:Dr,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return E({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>Vr(this.context,e),onchain:()=>Wr(this.context,e)})}getPythFeedObject(e){return qr(this.context,e)}getPythFeedObjects(e){return Kr(this.context,e)}getPricesFromIndexer(e){return Ur(this.context,e)}};var Qr=t=>{let{utils:e,indexerUrl:o,queryClientConfig:r=Fe}=t,n=e.onchain,a=_t(o),s=t.queryClient??new queryCore.QueryClient(r),l=e.logger,i={onchain:n,queryClient:s,logger:l},c,d,u,p,y,f,b,m,h,S,w,T,B,N;return {get market(){return c??=new Le({...i,indexer:a,addresses:Lt(e),metadata:Mt(e)})},get coinBalance(){return d??=new Ee({...i,metadata:Et(e)})},get flashloan(){return u??=new Ve({...i,metadata:Vt(e)})},get obligation(){return p??=new qe({...i,metadata:qt(e)})},get borrowIncentive(){return y??=new Ke({...i,metadata:Kt(e)})},get isolatedAssets(){return f??=new We({...i,metadata:$t(e)})},get veSca(){return b??=new Qe({...i,metadata:zt(e)})},get loyaltyProgram(){return m??=new $e({...i,metadata:Yt(e)})},get xOracle(){return h??=new Ye({...i,metadata:Xt(e)})},get spool(){return S??=new Ge({...i,indexer:a,metadata:Ht(e)})},get veScaLoyaltyProgram(){return w??=new He({...i,metadata:Gt(e)})},get referral(){return T??=new Xe({...i,metadata:Wt(e)})},get price(){return B??=new Ze({...i,indexer:a,metadata:Ut(e)})},get poolAddresses(){return N??=new Je({...i,api:Ft(),metadata:Qt(e)})}}};var $r=(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",Ea={rpc:"onchain",indexer:"api","indexer-first":"api-first"},me=t=>t?.source?Ea[t.source]:t?.indexer?"api-first":"onchain";[suiKit.getFullnodeUrl("mainnet")];var xe=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var et=(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 Wa=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})),Ua=(t,e)=>Object.values(t).filter(o=>!!o&&(o.totalBorrowedValueWithWeight>0||o.totalDepositedValue>0)).map(o=>({obligationId:o.obligationId,totalDebtsInUsd:o.totalBorrowedValueWithWeight,totalCollateralInUsd:o.totalDepositedValue,riskLevel:o.totalRiskLevel,availableCollateralInUsd:o.totalAvailableCollateralValue,totalUnhealthyCollateralInUsd:o.totalUnhealthyCollateralValue,collaterals:Object.values(o.collaterals).filter(r=>!!r&&r.depositedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,depositedCoin:r.depositedCoin,depositedValueInUsd:r.depositedValue})),borrowedPools:Object.values(o.debts).filter(r=>!!r&&r.borrowedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,borrowedCoin:r.borrowedCoin,borrowedValueInUsd:r.borrowedValueWithWeight,borrowApr:e[r.coinName]?.borrowApr,borrowApy:e[r.coinName]?.borrowApy,incentiveInfos:(o.borrowIncentives[r.coinName]?.rewards??[]).filter(n=>!!n&&isFinite(n.baseRewardApr)).map(n=>({coinName:n.coinName,symbol:n.symbol,coinType:n.coinType,boostValue:n.boostValue,maxBoost:n.maxBoost,incentiveApr:n.baseRewardApr,boostedIncentiveApr:n.boostedRewardApr}))}))})),Ae="sui",Qa="SUI",$a=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[Ae]?o[Ae].pendingRewardInCoin+=r.availableClaimCoin:o[Ae]={symbol:Qa,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[Ae]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),za=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),{}),Ya=(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})),Ga=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}},Ha=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),l=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:l.toNumber(),availableWithdrawAmount:0,availableWithdrawCoin:0},depositedValue:r,borrowCapacityValue:n,requiredCollateralValue:a,isDeposited:e.isGreaterThan(0)}},Xa=1e9,Ja=bignumber_js.BigNumber(1e12),Za=t=>{let e=[];Object.entries(t.borrowIncentiveAccount.pointList).forEach(([n,a])=>{let s=t.borrowIncentivePool.points[t.toMarketCoinName(n)];if(!a||!s)return;let l=bignumber_js.BigNumber(a.weightedAmount),i=s.currentPointIndex?Math.max(bignumber_js.BigNumber(s.currentPointIndex-a.index).dividedBy(Xa).toNumber(),0):1,c=l.multipliedBy(i).plus(a.points),d=c.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(Ja),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),y=p.isFinite()?p.toNumber():1,f=isFinite(s.rewardApr)?s.rewardApr:0;c.isGreaterThanOrEqualTo(0)&&e.push({coinName:s.coinName,coinType:s.coinType,symbol:s.symbol,coinDecimal:s.coinDecimal,coinPrice:s.coinPrice,weightedBorrowAmount:l.toNumber(),availableClaimAmount:c.toNumber(),availableClaimCoin:d.toNumber(),baseRewardApr:f,boostedRewardApr:f*y,maxBoost:1/u.toNumber(),boostValue:y});});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}},es=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),l=s.shiftedBy(-t.coinDecimal),i=a.multipliedBy(t.coinPrice),c=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:c.toNumber(),borrowIndex:Number(t.debt?.borrowIndex??0),requiredRepayAmount:n.toNumber(),requiredRepayCoin:a.toNumber(),availableBorrowAmount:0,availableBorrowCoin:0,availableRepayAmount:s.toNumber(),availableRepayCoin:l.toNumber(),rewards:(t.rewards??[]).filter(({weightedBorrowAmount:u})=>u>0)},borrowedValue:i,borrowedValueWithWeight:c,isBorrowed:o.isGreaterThan(0)}},ts=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()}},os=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):xe(e.multipliedBy(et(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()}},rs=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(et(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)?xe(o.multipliedBy(et(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()}},Gr=t=>{let{coinName:e,symbol:o,coinType:r,marketCoinType:n,coinDecimal:a,coinPrice:s,marketPool:l,spool:i,stakeAccounts:c,coinAmount:d,marketCoinAmount:u,sCoinAmount:p}=t,y=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),S=bignumber_js.BigNumber(0),w=bignumber_js.BigNumber(0),T=bignumber_js.BigNumber(0),B=bignumber_js.BigNumber(0);if(i)for(let re of c){let M=bignumber_js.BigNumber(re.staked),fe=M.shiftedBy(-i.coinDecimal),K=M.multipliedBy(l?.conversionRate??1),Y=K.shiftedBy(-i.coinDecimal),be=Y.multipliedBy(i.coinPrice);y=y.plus(M),f=f.plus(fe),b=b.plus(K),m=m.plus(Y),h=h.plus(be),S=S.plus(M),w=S.shiftedBy(-i.coinDecimal);let at=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-re.index).dividedBy(1e9):1;T=T.plus(M.multipliedBy(at).plus(re.points).multipliedBy(i.exchangeRateNumerator).dividedBy(i.exchangeRateDenominator)),B=T.shiftedBy(-i.rewardCoinDecimal);}let N=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)).multipliedBy(l?.conversionRate??1),I=N.shiftedBy(-a),x=I.multipliedBy(s??0),v=bignumber_js.BigNumber(s??0).multipliedBy(l?.conversionRate??1),j=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),F=j.shiftedBy(-a),q=bignumber_js.BigNumber(d),Q=q.shiftedBy(-a),ie=xe(N,l?.supplyAmount??1/0).plus(b),Z=xe(I,l?.supplyCoin??1/0).plus(m);return {coinName:e,symbol:o,coinType:r,marketCoinType:n,sCoinType:l?.sCoinType??"",coinDecimal:a,coinPrice:s??0,conversionRate:l?.conversionRate??1,marketCoinPrice:v.toNumber(),supplyApr:l?.supplyApr??0,supplyApy:l?.supplyApy??0,rewardApr:i?.rewardApr??0,suppliedAmount:N.plus(b).toNumber(),suppliedCoin:I.plus(m).toNumber(),suppliedValue:x.plus(h).toNumber(),stakedMarketAmount:y.toNumber(),stakedMarketCoin:f.toNumber(),stakedAmount:b.toNumber(),stakedCoin:m.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:j.toNumber(),unstakedMarketCoin:F.toNumber(),unstakedAmount:N.toNumber(),unstakedCoin:I.toNumber(),unstakedValue:x.toNumber(),availableSupplyAmount:q.toNumber(),availableSupplyCoin:Q.toNumber(),availableWithdrawAmount:ie.toNumber(),availableWithdrawCoin:Z.toNumber(),availableStakeAmount:j.toNumber(),availableStakeCoin:F.toNumber(),availableUnstakeAmount:S.toNumber(),availableUnstakeCoin:w.toNumber(),availableClaimAmount:T.toNumber(),availableClaimCoin:B.toNumber(),isIsolated:l?l.isIsolated:false}},Hr=t=>{let{obligationId:e,collateralCoinNames:o,market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:l,borrowIncentiveAccounts:i,utils:c}=t,d={},u={},p={},y=0,f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),h=0,S=0,w=bignumber_js.BigNumber(0),T=bignumber_js.BigNumber(0);for(let x of o){let v=s?.collaterals.find(q=>c.parseCoinNameFromType(q.type)===x),j=r.collaterals[x];if(!j)continue;let F=Ha({assetCoinName:x,coinType:c.parseCoinType(x),symbol:c.parseSymbol(x),coinDecimal:c.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketCollateral:j,depositedRawAmount:v?.amount});f=f.plus(F.depositedValue),b=b.plus(F.borrowCapacityValue),m=m.plus(F.requiredCollateralValue),F.isDeposited&&y++,d[x]=F.entry;}for(let[x,v]of Object.entries(i)){if(!v)continue;let j=l[x];if(!j)continue;let F=Za({borrowIncentivePool:j,borrowIncentiveAccount:v,toMarketCoinName:q=>c.parseSCoinTypeNameToMarketCoinName(q)});F.contributesRewardedPool&&S++,p[x]={coinName:j.coinName,coinType:j.coinType,symbol:j.symbol,coinDecimal:j.coinDecimal,coinPrice:j.coinPrice,rewards:F.rewards};}let B=[...new Set(Object.values(r.pools).filter(x=>!!x).map(x=>x.coinName))];for(let x of B){let v=s?.debts.find(q=>c.parseCoinNameFromType(q.type)===x),j=r.pools[x];if(!j)continue;let F=es({assetCoinName:x,coinType:c.parseCoinType(x),symbol:c.parseSymbol(x),coinDecimal:c.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketPool:j,debt:v?{amount:v.amount,borrowIndex:v.borrowIndex}:void 0,rewards:p[x]?.rewards});w=w.plus(F.borrowedValue),T=T.plus(F.borrowedValueWithWeight),F.isBorrowed&&h++,u[x]=F.entry;}let N=ts({totalDepositedValue:f,totalBorrowedValue:w,totalBorrowCapacityValue:b,totalBorrowedValueWithWeight:T,totalRequiredCollateralValue:m}),I={obligationId:e,totalDepositedValue:f.toNumber(),totalBorrowedValue:w.toNumber(),totalBalanceValue:N.accountBalanceValue,totalBorrowCapacityValue:b.toNumber(),totalAvailableCollateralValue:N.availableCollateralValue,totalBorrowedValueWithWeight:T.toNumber(),totalRequiredCollateralValue:N.requiredCollateralValue,totalUnhealthyCollateralValue:N.unhealthyCollateralValue,totalRiskLevel:N.riskLevel,totalDepositedPools:y,totalBorrowedPools:h,totalRewardedPools:S,collaterals:d,debts:u,borrowIncentives:p};for(let[x,v]of Object.entries(I.collaterals)){if(!v)continue;let j=r.collaterals[x];if(!j)continue;let{availableWithdrawAmount:F,availableWithdrawCoin:q}=os({obligationCollateral:v,marketCollateral:j,totalAvailableCollateralValue:I.totalAvailableCollateralValue,totalBorrowedValueWithWeight:I.totalBorrowedValueWithWeight});v.availableWithdrawAmount=F,v.availableWithdrawCoin=q;}for(let[x,v]of Object.entries(I.debts)){if(!v)continue;let j=r.pools[x];if(!j)continue;let{availableBorrowAmount:F,availableBorrowCoin:q,requiredRepayAmount:Q,requiredRepayCoin:ie}=rs({obligationDebt:v,marketPool:j,totalAvailableCollateralValue:I.totalAvailableCollateralValue});v.availableBorrowAmount=F,v.availableBorrowCoin=q,v.requiredRepayAmount=Q,v.requiredRepayCoin=ie;}return I},Xr=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=Wa(e),l=Ua(o,a),i=$a(e,n),c=za(o),d=Ya(r,n.sca??0);return {...Ga({parsedLendings:s,parsedObligationAccounts:l,parsedVeScas:d}),lendings:s,borrowings:l,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:Ae,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(c).map(([p,y])=>({coinName:p,...y,pendingRewardInUsd:y.coinPrice*y.pendingRewardInCoin}))},veScas:d}},Jr=t=>{let{coinPrices:e,marketPools:o,sCoinNames:r,parseCoinName:n}=t,a={};for(let s of r){let l=n(s);a[s]=bignumber_js.BigNumber(e[l]??0).multipliedBy(o[l]?.conversionRate??1).toNumber();}return {...e,...a}};var Zr=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 en=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var tt=class extends R{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return en(this.context,e)}};var At=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=Ne,timeout:r,client:n,network:a="mainnet",logger:s=le,forceAddressesInterface:l}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new tt({api:new ce({url:o,timeout:r,client:n})}),l&&this.initializeForcedAddresses(l);}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)}},tn=At;var ot=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[b,m.decimals]),...Object.entries(t).filter(([b,m])=>!!m?.sCoinName).map(([b,m])=>[m.sCoinName,m.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[b,m?.coinType]),...Object.entries(t).filter(([b,m])=>!!m&&m.sCoinName&&m.sCoinType).map(([b,m])=>[m.sCoinName,m.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([b,m])=>[m,b])),s=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&e.wormhole.has(b)).map(([b,m])=>[m.coinType,m.coinName])),l=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[m.coinName,o(m.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinType&&m.sCoinName).map(([b,m])=>[suiKit.parseStructTag(m.sCoinType).name,m.sCoinName])),c=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinType&&m.sCoinName).map(([b,m])=>[m.sCoinType,m.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&e.suiBridge.has(m.coinName)).map(([b,m])=>[m.coinType,m.coinName])),y=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinName&&m.sCoinType).map(([b,m])=>[m.sCoinName,m.sCoinType])),f=new Set([...Object.values(t).filter(b=>!!b).map(b=>b.sCoinName?[b.coinName,b.sCoinName]:[b.coinName]).flat()]);return {coinDecimals:Object.freeze(r),coinTypes:Object.freeze(n),coinTypeToCoinNameMap:Object.freeze(a),coinNameToOldMarketCoinTypeMap:Object.freeze(l),wormholeCoinTypeToCoinNameMap:Object.freeze(s),voloCoinTypeToCoinNameMap:Object.freeze(u),suiBridgeCoinTypeToCoinNameMap:Object.freeze(p),scoinRawNameToSCoinNameMap:Object.freeze(i),scoinTypeToSCoinNameMap:Object.freeze(c),sCoinTypes:Object.freeze(y),supportedBorrowIncentiveRewards:f}};var on={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 Oe=()=>Object.fromEntries(Object.entries(on).map(([t,e])=>[t,new Set(e)])),as=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)},Pe=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,as(o)]))),Te=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),rt=t=>{let e=Oe();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 Pe(e)},Ot=t=>Object.keys(t).length===0;var rn=({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??Oe()}})();return rt(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 Pt=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],ss=(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]})),is=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&Pt.every(s=>o[s].size>0)},nn=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 l=a.whitelist,i=a.poolAddresses;n.forcePoolAddressInterface&&(i=Te(n.forcePoolAddressInterface)),n.forceWhitelistInterface&&(l=rt(n.forceWhitelistInterface));let c=()=>ot({poolAddresses:i,whitelist:l,parseToOldMarketCoin:s});if(is(t,e,l,i)&&!o)return {whitelist:l,poolAddresses:i,derived:c()};let[d,u]=await Promise.all([t.fetchWhitelist(),t.fetchPoolAddresses()]);return n.forceWhitelistInterface||(l=Pe(d)),n.forcePoolAddressInterface||(i=Te(ss(u,l))),{whitelist:l,poolAddresses:i,derived:c()}};var an=t=>({getAddresses:()=>t.getAddresses()});var sn=t=>({getPoolAddresses:()=>t.poolAddresses});var cn=t=>({getWhitelist:()=>t.whitelist});var cs=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],ls=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],ds=(t,e)=>{let r=(e?.requiredPaths??cs).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=ls.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},ln=(t,e)=>{let o=ds(t,e);if(!o.valid)throw new te("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var us=(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},ps=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],ms=t=>{let e=t;return ps.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},dn=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:ms(t.whitelistSource.getWhitelist()),get:n=>us(o,n)};return ln(r,{requiredPaths:e.requiredPaths}),r};var bs=()=>{let t=Pe(Oe()),e=Te({});return {whitelist:t,poolAddresses:e,derived:ot({poolAddresses:e,whitelist:t,parseToOldMarketCoin:()=>""})}},Tt=class{address;logger;params;source;_state=bs();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=le,scallopAddress:r,defaultValues:n,forcePoolAddressInterface:a,forceWhitelistInterface:s,strictInit:l,urls:i,...c}=e;this.address=r??new tn({...c,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??rn({address:this.address,logger:this.logger,defaultValues:n});}get url(){return this.address.url}get protocolObjectId(){return this.address.get("core.object")??"0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf"}get isInitialized(){return this.isInitializedFor("mainnet")}get whitelist(){return this._state.whitelist}get poolAddresses(){return this._state.poolAddresses}get(e){return this.address.get(e)}set(e,o){return this.address.set(e,o)}getAddresses(e){return this.address.getAddresses(e)}getAllAddresses(){return this.address.getAllAddresses()}switchCurrentAddresses(e){return this.address.switchCurrentAddresses(e)}isAddressInitialized({network:e="mainnet"}={}){let o=this.address.getAddresses(e);return !!o&&!Ot(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!Ot(this._state.poolAddresses)&&Pt.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 nn({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&&dn({addressSource:an(this),poolAddressSource:sn(this),whitelistSource:cn(this)},{});}},un=Tt;var pn=10,Rt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new un(e),e.client){let{client:o,fullnodeUrl:r,tokensPerSecond:n=pn}=e;this.onchain=it(o,r,{tokensPerSecond:n});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=pn}=e,a=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=it(a,r,{tokensPerSecond:n});}this.walletAddress=e.walletAddress,this.logger=e.logger??le;}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)),l=o??0,i=0n,c=true,d=null;for(;c&&(s===void 0?a.length<l:i<s);){let{objects:u,hasNextPage:p,cursor:y}=await this.onchain.client.listCoins({owner:n,coinType:r,cursor:d});u.sort((f,b)=>Number(BigInt(b.balance)-BigInt(f.balance)));for(let f of u)if(a.push({objectId:f.objectId,digest:f.digest,version:f.version,balance:f.balance}),i+=BigInt(f.balance),s===void 0?a.length>=l:i>=s)break;d=y,c=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 Zr(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},mn=Rt;var nt=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var It=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,...n}){this.utils=e??new mn(n),this.repos=Qr({utils:this.utils,queryClient:o,queryClientConfig:r});}get logger(){return this.utils.logger}async init(e=false){await this.utils.init({force:e});}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async fetchMarkets(e){let o=e?.poolCoinNames||e?.collateralCoinNames?Array.from(new Set([...e.poolCoinNames??[],...e.collateralCoinNames??[]])):void 0,r=e?.coinPrices??await this.getPythCoinPrices({coinNames:o})??{};return this.repos.market.getMarkets({coinPrices:r,poolCoinNames:e?.poolCoinNames,collateralCoinNames:e?.collateralCoinNames,source:me(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:nt(r,e),collaterals:nt(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 nt(r,e)}async getMarketCollateral(e,o){return (await this.getMarketCollaterals(void 0,o))[e]}async getObligations(e=this.walletAddress){return this.repos.obligation.getObligations(e)}async queryObligation(e){let o=typeof e=="string"?e:"objectId"in e?e.objectId:void 0;if(o===void 0)throw new O("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 O("getObligationLocked expects an object id (string) or an object reference");return this.repos.obligation.getObligationLocked(o)}async getCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmounts({coinNames:e,address:o})}async getCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmount({coinName:e,address:o})}async getMarketCoinAmounts(e,o=this.walletAddress){let r=e??[...this.constants.whitelist.lending].map(n=>this.utils.parseMarketCoinName(n));return await this.repos.coinBalance.getMarketCoinAmounts({marketCoinNames:r,address:o})}async getMarketCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getMarketCoinAmount({marketCoinName:e,address:o})}async getSpools(e,o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.spool.getSpools({stakeCoinNames:e??[...this.constants.whitelist.spool],coinPrices:r,source:me(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:me(o)})}async getAllStakeAccounts(e=this.walletAddress){return await this.repos.spool.getStakeAccounts({address:e})}async getStakeAccounts(e,o=this.walletAddress){return (await this.getAllStakeAccounts(o))[e]??[]}async getStakePools(e=[...this.constants.whitelist.spool]){let o={};for(let r of e){let n=await this.repos.spool.getStakePool(r);n&&(o[r]=n);}return o}async getStakePool(e){return this.repos.spool.getStakePool(e)}async getStakeRewardPools(e=[...this.constants.whitelist.spool]){return this.repos.spool.getSpoolRewardPools(e)}async getStakeRewardPool(e){return this.repos.spool.getSpoolRewardPool(e)}async getPythCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromPyth({coinNames:o,source:"api-first"})}async getPythCoinPrice(e){return (await this.getPythCoinPrices({coinNames:[e]}))[e]}async getIndexerCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromIndexer({coinNames:o})}async getIndexerCoinPrice(e){return (await this.getIndexerCoinPrices({coinNames:[e]}))[e]}async getBorrowIncentivePools(e=[...this.constants.whitelist.lending],o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.borrowIncentive.getBorrowIncentivePools({coinNames:e,coinPrices:r})}async getBorrowIncentiveAccounts(e,o=[...this.constants.whitelist.lending]){return await this.repos.borrowIncentive.getBorrowIncentiveAccounts({obligationId:typeof e=="string"?e:e.objectId,coinNames:o})}async getLendings(e,o=this.walletAddress,r){let n=e??[...this.constants.whitelist.lending],a=n.map(b=>this.utils.parseMarketCoinName(b)),s=a.filter(b=>this.constants.whitelist.spool.has(b)),l=r?.coinPrices??await this.getPythCoinPrices({coinNames:n})??{},i=r?.marketPools??(await this.getMarketPools(n,{...r,coinPrices:l})).pools,c=await this.getSpools(s,{...r,marketPools:i,coinPrices:l}),[d,u,p,y]=await Promise.all([this.getCoinAmounts(n,o),this.getMarketCoinAmounts(a,o),this.getSCoinAmounts(a,o),this.getAllStakeAccounts(o)]),f={};for(let b of n){let m=this.utils.parseMarketCoinName(b),h=s.includes(m);f[b]=Gr({coinName:b,symbol:this.utils.parseSymbol(b),coinType:this.utils.parseCoinType(b),marketCoinType:this.utils.parseMarketCoinType(b),coinDecimal:this.utils.getCoinDecimal(b)??0,coinPrice:l[b]??0,marketPool:i?.[b],spool:h?c[m]:void 0,stakeAccounts:h?y[m]??[]:[],coinAmount:d[b]??0,marketCoinAmount:u[m]??0,sCoinAmount:p[m]??0});}return f}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return E({source:me(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)})}async getObligationAccountsByIds(e,o){return E({source:me(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return E({source:me(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,l,i]=await Promise.all([this.queryObligation(e),this.getBorrowIncentivePools(void 0,{coinPrices:n,marketPools:r.pools}),this.getBorrowIncentiveAccounts(e)]);return Hr({obligationId:typeof e=="string"?e:e.objectId,collateralCoinNames:Array.from(this.constants.whitelist.collateral),market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:l,borrowIncentiveAccounts:i,utils:{parseCoinNameFromType:c=>this.utils.parseCoinNameFromType(c),parseCoinType:c=>this.utils.parseCoinType(c),parseSymbol:c=>this.utils.parseSymbol(c),getCoinDecimal:c=>this.utils.getCoinDecimal(c),parseSCoinTypeNameToMarketCoinName:c=>this.utils.parseSCoinTypeNameToMarketCoinName(c)}})}async assembleObligationAccountsByOwner(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),[s,l]=await Promise.all([this.getCoinAmounts(void 0,e),this.getObligations(e)]),i=await this.repos.obligation.getObligationObjects(l.map(d=>d.id)),c={};return await Promise.allSettled(l.map(async(d,u)=>{c[d.keyId]=await this.assembleObligationAccount(i[u]??d.id,{market:n,coinPrices:a,coinAmounts:s});})),c}async assembleObligationAccountsByIds(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),s=[];return await Promise.allSettled(e.map(async l=>{let i=await this.assembleObligationAccount(l,{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:me(e),coinPrices:o})}async getVeSca(e){return await this.repos.veSca.getVeSca(typeof e=="string"?e:e.objectId)}async getVeScas({walletAddress:e=this.walletAddress,excludeEmpty:o=false}={}){return await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o})}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return this.repos.referral.getVeScaKeyIdFromReferralBindings(e)}async getBindedObligation(e){return this.repos.borrowIncentive.getBindedObligation(e)}async getBindedVeScaKey(e){return this.repos.borrowIncentive.getBindedVeScaKey(e)}async getLoyaltyProgramInfos(e){let o=e??(await this.getVeScas())[0]?.keyId,r=typeof o=="string"?o:o?.objectId;return this.repos.loyaltyProgram.getLoyaltyProgramInfos(r)}async getVeScaLoyaltyProgramInfos(e){return this.repos.veScaLoyaltyProgram.getVeScaLoyaltyProgramInfos(e)}async getSCoinTotalSupply(e){return await this.repos.coinBalance.getSCoinTotalSupply(e)}async getSCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getSCoinAmounts({sCoinNames:e,address:o})}async getSCoinAmount(e,o=this.walletAddress){let r=this.utils.parseSCoinName(e);return r?await this.repos.coinBalance.getSCoinAmount({sCoinName:r,address:o}):0}async getSCoinSwapRate(e,o){if(e===o)throw new O("fromAsset and toAsset must be different");if(!this.constants.whitelist.scoin.has(e))throw new O("fromAsset is not supported");if(!this.constants.whitelist.scoin.has(o))throw new O("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 O("Failed to fetch the lendings data");if(a.conversionRate===0||s.conversionRate===0)throw new O("Conversion rate cannot be zero");let l=a.conversionRate,i=1/s.conversionRate,c=await this.getPythCoinPrices();if(!c[r]||!c[n]||c[r]===0||c[n]===0){let u=await this.getIndexerCoinPrices().catch(()=>({}));c={...c,...u};}if(!c[r]||!c[n])throw new O("Failed to fetch the coin prices");let d=c[r]/c[n];return bignumber_js.BigNumber(l).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:$r({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 Jr({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 O("apiAddressId is required");return this.repos.poolAddresses.getPoolAddresses({})}async getUserPortfolio(e){let o=e?.walletAddress??this.walletAddress,r=e?.indexer??false,n=await this.getAllCoinPrices({indexer:r}),a=await this.getMarketPools(void 0,{indexer:r,coinPrices:n}),[s,l,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 Xr({lendings:s,obligationAccounts:l,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)}},Cs=It;
|
|
18
|
+
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 k=class extends z{constructor(e,o){super("SCALLOP_RPC_ERROR",e,o),this.name="ScallopRpcError";}};var Ie=class extends z{constructor(e,o){super("SCALLOP_INDEXER_ERROR",e,o),this.name="ScallopIndexerError";}};var O=class extends z{constructor(e,o){super("SCALLOP_PARSE_ERROR",e,o),this.name="ScallopParseError";}};var te=class extends z{constructor(e,o){super("SCALLOP_CONFIG_ERROR",e,o),this.name="ScallopConfigError";}};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],getSharedObject:t=>["rpc","getSharedObject",t],getOwnedObjects:t=>["rpc","getOwnedObjects",t],getDynamicFields:t=>["rpc","getDynamicFields",t],getDynamicFieldObject:t=>["rpc","getDynamicFieldObject",t],getTotalVeScaTreasuryAmount:t=>["rpc","getTotalVeScaTreasuryAmount",{...t,refreshArgs:t?.refreshArgs?JSON.stringify(t?.refreshArgs):void 0,veScaAmountArgs:t?.veScaAmountArgs?JSON.stringify(t?.veScaAmountArgs):void 0}],getCoinBalance:t=>["rpc","getCoinBalance",t],getAllCoinBalances:t=>["rpc","getAllCoinBalances",t]},oracle:{getPythLatestPriceFeeds:(t,e)=>["oracle","getPythPriceIds",e,t]}};var A=(t,e)=>{let o=e instanceof z?e.context:void 0;return t?.error(e.message,o),e},V=async t=>{if(t.source==="api")return t.api();if(t.source==="api-first")try{return await t.api()}catch(e){return t.logger?.warn(`[${t.label}] api failed, falling back to onchain`,{cause:e instanceof Error?e.message:String(e)}),t.onchain()}return t.onchain()},Pn=async(t,e)=>t.fetchWithCache({queryKey:g.rpc.getDynamicFieldObject({...e,node:t.onchain.url}),queryFn:()=>t.onchain.client.getDynamicField(e)}),Tn=new Set(["notExists","dynamicFieldNotFound","deleted"]),st=t=>{if(!(t instanceof Error))return false;let e=t.code;return typeof e=="string"&&Tn.has(e)?true:/does not exist|not exist|not found|dynamic field|deleted/i.test(t.message)},ne=async(t,e)=>{try{return await Pn(t,e)}catch(o){if(st(o))return null;throw o}};var Ne="https://sui.apis.scallop.io",je="https://sdk.api.scallop.io";var ce=class{client;constructor({url:e,httpClient:o,timeout:r=8e3}={}){this.client=o??kn__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 ve=class extends ce{constructor({url:e=je,...o}){super({url:e,...o});}};var Be=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 Rn=["getObjects","listOwnedObjects","listCoins","listDynamicFields","getDynamicField","getBalance","listBalances","getCoinMetadata","getTransaction","getReferenceGasPrice","getCurrentSystemState","getProtocolConfig","getChainIdentifier","defaultNameServiceName","getMoveFunction","simulateTransaction"],In=new Set(Rn),Bt=new Map;var Nn=(t,e)=>{let o=Bt.get(t)??{calls:0,waitMs:0};o.calls+=1,o.waitMs+=e,Bt.set(t,o);},jn=(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"&&In.has(r)?(...l)=>{let i=Date.now();return e.execute(()=>(Nn(r,Date.now()-i),s(...l)))}:s}}),_e=class{client;url;constructor({client:e,url:o,tokensPerSecond:r}){this.client=jn(e,new Be(r)),this.url=o;}async getObject(e){let{objectId:o}=e,{objects:[r]}=await this.client.getObjects({objectIds:[o],signal:e.signal,include:e.include});if(r instanceof Error)throw r;return {object:r}}};var it=(t,e,o)=>new _e({client:t.core,url:e,tokensPerSecond:o?.tokensPerSecond}),_t=(t=je)=>new ve({url:t}),Ft=(t=Ne)=>new ce({url:t});var Dt=["supra","switchboard","pyth"];var Mt=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)}),Lt=t=>({queryPackageId:t.address.get("core.packages.query.id"),market:t.address.get("core.market")}),Et=t=>{let e=t.address.getAddresses();if(!e)throw new te("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)}},Vt=t=>{let e=Object.entries(t.constants.coinTypeToCoinNameMap).filter(o=>o[1]!==void 0);return {coinTypeToCoinNameMap:new Map(e)}},qt=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")}}),Kt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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)}},Wt=t=>({addresses:{referral:{bindingTableId:t.address.get("referral.bindingTableId")}}}),Ut=t=>{let e=t.address.getAddresses();if(!e)throw new te("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))}}},Qt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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}}}},$t=t=>({addresses:{market:t.address.get("core.market")},poolAddresses:t.constants.poolAddresses,whitelist:{lending:t.constants.whitelist.lending}}),zt=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")}}}),Yt=t=>({addresses:{loyaltyProgram:{rewardPool:t.address.get("loyaltyProgram.rewardPool")}}}),Gt=t=>{let e=t.address.getAddresses();if(!e)throw new te("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}}}},Ht=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()}),Xt=t=>({addresses:{...Dt.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 le={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}};var Jt=(t,e)=>async o=>{try{return await t.fetchQuery(o)}catch(r){throw e.error("Error fetching query",{queryKey:o.queryKey}),r}};var Fe={defaultOptions:{queries:{staleTime:5e3,gcTime:5e3}}};var Zt=new queryCore.QueryClient(Fe);var R=class{queryClient;logger;metadata;fetchWithCache;constructor({queryClient:e=Zt,logger:o=le,metadata:r}){this.queryClient=e,this.logger=o,this.metadata=r,this.fetchWithCache=Jt(this.queryClient,this.logger);}get baseContext(){return {fetchWithCache:this.fetchWithCache,logger:this.logger,metadata:this.metadata}}};function L(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 ue=(t,e)=>{let o=[];for(let r=0;r<t.length;r+=e)o.push(t.slice(r,r+e));return o};var _n="0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field",Me=t=>typeof t=="object"&&t!==null,Fn=t=>!Me(t)||t.$kind!=="Shared"||!("Shared"in t)||!Me(t.Shared)?false:"initialSharedVersion"in t.Shared;function Dn(t){if(!t?.json)throw new Error(`Failed to parse object: ${JSON.stringify(t,null,2)}`)}var De=t=>{if(Array.isArray(t))return t.map(De);if(typeof t=="object"&&t!==null){let e=t;if("type"in e&&"fields"in e&&typeof e.type=="string")return De(e.fields);let o={};for(let[r,n]of Object.entries(e))o[r]=De(n);return o}return t},to=t=>{Dn(t);let e=t.json,o="fields"in e?e.fields:e;return De(o)},eo=t=>Fn(t.owner)?{objectId:t.objectId,initialSharedVersion:String(t.owner.Shared.initialSharedVersion)}:t,Mn=(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,G=async({onchain:t,fetchWithCache:e},{tx:o,objectId:r,mutable:n=false,include:a})=>{let s;if(typeof r=="string"){let l=await e({queryKey:g.rpc.getSharedObject({objectId:r,node:t.url}),queryFn:()=>t.getObject({objectId:r,include:a})});if(!l?.object)throw new Error("Failed to get object data");s=eo(l.object);}else "objectId"in r&&"owner"in r&&(s=eo(r));return Mn(o,{obj:s??r,mutable:n})},Ln=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())]),En=zod.z.union([zod.z.string(),zod.z.object({id:zod.z.string()})]),Vn=zod.z.object({id:En,name:Ln,value:zod.z.unknown().optional()}),oo=t=>t.type.startsWith(_n),ro=t=>{let{success:e}=Vn.safeParse(t);return !!e},qn=t=>typeof t=="string"?t:t.id,Kn=t=>{if(!ro(t))throw new Error(`Invalid dynamic field data: ${JSON.stringify(t,null,2)}`);let{value:e}=t;return e},Wn=t=>{if(typeof t=="string")return t;if(!Me(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},Un=t=>{if(typeof t=="string")return t.includes("::")?"type":"string";if(!Me(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=to(t);return oo(t)&&typeof e=="object"?Kn(e):e},no=t=>{if(!oo(t))throw new Error(`Object ${t.objectId} is not a dynamic field object`);let e=to(t);if(ro(e)){let o=Wn(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:qn(e.id),name:o,nameKind:Un(e.name)}}throw new Error(`Failed to parse dynamic field object ${t.objectId}, invalid fields: ${JSON.stringify(e,null,2)}`)};var H=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=>H(n)),r=o.length?`<${o.join(",")}>`:"";return utils.normalizeStructTag(`${e.address}::${e.module}::${e.name}${r}`)}if(e.name)return H(e.name)}throw new O(`Invalid Move type name: ${JSON.stringify(t)}`,{context:{payload:t}})},X=(t,e)=>{try{return H(t)}catch(o){throw new O(`Failed to map Move type at ${e}`,{cause:o,context:{path:e}})}};var so=t=>{if(t)return {...t,pools:(t.pools??[]).map((e,o)=>({...e,type:X(e.type,`market.pools[${o}].type`)})),collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:X(e.type,`market.collaterals[${o}].type`)}))}};var io="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",co="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",lo="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var ct=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)}),lt=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new O(`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,l=e.borrowRateOnMidKink*n/e.borrowRateScale,i=e.maxBorrowRate*n/e.borrowRateScale,c=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),y=bignumber_js.BigNumber(p).dividedBy(e.borrowIndex).minus(1),f=bignumber_js.BigNumber(e.debtAmount).multipliedBy(y),b=f.plus(e.debtAmount),m=b.shiftedBy(-r),h=bignumber_js.BigNumber(e.reserveAmount).plus(f.multipliedBy(e.reserveFactor)),S=h.shiftedBy(-r),w=bignumber_js.BigNumber(b).plus(Math.max(e.cashAmount-h.toNumber(),0)),T=w.shiftedBy(-r),B=bignumber_js.BigNumber(b).dividedBy(w);B=B.isFinite()?B:bignumber_js.BigNumber(0);let N=bignumber_js.BigNumber(c).multipliedBy(B).multipliedBy(1-e.reserveFactor);N=N.isFinite()?N:bignumber_js.BigNumber(0);let I=w.dividedBy(e.marketCoinSupplyAmount);return I=I.isFinite()&&!I.isNaN()?I:bignumber_js.BigNumber(1),{baseBorrowApr:a,baseBorrowApy:t.parseAprToApy(a),borrowAprOnHighKink:s,borrowApyOnHighKink:t.parseAprToApy(s),borrowAprOnMidKink:l,borrowApyOnMidKink:t.parseAprToApy(l),coinDecimal:r,maxBorrowApr:i,maxBorrowApy:t.parseAprToApy(i),borrowApr:Math.min(c,i),borrowApy:Math.min(t.parseAprToApy(c),t.parseAprToApy(i)),borrowIndex:p.toNumber(),growthInterest:y.toNumber(),supplyAmount:w.toNumber(),supplyCoin:T.toNumber(),borrowAmount:b.toNumber(),borrowCoin:m.toNumber(),reserveAmount:h.toNumber(),reserveCoin:S.toNumber(),utilizationRate:B.toNumber(),supplyApr:N.toNumber(),supplyApy:t.parseAprToApy(N.toNumber()),conversionRate:I.toNumber(),isIsolated:e.isIsolated,maxSupplyCoin:bignumber_js.BigNumber(e.supplyLimit).shiftedBy(-r).toNumber(),maxBorrowCoin:bignumber_js.BigNumber(e.borrowLimit).shiftedBy(-r).toNumber()}},dt=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)}),ut=(t,e)=>{let o=t.parseCoinNameFromType(e.coinType),r=t.getCoinDecimal(o);if(r===void 0)throw new O(`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()}},po=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 pt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{indexer:n,metadata:a,fetchWithCache:s}=t,l="api/market/migrate",i=await s({queryFn:()=>n.get(l),queryKey:g.api.getMarkets()}),c={},d={},u=o?new Set(o):void 0,p=r?new Set(r):void 0,y=b=>{u&&!u.has(b.coinName)||(c[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});},f=b=>{p&&!p.has(b.coinName)||(d[b.coinName]={...b,coinPrice:e[b.coinName]??b.coinPrice,coinWrappedType:a.getCoinWrappedType(b.coinName)});};return Object.values(i.pools).filter(Boolean).forEach(y),Object.values(i.collaterals).filter(Boolean).forEach(f),{pools:c,collaterals:d}},mt=async(t,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})=>{let{onchain:n,addresses:a,fetchWithCache:s}=t,{queryPackageId:l,market:i}=a,c=new suiKit.SuiTxBlock,d=`${l}::market_query::market_data`,p=[await G({onchain:n,fetchWithCache:s},{tx:c,mutable:true,objectId:i})];c.moveCall(d,p);let y=await s({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:p.map(m=>typeof m=="object"&&"objectId"in m?m.objectId:m),typeArgs:[],node:n.url}),queryFn:()=>n.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction;if(!f.status.success)throw A(t.logger,new k(`On-chain market query transaction failed: ${f.status.error.message}`));let b=so(f?.events?.[0]?.json);return $n(t,b,{coinPrices:e,poolCoinNames:o,collateralCoinNames:r})},bo=async(t,{coinPrice:e,coinName:o})=>{let r=await pt(t,{coinPrices:{[o]:e}});if(!r.pools[o])throw A(t.logger,new O(`Market pool for ${o} not found in indexer data`,{context:{coinName:o}}));return {pool:r.pools[o],collateral:r.collaterals[o]}},yo=async(t,{coinPrice:e,coinName:o})=>{let{metadata:r}=t,a=(await ho(t,[o]))[o];if(!a)throw A(t.logger,new k(`Failed to fetch required market objects for ${o}`,{context:{coinName:o}}));let s=await Gn(t,a),l=ct(s),i=lt(r,l),c=s.parsedOriginMarketCollateral?dt(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:l.highKink,midKink:l.midKink,reserveFactor:l.reserveFactor,borrowWeight:l.borrowWeight,borrowFee:l.borrowFee,marketCoinSupplyAmount:l.marketCoinSupplyAmount,minBorrowAmount:l.minBorrowAmount,...i},collateral:c?{...d(),coinWrappedType:r.getCoinWrappedType(o),coinPrice:e,collateralFactor:c.collateralFactor,liquidationFactor:c.liquidationFactor,liquidationDiscount:c.liquidationDiscount,liquidationPenalty:c.liquidationPenalty,liquidationReserveFactor:c.liquidationReserveFactor,...ut(r,c)}:void 0}},fo=async t=>{let{indexer:e,fetchWithCache:o}=t,r="/api/market/tvl";return o({queryKey:g.api.getTotalValueLocked(),queryFn:()=>e.get(r)})},go=async(t,{coinPrices:e})=>{let o=await mt(t,{coinPrices:e});return po(o)},$n=async(t,e,{coinPrices:o,poolCoinNames:r,collateralCoinNames:n})=>{let{metadata:a}=t,s={},l={},i=r?new Set(r):void 0,c=n?new Set(n):void 0,d=new Set;for(let p of e?.pools??[]){let y=a.parseCoinNameFromType(p.type);a.whitelist.lending.has(y)&&(i&&!i.has(y)||d.add(y));}for(let p of e?.collaterals??[]){let y=a.parseCoinNameFromType(p.type);a.whitelist.collateral.has(y)&&(c&&!c.has(y)||d.add(y));}let u=await ho(t,[...d],Yn);for(let p of e?.pools??[]){let y=p.type,f=a.parseCoinNameFromType(y),b=o[f]??0;if(!a.whitelist.lending.has(f)||i&&!i.has(f))continue;let{supplyLimit:m,borrowLimit:h,isIsolated:S}=mo(u[f]??{}),w=ct({...p,type:p.type,isIsolated:S,supplyLimit:m,borrowLimit:h}),T=lt(a,w);s[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),sCoinType:a.parseSCoinType(a.parseMarketCoinName(f))??"",coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...w,...T};}for(let p of e?.collaterals??[]){let y=p.type,f=a.parseCoinNameFromType(y),b=o[f]??0;if(!a.whitelist.collateral.has(f)||c&&!c.has(f))continue;let{isIsolated:m}=mo(u[f]??{}),h=dt({...p,type:p.type,liquidationPenalty:p.liquidationPanelty,isIsolated:m}),S=ut(a,h);l[f]={coinName:f,symbol:a.parseSymbol(f),marketCoinType:a.parseMarketCoinType(f),coinWrappedType:a.getCoinWrappedType(f),coinPrice:b,...h,...S};}return {pools:s,collaterals:l}},zn=["lendingPoolAddress","collateralPoolAddress","borrowDynamic","interestModel","riskModel","borrowFeeKey","supplyLimitKey","borrowLimitKey","isolatedAssetKey"],Yn=["supplyLimitKey","borrowLimitKey","isolatedAssetKey"],mo=t=>({supplyLimit:t.supplyLimitKey?P(t.supplyLimitKey):"0",borrowLimit:t.borrowLimitKey?P(t.borrowLimitKey):"0",isIsolated:t.isolatedAssetKey?.json?P(t.isolatedAssetKey):false}),Gn=async(t,{balanceSheet:e,borrowDynamic:o,collateralStat:r,interestModel:n,riskModel:a,borrowFeeKey:s,supplyLimitKey:l,borrowLimitKey:i,isolatedAssetKey:c})=>{if(!e||!o||!n)throw A(t.logger,new k("Missing required market objects"));let d=P(e),u=P(n),p=P(o),y=s?P(s):{value:"0"},f=l?P(l):"0",b=i?P(i):"0",m=a?P(a):void 0,h=r?P(r):void 0,S=t.metadata.parseCoinNameFromType(`0x${u.type}`),w=c?.json?P(c):await Hn(t,S),T=m&&h?{type:u.type,collateralFactor:m.collateral_factor,liquidationFactor:m.liquidation_factor,liquidationPenalty:m.liquidation_penalty,liquidationDiscount:m.liquidation_discount,liquidationReserveFactor:m.liquidation_revenue_factor,maxCollateralAmount:m.max_collateral_amount,totalCollateralAmount:h.amount,isIsolated:w}:void 0;return {type:u.type,maxBorrowRate:u.max_borrow_rate,interestRate:p.interest_rate,interestRateScale:p.interest_rate_scale,borrowIndex:p.borrow_index,lastUpdated:p.last_updated,cash:d.cash,debt:d.debt,marketCoinSupply:d.market_coin_supply,reserve:d.revenue,reserveFactor:u.revenue_factor,borrowWeight:u.borrow_weight,borrowFeeRate:y,baseBorrowRatePerSec:u.base_borrow_rate_per_sec,borrowRateOnHighKink:u.borrow_rate_on_high_kink,borrowRateOnMidKink:u.borrow_rate_on_mid_kink,highKink:u.high_kink,midKink:u.mid_kink,minBorrowAmount:u.min_borrow_amount,supplyLimit:f,borrowLimit:b,isIsolated:w,parsedOriginMarketCollateral:T}},ho=async({onchain:t,metadata:e,fetchWithCache:o},r,n=zn)=>{let a=[];for(let d of r){let u=e.poolAddresses[d];for(let p of n){let y=u?.[p];y&&a.push(y);}}let s=[],l=ue([...new Set(a)],50);for(let d of l){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),{}),c={};for(let d of r){let u=e.poolAddresses[d];c[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 c},Co=(t,e)=>wo(t,io,e),So=(t,e)=>wo(t,co,e),Hn=async(t,e)=>{let o=await xo(t,lo,e);return o?.object?.json?P(o.object):false},wo=async(t,e,o)=>{let r=await xo(t,e,o);return r?.object?.json?P(r.object):"0"},xo=({onchain:t,addresses:e,metadata:o,fetchWithCache:r},n,a)=>{let s=o.parseCoinType(a).slice(2),l={type:n,value:s};return r({queryKey:g.rpc.getDynamicFieldObject({parentId:e.market,name:l,node:t.url}),queryFn:async()=>{try{let{dynamicField:i}=await t.client.getDynamicField({parentId:e.market,name:L(l)});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 Le=class extends R{indexer;addresses;onchain;constructor({indexer:e,addresses:o,onchain:r,...n}){super(n),this.indexer=e,this.addresses=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,addresses:this.addresses}}getMarkets({coinPrices:e,poolCoinNames:o,collateralCoinNames:r,source:n="api-first"}){let a={coinPrices:e,poolCoinNames:o,collateralCoinNames:r};return V({source:n,label:"MarketRepository.getMarkets",logger:this.logger,api:()=>pt(this.context,a),onchain:()=>mt(this.context,a)})}getMarket({coinPrice:e,coinName:o,source:r="api-first"}){return V({source:r,label:"MarketRepository.getMarketPool",logger:this.logger,api:()=>bo(this.context,{coinPrice:e,coinName:o}),onchain:()=>yo(this.context,{coinPrice:e,coinName:o})})}getPoolSupplyLimit(e){return Co(this.context,e)}getPoolBorrowLimit(e){return So(this.context,e)}getTvl({source:e="api-first",coinPrices:o}){return V({source:e,label:"MarketRepository.getTvl",logger:this.logger,api:()=>fo(this.context),onchain:()=>go(this.context,{coinPrices:o})})}};var bt=async(t,{address:e,coinType:o})=>{let{onchain:r}=t;return (await r.client.getBalance({owner:e,coinType:o})).balance},ta=(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()});},yt=async(t,e)=>{let{onchain:o,queryClient:r}=t,n=[],a=null,s=true;for(;s;){let i=await o.client.listBalances({owner:e,cursor:a,limit:50});n.push(...i.balances??[]),s=i.hasNextPage,a=i.cursor;}return n.length?n.reduce((i,c)=>{if(c.balance!=="0"){let d=utils.normalizeStructTag(c.coinType);i[d]=c,ta(r,{balance:c,coinType:d,address:e,node:o.url});}return i},{}):{}},Ao=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,coinNames:l=[...n.whitelist.lending.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},Oo=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,coinName:s}=e,l=n.parseCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},Po=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,sCoinNames:l=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseSCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},To=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,sCoinName:s}=e,l=n.parseSCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},ko=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n,queryClient:a}=t,{address:s,marketCoinNames:l=[...n.whitelist.scoin.values()]}=e,i=await o({queryKey:g.rpc.getAllCoinBalances({node:r.url,activeAddress:s}),queryFn:()=>yt({onchain:r,queryClient:a},s)});return l.reduce((d,u)=>{let p=n.parseMarketCoinType(u);return d[u]=p?Number(i[p]?.balance??0):0,d},{})},Ro=async(t,e)=>{let{fetchWithCache:o,onchain:r,metadata:n}=t,{address:a,marketCoinName:s}=e,l=n.parseMarketCoinType(s);if(!l)return 0;let i=await o({queryKey:g.rpc.getCoinBalance({node:r.url,address:a,coinType:l}),queryFn:()=>bt({onchain:r},{address:a,coinType:l})});return Number(i?.balance??0)},Io=async(t,e)=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,{getCoinDecimal:a,parseSCoinType:s,parseUnderlyingSCoinType:l,parseCoinName:i,addresses:{scoin:c}}=r,d=`${c.id}::s_coin_converter::total_supply`,u=c.coins[e]?.treasury;if(!u)throw A(t.logger,new O(`Treasury address not found for sCoin: ${e}`,{context:{sCoinName:e}}));let p=new suiKit.SuiTxBlock,y=await n({queryKey:g.rpc.getSharedObject({objectId:u,node:o.url}),queryFn:()=>o.getObject({objectId:u})});if(!y.object)throw A(t.logger,new k(`Failed to fetch treasury object ${u}`,{context:{treasury:u}}));let f=[await G({onchain:o,fetchWithCache:n},{tx:p,objectId:y.object})],b=[s(e),l(e)].filter(w=>!!w);p.moveCall(d,f,b);let m={include:{commandResults:true}},h=await n({queryKey:g.rpc.getInspectTxn({queryTarget:d,args:f,typeArgs:b,node:o.url,...m}),queryFn:()=>o.client.simulateTransaction({...m,transaction:p.txBlock})}),S=h?.commandResults;if(!S)throw A(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 w=S[0].returnValues[0].bcs,T=a(i(e)??"")??0;return bignumber_js.BigNumber(bcs.bcs.u64().parse(w)).shiftedBy(-T).toNumber()}return 0};var Ee=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain,queryClient:this.queryClient}}getCoinAmounts(e){return Ao(this.context,e)}getCoinAmount(e){return Oo(this.context,e)}getSCoinAmounts(e){return Po(this.context,e)}getSCoinAmount(e){return To(this.context,e)}getSCoinTotalSupply(e){return Io(this.context,e)}getMarketCoinAmounts(e){return ko(this.context,e)}getMarketCoinAmount(e){return Ro(this.context,e)}};var No="0x00481a93b819d744a7d79ecdc6c62c74f2f7cb4779316c4df640415817ac61bb";var na=async(t,{assetTypeMap:e})=>{let{onchain:o,fetchWithCache:r}=t,n=null,a=false,s=[];do{let c={parentId:No,limit:50,cursor:n},d=await r({queryKey:g.rpc.getDynamicFields(c),queryFn:()=>o.client.listDynamicFields(c)});if(!d)break;let u=d.dynamicFields.filter(p=>{let y=`0x${bcs.bcs.string().parse(p.name.bcs)}`;return !!e[y]}).map(p=>p.fieldId);s.push(...u),a=d.hasNextPage,n=d.cursor;}while(a);if(s.length===0)return [];let l={json:true},{objects:i}=await r({queryKey:g.rpc.getObjects({node:o.url,objectIds:s}),queryFn:()=>o.client.getObjects({objectIds:s,include:l})});return i},jo=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 na(t,{assetTypeMap:n})).filter(s=>!(s instanceof Error)).reduce((s,l)=>{if(l){let{name:i}=no(l),c=`0x${i}`,d=n[c];if(!d)return s;let u=+P(l);s[d]=u/1e4;}return s},{})};var Ve=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getFlashloanFees(e){return jo(this.context,{assetNames:e})}};var Bo=t=>{let o=P(t).ownership?.of;if(!o)throw new O(`Failed to parse obligation key object ${t.objectId}`,{context:{objectId:t.objectId}});return o};var _o=t=>{if(t)return {...t,collaterals:(t.collaterals??[]).map((e,o)=>({...e,type:X(e.type,`obligation.collaterals[${o}].type`)})),debts:(t.debts??[]).map((e,o)=>({...e,type:X(e.type,`obligation.debts[${o}].type`)}))}},Fo=(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(l=>l.toString(16).padStart(2,"0")).join("")}`};var Do=async(t,{address:e})=>{let{onchain:o,metadata:r,fetchWithCache:n}=t,a=`${r.addresses.protocolObjectId}::obligation::ObligationKey`,s=[],l=false,i=null;do{let c={owner:e,type:a,include:{json:true},limit:50,cursor:i},d=await n({queryKey:g.rpc.getOwnedObjects(c),queryFn:()=>o.client.listOwnedObjects(c)});s.push(...d.objects),d.hasNextPage&&d.cursor?(l=true,i=d.cursor):l=false;}while(l);return s},Mo=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{queryPackageId:a,version:s,market:l}=n.addresses,i=`${a}::obligation_query::obligation_data`,c=new suiKit.SuiTxBlock,d=m=>({objectId:m,include:{json:false,content:false}}),u=async m=>{let h=await r({queryKey:g.rpc.getObject({...d(m),node:o.url}),queryFn:()=>o.getObject(d(m))});if(!h.object)throw A(t.logger,new k(`Failed to fetch object ${m}`,{context:{objectId:m}}));return G({onchain:o,fetchWithCache:r},{tx:c,mutable:false,objectId:h.object})},p=await Promise.all([u(s),u(l),u(e)]);c.moveCall(i,[...p,c.txBlock.object.clock()]);let y=[s,l,e],f=await r({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:y,node:o.url}),queryFn:()=>o.client.simulateTransaction({transaction:c.txBlock,include:{events:true}})}),b=f.Transaction??f.FailedTransaction;if(!b.status.success)throw A(t.logger,new k(`Failed to query obligation data for obligationId ${e}: ${b.status.error.message}`,{context:{obligationId:e}}));return _o(b?.events?.[0]?.json)},Lo=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},Eo=async(t,{address:e})=>{let o=await Do(t,{address:e}),r=o.map(Bo),n=await ft(t,r);return o.map((a,s)=>{let l=n[s],i=l?P(l):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)},Vo=async(t,e)=>{let{metadata:{addresses:o},fetchWithCache:r,onchain:n}=t,a=o.obligationNaming.registryTableId,s=await Do(t,{address:e}),l=await Promise.all(s.map(async i=>{let c=Fo(i.objectId,e),d={parentId:a,name:L({type:"0x2::object::ID",value:c}),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(l.filter(i=>i!==null))};var qe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getObligations(e){return Eo(this.context,{address:e})}getObligationData(e){return Mo(this.context,e)}getObligationLocked(e){return Lo(this.context,e)}getObligationObjects(e){return ft(this.context,e)}getObligationNames(e){return Vo(this.context,e)}};var ca=t=>({pointType:H(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)}),qo=(t,e)=>({poolType:H(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=ca(r),a=t(n.pointType);return o[a]=n,o},{})}),Ko=(t,e,o,r,n)=>{let s=bignumber_js.BigNumber(t.distributedPointPerPeriod).dividedBy(t.period),l=bignumber_js.BigNumber(Math.floor(new Date().getTime()/1e3)-t.lastUpdate).dividedBy(t.period).toFixed(0),i=bignumber_js.BigNumber.minimum(bignumber_js.BigNumber(l).multipliedBy(t.distributedPointPerPeriod),bignumber_js.BigNumber(t.points)),c=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),y=p.shiftedBy(-1*n),f=y.multipliedBy(r),b=365*24*60*60,m=bignumber_js.BigNumber(s).shiftedBy(-1*o),h=bignumber_js.BigNumber(m).multipliedBy(b).multipliedBy(e),S=bignumber_js.BigNumber(1e12),w=bignumber_js.BigNumber(t.baseWeight).dividedBy(S),T=h.multipliedBy(w).dividedBy(f).isFinite()&&t.points>0?h.multipliedBy(w).dividedBy(f).toNumber():1/0;return {distributedPointPerSec:s.toNumber(),accumulatedPoints:i.toNumber(),currentPointIndex:c.toNumber(),currentTotalDistributedPoint:d.toNumber(),baseWeight:u.toNumber(),weightedStakedAmount:p.toNumber(),weightedStakedCoin:y.toNumber(),weightedStakedValue:f.toNumber(),rewardApr:T,rewardPerSec:m.toNumber()}},la=t=>({pointType:H(t.point_type),weightedAmount:Number(t.weighted_amount),points:Number(t.points),totalPoints:Number(t.total_points),index:Number(t.index)}),Wo=(t,e)=>({poolType:H(e.pool_type),debtAmount:Number(e.debt_amount),pointList:e.points_list.reduce((o,r)=>{let n=la(r),a=t(n.pointType);return o[a]=n,o},{})}),Uo=t=>{if(t)return {...t,incentive_pools:(t.incentive_pools??[]).map((e,o)=>({...e,pool_type:X(e.pool_type,`borrowIncentive.incentive_pools[${o}].pool_type`),points:(e.points??[]).map((r,n)=>({...r,point_type:X(r.point_type,`borrowIncentive.incentive_pools[${o}].points[${n}].point_type`)}))}))}},Qo=t=>{if(t)return {...t,pool_records:(t.pool_records??[]).map((e,o)=>({...e,pool_type:X(e.pool_type,`borrowIncentive.pool_records[${o}].pool_type`),points_list:(e.points_list??[]).map((r,n)=>({...r,point_type:X(r.point_type,`borrowIncentive.pool_records[${o}].points_list[${n}].point_type`)}))}))}};var da=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),ua=bcs.bcs.struct("Table",{id:bcs.bcs.Address,size:bcs.bcs.u64()}),$o=bcs.bcs.struct("IncentiveAccount",{id:bcs.bcs.Address,pool_records:ua,pool_types:bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(da)}),binded_ve_sca_key:bcs.bcs.option(bcs.bcs.Address)});var Yo=async(t,{coinNames:e,coinPrices:o})=>{let{onchain:r,metadata:n,fetchWithCache:a}=t,{borrowIncentive:s}=n.addresses,l=new suiKit.SuiTxBlock,i=`${s.query}::incentive_pools_query::incentive_pools_data`,c={objectId:s.incentivePools},d=await a({queryKey:g.rpc.getSharedObject({...c,node:r.url}),queryFn:()=>r.getObject(c)});if(!d.object)throw A(t.logger,new k(`Failed to fetch incentive pools object ${s.incentivePools}`,{context:{objectId:s.incentivePools}}));let p=[await G({onchain:r,fetchWithCache:a},{tx:l,mutable:true,objectId:d.object})];l.moveCall(i,p,[]);let y=await a({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentivePools],node:r.url}),queryFn:()=>r.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction,b=Uo(f?.events?.[0]?.json),m=e??[...n.whitelist.lending.values()],h={};for(let S of b?.incentive_pools??[]){let w={},T=qo(n.parseCoinNameFromType,S),B=S.pool_type,N=n.parseCoinNameFromType(B),I=o[N]??0,x=n.getCoinDecimal(N);if(x===void 0)throw A(t.logger,new O(`Coin decimal not found for ${N}`,{context:{poolCoinName:N}}));if(!m.includes(N))continue;for(let[K,Q]of Object.entries(T.poolPoints)){if(!Q)continue;let ie=Q.pointType,Z=n.parseCoinNameFromType(ie),re=n.getCoinDecimal(Z);if(re===void 0)throw A(t.logger,new O(`Coin decimal not found for ${Z}`,{context:{poolCoinName:Z}}));let M=o[Z]??0,fe=n.parseSymbol(Z),W=Ko(Q,M,re,I,x),Y=Q.points<=W.accumulatedPoints;Q.points>W.accumulatedPoints&&(w[K]={symbol:fe,coinName:Z,coinType:ie,coinDecimal:re,coinPrice:M,points:Q.points,distributedPoint:Q.distributedPoint,weightedAmount:Q.weightedAmount,...W,...Y?{rewardApr:0}:{}});}let v=bignumber_js.BigNumber(T.staked),j=v.shiftedBy(-x),F=j.multipliedBy(I);h[N]={coinName:N,symbol:n.parseSymbol(N),coinType:B,coinDecimal:x,coinPrice:I,stakedAmount:v.toNumber(),stakedCoin:j.toNumber(),stakedValue:F.toNumber(),points:w};}return h},Go=async(t,{coinNames:e,obligationId:o})=>{let{metadata:r,fetchWithCache:n,onchain:a}=t,{borrowIncentive:s}=r.addresses,l=new suiKit.SuiTxBlock,i=`${s.query}::incentive_account_query::incentive_account_data`,c=async(h,S)=>{let w=await n({queryKey:g.rpc.getSharedObject({objectId:h,node:a.url}),queryFn:()=>a.getObject({objectId:h})});if(!w.object)throw A(t.logger,new k(`Failed to fetch object ${h}`,{context:{objectId:h}}));return G({onchain:a,fetchWithCache:n},{tx:l,mutable:S,objectId:w.object})},[d,u]=await Promise.all([c(s.incentiveAccounts,true),c(o,true)]),p=[d,u];l.moveCall(i,p,[]);let y=await n({queryKey:g.rpc.getInspectTxn({queryTarget:i,args:[s.incentiveAccounts,o],node:a.url}),queryFn:()=>a.client.simulateTransaction({transaction:l.txBlock,include:{events:true}})}),f=y?.Transaction??y?.FailedTransaction,b=Qo(f?.events?.[0]?.json),m=e??[...r.whitelist.lending.values()];return b?b.pool_records.reduce((h,S)=>{let w=Wo(r.parseCoinNameFromType,S),T=w.poolType,B=r.parseCoinNameFromType(T);return m.includes(B)&&(h[B]=w),h},{}):{}},Ho=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,core:s}=n,l={objectId:a.incentiveAccounts,include:{json:true}},i=await r({queryKey:g.rpc.getObject(l),queryFn:()=>o.getObject(l)});if(!i.object)throw A(t.logger,new k(`Failed to fetch incentive accounts object with id ${a.incentiveAccounts}`,{context:{objectId:a.incentiveAccounts}}));let c=P(i.object).accounts.id,d=await ne(t,{parentId:c,name:L({type:`${a.object}::typed_id::TypedID<${s.object}::obligation::Obligation>`,value:e})});return d?$o.parse(d.dynamicField.value.bcs).binded_ve_sca_key:null},Xo=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{borrowIncentive:a,vesca:s}=n,l={objectId:a.incentivePools,include:{json:true}},i=await r({queryKey:g.rpc.getObject(l),queryFn:()=>o.getObject(l)});if(!i.object)throw A(t.logger,new k(`Failed to fetch incentive pool object with id ${a.incentivePools}`,{context:{objectId:a.incentivePools}}));let c=P(i.object).ve_sca_bind.id,d=`${a.object}::typed_id::TypedID<${s.object}::ve_sca::VeScaKey>`,u=await ne(t,{parentId:c,name:L({type:d,value:e})});return u?bcs.bcs.Address.parse(u.dynamicField.value.bcs):null};var Ke=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getBorrowIncentivePools(e){return Yo(this.context,e)}getBorrowIncentiveAccounts(e){return Go(this.context,e)}getBindedVeScaKey(e){return Ho(this.context,e)}getBindedObligation(e){return Xo(this.context,e)}};var Jo="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var er=bcs.bcs.bool(),tr=bcs.bcs.string();var ba=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,n=false,a=null,s=i=>i.name.type===Jo,l=[];do{let i={parentId:r.market,cursor:a,limit:50,include:{value:true}},{dynamicFields:c,hasNextPage:d,cursor:u}=await o({queryKey:g.rpc.getDynamicFields({...i,node:e.url}),queryFn:()=>e.client.listDynamicFields(i)}),p=c.filter(y=>s(y)?er.parse(y.valueType.bcs):false).map(y=>`0x${tr.parse(y.name.bcs)}`);l.push(...p),a=u,n=d;}while(n);return l},or=async t=>ba(t),rr=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 We=class extends R{onchain;constructor(e){let{onchain:o,...r}=e;super(r),this.onchain=o;}get context(){return {...this.baseContext,onchain:this.onchain}}getIsolatedAssets({source:e}){return V({source:e,label:"IsolatedAssetsRepository.getIsolatedAssets",logger:this.logger,api:()=>rr(this.context),onchain:()=>or(this.context)})}};var nr=bcs.bcs.struct("VeSca",{locked_amount:bcs.bcs.u64(),unlock_at:bcs.bcs.u64()});var ga=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=`${n.veSca.object}::ve_sca::VeScaKey`,s=[],l=false,i=null;do{let c={owner:e,type:a,include:{json:true},cursor:i,limit:50},d=await r({queryKey:g.rpc.getOwnedObjects({...c,node:o.url}),queryFn:()=>o.client.listOwnedObjects(c)});s.push(...d.objects),d.hasNextPage&&d.cursor?(l=true,i=d.cursor):l=false;}while(l);return s},ha=async t=>{let{onchain:e,fetchWithCache:o,metadata:{addresses:r}}=t,{id:n,config:a,treasury:s}=r.veSca,l=new suiKit.SuiTxBlock,i=async(S,w)=>{let T=await o({queryKey:g.rpc.getSharedObject({node:e.url,objectId:S}),queryFn:()=>e.getObject({objectId:S})});if(!T.object)throw A(t.logger,new k(`Failed to fetch object ${S}`,{context:{objectId:S}}));return G({onchain:e,fetchWithCache:o},{tx:l,mutable:w,objectId:T.object})},[c,d]=await Promise.all([i(s,true),i(a,false)]),u=`${n}::treasury::refresh`,p=[d,c,l.txBlock.object.clock()],y=`${n}::treasury::total_ve_sca_amount`,f=[c,l.txBlock.object.clock()];l.moveCall(u,p),l.moveCall(y,f);let m=(await o({queryKey:g.rpc.getTotalVeScaTreasuryAmount({refreshArgs:p,veScaAmountArgs:f,node:e.url}),queryFn:()=>e.client.simulateTransaction({transaction:l.txBlock,include:{commandResults:true}})}))?.commandResults;if(!m)throw A(t.logger,new k("Failed to fetch total veSca amount from treasury: No command results",{context:{treasury:s}}));let h=m[1]?.returnValues?.[0].bcs;if(!h)throw A(t.logger,new k("Failed to fetch result bcs from vesca treasury",{context:{treasury:s}}));return bcs.bcs.u64().parse(h)},he=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,a={parentId:r.veSca.tableId,name:L({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 l=s.value.bcs,i=nr.parse(l),c=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(c/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()}},ar=async(t,{address:e,excludeEmpty:o})=>{let r=await ga(t,e),n=(await Promise.all(r.map(a=>he(t,a.objectId)))).filter(a=>!!a);return n.sort((a,s)=>s.currentVeScaBalance-a.currentVeScaBalance),o?n.filter(a=>a.lockedScaAmount!=="0"):n},sr=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:L(a)});return await r.getObject({objectId:i.fieldId,include:{json:!0}})}catch(i){if(st(i))return null;throw i}}});if(!s?.object)return false;let l=P(s.object);return Array.isArray(l?.contents)&&l.contents.length>0},ir=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),l=bignumber_js.BigNumber(s.unlock_schedule.locked_sca_amount).shiftedBy(-9).toNumber(),i=bignumber_js.BigNumber(await ha(t)).shiftedBy(-9).toNumber(),c=l>0?i/l*4:0;return {totalLockedSca:l,totalVeSca:i,averageLockingPeriod:c,averageLockingPeriodUnit:"year"}};var Qe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeSca(e){return he(this.context,e)}getVeScasByAddress({address:e,excludeEmpty:o=true}){return ar(this.context,{address:e,excludeEmpty:o})}getVeScaTreasuryInfo(){return ir(this.context)}isVeScaKeyInSubsTable(e,o){return sr(this.context,{veScaKey:e,tableId:o})}};var cr=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 lr=bcs.bcs.u64();var xa=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 k("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Aa=async(t,{veScaKey:e,tableId:o})=>{let{onchain:r,fetchWithCache:n}=t,a={parentId:o,name:L({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(lr.parse(s.bcs)).shiftedBy(-9).toNumber()},dr=async(t,e)=>{let{metadata:{addresses:o}}=t,{rewardPool:r}=o.loyaltyProgram,n=await xa(t,r),{data:a,success:s}=cr.safeParse(n.json);return s?{pendingReward:e?await Aa(t,{veScaKey:e,tableId:a.userRewardTableId}).catch(()=>0):0,totalPoolReward:a.totalPoolReward,isClaimEnabled:a.isClaimEnabled}:{pendingReward:0,totalPoolReward:0,isClaimEnabled:false}};var $e=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getLoyaltyProgramInfos(e){return dr(this.context,e)}};var ht=t=>t.startsWith("0x")?t:`0x${t}`;var Oa=bcs.bcs.struct("TypeName",{name:bcs.bcs.string()}),Pa=t=>bcs.bcs.struct("VecSet",{contents:bcs.bcs.vector(t)}),ur=Pa(Oa);var Ta=3,pr=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:n}=t,{addresses:a,parseCoinNameFromType:s}=n,l=50,i={[`${a.pyth.object}::rule::Rule`]:"pyth",[`${a.supra.object}::rule::Rule`]:"supra",[`${a.switchboard.object}::rule::Rule`]:"switchboard"},c=null,d=true,u={};do{let p={parentId:e,cursor:c,limit:l,include:{value:true}},{dynamicFields:y,cursor:f,hasNextPage:b}=await r({queryKey:g.rpc.getDynamicFields({...p,node:o.url}),queryFn:()=>o.client.listDynamicFields(p)});c=f,d=b,y.forEach(m=>{let h=ht(bcs.bcs.string().parse(m.name.bcs)),S=s(h),w=ur.parse(m.value.bcs);u[S]||(u[S]=[]),w.contents.forEach(({name:T})=>{let B=i[ht(T)];B&&u[S].push(B);});});}while(d);return u},mr=async t=>{let{metadata:{addresses:e,whitelist:o}}=t,[r,n]=await Promise.all([pr(t,e.oracles.primaryPriceUpdatePolicyVecsetId),pr(t,e.oracles.secondaryPriceUpdatePolicyVecsetId)]);return [...o.lending.values()].reduce((a,s)=>(a[s]={primary:r[s]??[],secondary:n[s]??[]},a),{})},br=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([ne(t,{parentId:e.oracles.primaryPriceUpdatePolicyObject,name:{type:o,bcs:r}}),ne(t,{parentId:e.oracles.secondaryPriceUpdatePolicyObject,name:{type:o,bcs:r}})]);return {primary:n,secondary:a}},yr=async(t,e)=>{let{addresses:o,parseCoinType:r,getSwitchboardAggAddress:n}=t.metadata,a=o.oracles.switchboardRegistryTableId,s=[],l=e.map((i,c)=>{let d=n(i);return d||(s.push({idx:c,coinName:i}),null)});if(s.length===0)return l;if(s.length>Ta){let i=new Map;for(let d of s){let u=r(d.coinName);if(!u)throw A(t.logger,new O(`Invalid coin name: ${d.coinName}`,{context:{coinName:d.coinName}}));i.set(u.slice(2),d);}let c=await Ra(t,a,i);for(let[d,{idx:u}]of i){let p=c[d];if(!p)throw A(t.logger,new k(`No on-demand aggregator found for 0x${d}`,{context:{coinTypeKey:d}}));l[u]=p;}return l}return await Promise.all(s.map(async({idx:i,coinName:c})=>{let d=r(c);if(!d)throw A(t.logger,new O(`Invalid coin name: ${c}`,{context:{coinName:c}}));let u=await ne(t,{parentId:a,name:L({type:"0x1::type_name::TypeName",value:{name:d.slice(2)}})});if(!u)throw A(t.logger,new k(`No on-demand aggregator found for ${d}`,{context:{coinType:d}}));l[i]=bcs.bcs.Address.parse(u.dynamicField.value.bcs);})),l},ka=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}}},Ra=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,l=false;do{let i={parentId:e,cursor:s,limit:50,include:{value:true}},c=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});for(let d of c.dynamicFields){let u=ka(d);if(!u||!o.has(u))continue;let p=d.value?.bcs;p&&(a[u]=bcs.bcs.Address.parse(p));}s=c.cursor,l=c.hasNextPage&&Object.keys(a).length<o.size;}while(l);return a};var Ye=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getAssetOracles(){return mr(this.context)}getPriceUpdatePolicies(){return br(this.context)}getOnDemandAggObjectIds(e){return yr(this.context,e)}};var fr=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)}),gr=(t={})=>{let{spool:e,spoolReward:o}=t;if(!e||!o)throw new O("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}},hr=(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),l=t.createdAt,i=s.plus(t.lastUpdate).integerValue().toNumber(),c=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(c).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),y=bignumber_js.BigNumber(t.distributedPoint).plus(u),f=bignumber_js.BigNumber(t.staked),b=f.shiftedBy(-o),m=b.multipliedBy(e);return {distributedPointPerSec:n.toNumber(),accumulatedPoints:u.toNumber(),currentPointIndex:p.toNumber(),currentTotalDistributedPoint:y.toNumber(),startDate:new Date(l*1e3),endDate:new Date(i*1e3),stakedAmount:f.toNumber(),stakedCoin:b.toNumber(),stakedValue:m.toNumber()}},Cr=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)}),Sr=(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),l=s.shiftedBy(-n),i=l.multipliedBy(r),c=bignumber_js.BigNumber(e.rewards),d=c.shiftedBy(-n),u=d.multipliedBy(r),p=bignumber_js.BigNumber(e.claimedRewards),y=p.shiftedBy(-n),f=y.multipliedBy(r),b=bignumber_js.BigNumber(a).shiftedBy(-n).multipliedBy(31536e3).multipliedBy(r),m=b.dividedBy(o.stakedValue).isFinite()?b.dividedBy(o.stakedValue).toNumber():1/0;return (t.maxPoint<=t.distributedPoint||t.pointPerPeriod===0)&&(m=1/0),{rewardApr:m,totalRewardAmount:s.toNumber(),totalRewardCoin:l.toNumber(),totalRewardValue:i.toNumber(),remaindRewardAmount:c.toNumber(),remaindRewardCoin:d.toNumber(),remaindRewardValue:u.toNumber(),claimedRewardAmount:p.toNumber(),claimedRewardCoin:y.toNumber(),claimedRewardValue:f.toNumber(),rewardPerSec:a.toNumber()}},wr=t=>({...t,stakeType:ja(t.stakeType)}),ja=t=>{try{return H(t)}catch(e){throw new O("Failed to map Move type at spool.stakeType",{cause:e,context:{path:"spool.stakeType"}})}};var Ct=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")}),l=o?new Set(o):a.whitelist.spool,i=a.getSpoolRewardCoinName();return s.reduce((c,d)=>{if(!l.has(d.marketCoinName))return c;let u=a.parseCoinName(d.marketCoinName);return c[d.marketCoinName]={...d,coinPrice:e[u]??d.coinPrice,marketCoinPrice:e[d.marketCoinName]??d.marketCoinPrice,rewardCoinPrice:e[i]??d.rewardCoinPrice},c},{})},xr=async(t,{coinPrices:e,stakeCoinName:o})=>(await Ct(t,{coinPrices:e,stakeCoinNames:[o]}))[o]??null,Ar=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 Pr(t,a);return (await Promise.allSettled(n.map((i,c)=>St(t,{coinPrices:e,stakeCoinName:i,requiredObjects:s[a[c]]})))).reduce((i,c,d)=>(c.status==="fulfilled"&&c.value&&(i[n[d]]=c.value),i),{})},St=async(t,{coinPrices:e,stakeCoinName:o,requiredObjects:r})=>{let{metadata:n}=t,a=n.parseCoinName(o),s=n.getSpoolRewardCoinName(),l=wr(gr(r??(await Pr(t,[a]))[a])),i=fr(l),c=e[o]??0,d=hr(i,c,n.getCoinDecimal(o)),u=Cr(l),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:c,rewardCoinPrice:p,maxPoint:i.maxPoint,distributedPoint:i.distributedPoint,maxStake:i.maxStake,...d,exchangeRateNumerator:u.exchangeRateNumerator,exchangeRateDenominator:u.exchangeRateDenominator,...Sr(i,u,d,p,n.getCoinDecimal(s))}},Or=async(t,{address:e,stakeCoinNames:o})=>{let{metadata:r}=t,n=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount`,a=await va(t,{address:e,stakeAccountType:n}),s=(o??[...r.whitelist.spool.values()]).reduce((c,d)=>(c[d]=[],c),{}),l=Object.keys(s).reduce((c,d)=>{let u=r.parseCoinName(d),p=r.parseMarketCoinType(u);return c[d]=`${r.addresses.spoolObjectId}::spool_account::SpoolAccount<${p}>`,c},{}),i=Object.entries(l).reduce((c,[d,u])=>(c[u]=d,c),{});for(let c of a){let{objectId:d,type:u,json:p}=c;if(!d||!u||!p)continue;let y=P(c),f=utils.normalizeStructTag(u),b=i[f],m=s[b];m&&m.push({id:d,type:f,stakePoolId:String(y.spool_id),stakeType:utils.normalizeStructTag(String(y.stake_type)),staked:Number(y.stakes),index:Number(y.index),points:Number(y.points),totalPoints:Number(y.total_points)});}return s},wt=async(t,{stakeCoinNames:e})=>(await Promise.allSettled(e.map(r=>Ba(t,{stakeCoinName:r})))).reduce((r,n,a)=>(n.status==="fulfilled"&&(r[e[a]]=n.value),r),{}),va=async(t,{address:e,stakeAccountType:o})=>{let{onchain:r,fetchWithCache:n}=t,a=false,s=null,l=[];do{let i={owner:e,type:o,include:{json:true},cursor:s,limit:50},c=await n({queryKey:g.rpc.getOwnedObjects(i),queryFn:()=>r.client.listOwnedObjects(i)});c.objects&&l.push(...c.objects),c.hasNextPage&&c.cursor?(a=true,s=c.cursor):a=false;}while(a);return l},Pr=async({onchain:t,metadata:e,fetchWithCache:o},r)=>{let n=["spool","spoolReward","sCoinTreasury"],a=r.flatMap(c=>{let d=e.poolAddresses[c];return n.flatMap(u=>{let p=d?.[u];return p?[p]:[]})}),s=[],l=ue([...new Set(a)],50);for(let c of l){let d=await o({queryKey:g.rpc.getObjects({objectIds:c,node:t.url}),queryFn:()=>t.client.getObjects({objectIds:c,include:{json:true}})});s.push(...d.objects.filter(u=>!(u instanceof Error)));}let i=s.reduce((c,d)=>(c[d.objectId]=d,c),{});return r.reduce((c,d)=>{let u=e.poolAddresses[d];return c[d]={spool:i[u?.spool??""],spoolReward:i[u?.spoolReward??""]},c},{})},Ba=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 c=P(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),stakePoolId:String(c.spool_id),ratioNumerator:Number(c.exchange_rate_numerator),ratioDenominator:Number(c.exchange_rate_denominator),rewards:Number(c.rewards),claimedRewards:Number(c.claimed_rewards)}},Tr=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 c=P(i);return {id:i.objectId,type:utils.normalizeStructTag(i.type??""),maxPoint:Number(c.max_distributed_point),distributedPoint:Number(c.distributed_point),pointPerPeriod:Number(c.distributed_point_per_period),period:Number(c.point_distribution_time),maxStake:Number(c.max_stakes),stakeType:utils.normalizeStructTag(String(c.stake_type)),totalStaked:Number(c.stakes),index:Number(c.index),createdAt:Number(c.created_at),lastUpdate:Number(c.last_update)}};var Ge=class extends R{indexer;onchain;constructor({indexer:e,onchain:o,...r}){super(r),this.indexer=e,this.onchain=o;}get context(){return {...this.baseContext,indexer:this.indexer,onchain:this.onchain}}getSpools({stakeCoinNames:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpools",logger:this.logger,api:()=>Ct(this.context,{stakeCoinNames:e,coinPrices:o}),onchain:()=>Ar(this.context,{stakeCoinNames:e,coinPrices:o})})}getSpool({stakeCoinName:e,coinPrices:o,source:r="api-first"}){return V({source:r,label:"SpoolRepository.getSpool",logger:this.logger,api:()=>xr(this.context,{stakeCoinName:e,coinPrices:o}),onchain:()=>St(this.context,{stakeCoinName:e,coinPrices:o})})}getStakeAccounts(e){return Or(this.context,e)}async getStakeAccountsByPool(e,o){return (await this.getStakeAccounts({address:e,stakeCoinNames:[o]}))[o]||[]}getSpoolRewardPools(e){return wt(this.context,{stakeCoinNames:e})}getSpoolRewardPool(e){return wt(this.context,{stakeCoinNames:[e]}).then(o=>o[e])}getStakePool(e){return Tr(this.context,e)}};var kr=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 Rr=bcs.bcs.u64();var Da=async(t,e)=>{let{onchain:o,metadata:{addresses:r},fetchWithCache:n}=t,{veScaRewardTableId:a}=r.veScaLoyaltyProgram,s={parentId:a,name:L({type:"0x2::object::ID",value:e})},{dynamicField:{value:l}}=await n({queryKey:g.rpc.getDynamicFieldObject({...s,node:o.url}),queryFn:()=>o.client.getDynamicField(s)});return bignumber_js.BigNumber(Rr.parse(l.bcs)).shiftedBy(-9).toNumber()},Ma=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 k("Failed to fetch reward pool object",{context:{rewardPoolId:e}}));return a},Ir=async(t,e)=>{let{metadata:{addresses:o}}=t,{veScaRewardPool:r}=o.veScaLoyaltyProgram,n=await Ma(t,r),{data:a,success:s}=kr.safeParse(n.json);if(!s||!a.reserveVeScaKey)return {isClaimEnabled:false,totalPoolReward:0,pendingVeScaReward:0,pendingScaReward:0};let l=await he(t,a.reserveVeScaKey),i=e?await Da(t,e).catch(()=>0):0,c=Math.max((l?.unlockAt??0)-Date.now(),0);return {pendingScaReward:i,pendingVeScaReward:i*(Math.floor(c/1e3)/126144e3),totalPoolReward:l?.currentVeScaBalance??0,isClaimEnabled:a.isClaimEnabled}};var He=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaLoyaltyProgramInfos(e){return Ir(this.context,e)}};var Nr=bcs.bcs.Address;var jr=async(t,e)=>{let{metadata:{addresses:o}}=t,r={parentId:o.referral.bindingTableId,name:L({type:"address",value:e})},n=await ne(t,r);return n?Nr.parse(n.dynamicField.value.bcs):null};var Xe=class extends R{onchain;constructor({onchain:e,...o}){super(o),this.onchain=e;}get context(){return {...this.baseContext,onchain:this.onchain}}getVeScaKeyIdFromReferralBindings(e){return jr(this.context,e)}};var oe=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()}),vr=zod.z.object({id:zod.z.string(),size:zod.z.string()}),Br=zod.z.object({asset_active_states:zod.z.object({base:oe,collateral:oe}),borrow_dynamics:oe,collateral_stats:oe,id:zod.z.string(),interest_models:oe,limiters:oe,reward_factors:oe,risk_models:oe,vault:zod.z.object({balance_sheets:oe,flash_loan_fees:oe,id:zod.z.string(),market_coin_supplies:vr,underlying_balances:vr})});var ge="0x1::type_name::TypeName",_r="0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da::market_dynamic_keys::BorrowFeeKey",Fr="0x6e641f0dca8aedab3101d047e96439178f16301bf0b57fe8745086ff1195eb3e::market_dynamic_keys::SupplyLimitKey",Dr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey",Mr="0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey";var Lr=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,[l,i])=>(o.has(l)&&(s[l]=i),s),{})},Ea=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}},se=async(t,{parentId:e,type:o,coinTypeKeys:r})=>{let{onchain:n,fetchWithCache:a}=t,s={},l=null,i=false;do{let c={parentId:e,cursor:l,limit:50},d=await a({queryKey:g.rpc.getDynamicFields({...c,node:n.url}),queryFn:()=>n.client.listDynamicFields(c)});for(let u of d.dynamicFields){if(u.name.type!==o)continue;let p=Ea(u);p&&r.has(p)&&(s[p]=u.fieldId);}l=d.cursor,i=d.hasNextPage;}while(i);return s},Va=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 ue(n,50)){let{objects:l}=await r({queryKey:g.rpc.getObjects({objectIds:s,node:o.url}),queryFn:()=>o.client.getObjects({objectIds:s,include:{json:true}})});for(let i of l)i instanceof Error||(a[i.objectId]=i);}return Object.entries(e).reduce((s,[l,i])=>(s[l]=Object.entries(i).reduce((c,[d,u])=>{let p=a[u];return c[d]=p?{objectId:p.objectId,json:p.json}:void 0,c},{}),s),{})},qa=async(t,e,o)=>{let{onchain:r,fetchWithCache:n}=t,a={},s=null,l=false;do{let i={parentId:o,limit:50,cursor:s},c=await n({queryKey:g.rpc.getDynamicFields({...i,node:r.url}),queryFn:()=>r.client.listDynamicFields(i)});if(!c)break;for(let d of c.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=c.cursor,l=c.hasNextPage;}while(l);return a},Er=async(t,{poolNames:e=[]})=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,{core:a,spool:s,scoin:l}=n,{market:i,coins:c}=a,d={objectId:i,include:{json:true}},{object:u}=await r({queryKey:g.rpc.getObject({...d,node:o.url}),queryFn:()=>o.getObject(d)}),p=Br.safeParse(u?.json);if(!p.success)throw A(t.logger,new O("Failed to parse market object from on-chain data",{context:{market:i},cause:p.error}));let y=p.data,f=y.vault.balance_sheets.table.id,b=y.collateral_stats.table.id,m=y.borrow_dynamics.table.id,h=y.interest_models.table.id,S=y.risk_models.table.id,w=y.vault.flash_loan_fees.table.id,T=new Set(e),B=Object.entries(c).filter(W=>{let[Y,be]=W;return be?.coinType?T.size===0||T.has(Y):false});if(B.length===0)throw A(t.logger,new k("No coins to resolve pool addresses for (empty config or filter matched nothing)",{context:{poolNames:e}}));let N=await qa(t,new Set(B.map(([,W])=>W.coinType)),w),I=new Set(B.map(([,W])=>W.coinType.slice(2))),[x,v,j,F,K,Q,ie,Z,re]=await Promise.all([se(t,{parentId:f,type:ge,coinTypeKeys:I}),se(t,{parentId:b,type:ge,coinTypeKeys:I}),se(t,{parentId:m,type:ge,coinTypeKeys:I}),se(t,{parentId:h,type:ge,coinTypeKeys:I}),se(t,{parentId:S,type:ge,coinTypeKeys:I}),se(t,{parentId:i,type:_r,coinTypeKeys:I}),se(t,{parentId:i,type:Fr,coinTypeKeys:I}),se(t,{parentId:i,type:Dr,coinTypeKeys:I}),se(t,{parentId:i,type:Mr,coinTypeKeys:I})]),M=await Va(t,{lendingPool:x,collateralPool:v,borrowDynamic:j,interestModel:F,riskModel:K,borrowFee:Q,supplyLimit:ie,borrowLimit:Z,isolatedAsset:re}),fe={};for(let[W,Y]of B){let{coinType:be}=Y,ee=be.slice(2),at=M.lendingPool[ee],hn=M.collateralPool[ee],Cn=M.borrowDynamic[ee],Sn=M.interestModel[ee],wn=M.riskModel[ee],xn=M.borrowFee[ee],An=M.supplyLimit[ee],On=M.borrowLimit[ee],Nt=M.isolatedAsset[ee]?.json,ke=`s${W}`,jt=s.pools[ke],Re=l.coins[ke],vt=Y.oracle?.pyth;fe[W]={coinName:W,symbol:Y.symbol,coinType:be,coinMetadataId:Y.metaData,decimals:Y.decimals,lendingPoolAddress:at?.objectId??"",collateralPoolAddress:hn?.objectId??"",borrowDynamic:Cn?.objectId??"",interestModel:Sn?.objectId??"",riskModel:wn?.objectId,borrowFeeKey:xn?.objectId??"",supplyLimitKey:An?.objectId??"",borrowLimitKey:On?.objectId??"",isolatedAssetKey:Nt?.id??"",isIsolated:Nt?.value??false,spool:jt?.id??"",spoolReward:jt?.rewardPoolId??"",spoolName:ke,sCoinName:ke,sCoinType:Re?.coinType??"",sCoinTreasury:Re?.treasury??"",sCoinMetadataId:Re?.metaData??"",sCoinSymbol:Re?.symbol??"",pythFeed:vt?.feed??"",pythFeedObjectId:vt?.feedObject??"",flashloanFeeObject:N[be]??""};}return fe};var Je=class extends R{api;onchain;constructor({api:e,onchain:o,...r}){super(r),this.api=e,this.onchain=o;}get context(){return {...this.baseContext,api:this.api,onchain:this.onchain}}getPoolAddresses({poolNames:e,source:o="api"}){return V({source:o,label:"PoolAddressesRepository.getPoolAddresses",logger:this.logger,api:()=>Lr(this.context,{poolNames:e}),onchain:()=>Er(this.context,{poolNames:e})})}};var Vr="https://hermes.pyth.network";var qr=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 Wr=({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 Ur=async(t,e)=>{let{fetchWithCache:o,metadata:{addresses:r},pythPriceServiceConfig:{endpoint:n,config:a}}=t,s=new Map(e.map(d=>[d,r.coins[d]?.oracle?.pyth?.feed])),l=Array.from(new Set(s.values())).filter(d=>!!d),i=new pythSuiJs.SuiPriceServiceConnection(n,a),{parsed:c}=await i.getLatestPriceUpdates(l,{parsed:true,ignoreInvalidPriceIds:true});if(!c)throw A(t.logger,new Ie("Failed to fetch price feeds from Pyth API",{context:{endpoint:n,priceFeedIds:l}}));return await o({queryKey:g.oracle.getPythLatestPriceFeeds(n,l),queryFn:()=>{let d=new Map;for(let p of c)d.set(p.id,bignumber_js.BigNumber(p.price.price).shiftedBy(p.price.expo).toNumber());let u={};for(let[p,y]of s)u[p]=(y!==void 0?d.get(y):void 0)??0;return u}})},Qr=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},$r=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))},zr=async(t,e)=>{let{onchain:o,fetchWithCache:r,metadata:{addresses:n}}=t,a=new Map(e.map(c=>[c,n.coins[c]?.oracle?.pyth?.feedObject])),s=Array.from(new Set(a.values())).filter(c=>!!c),l=new Map;for(let c of ue(s,50)){let d={objectIds:c,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 k("Failed to fetch price feed object on chain",{cause:p}));let{data:y,success:f}=qr.safeParse(p.json);if(!f)throw A(t.logger,new O("Failed to parse price feed object",{context:{objectId:p.objectId,json:JSON.stringify(p.json)}}));let{price_feed:b}=y.price_info;l.set(p.objectId,Wr(b.price).toNumber());}}let i={};for(let[c,d]of a)i[c]=(d!==void 0?l.get(d):void 0)??0;return i},Yr=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,l)=>(e.includes(l.coinName)&&(s[l.coinName]=l.coinPrice),s),{})};var Ze=class extends R{config;indexer;onchain;constructor({pythPriceServiceConfig:e,indexer:o,onchain:r,...n}){super(n),this.config=e??{endpoint:Vr,config:{timeout:4e3,httpRetries:1}},this.indexer=o,this.onchain=r;}get context(){return {...this.baseContext,onchain:this.onchain,indexer:this.indexer,pythPriceServiceConfig:this.config}}getPricesFromPyth({coinNames:e,source:o="api-first"}){return V({source:o,label:"PriceRepository.getPriceFromPyth",logger:this.logger,api:()=>Ur(this.context,e),onchain:()=>zr(this.context,e)})}getPythFeedObject(e){return Qr(this.context,e)}getPythFeedObjects(e){return $r(this.context,e)}getPricesFromIndexer(e){return Yr(this.context,e)}};var Gr=t=>{let{utils:e,indexerUrl:o,queryClientConfig:r=Fe}=t,n=e.onchain,a=_t(o),s=t.queryClient??new queryCore.QueryClient(r),l=e.logger,i={onchain:n,queryClient:s,logger:l},c,d,u,p,y,f,b,m,h,S,w,T,B,N;return {get market(){return c??=new Le({...i,indexer:a,addresses:Lt(e),metadata:Mt(e)})},get coinBalance(){return d??=new Ee({...i,metadata:Et(e)})},get flashloan(){return u??=new Ve({...i,metadata:Vt(e)})},get obligation(){return p??=new qe({...i,metadata:qt(e)})},get borrowIncentive(){return y??=new Ke({...i,metadata:Kt(e)})},get isolatedAssets(){return f??=new We({...i,metadata:$t(e)})},get veSca(){return b??=new Qe({...i,metadata:zt(e)})},get loyaltyProgram(){return m??=new $e({...i,metadata:Yt(e)})},get xOracle(){return h??=new Ye({...i,metadata:Xt(e)})},get spool(){return S??=new Ge({...i,indexer:a,metadata:Ht(e)})},get veScaLoyaltyProgram(){return w??=new He({...i,metadata:Gt(e)})},get referral(){return T??=new Xe({...i,metadata:Wt(e)})},get price(){return B??=new Ze({...i,indexer:a,metadata:Ut(e)})},get poolAddresses(){return N??=new Je({...i,api:Ft(),metadata:Qt(e)})}}};var Hr=(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",Qa={rpc:"onchain",indexer:"api","indexer-first":"api-first"},me=t=>t?.source?Qa[t.source]:t?.indexer?"api-first":"onchain";[suiKit.getFullnodeUrl("mainnet")];var xe=(...t)=>bignumber_js.BigNumber(t.reduce((e,o)=>new bignumber_js.BigNumber(o).lt(e)?o:e));var et=(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 Ga=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})),Ha=(t,e)=>Object.values(t).filter(o=>!!o&&(o.totalBorrowedValueWithWeight>0||o.totalDepositedValue>0)).map(o=>({obligationId:o.obligationId,totalDebtsInUsd:o.totalBorrowedValueWithWeight,totalCollateralInUsd:o.totalDepositedValue,riskLevel:o.totalRiskLevel,availableCollateralInUsd:o.totalAvailableCollateralValue,totalUnhealthyCollateralInUsd:o.totalUnhealthyCollateralValue,collaterals:Object.values(o.collaterals).filter(r=>!!r&&r.depositedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,depositedCoin:r.depositedCoin,depositedValueInUsd:r.depositedValue})),borrowedPools:Object.values(o.debts).filter(r=>!!r&&r.borrowedCoin>0).map(r=>({coinName:r.coinName,symbol:r.symbol,coinDecimals:r.coinDecimal,coinType:r.coinType,coinPrice:r.coinPrice,borrowedCoin:r.borrowedCoin,borrowedValueInUsd:r.borrowedValueWithWeight,borrowApr:e[r.coinName]?.borrowApr,borrowApy:e[r.coinName]?.borrowApy,incentiveInfos:(o.borrowIncentives[r.coinName]?.rewards??[]).filter(n=>!!n&&isFinite(n.baseRewardApr)).map(n=>({coinName:n.coinName,symbol:n.symbol,coinType:n.coinType,boostValue:n.boostValue,maxBoost:n.maxBoost,incentiveApr:n.baseRewardApr,boostedIncentiveApr:n.boostedRewardApr}))}))})),Ae="sui",Xa="SUI",Ja=(t,e)=>Object.values(t).reduce((o,r)=>{if(r){if(r.availableClaimCoin===0)return o;o[Ae]?o[Ae].pendingRewardInCoin+=r.availableClaimCoin:o[Ae]={symbol:Xa,coinType:suiKit.normalizeStructTag(suiKit.SUI_TYPE_ARG),coinPrice:e[Ae]??0,pendingRewardInCoin:r.availableClaimCoin};}return o},{}),Za=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),{}),es=(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})),ts=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}},os=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),l=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:l.toNumber(),availableWithdrawAmount:0,availableWithdrawCoin:0},depositedValue:r,borrowCapacityValue:n,requiredCollateralValue:a,isDeposited:e.isGreaterThan(0)}},rs=1e9,ns=bignumber_js.BigNumber(1e12),as=t=>{let e=[];Object.entries(t.borrowIncentiveAccount.pointList).forEach(([n,a])=>{let s=t.borrowIncentivePool.points[t.toMarketCoinName(n)];if(!a||!s)return;let l=bignumber_js.BigNumber(a.weightedAmount),i=s.currentPointIndex?Math.max(bignumber_js.BigNumber(s.currentPointIndex-a.index).dividedBy(rs).toNumber(),0):1,c=l.multipliedBy(i).plus(a.points),d=c.shiftedBy(-s.coinDecimal),u=bignumber_js.BigNumber(s.baseWeight).dividedBy(ns),p=bignumber_js.BigNumber(a.weightedAmount).div(bignumber_js.BigNumber(t.borrowIncentiveAccount.debtAmount).multipliedBy(u)),y=p.isFinite()?p.toNumber():1,f=isFinite(s.rewardApr)?s.rewardApr:0;c.isGreaterThanOrEqualTo(0)&&e.push({coinName:s.coinName,coinType:s.coinType,symbol:s.symbol,coinDecimal:s.coinDecimal,coinPrice:s.coinPrice,weightedBorrowAmount:l.toNumber(),availableClaimAmount:c.toNumber(),availableClaimCoin:d.toNumber(),baseRewardApr:f,boostedRewardApr:f*y,maxBoost:1/u.toNumber(),boostValue:y});});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}},ss=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),l=s.shiftedBy(-t.coinDecimal),i=a.multipliedBy(t.coinPrice),c=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:c.toNumber(),borrowIndex:Number(t.debt?.borrowIndex??0),requiredRepayAmount:n.toNumber(),requiredRepayCoin:a.toNumber(),availableBorrowAmount:0,availableBorrowCoin:0,availableRepayAmount:s.toNumber(),availableRepayCoin:l.toNumber(),rewards:(t.rewards??[]).filter(({weightedBorrowAmount:u})=>u>0)},borrowedValue:i,borrowedValueWithWeight:c,isBorrowed:o.isGreaterThan(0)}},is=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()}},cs=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):xe(e.multipliedBy(et(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()}},ls=t=>{let e=bignumber_js.BigNumber(t.obligationDebt.requiredRepayAmount).multipliedBy(et(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)?xe(o.multipliedBy(et(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()}},Zr=t=>{let{coinName:e,symbol:o,coinType:r,marketCoinType:n,coinDecimal:a,coinPrice:s,marketPool:l,spool:i,stakeAccounts:c,coinAmount:d,marketCoinAmount:u,sCoinAmount:p}=t,y=bignumber_js.BigNumber(0),f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),h=bignumber_js.BigNumber(0),S=bignumber_js.BigNumber(0),w=bignumber_js.BigNumber(0),T=bignumber_js.BigNumber(0),B=bignumber_js.BigNumber(0);if(i)for(let re of c){let M=bignumber_js.BigNumber(re.staked),fe=M.shiftedBy(-i.coinDecimal),W=M.multipliedBy(l?.conversionRate??1),Y=W.shiftedBy(-i.coinDecimal),be=Y.multipliedBy(i.coinPrice);y=y.plus(M),f=f.plus(fe),b=b.plus(W),m=m.plus(Y),h=h.plus(be),S=S.plus(M),w=S.shiftedBy(-i.coinDecimal);let at=i.currentPointIndex?bignumber_js.BigNumber(i.currentPointIndex-re.index).dividedBy(1e9):1;T=T.plus(M.multipliedBy(at).plus(re.points).multipliedBy(i.exchangeRateNumerator).dividedBy(i.exchangeRateDenominator)),B=T.shiftedBy(-i.rewardCoinDecimal);}let N=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)).multipliedBy(l?.conversionRate??1),I=N.shiftedBy(-a),x=I.multipliedBy(s??0),v=bignumber_js.BigNumber(s??0).multipliedBy(l?.conversionRate??1),j=bignumber_js.BigNumber(u).plus(bignumber_js.BigNumber(p)),F=j.shiftedBy(-a),K=bignumber_js.BigNumber(d),Q=K.shiftedBy(-a),ie=xe(N,l?.supplyAmount??1/0).plus(b),Z=xe(I,l?.supplyCoin??1/0).plus(m);return {coinName:e,symbol:o,coinType:r,marketCoinType:n,sCoinType:l?.sCoinType??"",coinDecimal:a,coinPrice:s??0,conversionRate:l?.conversionRate??1,marketCoinPrice:v.toNumber(),supplyApr:l?.supplyApr??0,supplyApy:l?.supplyApy??0,rewardApr:i?.rewardApr??0,suppliedAmount:N.plus(b).toNumber(),suppliedCoin:I.plus(m).toNumber(),suppliedValue:x.plus(h).toNumber(),stakedMarketAmount:y.toNumber(),stakedMarketCoin:f.toNumber(),stakedAmount:b.toNumber(),stakedCoin:m.toNumber(),stakedValue:h.toNumber(),unstakedMarketAmount:j.toNumber(),unstakedMarketCoin:F.toNumber(),unstakedAmount:N.toNumber(),unstakedCoin:I.toNumber(),unstakedValue:x.toNumber(),availableSupplyAmount:K.toNumber(),availableSupplyCoin:Q.toNumber(),availableWithdrawAmount:ie.toNumber(),availableWithdrawCoin:Z.toNumber(),availableStakeAmount:j.toNumber(),availableStakeCoin:F.toNumber(),availableUnstakeAmount:S.toNumber(),availableUnstakeCoin:w.toNumber(),availableClaimAmount:T.toNumber(),availableClaimCoin:B.toNumber(),isIsolated:l?l.isIsolated:false}},en=t=>{let{obligationId:e,collateralCoinNames:o,market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:l,borrowIncentiveAccounts:i,utils:c}=t,d={},u={},p={},y=0,f=bignumber_js.BigNumber(0),b=bignumber_js.BigNumber(0),m=bignumber_js.BigNumber(0),h=0,S=0,w=bignumber_js.BigNumber(0),T=bignumber_js.BigNumber(0);for(let x of o){let v=s?.collaterals.find(K=>c.parseCoinNameFromType(K.type)===x),j=r.collaterals[x];if(!j)continue;let F=os({assetCoinName:x,coinType:c.parseCoinType(x),symbol:c.parseSymbol(x),coinDecimal:c.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketCollateral:j,depositedRawAmount:v?.amount});f=f.plus(F.depositedValue),b=b.plus(F.borrowCapacityValue),m=m.plus(F.requiredCollateralValue),F.isDeposited&&y++,d[x]=F.entry;}for(let[x,v]of Object.entries(i)){if(!v)continue;let j=l[x];if(!j)continue;let F=as({borrowIncentivePool:j,borrowIncentiveAccount:v,toMarketCoinName:K=>c.parseSCoinTypeNameToMarketCoinName(K)});F.contributesRewardedPool&&S++,p[x]={coinName:j.coinName,coinType:j.coinType,symbol:j.symbol,coinDecimal:j.coinDecimal,coinPrice:j.coinPrice,rewards:F.rewards};}let B=[...new Set(Object.values(r.pools).filter(x=>!!x).map(x=>x.coinName))];for(let x of B){let v=s?.debts.find(K=>c.parseCoinNameFromType(K.type)===x),j=r.pools[x];if(!j)continue;let F=ss({assetCoinName:x,coinType:c.parseCoinType(x),symbol:c.parseSymbol(x),coinDecimal:c.getCoinDecimal(x),coinPrice:n?.[x]??0,coinAmount:a?.[x]??0,marketPool:j,debt:v?{amount:v.amount,borrowIndex:v.borrowIndex}:void 0,rewards:p[x]?.rewards});w=w.plus(F.borrowedValue),T=T.plus(F.borrowedValueWithWeight),F.isBorrowed&&h++,u[x]=F.entry;}let N=is({totalDepositedValue:f,totalBorrowedValue:w,totalBorrowCapacityValue:b,totalBorrowedValueWithWeight:T,totalRequiredCollateralValue:m}),I={obligationId:e,totalDepositedValue:f.toNumber(),totalBorrowedValue:w.toNumber(),totalBalanceValue:N.accountBalanceValue,totalBorrowCapacityValue:b.toNumber(),totalAvailableCollateralValue:N.availableCollateralValue,totalBorrowedValueWithWeight:T.toNumber(),totalRequiredCollateralValue:N.requiredCollateralValue,totalUnhealthyCollateralValue:N.unhealthyCollateralValue,totalRiskLevel:N.riskLevel,totalDepositedPools:y,totalBorrowedPools:h,totalRewardedPools:S,collaterals:d,debts:u,borrowIncentives:p};for(let[x,v]of Object.entries(I.collaterals)){if(!v)continue;let j=r.collaterals[x];if(!j)continue;let{availableWithdrawAmount:F,availableWithdrawCoin:K}=cs({obligationCollateral:v,marketCollateral:j,totalAvailableCollateralValue:I.totalAvailableCollateralValue,totalBorrowedValueWithWeight:I.totalBorrowedValueWithWeight});v.availableWithdrawAmount=F,v.availableWithdrawCoin=K;}for(let[x,v]of Object.entries(I.debts)){if(!v)continue;let j=r.pools[x];if(!j)continue;let{availableBorrowAmount:F,availableBorrowCoin:K,requiredRepayAmount:Q,requiredRepayCoin:ie}=ls({obligationDebt:v,marketPool:j,totalAvailableCollateralValue:I.totalAvailableCollateralValue});v.availableBorrowAmount=F,v.availableBorrowCoin=K,v.requiredRepayAmount=Q,v.requiredRepayCoin=ie;}return I},tn=t=>{let{lendings:e,obligationAccounts:o,veScas:r,coinPrices:n,marketPools:a}=t,s=Ga(e),l=Ha(o,a),i=Ja(e,n),c=Za(o),d=es(r,n.sca??0);return {...ts({parsedLendings:s,parsedObligationAccounts:l,parsedVeScas:d}),lendings:s,borrowings:l,pendingRewards:{lendings:Object.values(i).map(p=>({...p,coinName:Ae,pendingRewardInUsd:p.coinPrice*p.pendingRewardInCoin})),borrowIncentives:Object.entries(c).map(([p,y])=>({coinName:p,...y,pendingRewardInUsd:y.coinPrice*y.pendingRewardInCoin}))},veScas:d}},on=t=>{let{coinPrices:e,marketPools:o,sCoinNames:r,parseCoinName:n}=t,a={};for(let s of r){let l=n(s);a[s]=bignumber_js.BigNumber(e[l]??0).multipliedBy(o[l]?.conversionRate??1).toNumber();}return {...e,...a}};var rn=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 nn=async(t,e)=>{let{api:o,fetchWithCache:r}=t;return r({queryKey:g.api.getAddresses({addressId:e}),queryFn:()=>o.get(`/addresses/${e}`)})};var tt=class extends R{api;constructor({api:e,...o}){super(o),this.api=e;}get context(){return {...this.baseContext,api:this.api}}read(e){return nn(this.context,e)}};var At=class{url;addressId;addressApiRepo;network;logger;currentAddresses;addressMap=new Map;constructor({addressId:e,url:o=Ne,timeout:r,httpClient:n,network:a="mainnet",logger:s=le,forceAddressesInterface:l}){this.url=o,this.addressId=e,this.network=a,this.logger=s,this.addressApiRepo=new tt({api:new ce({url:o,timeout:r,httpClient:n})}),l&&this.initializeForcedAddresses(l);}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)}},an=At;var ot=({poolAddresses:t,whitelist:e,parseToOldMarketCoin:o})=>{let r=Object.fromEntries([...Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[b,m.decimals]),...Object.entries(t).filter(([b,m])=>!!m?.sCoinName).map(([b,m])=>[m.sCoinName,m.decimals])]),n=Object.fromEntries([...Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[b,m?.coinType]),...Object.entries(t).filter(([b,m])=>!!m&&m.sCoinName&&m.sCoinType).map(([b,m])=>[m.sCoinName,m.sCoinType])]),a=Object.fromEntries(Object.entries(n).map(([b,m])=>[m,b])),s=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&e.wormhole.has(b)).map(([b,m])=>[m.coinType,m.coinName])),l=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m).map(([b,m])=>[m.coinName,o(m.coinType)])),i=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinType&&m.sCoinName).map(([b,m])=>[suiKit.parseStructTag(m.sCoinType).name,m.sCoinName])),c=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinType&&m.sCoinName).map(([b,m])=>[m.sCoinType,m.sCoinName])),d=t.vsui?.coinType,u=d?{[d]:"vsui"}:{},p=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&e.suiBridge.has(m.coinName)).map(([b,m])=>[m.coinType,m.coinName])),y=Object.fromEntries(Object.entries(t).filter(([b,m])=>!!m&&m.sCoinName&&m.sCoinType).map(([b,m])=>[m.sCoinName,m.sCoinType])),f=new Set([...Object.values(t).filter(b=>!!b).map(b=>b.sCoinName?[b.coinName,b.sCoinName]:[b.coinName]).flat()]);return {coinDecimals:Object.freeze(r),coinTypes:Object.freeze(n),coinTypeToCoinNameMap:Object.freeze(a),coinNameToOldMarketCoinTypeMap:Object.freeze(l),wormholeCoinTypeToCoinNameMap:Object.freeze(s),voloCoinTypeToCoinNameMap:Object.freeze(u),suiBridgeCoinTypeToCoinNameMap:Object.freeze(p),scoinRawNameToSCoinNameMap:Object.freeze(i),scoinTypeToSCoinNameMap:Object.freeze(c),sCoinTypes:Object.freeze(y),supportedBorrowIncentiveRewards:f}};var sn={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 Oe=()=>Object.fromEntries(Object.entries(sn).map(([t,e])=>[t,new Set(e)])),us=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)},Pe=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,us(o)]))),Te=t=>Object.freeze(Object.fromEntries(Object.entries(t).map(([e,o])=>[e,o?Object.freeze({...o}):void 0]))),rt=t=>{let e=Oe();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 Pe(e)},Ot=t=>Object.keys(t).length===0;var cn=({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??Oe()}})();return rt(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 Pt=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints","emerging"],ps=(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]})),ms=(t,e,o,r)=>{let n=t.getAddresses(e);return !!n&&Object.keys(n).length>0&&Object.keys(r).length>0&&Pt.every(s=>o[s].size>0)},ln=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 l=a.whitelist,i=a.poolAddresses;n.forcePoolAddressInterface&&(i=Te(n.forcePoolAddressInterface)),n.forceWhitelistInterface&&(l=rt(n.forceWhitelistInterface));let c=()=>ot({poolAddresses:i,whitelist:l,parseToOldMarketCoin:s});if(ms(t,e,l,i)&&!o)return {whitelist:l,poolAddresses:i,derived:c()};let[d,u]=await Promise.all([t.fetchWhitelist(),t.fetchPoolAddresses()]);return n.forceWhitelistInterface||(l=Pe(d)),n.forcePoolAddressInterface||(i=Te(ps(u,l))),{whitelist:l,poolAddresses:i,derived:c()}};var dn=t=>({getAddresses:()=>t.getAddresses()});var un=t=>({getPoolAddresses:()=>t.poolAddresses});var pn=t=>({getWhitelist:()=>t.whitelist});var bs=["core.version","core.market","core.packages.protocol.id","core.coinDecimalsRegistry","core.oracles.xOracle"],ys=["lending","collateral","borrowing","packages","scoin","spool","oracles","pythEndpoints"],fs=(t,e)=>{let r=(e?.requiredPaths??bs).filter(a=>{let s=t.get(a);return s===void 0||s===""}),n=ys.filter(a=>{let s=t.whitelist[a];return !s||s.size===0});return {valid:r.length===0&&n.length===0,missingPaths:r,emptyWhitelistKeys:n}},mn=(t,e)=>{let o=fs(t,e);if(!o.valid)throw new te("Scallop config snapshot is incomplete",{context:{missingPaths:o.missingPaths,emptyWhitelistKeys:o.emptyWhitelistKeys}})};var gs=(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},hs=["lending","borrowing","collateral","packages","spool","scoin","suiBridge","wormhole","layerZero","oracles","borrowIncentiveRewards","rewardsAsPoint","pythEndpoints","deprecated","emerging"],Cs=t=>{let e=t;return hs.reduce((o,r)=>{let n=e?.[r];return o[r]=n instanceof Set?new Set(n):new Set(Array.isArray(n)?n:[]),o},{})},bn=(t,e)=>{let o=t.addressSource.getAddresses(),r={addresses:o,poolAddresses:t.poolAddressSource.getPoolAddresses(),whitelist:Cs(t.whitelistSource.getWhitelist()),get:n=>gs(o,n)};return mn(r,{requiredPaths:e.requiredPaths}),r};var Ss=()=>{let t=Pe(Oe()),e=Te({});return {whitelist:t,poolAddresses:e,derived:ot({poolAddresses:e,whitelist:t,parseToOldMarketCoin:()=>""})}},Tt=class{address;logger;params;source;_state=Ss();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=le,scallopAddress:r,defaultValues:n,forcePoolAddressInterface:a,forceWhitelistInterface:s,strictInit:l,urls:i,...c}=e;this.address=r??new an({...c,defaultValues:n?.addresses?{addresses:n.addresses}:void 0}),this.logger=o,this.params=e,this.source=e.constantsSource??cn({address:this.address,logger:this.logger,defaultValues:n});}get url(){return this.address.url}get protocolObjectId(){return this.address.get("core.object")??"0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf"}get isInitialized(){return this.isInitializedFor("mainnet")}get whitelist(){return this._state.whitelist}get poolAddresses(){return this._state.poolAddresses}get(e){return this.address.get(e)}set(e,o){return this.address.set(e,o)}getAddresses(e){return this.address.getAddresses(e)}getAllAddresses(){return this.address.getAllAddresses()}switchCurrentAddresses(e){return this.address.switchCurrentAddresses(e)}isAddressInitialized({network:e="mainnet"}={}){let o=this.address.getAddresses(e);return !!o&&!Ot(o)}parseToOldMarketCoin(e){return `${this.protocolObjectId}::reserve::MarketCoin<${e}>`}isInitializedFor(e){return this.isAddressInitialized({network:e})&&!Ot(this._state.poolAddresses)&&Pt.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 ln({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&&bn({addressSource:dn(this),poolAddressSource:un(this),whitelistSource:pn(this)},{});}},yn=Tt;var fn=10,Rt=class{onchain;walletAddress;constants;logger;constructor(e){if(this.constants=e.scallopConstants??new yn(e),e.suiClient){let{suiClient:o,fullnodeUrl:r,tokensPerSecond:n=fn}=e;this.onchain=it(o,r,{tokensPerSecond:n});}else {let{network:o,fullnodeUrl:r,tokensPerSecond:n=fn}=e,a=new grpc.SuiGrpcClient({baseUrl:r,network:o});this.onchain=it(a,r,{tokensPerSecond:n});}this.walletAddress=e.walletAddress,this.logger=e.logger??le;}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)),l=o??0,i=0n,c=true,d=null;for(;c&&(s===void 0?a.length<l:i<s);){let{objects:u,hasNextPage:p,cursor:y}=await this.onchain.client.listCoins({owner:n,coinType:r,cursor:d});u.sort((f,b)=>Number(BigInt(b.balance)-BigInt(f.balance)));for(let f of u)if(a.push({objectId:f.objectId,digest:f.digest,version:f.version,balance:f.balance}),i+=BigInt(f.balance),s===void 0?a.length>=l:i>=s)break;d=y,c=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 rn(a)}getSupportedPoolAddresses(){return this.constants.poolAddresses?Object.values(this.constants.poolAddresses).filter(e=>e!==void 0&&this.constants.whitelist.lending.has(e.coinName)):[]}},gn=Rt;var nt=(t,e)=>e.reduce((o,r)=>{let n=t[r];return n!==void 0&&(o[r]=n),o},{});var It=class{utils;repos;constructor({utils:e,queryClient:o,queryClientConfig:r,...n}){this.utils=e??new gn(n),this.repos=Gr({utils:this.utils,queryClient:o,queryClientConfig:r});}get logger(){return this.utils.logger}async init(e=false){await this.utils.init({force:e});}get constants(){return this.utils.constants}get walletAddress(){return this.utils.walletAddress}get onchain(){return this.utils.onchain}get address(){return this.utils.address}async fetchMarkets(e){let o=e?.poolCoinNames||e?.collateralCoinNames?Array.from(new Set([...e.poolCoinNames??[],...e.collateralCoinNames??[]])):void 0,r=e?.coinPrices??await this.getPythCoinPrices({coinNames:o})??{};return this.repos.market.getMarkets({coinPrices:r,poolCoinNames:e?.poolCoinNames,collateralCoinNames:e?.collateralCoinNames,source:me(e)})}async getMarketPools(e=[...this.constants.whitelist.lending],o){let{pools:r,collaterals:n}=await this.fetchMarkets({...o,poolCoinNames:e,collateralCoinNames:e});return {pools:nt(r,e),collaterals:nt(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 nt(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 O("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 O("getObligationLocked expects an object id (string) or an object reference");return this.repos.obligation.getObligationLocked(o)}async getCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmounts({coinNames:e,address:o})}async getCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getCoinAmount({coinName:e,address:o})}async getMarketCoinAmounts(e,o=this.walletAddress){let r=e??[...this.constants.whitelist.lending].map(n=>this.utils.parseMarketCoinName(n));return await this.repos.coinBalance.getMarketCoinAmounts({marketCoinNames:r,address:o})}async getMarketCoinAmount(e,o=this.walletAddress){return await this.repos.coinBalance.getMarketCoinAmount({marketCoinName:e,address:o})}async getSpools(e,o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.spool.getSpools({stakeCoinNames:e??[...this.constants.whitelist.spool],coinPrices:r,source:me(o)})}async getSpool(e,o){let r=o?.coinPrices??await this.getAllCoinPrices()??{};return this.repos.spool.getSpool({stakeCoinName:e,coinPrices:r,source:me(o)})}async getAllStakeAccounts(e=this.walletAddress){return await this.repos.spool.getStakeAccounts({address:e})}async getStakeAccounts(e,o=this.walletAddress){return (await this.getAllStakeAccounts(o))[e]??[]}async getStakePools(e=[...this.constants.whitelist.spool]){let o={};for(let r of e){let n=await this.repos.spool.getStakePool(r);n&&(o[r]=n);}return o}async getStakePool(e){return this.repos.spool.getStakePool(e)}async getStakeRewardPools(e=[...this.constants.whitelist.spool]){return this.repos.spool.getSpoolRewardPools(e)}async getStakeRewardPool(e){return this.repos.spool.getSpoolRewardPool(e)}async getPythCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromPyth({coinNames:o,source:"api-first"})}async getPythCoinPrice(e){return (await this.getPythCoinPrices({coinNames:[e]}))[e]}async getIndexerCoinPrices(e){let o=e?.coinNames??Array.from(new Set([...this.constants.whitelist.lending,...this.constants.whitelist.collateral]).values());return this.repos.price.getPricesFromIndexer({coinNames:o})}async getIndexerCoinPrice(e){return (await this.getIndexerCoinPrices({coinNames:[e]}))[e]}async getBorrowIncentivePools(e=[...this.constants.whitelist.lending],o){let r=o?.coinPrices??await this.getAllCoinPrices({marketPools:o?.marketPools})??{};return this.repos.borrowIncentive.getBorrowIncentivePools({coinNames:e,coinPrices:r})}async getBorrowIncentiveAccounts(e,o=[...this.constants.whitelist.lending]){return await this.repos.borrowIncentive.getBorrowIncentiveAccounts({obligationId:typeof e=="string"?e:e.objectId,coinNames:o})}async getLendings(e,o=this.walletAddress,r){let n=e??[...this.constants.whitelist.lending],a=n.map(b=>this.utils.parseMarketCoinName(b)),s=a.filter(b=>this.constants.whitelist.spool.has(b)),l=r?.coinPrices??await this.getPythCoinPrices({coinNames:n})??{},i=r?.marketPools??(await this.getMarketPools(n,{...r,coinPrices:l})).pools,c=await this.getSpools(s,{...r,marketPools:i,coinPrices:l}),[d,u,p,y]=await Promise.all([this.getCoinAmounts(n,o),this.getMarketCoinAmounts(a,o),this.getSCoinAmounts(a,o),this.getAllStakeAccounts(o)]),f={};for(let b of n){let m=this.utils.parseMarketCoinName(b),h=s.includes(m);f[b]=Zr({coinName:b,symbol:this.utils.parseSymbol(b),coinType:this.utils.parseCoinType(b),marketCoinType:this.utils.parseMarketCoinType(b),coinDecimal:this.utils.getCoinDecimal(b)??0,coinPrice:l[b]??0,marketPool:i?.[b],spool:h?c[m]:void 0,stakeAccounts:h?y[m]??[]:[],coinAmount:d[b]??0,marketCoinAmount:u[m]??0,sCoinAmount:p[m]??0});}return f}async getLending(e,o=this.walletAddress,r){return (await this.getLendings([e],o,r))[e]}async getObligationAccounts(e=this.walletAddress,o){return V({source:me(o),label:"ScallopQuery.getObligationAccounts",logger:this.logger,api:()=>this.assembleObligationAccountsByOwner(e,o,true),onchain:()=>this.assembleObligationAccountsByOwner(e,o,false)})}async getObligationAccountsByIds(e,o){return V({source:me(o),label:"ScallopQuery.getObligationAccountsByIds",logger:this.logger,api:()=>this.assembleObligationAccountsByIds(e,o,true),onchain:()=>this.assembleObligationAccountsByIds(e,o,false)})}async getObligationAccountById(e,o){return V({source:me(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,l,i]=await Promise.all([this.queryObligation(e),this.getBorrowIncentivePools(void 0,{coinPrices:n,marketPools:r.pools}),this.getBorrowIncentiveAccounts(e)]);return en({obligationId:typeof e=="string"?e:e.objectId,collateralCoinNames:Array.from(this.constants.whitelist.collateral),market:r,coinPrices:n,coinAmounts:a,obligationQuery:s,borrowIncentivePools:l,borrowIncentiveAccounts:i,utils:{parseCoinNameFromType:c=>this.utils.parseCoinNameFromType(c),parseCoinType:c=>this.utils.parseCoinType(c),parseSymbol:c=>this.utils.parseSymbol(c),getCoinDecimal:c=>this.utils.getCoinDecimal(c),parseSCoinTypeNameToMarketCoinName:c=>this.utils.parseSCoinTypeNameToMarketCoinName(c)}})}async assembleObligationAccountsByOwner(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),[s,l]=await Promise.all([this.getCoinAmounts(void 0,e),this.getObligations(e)]),i=await this.repos.obligation.getObligationObjects(l.map(d=>d.id)),c={};return await Promise.allSettled(l.map(async(d,u)=>{c[d.keyId]=await this.assembleObligationAccount(i[u]??d.id,{market:n,coinPrices:a,coinAmounts:s});})),c}async assembleObligationAccountsByIds(e,o,r){let{market:n,coinPrices:a}=await this.resolveObligationMarketInputs(o,r),s=[];return await Promise.allSettled(e.map(async l=>{let i=await this.assembleObligationAccount(l,{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:me(e),coinPrices:o})}async getVeSca(e){return await this.repos.veSca.getVeSca(typeof e=="string"?e:e.objectId)}async getVeScas({walletAddress:e=this.walletAddress,excludeEmpty:o=false}={}){return await this.repos.veSca.getVeScasByAddress({address:e,excludeEmpty:o})}async getVeScaTreasuryInfo(){return await this.repos.veSca.getVeScaTreasuryInfo()}async getVeScaKeyIdFromReferralBindings(e=this.walletAddress){return this.repos.referral.getVeScaKeyIdFromReferralBindings(e)}async getBindedObligation(e){return this.repos.borrowIncentive.getBindedObligation(e)}async getBindedVeScaKey(e){return this.repos.borrowIncentive.getBindedVeScaKey(e)}async getLoyaltyProgramInfos(e){let o=e??(await this.getVeScas())[0]?.keyId,r=typeof o=="string"?o:o?.objectId;return this.repos.loyaltyProgram.getLoyaltyProgramInfos(r)}async getVeScaLoyaltyProgramInfos(e){return this.repos.veScaLoyaltyProgram.getVeScaLoyaltyProgramInfos(e)}async getSCoinTotalSupply(e){return await this.repos.coinBalance.getSCoinTotalSupply(e)}async getSCoinAmounts(e,o=this.walletAddress){return await this.repos.coinBalance.getSCoinAmounts({sCoinNames:e,address:o})}async getSCoinAmount(e,o=this.walletAddress){let r=this.utils.parseSCoinName(e);return r?await this.repos.coinBalance.getSCoinAmount({sCoinName:r,address:o}):0}async getSCoinSwapRate(e,o){if(e===o)throw new O("fromAsset and toAsset must be different");if(!this.constants.whitelist.scoin.has(e))throw new O("fromAsset is not supported");if(!this.constants.whitelist.scoin.has(o))throw new O("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 O("Failed to fetch the lendings data");if(a.conversionRate===0||s.conversionRate===0)throw new O("Conversion rate cannot be zero");let l=a.conversionRate,i=1/s.conversionRate,c=await this.getPythCoinPrices();if(!c[r]||!c[n]||c[r]===0||c[n]===0){let u=await this.getIndexerCoinPrices().catch(()=>({}));c={...c,...u};}if(!c[r]||!c[n])throw new O("Failed to fetch the coin prices");let d=c[r]/c[n];return bignumber_js.BigNumber(l).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:Hr({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 on({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 O("apiAddressId is required");return this.repos.poolAddresses.getPoolAddresses({})}async getUserPortfolio(e){let o=e?.walletAddress??this.walletAddress,r=e?.indexer??false,n=await this.getAllCoinPrices({indexer:r}),a=await this.getMarketPools(void 0,{indexer:r,coinPrices:n}),[s,l,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 tn({lendings:s,obligationAccounts:l,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)}},Ps=It;
|
|
18
19
|
|
|
19
|
-
exports.ScallopQuery =
|
|
20
|
+
exports.ScallopQuery = Ps;
|