@naviprotocol/lending 1.4.0-emode.8 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/account.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { UserLendingInfo, SuiClientOption, EnvOption, Transaction as NAVITransaction, AssetIdentifier, TransactionResult, CacheOption, AccountCap, MarketOption, LendingPosition, MarketsOption } from './types';
1
+ import { UserLendingInfo, SuiClientOption, EnvOption, Pool, Transaction as NAVITransaction, AssetIdentifier, TransactionResult, CacheOption, AccountCap, MarketOption, LendingPosition, MarketsOption, EModePool } from './types';
2
2
  import { Transaction } from '@mysten/sui/transactions';
3
3
  import { CoinStruct } from '@mysten/sui/client';
4
4
  import { PoolOperator } from './pool';
@@ -125,5 +125,46 @@ export declare const getTransactions: (address: string | AccountCap, options?: {
125
125
  export declare function getCoins(address: string, options?: Partial<{
126
126
  coinType?: string;
127
127
  } & SuiClientOption>): Promise<CoinStruct[]>;
128
- export declare const getLendingPositions: (address: string, options?: Partial<SuiClientOption & EnvOption & CacheOption & MarketsOption>) => Promise<LendingPosition[]>;
128
+ export declare const getLendingPositions: (address: string, options?: Partial<SuiClientOption & EnvOption & CacheOption & MarketsOption & {
129
+ includeZeroBalanceEmodePositions?: boolean;
130
+ }>) => Promise<LendingPosition[]>;
131
+ export declare class UserPositions {
132
+ private _positions;
133
+ private _overview;
134
+ get positions(): LendingPosition[];
135
+ get overview(): {
136
+ hf: number;
137
+ netVaule: string;
138
+ netWorthApr: string;
139
+ totalSupplyValue: string;
140
+ totalBorrowValue: string;
141
+ totalsupplyApy: string;
142
+ totalBorrowApy: string;
143
+ maxLiquidationValue: string;
144
+ maxLoanToVaule: string;
145
+ supply: Record<string, string>;
146
+ borrow: Record<string, string>;
147
+ };
148
+ set positions(positions: LendingPosition[]);
149
+ constructor(positions: LendingPosition[]);
150
+ filterPositionsByPool(pool: Pool | EModePool): UserPositions;
151
+ deposit(pool: Pool | EModePool, amount: number): UserPositions;
152
+ withdraw(pool: Pool | EModePool, amount: number): UserPositions;
153
+ borrow(pool: Pool | EModePool, amount: number): UserPositions;
154
+ repay(pool: Pool | EModePool, amount: number): UserPositions;
155
+ getPositionsOverview(positions: LendingPosition[]): {
156
+ hf: number;
157
+ netVaule: string;
158
+ netWorthApr: string;
159
+ totalSupplyValue: string;
160
+ totalBorrowValue: string;
161
+ totalsupplyApy: string;
162
+ totalBorrowApy: string;
163
+ maxLiquidationValue: string;
164
+ maxLoanToVaule: string;
165
+ supply: Record<string, string>;
166
+ borrow: Record<string, string>;
167
+ };
168
+ }
169
+ export declare function verifyHealthFactorPTB(tx: Transaction, address: string | AccountCap | TransactionResult, hf: number, options?: Partial<EnvOption>): Promise<void>;
129
170
  //# sourceMappingURL=account.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("@mysten/sui/transactions"),l=require("@mysten/bcs"),G=require("@mysten/sui/client"),be=require("lodash.camelcase"),ye=require("@mysten/sui/utils"),L=require("@pythnetwork/pyth-sui-js"),y=require("bignumber.js"),h=require("@mysten/sui/bcs"),N=l.bcs.bytes(32).transform({input:e=>l.fromHex(e),output:e=>l.toHex(e)}),he=l.bcs.struct("IncentiveAPYInfo",{asset_id:l.bcs.u8(),apy:l.bcs.u256(),coin_types:l.bcs.vector(l.bcs.string())}),J=l.bcs.struct("IncentivePoolInfo",{pool_id:N,funds:N,phase:l.bcs.u64(),start_at:l.bcs.u64(),end_at:l.bcs.u64(),closed_at:l.bcs.u64(),total_supply:l.bcs.u64(),asset_id:l.bcs.u8(),option:l.bcs.u8(),factor:l.bcs.u256(),distributed:l.bcs.u64(),available:l.bcs.u256(),total:l.bcs.u256()}),we=l.bcs.struct("IncentivePoolInfoByPhase",{phase:l.bcs.u64(),pools:l.bcs.vector(J)}),ve=l.bcs.struct("OracleInfo",{oracle_id:l.bcs.u8(),price:l.bcs.u256(),decimals:l.bcs.u8(),valid:l.bcs.bool()}),Ce=l.bcs.struct("FlashLoanAssetConfig",{id:l.bcs.string(),asset_id:l.bcs.u8(),coin_type:l.bcs.string(),pool_id:l.bcs.string(),rate_to_supplier:l.bcs.u64(),rate_to_treasury:l.bcs.u64(),max:l.bcs.u64(),min:l.bcs.u64()}),Te=l.bcs.struct("ReserveDataInfo",{id:l.bcs.u8(),oracle_id:l.bcs.u8(),coin_type:l.bcs.string(),supply_cap:l.bcs.u256(),borrow_cap:l.bcs.u256(),supply_rate:l.bcs.u256(),borrow_rate:l.bcs.u256(),supply_index:l.bcs.u256(),borrow_index:l.bcs.u256(),total_supply:l.bcs.u256(),total_borrow:l.bcs.u256(),last_update_at:l.bcs.u64(),ltv:l.bcs.u256(),treasury_factor:l.bcs.u256(),treasury_balance:l.bcs.u256(),base_rate:l.bcs.u256(),multiplier:l.bcs.u256(),jump_rate_multiplier:l.bcs.u256(),reserve_factor:l.bcs.u256(),optimal_utilization:l.bcs.u256(),liquidation_ratio:l.bcs.u256(),liquidation_bonus:l.bcs.u256(),liquidation_threshold:l.bcs.u256()}),Q=l.bcs.struct("UserStateInfo",{asset_id:l.bcs.u8(),borrow_balance:l.bcs.u256(),supply_balance:l.bcs.u256()}),_e="1.4.0-emode.8",A={version:_e},je=A.version,ke=()=>{if(typeof process<"u"&&process.versions&&process.versions.node)try{const e=require("os"),t=process.version,o=e.type(),r=e.arch();return`Node.js ${t.startsWith("v")?t.substring(1):t}; ${o}/${r}`}catch{return`Node.js ${process.version}; OS/Unknown (Error)`}return"Node/Unknown"},Pe=()=>{let e="";return typeof process<"u"&&process.versions&&process.versions.node&&(e=`lending/${je} (${ke()})`),e},W=Pe(),k=new G.SuiClient({url:G.getFullnodeUrl("mainnet")});function X(e){const t=[];return e.forEach((o,r)=>{const n=r===e.length-1;if(typeof o=="object"&&o!==null&&n){const{client:a,disableCache:c,cacheTime:s,...i}=o;t.push(i)}else t.push(o)}),JSON.stringify(t)}function T(e){const t={};return(...o)=>{const r=X(o);return t[r]||(t[r]=e(...o).finally(()=>{delete t[r]})),t[r]}}function j(e){let t={};return(...o)=>{const r=o[o.length-1],n=X(o),a=t[n];return!r?.disableCache&&typeof a?.data<"u"&&(typeof r?.cacheTime>"u"||r.cacheTime>Date.now()-a.cacheAt)?a.data:e(...o).then(c=>(t[n]={data:c,cacheAt:Date.now()},c))}}function S(e){return Array.isArray(e)?e.map(t=>S(t)):e!=null&&typeof e=="object"?Object.keys(e).reduce((t,o)=>({...t,[be(o)]:S(e[o])}),{}):e}function d(e,t){return typeof e=="object"?e:t(e)}function Ae(e,t){return typeof t=="string"?e.object(t):typeof t=="object"&&t.$kind?t:e.object(t.contract.pool)}function F(e,t,o){if(e.results&&e.results.length>0){if(e.results[0].returnValues&&e.results[0].returnValues.length>0)return e.results[0].returnValues.map((r,n)=>(t[n]||t[0]).parse(Uint8Array.from(r[0])))}else if(e.error)return console.log(`Get an error, msg: ${e.error}`),[];return[]}function f(e){return ye.normalizeStructTag(e)}function Z(e){const t=(e||0)/Math.pow(10,27);return t>Math.pow(10,5)?1/0:t}new L.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:2e4});const Ie=27,z=(e,t)=>{if(!Number(e)||!Number(t))return new y(0);const o=new y(1).shiftedBy(1*Ie),r=o.multipliedBy(new y(.5));return new y(e).multipliedBy(new y(t)).plus(r).dividedBy(o).integerValue(y.ROUND_DOWN)},I=W?{"User-Agent":W}:{};function x(e){return e.reduce((t,o)=>(t[o.uniqueId]=o,t),{})}function K(e){return e.reduce((t,o)=>(t[o.uniqueId]=o,t),{})}function Y(e,t){const o=e.emodes.find(r=>r.emodeId===t.emodeId);if(!o)throw new Error("EMode not found in pool");return{...e,emode:o,isEMode:!0}}function ee(e){const[t,o]=e.split("-");return!t||!o?null:{marketKey:t,poolId:parseInt(o)}}var B=(e=>(e[e.Supply=1]="Supply",e[e.Withdraw=2]="Withdraw",e[e.Borrow=3]="Borrow",e[e.Repay=4]="Repay",e))(B||{});const M=j(T(async e=>{const t=(e?.markets||Object.keys(V)).map(n=>P(n)),o=`https://open-api.naviprotocol.io/api/navi/pools?env=${e?.env||"prod"}&sdk=${A.version}&market=${t.map(n=>n.key)}`,r=await fetch(o,{headers:I}).then(n=>n.json());return r.data.forEach(n=>{const c=r.meta.emodes.filter(s=>{const i=P(s.marketId);return n.market===i.key&&s.isActive}).filter(s=>!!s.assets.find(i=>i.assetId===n.id));n.emodes=c}),r.data}));async function _(e,t){let o=t?.market;if(typeof e=="string"){const a=ee(e);a&&(o=a.marketKey,e=a.poolId)}const r=await M({...t,markets:[o||$],cacheTime:g});if(typeof e=="object")return e;const n=r.find(a=>typeof e=="string"?f(a.suiCoinType)===f(e):typeof e=="number"?a.id===e:!1);if(!n)throw new Error("Pool not found");return n.isDeprecated&&console.log(`The lending pool for coinType ${n.suiCoinType} is going to be deprecated.`),n}const $e=j(T(async e=>{const t=`https://open-api.naviprotocol.io/api/navi/stats?sdk=${A.version}`;return(await fetch(t,{headers:I}).then(r=>r.json())).data})),Be=j(T(async e=>{const t=`https://open-api.naviprotocol.io/api/navi/fee?sdk=${A.version}`;return await fetch(t,{headers:I}).then(r=>r.json())}));async function te(e,t,o,r){const n=await b({...r,cacheTime:g}),a=await _(t,r);if(a?.deprecatedAt&&Date.now()>a.deprecatedAt)throw new Error(`The lending pool for coinType ${a.suiCoinType} has been deprecated.`);const c=typeof o=="object"&&o.$kind==="GasCoin";if(f(a.suiCoinType)===f("0x2::sui::SUI")&&c){if(!r?.amount)throw new Error("Amount is required for sui coin");o=e.splitCoins(o,[r.amount])}let s;return typeof r?.amount<"u"?s=d(r.amount,e.pure.u64):s=e.moveCall({target:"0x2::coin::value",arguments:[d(o,e.object)],typeArguments:[a.suiCoinType]}),r?.accountCap?e.moveCall({target:`${n.package}::incentive_v3::deposit_with_account_cap`,arguments:[e.object("0x06"),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),d(o,e.object),e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object)],typeArguments:[a.suiCoinType]}):e.moveCall({target:`${n.package}::incentive_v3::entry_deposit`,arguments:[e.object("0x06"),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),d(o,e.object),s,e.object(n.incentiveV2),e.object(n.incentiveV3)],typeArguments:[a.suiCoinType]}),n.version===2&&a.id===0&&e.moveCall({target:`${n.package}::pool::refresh_stake`,arguments:[e.object(a.contract.pool),e.object("0x05")]}),e}async function Ee(e,t,o,r){const n=await b({...r,cacheTime:g}),a=await _(t,r),c=d(o,e.pure.u64);let s;if(n.version===1)if(r?.accountCap){const[u]=e.moveCall({target:`${n.package}::incentive_v3::withdraw_with_account_cap`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});s=u}else{const[u]=e.moveCall({target:`${n.package}::incentive_v3::withdraw`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3)],typeArguments:[a.suiCoinType]});s=u}else if(r?.accountCap){const[u]=e.moveCall({target:`${n.package}::incentive_v3::withdraw_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object),e.object("0x05")],typeArguments:[a.suiCoinType]});s=u}else{const[u]=e.moveCall({target:`${n.package}::incentive_v3::withdraw_v2`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),e.object("0x05")],typeArguments:[a.suiCoinType]});s=u}return e.moveCall({target:"0x2::coin::from_balance",arguments:[s],typeArguments:[a.suiCoinType]})}async function Me(e,t,o,r){const n=await b({...r,cacheTime:g}),a=await _(t,r);if(a?.deprecatedAt&&Date.now()>a.deprecatedAt)throw new Error(`The lending pool for coinType ${a.suiCoinType} has been deprecated.`);const c=d(o,e.pure.u64);let s;if(n.version===1)if(r?.accountCap){const[u]=e.moveCall({target:`${n.package}::incentive_v3::borrow_with_account_cap`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});s=u}else{const[u]=e.moveCall({target:`${n.package}::incentive_v3::borrow`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3)],typeArguments:[a.suiCoinType]});s=u}else if(r?.accountCap){const[u]=e.moveCall({target:`${n.package}::incentive_v3::borrow_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object),e.object("0x05")],typeArguments:[a.suiCoinType]});s=u}else{const[u]=e.moveCall({target:`${n.package}::incentive_v3::borrow_v2`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),c,e.object(n.incentiveV2),e.object(n.incentiveV3),e.object("0x05")],typeArguments:[a.suiCoinType]});s=u}return e.moveCall({target:"0x2::coin::from_balance",arguments:[e.object(s)],typeArguments:[a.suiCoinType]})}async function Fe(e,t,o,r){const n=await b({...r,cacheTime:g}),a=await _(t,r),c=typeof o=="object"&&o.$kind==="GasCoin";if(f(a.suiCoinType)===f("0x2::sui::SUI")&&c){if(!r?.amount)throw new Error("Amount is required for sui coin");o=e.splitCoins(o,[r.amount])}let s;if(typeof r?.amount<"u"?s=d(r.amount,e.pure.u64):s=e.moveCall({target:"0x2::coin::value",arguments:[d(o,e.object)],typeArguments:[a.suiCoinType]}),r?.accountCap){const[i]=e.moveCall({target:`${n.package}::incentive_v3::repay_with_account_cap`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),d(o,e.object),e.object(n.incentiveV2),e.object(n.incentiveV3),d(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});return e.moveCall({target:"0x2::coin::from_balance",arguments:[i],typeArguments:[a.suiCoinType]})}else return e.moveCall({target:`${n.package}::incentive_v3::entry_repay`,arguments:[e.object("0x06"),e.object(n.priceOracle),e.object(n.storage),e.object(a.contract.pool),e.pure.u8(a.id),d(o,e.object),s,e.object(n.incentiveV2),e.object(n.incentiveV3)],typeArguments:[a.suiCoinType]}),e}const Ve=j(T(async e=>{const t=await b({...e});if(e?.address&&typeof e?.asset<"u")try{const n=await _(e.asset,e),a=e?.client??k,c=new E.Transaction;c.moveCall({target:`${t.package}::incentive_v3::get_borrow_fee_v2`,arguments:[c.object(t.incentiveV3),c.pure.address(e.address),c.pure.u8(n.id),c.pure.u64(1e4)],typeArguments:[]});const s=await a.devInspectTransactionBlock({transactionBlock:c,sender:e.address}),i=F(s,[h.bcs.u64()]);return(Number(i[0])||0)/100}catch(n){console.error(n)}const r=(await k.getObject({id:t.incentiveV3,options:{showType:!0,showOwner:!0,showContent:!0}})).data.content.fields.borrow_fee_rate;return Number(r)/100}));async function oe(e,t){const o=await b({cacheTime:g,...t});return e.moveCall({target:`${o.package}::lending::create_account`,arguments:[]})}async function ne(e,t,o){const r=await b({cacheTime:g,...o});return e.moveCall({target:`${r.package}::lending_core::account_owner`,arguments:[t]})}async function re(e,t,o){const r=await b({...o,cacheTime:g});return o?.accountCap?e.moveCall({target:`${r.package}::lending::enter_emode_with_account_cap`,arguments:[e.object(r.storage),d(t,e.pure.u64),d(o.accountCap,e.object)]}):e.moveCall({target:`${r.package}::lending::enter_emode`,arguments:[e.object(r.storage),d(t,e.pure.u64)]}),e}async function Ue(e,t){const o=await b({...t,cacheTime:g});return t?.accountCap?e.moveCall({target:`${o.package}::lending::exit_emode_with_account_cap`,arguments:[e.object(o.storage),d(t.accountCap,e.object)]}):e.moveCall({target:`${o.package}::lending::exit_emode`,arguments:[e.object(o.storage)]}),e}async function Re(e,t,o){const r=await b({cacheTime:g,...o}),n=await oe(e,o);await re(e,t,{...o,accountCap:n});const a=await P(o?.market||$),c=await ne(e,n,o);return e.moveCall({target:`${r.emode.contract.registryPackage}::registry::register_emode_for_account_cap`,arguments:[e.object(r.emode.contract.registryObject),c,d(a.id,e.pure.u64),d(t,e.pure.u64)]}),n}const ae=j(T(async(e,t)=>{const o=await b({cacheTime:g,...t}),r=new E.Transaction,n=t?.client??k;r.moveCall({target:`${o.emode.contract.registryPackage}::registry::find_user_emode_account_caps`,arguments:[r.object(o.emode.contract.registryObject),r.pure.address(e)]});const c=(await n.devInspectTransactionBlock({transactionBlock:r,sender:e})).results[0].returnValues,s=h.bcs.vector(h.bcs.u64()).parse(Uint8Array.from(c[0][0])),i=h.bcs.vector(h.bcs.u64()).parse(Uint8Array.from(c[1][0])),u=h.bcs.vector(h.bcs.Address).parse(Uint8Array.from(c[2][0]));return s.map((m,p)=>({marketId:Number(m),emodeId:Number(i[p]),accountCap:u[p].toString()}))}));function ce(e){return`${P(e.marketId).key}-${e.emodeId}`}const $="main",V={main:{id:0,key:"main",name:"Main Market"}};class se{constructor(t,o){this.pools=[],this.emodes=[],this.config=P(t),this.addPools(o)}addPools(t){const o=x(this.pools),r=K(this.emodes);t.forEach(n=>{if(!this.checkMarket(n.market)){console.warn(`Pool is not in market ${this.config.name}`,n);return}o[n.uniqueId]||this.pools.push(n),n.emodes.forEach(c=>{r[c.uniqueId]||this.emodes.push(c)})})}getEMode(t){if(!this.checkMarket(t.marketId))return console.warn(`EMode market mismatch ${this.config.id} !== ${t.marketId}`,t),null;const n=K(this.emodes)[ce(t)];return n||(console.warn(`EMode not found ${t.emodeId} in market ${this.config.name}`,t),null)}getEModePools(t){const o=this.getEMode(t);if(!o)return[];const r=o.assets.map(a=>a.assetId);return this.pools.filter(a=>r.includes(a.id)).map(a=>({...a,emode:o,isEMode:!0}))}checkMarket(t){let o=!1;return typeof t=="number"&&t===this.config.id&&(o=!0),typeof t=="string"&&t===this.config.key&&(o=!0),typeof t=="object"&&t.id===this.config.id&&(o=!0),o}}const P=e=>{const o=Object.values(V).find(r=>typeof e=="number"?r.id===e:typeof e=="string"?r.key===e:r.id===e.id);if(!o)throw new Error("Market not found");return o},ie=j(T(async(e,t)=>{const o=await M({cacheTime:6e4,...t,markets:e});return e.map(r=>{const n=P(r),a=o.filter(c=>c.market===n.key);return new se(r,a)})})),De=j(T(async(e,t)=>(await ie([e],t))[0])),b=j(T(async e=>{const t=P(e?.market||$),o=`https://open-api.naviprotocol.io/api/navi/config?env=${e?.env||"prod"}&sdk=${A.version}&market=${t.key}`;return(await fetch(o,{headers:I}).then(n=>n.json())).data})),g=1e3*60*5;function Ne(e,t,o){const r=typeof o?.balance=="number",n=r?o.balance:0;let a=0;const c=[];let s="";if(t.sort((i,u)=>Number(u.balance)-Number(i.balance)).forEach(i=>{if(!(r&&a>=n)&&Number(i.balance)!==0){if(s||(s=i.coinType),s!==i.coinType)throw new Error("All coins must be of the same type");a+=Number(i.balance),c.push(i.coinObjectId)}}),c.length===0)throw new Error("No coins to merge");if(r&&a<n)throw new Error(`Balance is less than the specified balance: ${a} < ${n}`);return f(s)===f("0x2::sui::SUI")&&o?.useGasCoin?r?e.splitCoins(e.gas,[e.pure.u64(n)]):e.gas:(c.length===1?e.object(c[0]):e.mergeCoins(c[0],c.slice(1)),r?e.splitCoins(c[0],[e.pure.u64(n)]):c[0])}async function q(e,t,o,r,n,a,c){const s=await b({...c,cacheTime:g}),i=await _(o,c);return e.moveCall({target:`${s.uiGetter}::calculator_unchecked::dynamic_health_factor`,arguments:[e.object("0x06"),e.object(s.storage),e.object(s.oracle.priceOracle),Ae(e,i),d(t,e.pure.address),d(i.id,e.pure.u8),d(r,e.pure.u64),d(n,e.pure.u64),d(a,e.pure.bool)],typeArguments:[i.suiCoinType]})}async function ue(e,t,o){return q(e,t,0,0,0,!1,o)}const O=j(async(e,t)=>{const o=(t?.markets||Object.keys(V)).map(m=>P(m)),r=new E.Transaction,n=t?.client??k,a=await M(t),c=x(a);for(let m of o){const p=await b({...t,cacheTime:g,market:m});r.moveCall({target:`${p.uiGetter}::getter_unchecked::get_user_state`,arguments:[r.object(p.storage),r.pure.address(e)]})}const i=((await n.devInspectTransactionBlock({transactionBlock:r,sender:e})).results||[]).map(m=>m.returnValues?.map(p=>h.bcs.vector(Q).parse(Uint8Array.from(p[0])))[0]||[]),u=[];return i.forEach((m,p)=>{const w=o[p];m.forEach(v=>{if(v.supply_balance==="0"&&v.borrow_balance==="0")return;const C=c[`${w.key}-${v.asset_id}`];if(!C)return;const R=z(v.supply_balance,C.currentSupplyIndex).toString(),D=z(v.borrow_balance,C.currentBorrowIndex).toString();u.push({supplyBalance:R,borrowBalance:D,assetId:v.asset_id,market:w.key,pool:C})})}),u});async function Se(e,t){const o=t?.client??k,r=new E.Transaction;await ue(r,e,t);const n=await o.devInspectTransactionBlock({transactionBlock:r,sender:e}),a=F(n,[h.bcs.u256()]);return Z(Number(a[0])||0)}async function Oe(e,t,o,r){const n=r?.client??k,a=new E.Transaction;let c=0,s=0;const i=await _(t,r);if(o.forEach(w=>{w.type===B.Supply?c+=w.amount:w.type===B.Withdraw?c-=w.amount:w.type===B.Borrow?s+=w.amount:w.type===B.Repay&&(s-=w.amount)}),c*s<0)throw new Error("Invalid operations");const u=c>0||s>0;await q(a,e,i,Math.abs(c),Math.abs(s),u,r);const m=await n.devInspectTransactionBlock({transactionBlock:a,sender:e}),p=F(m,[h.bcs.u256()]);return Z(Number(p[0])||0)}const Le=T(async(e,t)=>{const o=new URLSearchParams;t?.cursor&&o.set("cursor",t.cursor),o.set("userAddress",e);const r=`https://open-api.naviprotocol.io/api/navi/user/transactions?${o.toString()}&sdk=${A.version}`;return(await fetch(r,{headers:I}).then(a=>a.json())).data});async function qe(e,t){let o=null;const r=[],n=t?.client??k;do{let a;if(t?.coinType?a=await n.getCoins({owner:e,coinType:t?.coinType,cursor:o,limit:100}):a=await n.getAllCoins({owner:e,cursor:o,limit:100}),!a.data||!a.data.length)break;r.push(...a.data),o=a.nextCursor}while(o);return r}const le=j(async(e,t)=>{const o=[],[r,n]=await Promise.all([O(e,t),ae(e,t)]);return r.forEach(c=>{if(y(c.supplyBalance).gt(0)){const s=y(c.supplyBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,y.ROUND_DOWN);o.push({id:`${c.pool.uniqueId}_navi-lending-supply`,wallet:e,protocol:"navi",type:"navi-lending-supply",market:c.market,"navi-lending-supply":{amount:s.toString(),pool:c.pool,token:c.pool.token,valueUSD:s.multipliedBy(c.pool.oracle.price).toString()}})}if(y(c.borrowBalance).gt(0)){const s=y(c.borrowBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,y.ROUND_DOWN);o.push({id:`${c.pool.uniqueId}_navi-lending-borrow`,wallet:e,protocol:"navi",market:c.market,type:"navi-lending-borrow","navi-lending-borrow":{amount:s.toString(),pool:c.pool,token:c.pool.token,valueUSD:s.multipliedBy(c.pool.oracle.price).toString()}})}}),(await Promise.all(n.map(async c=>O(c.accountCap,{...t,markets:[c.marketId]})))).forEach((c,s)=>{const i=n[s];c.forEach(u=>{if(y(u.supplyBalance).gt(0)){const m=y(u.supplyBalance).shiftedBy(-9).decimalPlaces(u.pool.token.decimals,y.ROUND_DOWN);o.push({id:`${u.pool.uniqueId}_navi-lending-emode-supply`,wallet:e,protocol:"navi",market:u.market,type:"navi-lending-emode-supply","navi-lending-emode-supply":{amount:m.toString(),pool:Y(u.pool,i),token:u.pool.token,valueUSD:m.multipliedBy(u.pool.oracle.price).toString()}})}if(y(u.borrowBalance).gt(0)){const m=y(u.borrowBalance).shiftedBy(-9).decimalPlaces(u.pool.token.decimals,y.ROUND_DOWN);o.push({id:`${u.pool.uniqueId}_navi-lending-emode-borrow`,wallet:e,protocol:"navi",market:u.market,type:"navi-lending-emode-borrow","navi-lending-emode-borrow":{amount:m.toString(),pool:Y(u.pool,i),token:u.pool.token,valueUSD:m.multipliedBy(u.pool.oracle.price).toString()}})}})}),o}),pe=new L.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:1e4});async function de(e){try{const t=[],o=await pe.getLatestPriceFeeds(e);if(!o)return t;const r=Math.floor(new Date().valueOf()/1e3);for(const n of o){const a=n.getPriceUnchecked();if(a.publishTime>r){console.warn(`pyth price feed is invalid, id: ${n.id}, publish time: ${a.publishTime}, current timestamp: ${r}`);continue}r-n.getPriceUnchecked().publishTime>30&&(console.info(`stale price feed, id: ${n.id}, publish time: ${a.publishTime}, current timestamp: ${r}`),t.push(n.id))}return t}catch(t){throw new Error(`failed to get pyth stale price feed id, msg: ${t.message}`)}}async function me(e,t,o){const r=o?.client??k,n=await b({...o,cacheTime:g});try{const a=await pe.getPriceFeedsUpdateData(t);return await new L.SuiPythClient(r,n.oracle.pythStateId,n.oracle.wormholeStateId).updatePriceFeeds(e,a,t)}catch(a){throw new Error(`failed to update pyth price feeds, msg: ${a.message}`)}}async function ge(e,t,o){const r=await b({...o,cacheTime:g});if(o?.updatePythPriceFeeds){const n=t.filter(a=>!!a.pythPriceFeedId).map(a=>a.pythPriceFeedId);try{const a=await de(n);a.length>0&&await me(e,a,o)}catch{}}for(const n of t)e.moveCall({target:`${r.oracle.packageId}::oracle_pro::update_single_price`,arguments:[e.object("0x6"),e.object(r.oracle.oracleConfig),e.object(r.oracle.priceOracle),e.object(r.oracle.supraOracleHolder),e.object(n.pythPriceInfoObject),e.pure.address(n.feedId)]});return e}async function H(e){return(await b({...e,cacheTime:g})).oracle.feeds}function fe(e,t){return e.filter(o=>!!(t?.lendingState&&t.lendingState.find(n=>n.assetId===o.assetId)||t?.lendingPositions&&t.lendingPositions.find(n=>["navi-lending-supply","navi-lending-borrow","navi-lending-emode-supply","navi-lending-emode-borrow"].includes(n.type)?n[n.type]?.pool?.id===o.assetId:!1)||t?.pools&&t.pools.find(n=>n.id===o.assetId)))}async function He(e,t,o,r){try{const n=await H({...r}),a=[];o.forEach(u=>{a.includes(u.market)||a.push(u.market)});const c=await le(t,{...r,markets:a}),s=fe(n,{lendingPositions:c,pools:o});return await ge(e,s,{updatePythPriceFeeds:!0,...r})}catch(n){if(r?.throws)throw n;return console.error(n),e}}const U=j(T(async e=>{const t=`https://open-api.naviprotocol.io/api/navi/flashloan?env=${e?.env||"prod"}&sdk=${A.version}&market=${e?.market||$}`,o=await fetch(t,{headers:I}).then(r=>r.json());return Object.keys(o.data).map(r=>({...o.data[r],coinType:r}))}));async function Ge(e,t){return(await U(t)).find(r=>typeof e=="string"?f(r.coinType)===f(e):typeof e=="number"?r.assetId===e:r.assetId===e.id)||null}async function We(e,t,o,r){const n=await b({...r,cacheTime:g}),a=await _(t,r);if(!(await U({...r,cacheTime:g})).some(i=>f(i.coinType)===f(a.suiCoinType)))throw new Error("Pool does not support flashloan");if(n.version===1){const[i,u]=e.moveCall({target:`${n.package}::lending::flash_loan_with_ctx`,arguments:[e.object(n.flashloanConfig),e.object(a.contract.pool),d(o,e.pure.u64)],typeArguments:[a.suiCoinType]});return[i,u]}else{const[i,u]=e.moveCall({target:`${n.package}::lending::flash_loan_with_ctx_v2`,arguments:[e.object(n.flashloanConfig),e.object(a.contract.pool),d(o,e.pure.u64),e.object("0x05")],typeArguments:[a.suiCoinType]});return[i,u]}}async function ze(e,t,o,r,n){const a=await b({...n,cacheTime:g}),c=await _(t,n);if(!(await U({...n,cacheTime:g})).some(m=>f(m.coinType)===f(c.suiCoinType)))throw new Error("Pool does not support flashloan");const[u]=e.moveCall({target:`${a.package}::lending::flash_repay_with_ctx`,arguments:[e.object("0x06"),e.object(a.storage),e.object(c.contract.pool),d(o,e.object),d(r,e.object)],typeArguments:[c.suiCoinType]});return[u]}async function Ke(e,t,o,r,n,a){const c={...a,cacheTime:g},s=await b(c),i=await _(t,c),u=await _(r,c);if(s.version===1){const[m,p]=e.moveCall({target:`${s.package}::incentive_v3::liquidation`,arguments:[e.object("0x06"),e.object(s.priceOracle),e.object(s.storage),e.pure.u8(i.id),e.object(i.contract.pool),d(o,e.object),e.pure.u8(u.id),e.object(u.contract.pool),d(n,e.pure.address),e.object(s.incentiveV2),e.object(s.incentiveV3)],typeArguments:[i.suiCoinType,u.suiCoinType]});return[m,p]}else{const[m,p]=e.moveCall({target:`${s.package}::incentive_v3::liquidation_v2`,arguments:[e.object("0x06"),e.object(s.priceOracle),e.object(s.storage),e.pure.u8(i.id),e.object(i.contract.pool),d(o,e.object),e.pure.u8(u.id),e.object(u.contract.pool),d(n,e.pure.address),e.object(s.incentiveV2),e.object(s.incentiveV3),e.object("0x05")],typeArguments:[i.suiCoinType,u.suiCoinType]});return[m,p]}}async function Ye(e,t){const o=await H(t),r=await M({...t,cacheTime:g}),n=t?.client??k,a=await b({...t,cacheTime:g}),c=new E.Transaction;c.moveCall({target:`${a.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,arguments:[c.object("0x06"),c.object(a.storage),c.object(a.incentiveV3),c.pure.address(e)]});const s=await n.devInspectTransactionBlock({transactionBlock:c,sender:e}),i=F(s,[h.bcs.vector(h.bcs.string()),h.bcs.vector(h.bcs.string()),h.bcs.vector(h.bcs.u8()),h.bcs.vector(h.bcs.Address),h.bcs.vector(h.bcs.u256())]),u=[];if(i.length===5&&Array.isArray(i[0])){const m=i[0].length;for(let p=0;p<m;p++){const w=o.find(C=>f(C.coinType)===f(i[1][p])),v=r.find(C=>f(C.coinType)===f(i[0][p]));!w||!v||u.push({assetId:v.id,assetCoinType:f(i[0][p]),rewardCoinType:f(i[1][p]),option:Number(i[2][p]),userClaimableReward:Number(i[4][p])/Math.pow(10,w.priceDecimal),ruleIds:Array.isArray(i[3][p])?i[3][p]:[i[3][p]]})}}return u}function Je(e){const t=new Map;e.forEach(r=>{const n=r.assetId,a=r.option,c=`${n}-${a}-${r.rewardCoinType}`;t.has(c)?t.get(c).total+=r.userClaimableReward:t.set(c,{assetId:n,rewardType:a,coinType:r.rewardCoinType,total:Number(r.userClaimableReward)})});const o=new Map;for(const{assetId:r,rewardType:n,coinType:a,total:c}of t.values()){const s=`${r}-${n}`;o.has(s)||o.set(s,{assetId:r,rewardType:n,rewards:new Map});const i=o.get(s);i.rewards.set(a,(i.rewards.get(a)||0)+c)}return Array.from(o.values()).map(r=>({assetId:r.assetId,rewardType:r.rewardType,rewards:Array.from(r.rewards.entries()).map(([n,a])=>({coinType:n,available:a.toFixed(6)}))}))}const Qe=T(async(e,t)=>{const o=`https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${e}&sdk=${A.version}&market=${t?.market||$}`;return(await fetch(o,{headers:I}).then(n=>n.json())).data}),Xe=T(async(e,t)=>{const o=`https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${e}&page=${t?.page||1}&pageSize=${t?.size||400}&sdk=${A.version}&market=${t?.market||$}`,r=await fetch(o,{headers:I}).then(n=>n.json());return S({data:r.data.rewards})});async function Ze(e,t,o){const r=await b({...o,cacheTime:g}),n=await M({...o,cacheTime:g}),a=new Map;for(const s of t){const{rewardCoinType:i,ruleIds:u}=s;for(const m of u){a.has(i)||a.set(i,{assetIds:[],ruleIds:[],amount:0});const p=a.get(i);p.assetIds.push(s.assetCoinType.replace("0x","")),p.ruleIds.push(m),p.amount+=s.userClaimableReward}}const c=[];for(const[s,{assetIds:i,ruleIds:u,amount:m}]of a){const p=n.find(v=>f(v.suiCoinType)===f(s));if(!p||!p.contract.rewardFundId)throw new Error(`No matching rewardFund found for reward coin: ${s}`);const w=p.contract.rewardFundId;if(o?.accountCap&&!o.customCoinReceive)throw new Error("customCoinReceive is required when accountCap is provided");if(o?.customCoinReceive){let v;o.accountCap?v=e.moveCall({target:`${r.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(r.incentiveV3),e.object(r.storage),e.object(w),e.pure.vector("string",i),e.pure.vector("address",u),d(o.accountCap,e.object)],typeArguments:[s]}):v=e.moveCall({target:`${r.package}::incentive_v3::claim_reward`,arguments:[e.object("0x06"),e.object(r.incentiveV3),e.object(r.storage),e.object(w),e.pure.vector("string",i),e.pure.vector("address",u)],typeArguments:[s]});const[C]=e.moveCall({target:"0x2::coin::from_balance",arguments:[v],typeArguments:[s]});if(o?.customCoinReceive.type==="transfer"){if(!o.customCoinReceive.transfer)throw new Error("customCoinReceive.transfer is required");e.transferObjects([C],d(o.customCoinReceive.transfer,e.pure.address))}if(o?.customCoinReceive.type==="depositNAVI"){const R=y(p.totalSupplyAmount).shiftedBy(-9),D=y(p.supplyCapCeiling).shiftedBy(-27);R.plus(m).isGreaterThan(D)&&o?.customCoinReceive.depositNAVI?.fallbackReceiveAddress?e.transferObjects([C],e.pure.address(o.customCoinReceive.depositNAVI.fallbackReceiveAddress)):await te(e,p,C,o)}else c.push({coin:C,identifier:p})}else e.moveCall({target:`${r.package}::incentive_v3::claim_reward_entry`,arguments:[e.object("0x06"),e.object(r.incentiveV3),e.object(r.storage),e.object(w),e.pure.vector("string",i),e.pure.vector("address",u)],typeArguments:[s]})}return c}exports.Address=N;exports.DEFAULT_CACHE_TIME=g;exports.DEFAULT_MARKET_IDENTITY=$;exports.FlashLoanAssetConfig=Ce;exports.IncentiveAPYInfo=he;exports.IncentivePoolInfo=J;exports.IncentivePoolInfoByPhase=we;exports.MARKETS=V;exports.Market=se;exports.OracleInfo=ve;exports.PoolOperator=B;exports.ReserveDataInfo=Te;exports.UserStateInfo=Q;exports.borrowCoinPTB=Me;exports.claimLendingRewardsPTB=Ze;exports.createAccountCapPTB=oe;exports.createEModeCapPTB=Re;exports.depositCoinPTB=te;exports.emodeIdentityId=ce;exports.enterEModePTB=re;exports.exitEModePTB=Ue;exports.filterPriceFeeds=fe;exports.flashloanPTB=We;exports.getAccountCapOwnerPTB=ne;exports.getAllFlashLoanAssets=U;exports.getBorrowFee=Ve;exports.getCoins=qe;exports.getConfig=b;exports.getFees=Be;exports.getFlashLoanAsset=Ge;exports.getHealthFactor=Se;exports.getHealthFactorPTB=ue;exports.getLendingPositions=le;exports.getLendingState=O;exports.getMarket=De;exports.getMarketConfig=P;exports.getMarkets=ie;exports.getPool=_;exports.getPools=M;exports.getPriceFeeds=H;exports.getPythStalePriceFeedId=de;exports.getSimulatedHealthFactor=Oe;exports.getSimulatedHealthFactorPTB=q;exports.getStats=$e;exports.getTransactions=Le;exports.getUserAvailableLendingRewards=Ye;exports.getUserClaimedRewardHistory=Xe;exports.getUserEModeCaps=ae;exports.getUserTotalClaimedReward=Qe;exports.liquidatePTB=Ke;exports.mergeCoinsPTB=Ne;exports.normalizeCoinType=f;exports.parsePoolUID=ee;exports.parseTxValue=d;exports.repayCoinPTB=Fe;exports.repayFlashLoanPTB=ze;exports.summaryLendingRewards=Je;exports.updateOraclePriceBeforeUserOperationPTB=He;exports.updateOraclePricesPTB=ge;exports.updatePythPriceFeeds=me;exports.withCache=j;exports.withSingleton=T;exports.withdrawCoinPTB=Ee;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const N=require("@mysten/sui/transactions"),m=require("@mysten/bcs"),Q=require("@mysten/sui/client"),Ce=require("lodash.camelcase"),je=require("@mysten/sui/utils"),K=require("@pythnetwork/pyth-sui-js"),p=require("bignumber.js"),C=require("@mysten/sui/bcs"),W=m.bcs.bytes(32).transform({input:e=>m.fromHex(e),output:e=>m.toHex(e)}),_e=m.bcs.struct("IncentiveAPYInfo",{asset_id:m.bcs.u8(),apy:m.bcs.u256(),coin_types:m.bcs.vector(m.bcs.string())}),te=m.bcs.struct("IncentivePoolInfo",{pool_id:W,funds:W,phase:m.bcs.u64(),start_at:m.bcs.u64(),end_at:m.bcs.u64(),closed_at:m.bcs.u64(),total_supply:m.bcs.u64(),asset_id:m.bcs.u8(),option:m.bcs.u8(),factor:m.bcs.u256(),distributed:m.bcs.u64(),available:m.bcs.u256(),total:m.bcs.u256()}),Te=m.bcs.struct("IncentivePoolInfoByPhase",{phase:m.bcs.u64(),pools:m.bcs.vector(te)}),Ie=m.bcs.struct("OracleInfo",{oracle_id:m.bcs.u8(),price:m.bcs.u256(),decimals:m.bcs.u8(),valid:m.bcs.bool()}),Be=m.bcs.struct("FlashLoanAssetConfig",{id:m.bcs.string(),asset_id:m.bcs.u8(),coin_type:m.bcs.string(),pool_id:m.bcs.string(),rate_to_supplier:m.bcs.u64(),rate_to_treasury:m.bcs.u64(),max:m.bcs.u64(),min:m.bcs.u64()}),Pe=m.bcs.struct("ReserveDataInfo",{id:m.bcs.u8(),oracle_id:m.bcs.u8(),coin_type:m.bcs.string(),supply_cap:m.bcs.u256(),borrow_cap:m.bcs.u256(),supply_rate:m.bcs.u256(),borrow_rate:m.bcs.u256(),supply_index:m.bcs.u256(),borrow_index:m.bcs.u256(),total_supply:m.bcs.u256(),total_borrow:m.bcs.u256(),last_update_at:m.bcs.u64(),ltv:m.bcs.u256(),treasury_factor:m.bcs.u256(),treasury_balance:m.bcs.u256(),base_rate:m.bcs.u256(),multiplier:m.bcs.u256(),jump_rate_multiplier:m.bcs.u256(),reserve_factor:m.bcs.u256(),optimal_utilization:m.bcs.u256(),liquidation_ratio:m.bcs.u256(),liquidation_bonus:m.bcs.u256(),liquidation_threshold:m.bcs.u256()}),oe=m.bcs.struct("UserStateInfo",{asset_id:m.bcs.u8(),borrow_balance:m.bcs.u256(),supply_balance:m.bcs.u256()}),Ae="1.4.0",E={version:Ae},$e=E.version,Se=()=>{if(typeof process<"u"&&process.versions&&process.versions.node)try{const e=require("os"),n=process.version,o=e.type(),r=e.arch();return`Node.js ${n.startsWith("v")?n.substring(1):n}; ${o}/${r}`}catch{return`Node.js ${process.version}; OS/Unknown (Error)`}return"Node/Unknown"},Ee=()=>{let e="";return typeof process<"u"&&process.versions&&process.versions.node&&(e=`lending/${$e} (${Se()})`),e},X=Ee(),$=new Q.SuiClient({url:Q.getFullnodeUrl("mainnet")});function ne(e){const n=[];return e.forEach((o,r)=>{const t=r===e.length-1;if(typeof o=="object"&&o!==null&&t){const{client:a,disableCache:i,cacheTime:c,...s}=o;n.push(s)}else n.push(o)}),JSON.stringify(n)}function T(e){const n={};return(...o)=>{const r=ne(o);return n[r]||(n[r]=e(...o).finally(()=>{delete n[r]})),n[r]}}function A(e){let n={};return(...o)=>{const r=o[o.length-1],t=ne(o),a=n[t];return!r?.disableCache&&typeof a?.data<"u"&&(typeof r?.cacheTime>"u"||r.cacheTime>Date.now()-a.cacheAt)?a.data:e(...o).then(i=>(n[t]={data:i,cacheAt:Date.now()},i))}}function G(e){return Array.isArray(e)?e.map(n=>G(n)):e!=null&&typeof e=="object"?Object.keys(e).reduce((n,o)=>({...n,[Ce(o)]:G(e[o])}),{}):e}function f(e,n){return typeof e=="object"?e:n(e)}function Ve(e,n){return typeof n=="string"?e.object(n):typeof n=="object"&&n.$kind?n:e.object(n.contract.pool)}function q(e,n,o){if(e.results&&e.results.length>0){if(e.results[0].returnValues&&e.results[0].returnValues.length>0)return e.results[0].returnValues.map((r,t)=>(n[t]||n[0]).parse(Uint8Array.from(r[0])))}else if(e.error)return console.log(`Get an error, msg: ${e.error}`),[];return[]}function v(e){return je.normalizeStructTag(e)}function re(e){const n=(e||0)/Math.pow(10,27);return n>Math.pow(10,5)?1/0:n}new K.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:2e4});const Me=27,x=(e,n)=>{if(!Number(e)||!Number(n))return new p(0);const o=new p(1).shiftedBy(1*Me),r=o.multipliedBy(new p(.5));return new p(e).multipliedBy(new p(n)).plus(r).dividedBy(o).integerValue(p.ROUND_DOWN)},M=X?{"User-Agent":X}:{};function z(e,n="uniqueId"){return e.reduce((o,r)=>(o[r[n]]=r,o),{})}function ee(e,n="uniqueId"){return e.reduce((o,r)=>(o[r[n]]=r,o),{})}function L(e,n){const o=e.emodes.find(t=>t.emodeId===n.emodeId);if(!o)throw new Error("EMode not found in pool");const r=o.assets.find(t=>t.assetId===e.id);return{...e,emode:{...r,emodeId:o.emodeId},isEMode:!0}}function ae(e){const[n,o]=e.split("-");return!n||!o?null:{marketKey:n,poolId:parseInt(o)}}function B(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}var F=(e=>(e[e.Supply=1]="Supply",e[e.Withdraw=2]="Withdraw",e[e.Borrow=3]="Borrow",e[e.Repay=4]="Repay",e))(F||{});const R=A(T(async e=>{const n=(e?.markets||[V.main]).map(t=>_(t)),o=`https://open-api.naviprotocol.io/api/navi/pools?env=${e?.env||"prod"}&sdk=${E.version}&market=${n.map(t=>t.key)}`,r=await fetch(o,{headers:M}).then(t=>t.json());return r.data.forEach(t=>{const i=r.meta.emodes.filter(b=>{const j=_(b.marketId);return t.market===j.key&&b.isActive}).filter(b=>!!b.assets.find(j=>j.assetId===t.id));t.emodes=i;const c=p(t.totalSupplyAmount).div(Math.pow(10,9)).decimalPlaces(t.token.decimals,p.ROUND_DOWN).toString(),s=p(t.borrowedAmount).shiftedBy(-9).decimalPlaces(t.token.decimals,p.ROUND_DOWN).toString(),l=p(c).multipliedBy(t.oracle.price).toString(),d=p(s).multipliedBy(t.oracle.price).toString(),g=p(t.supplyCapCeiling).shiftedBy(-27).decimalPlaces(t.token.decimals,p.ROUND_DOWN).toString(),h=p.max(p(t.borrowedAmount),p(t.validBorrowAmount)).shiftedBy(-9).decimalPlaces(t.token.decimals,p.ROUND_DOWN).toString(),y=p(g).multipliedBy(t.oracle.price).toString(),u=p(h).multipliedBy(t.oracle.price).toString();t.poolSupplyAmount=c,t.poolBorrowAmount=s,t.poolSupplyValue=l,t.poolBorrowValue=d,t.poolSupplyCapAmount=g,t.poolBorrowCapAmount=h,t.poolSupplyCapValue=y,t.poolBorrowCapValue=u}),r.data}));async function P(e,n){let o=n?.market;if(typeof e=="string"){const a=ae(e);a&&(o=a.marketKey,e=a.poolId)}const r=await R({...n,markets:[o||D],cacheTime:w});if(typeof e=="object")return e;const t=r.find(a=>typeof e=="string"?v(a.suiCoinType)===v(e):typeof e=="number"?a.id===e:!1);if(!t)throw new Error("Pool not found");return t.isDeprecated&&console.log(`The lending pool for coinType ${t.suiCoinType} is going to be deprecated.`),t}const Ue=A(T(async e=>{const n=`https://open-api.naviprotocol.io/api/navi/stats?sdk=${E.version}`;return(await fetch(n,{headers:M}).then(r=>r.json())).data})),De=A(T(async e=>{const n=`https://open-api.naviprotocol.io/api/navi/fee?sdk=${E.version}`;return await fetch(n,{headers:M}).then(r=>r.json())}));async function ce(e,n,o,r){const t=await k({...r,cacheTime:w}),a=await P(n,r);if(a?.deprecatedAt&&Date.now()>a.deprecatedAt)throw new Error(`The lending pool for coinType ${a.suiCoinType} has been deprecated.`);const i=typeof o=="object"&&o.$kind==="GasCoin";if(v(a.suiCoinType)===v("0x2::sui::SUI")&&i){if(!r?.amount)throw new Error("Amount is required for sui coin");o=e.splitCoins(o,[r.amount])}let c;return typeof r?.amount<"u"?c=f(r.amount,e.pure.u64):c=e.moveCall({target:"0x2::coin::value",arguments:[f(o,e.object)],typeArguments:[a.suiCoinType]}),r?.accountCap?e.moveCall({target:`${t.package}::incentive_v3::deposit_with_account_cap`,arguments:[e.object("0x06"),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),f(o,e.object),e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object)],typeArguments:[a.suiCoinType]}):e.moveCall({target:`${t.package}::incentive_v3::entry_deposit`,arguments:[e.object("0x06"),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),f(o,e.object),c,e.object(t.incentiveV2),e.object(t.incentiveV3)],typeArguments:[a.suiCoinType]}),t.version===2&&a.id===0&&(!r?.env||r?.env==="prod")&&e.moveCall({target:`${t.package}::pool::refresh_stake`,arguments:[e.object(a.contract.pool),e.object("0x05")]}),e}async function Oe(e,n,o,r){const t=await k({...r,cacheTime:w}),a=await P(n,r),i=f(o,e.pure.u64);let c;if(t.version===1)if(r?.accountCap){const[l]=e.moveCall({target:`${t.package}::incentive_v3::withdraw_with_account_cap`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});c=l}else{const[l]=e.moveCall({target:`${t.package}::incentive_v3::withdraw`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3)],typeArguments:[a.suiCoinType]});c=l}else if(r?.accountCap){const[l]=e.moveCall({target:`${t.package}::incentive_v3::withdraw_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object),e.object("0x05")],typeArguments:[a.suiCoinType]});c=l}else{const[l]=e.moveCall({target:`${t.package}::incentive_v3::withdraw_v2`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),e.object("0x05")],typeArguments:[a.suiCoinType]});c=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[c],typeArguments:[a.suiCoinType]})}async function Fe(e,n,o,r){const t=await k({...r,cacheTime:w}),a=await P(n,r);if(a?.deprecatedAt&&Date.now()>a.deprecatedAt)throw new Error(`The lending pool for coinType ${a.suiCoinType} has been deprecated.`);const i=f(o,e.pure.u64);let c;if(t.version===1)if(r?.accountCap){const[l]=e.moveCall({target:`${t.package}::incentive_v3::borrow_with_account_cap`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});c=l}else{const[l]=e.moveCall({target:`${t.package}::incentive_v3::borrow`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3)],typeArguments:[a.suiCoinType]});c=l}else if(r?.accountCap){const[l]=e.moveCall({target:`${t.package}::incentive_v3::borrow_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object),e.object("0x05")],typeArguments:[a.suiCoinType]});c=l}else{const[l]=e.moveCall({target:`${t.package}::incentive_v3::borrow_v2`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),i,e.object(t.incentiveV2),e.object(t.incentiveV3),e.object("0x05")],typeArguments:[a.suiCoinType]});c=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[e.object(c)],typeArguments:[a.suiCoinType]})}async function Ne(e,n,o,r){const t=await k({...r,cacheTime:w}),a=await P(n,r),i=typeof o=="object"&&o.$kind==="GasCoin";if(v(a.suiCoinType)===v("0x2::sui::SUI")&&i){if(!r?.amount)throw new Error("Amount is required for sui coin");o=e.splitCoins(o,[r.amount])}let c;if(typeof r?.amount<"u"?c=f(r.amount,e.pure.u64):c=e.moveCall({target:"0x2::coin::value",arguments:[f(o,e.object)],typeArguments:[a.suiCoinType]}),r?.accountCap){const[s]=e.moveCall({target:`${t.package}::incentive_v3::repay_with_account_cap`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),f(o,e.object),e.object(t.incentiveV2),e.object(t.incentiveV3),f(r.accountCap,e.object)],typeArguments:[a.suiCoinType]});return e.moveCall({target:"0x2::coin::from_balance",arguments:[s],typeArguments:[a.suiCoinType]})}else return e.moveCall({target:`${t.package}::incentive_v3::entry_repay`,arguments:[e.object("0x06"),e.object(t.priceOracle),e.object(t.storage),e.object(a.contract.pool),e.pure.u8(a.id),f(o,e.object),c,e.object(t.incentiveV2),e.object(t.incentiveV3)],typeArguments:[a.suiCoinType]}),e}const Re=A(T(async e=>{const n=await k({...e});if(e?.address&&typeof e?.asset<"u")try{const t=await P(e.asset,e),a=e?.client??$,i=new N.Transaction;i.moveCall({target:`${n.package}::incentive_v3::get_borrow_fee_v2`,arguments:[i.object(n.incentiveV3),i.pure.address(e.address),i.pure.u8(t.id),i.pure.u64(1e4)],typeArguments:[]});const c=await a.devInspectTransactionBlock({transactionBlock:i,sender:e.address}),s=q(c,[C.bcs.u64()]);return(Number(s[0])||0)/100}catch(t){console.error(t)}const r=(await $.getObject({id:n.incentiveV3,options:{showType:!0,showOwner:!0,showContent:!0}})).data.content.fields.borrow_fee_rate;return Number(r)/100})),D="main",V={main:{id:0,key:"main",name:"Main Market"}};class se{constructor(n,o){this.poolMap={},this.emodeMap={},this.pools=[],this.emodes=[],this.emodePools=[],this.emodeBorrowablePools=[],this.emodeSupplyablePools=[],this._overview={marketTotalSupplyValue:"0",marketTotalBorrowValue:"0"},this.config=_(n),this.initPools(o)}get overview(){return this._overview}initPools(n){const o=z(this.pools),r=ee(this.emodes),t=new Set,a=new Set;let i=p(0),c=p(0);n.forEach(s=>{if(!this.checkMarket(s.market)){console.warn(`Pool is not in market ${this.config.name}`,s);return}o[s.uniqueId]||this.pools.push(s),s?.emodes?.forEach(d=>{r[d.uniqueId]||this.emodes.push(d),d.assets.forEach(g=>{g.isDebt&&d.assets.find(y=>y.isCollateral&&y.ltv>0&&y.assetId!==s.id)&&t.add(s.uniqueId),g.isCollateral&&d.assets.find(y=>y.isDebt&&y.assetId!==s.id)&&a.add(s.uniqueId)})}),c=c.plus(s.poolBorrowValue),i=i.plus(s.poolSupplyValue)}),this.poolMap=z(this.pools,"id"),this.emodeMap=ee(this.emodes,"emodeId"),this.emodes.forEach(s=>{const l=this.getEModePools(s.emodeId);this.emodePools.push(...l)}),this._overview={marketTotalSupplyValue:i.toString(),marketTotalBorrowValue:c.toString()},this.emodeBorrowablePools=this.pools.filter(s=>t.has(s.uniqueId)),this.emodeSupplyablePools=this.pools.filter(s=>a.has(s.uniqueId))}getEMode(n){return this.emodeMap[n]||null}getEModeRelatePools(n,o){const{collateral:r,debt:t,emodeId:a}=o||{},i=[];return n.emodes.forEach(c=>{typeof a=="number"&&a!==c.emodeId||c.assets.forEach(s=>{typeof r=="boolean"&&r&&s.isCollateral&&s.assetId===n.id&&i.push(this.poolMap[s.assetId]),typeof t=="boolean"&&t&&s.isDebt&&s.assetId===n.id&&i.push(this.poolMap[s.assetId])})}),i}getEModePools(n){const o=this.getEMode(n);return o?o.assets.map(t=>t.assetId).map(t=>this.poolMap[t]).filter(t=>!!t).map(t=>{const a=o.assets.find(i=>i.assetId===t.id);return{...t,emode:{...a,emodeId:o.emodeId},isEMode:!0}}):[]}checkMarket(n){let o=!1;return typeof n=="number"&&n===this.config.id&&(o=!0),typeof n=="string"&&n===this.config.key&&(o=!0),typeof n=="object"&&n.id===this.config.id&&(o=!0),o}}const _=e=>{const o=Object.values(V).find(r=>typeof e=="number"?r.id===e:typeof e=="string"?r.key===e:r.id===e.id);if(!o)throw new Error("Market not found");return o},ie=A(T(async(e,n)=>{const o=await R({cacheTime:6e4,...n,markets:e});return e.map(r=>{const t=_(r),a=o.filter(i=>i.market===t.key);return new se(r,a)})})),Le=A(T(async(e,n)=>(await ie([e],n))[0])),k=A(T(async e=>{const n=_(e?.market||D),o=`https://open-api.naviprotocol.io/api/navi/config?env=${e?.env||"prod"}&sdk=${E.version}&market=${n.key}`;return(await fetch(o,{headers:M}).then(t=>t.json())).data})),w=1e3*60*5;async function le(e,n){const o=await k({cacheTime:w,...n});return e.moveCall({target:`${o.package}::lending::create_account`,arguments:[]})}async function ue(e,n,o){const r=await k({cacheTime:w,...o});return e.moveCall({target:`${r.package}::account::account_owner`,arguments:[n]})}async function pe(e,n,o){const r=await k({...o,cacheTime:w});return o?.accountCap?e.moveCall({target:`${r.package}::lending::enter_emode_with_account_cap`,arguments:[e.object(r.storage),f(n,e.pure.u64),f(o.accountCap,e.object)]}):e.moveCall({target:`${r.package}::lending::enter_emode`,arguments:[e.object(r.storage),f(n,e.pure.u64)]}),e}async function qe(e,n){const o=await k({...n,cacheTime:w});return n?.accountCap?e.moveCall({target:`${o.package}::lending::exit_emode_with_account_cap`,arguments:[e.object(o.storage),f(n.accountCap,e.object)]}):e.moveCall({target:`${o.package}::lending::exit_emode`,arguments:[e.object(o.storage)]}),e}async function He(e,n,o){const r=await k({cacheTime:w,...o}),t=await le(e,o);await pe(e,n,{...o,accountCap:t});const a=await _(o?.market||D),i=await ue(e,t,o);return e.moveCall({target:`${r.emode.contract.registryPackage}::registry::register_emode_for_account_cap`,arguments:[e.object(r.emode.contract.registryObject),i,f(a.id,e.pure.u64),f(n,e.pure.u64)]}),t}const Y=A(T(async(e,n)=>{const o=await k({cacheTime:w,...n}),r=new N.Transaction,t=n?.client??$;r.moveCall({target:`${o.emode.contract.registryPackage}::registry::find_user_emode_account_caps`,arguments:[r.object(o.emode.contract.registryObject),r.pure.address(e)]});const i=(await t.devInspectTransactionBlock({transactionBlock:r,sender:e})).results[0].returnValues,c=C.bcs.vector(C.bcs.u64()).parse(Uint8Array.from(i[0][0])),s=C.bcs.vector(C.bcs.u64()).parse(Uint8Array.from(i[1][0])),l=C.bcs.vector(C.bcs.Address).parse(Uint8Array.from(i[2][0]));return c.map((d,g)=>({marketId:Number(d),emodeId:Number(s[g]),accountCap:l[g].toString()}))}));function We(e){return`${_(e.marketId).key}-${e.emodeId}`}function Ge(e,n,o){const r=typeof o?.balance=="number",t=r?o.balance:0;let a=0;const i=[];let c="";if(n.sort((s,l)=>Number(l.balance)-Number(s.balance)).forEach(s=>{if(!(r&&a>=t)&&Number(s.balance)!==0){if(c||(c=s.coinType),c!==s.coinType)throw new Error("All coins must be of the same type");a+=Number(s.balance),i.push(s.coinObjectId)}}),i.length===0)throw new Error("No coins to merge");if(r&&a<t)throw new Error(`Balance is less than the specified balance: ${a} < ${t}`);return v(c)===v("0x2::sui::SUI")&&o?.useGasCoin?r?e.splitCoins(e.gas,[e.pure.u64(t)]):e.gas:(i.length===1?e.object(i[0]):e.mergeCoins(i[0],i.slice(1)),r?e.splitCoins(i[0],[e.pure.u64(t)]):i[0])}async function J(e,n,o,r,t,a,i){const c=await k({...i,cacheTime:w}),s=await P(o,i);return e.moveCall({target:`${c.uiGetter}::calculator_unchecked::dynamic_health_factor`,arguments:[e.object("0x06"),e.object(c.storage),e.object(c.oracle.priceOracle),Ve(e,s),f(n,e.pure.address),f(s.id,e.pure.u8),f(r,e.pure.u64),f(t,e.pure.u64),f(a,e.pure.bool)],typeArguments:[s.suiCoinType]})}async function de(e,n,o){return J(e,n,0,0,0,!1,o)}async function me(e,n,o){const r=new N.Transaction,t=o?.client??$,a=await R({...o,markets:Object.values(V)}),i=z(a);for(let d of n){const g=await k({...o,cacheTime:w,market:d.market});r.moveCall({target:`${g.uiGetter}::getter_unchecked::get_user_state`,arguments:[r.object(g.storage),r.pure.address(d.address)]})}const s=((await t.devInspectTransactionBlock({transactionBlock:r,sender:e})).results||[]).map(d=>d.returnValues?.map(g=>C.bcs.vector(oe).parse(Uint8Array.from(g[0])))[0]||[]),l=[];return s.forEach((d,g)=>{const h=n[g],y=_(h.market);d.forEach(u=>{if(u.supply_balance==="0"&&u.borrow_balance==="0"&&(h.emodeId===void 0||!o?.includeZeroBalanceEmodePositions))return;const b=i[`${y.key}-${u.asset_id}`];if(!b)return;const j=x(u.supply_balance,b.currentSupplyIndex).toString(),I=x(u.borrow_balance,b.currentBorrowIndex).toString();l.push({supplyBalance:j,borrowBalance:I,assetId:u.asset_id,market:y.key,pool:b,emodeId:h.emodeId})})}),l}const ze=A(async(e,n)=>{const r=(n?.markets||Object.keys(V)).map(t=>_(t)).map(t=>({address:e,market:t.key}));return await me(e,r,n)});async function Ke(e,n){const o=n?.client??$,r=new N.Transaction;await de(r,e,n);const t=await o.devInspectTransactionBlock({transactionBlock:r,sender:e}),a=q(t,[C.bcs.u256()]);return re(Number(a[0])||0)}async function Ye(e,n,o,r){const t=r?.client??$,a=new N.Transaction;let i=0,c=0;const s=await P(n,r);if(o.forEach(h=>{h.type===F.Supply?i+=h.amount:h.type===F.Withdraw?i-=h.amount:h.type===F.Borrow?c+=h.amount:h.type===F.Repay&&(c-=h.amount)}),i*c<0)throw new Error("Invalid operations");const l=i>0||c>0;await J(a,e,s,Math.abs(i),Math.abs(c),l,r);const d=await t.devInspectTransactionBlock({transactionBlock:a,sender:e}),g=q(d,[C.bcs.u256()]);return re(Number(g[0])||0)}const Je=T(async(e,n)=>{const o=new URLSearchParams;n?.cursor&&o.set("cursor",n.cursor),o.set("userAddress",e);const r=`https://open-api.naviprotocol.io/api/navi/user/transactions?${o.toString()}&sdk=${E.version}`;return(await fetch(r,{headers:M}).then(a=>a.json())).data});async function Ze(e,n){let o=null;const r=[],t=n?.client??$;do{let a;if(n?.coinType?a=await t.getCoins({owner:e,coinType:n?.coinType,cursor:o,limit:100}):a=await t.getAllCoins({owner:e,cursor:o,limit:100}),!a.data||!a.data.length)break;r.push(...a.data),o=a.nextCursor}while(o);return r}const fe=A(async(e,n)=>{const o=[],r=(n?.markets||Object.keys(V)).map(c=>_(c));let t=[];try{t=await Y(e,n)}catch(c){console.error(c)}const a=r.map(c=>({address:e,market:c.key})).concat(t.filter(c=>!!r.find(s=>s.id===c.marketId)).map(c=>({address:c.accountCap,market:_(c.marketId).key,emodeId:c.emodeId})));return(await me(e,a,n)).forEach(c=>{const s=typeof c.emodeId=="number"?t.find(l=>{const d=_(c.market);return l.emodeId===c.emodeId&&l.marketId===d.id}):void 0;if(s){if(!c.pool.emodes.find(d=>d.emodeId===s.emodeId))return;if(p(c.supplyBalance).gte(0)){const d=p(c.supplyBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,p.ROUND_DOWN),g=L(c.pool,s);if(d.gt(0)||g.emode.isCollateral)try{o.push({id:`${c.pool.uniqueId}_${s.emodeId}_navi-lending-emode-supply-${B()}`,wallet:e,protocol:"navi",market:c.market,type:"navi-lending-emode-supply","navi-lending-emode-supply":{amount:d.toString(),pool:L(c.pool,s),token:c.pool.token,valueUSD:d.multipliedBy(c.pool.oracle.price).toString(),emodeCap:s}})}catch(h){console.error(h)}}if(p(c.borrowBalance).gte(0)){const d=p(c.borrowBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,p.ROUND_DOWN),g=L(c.pool,s);if(d.gt(0)||g.emode.isDebt)try{o.push({id:`${c.pool.uniqueId}_${s.emodeId}_navi-lending-emode-borrow-${B()}`,wallet:e,protocol:"navi",market:c.market,type:"navi-lending-emode-borrow","navi-lending-emode-borrow":{amount:d.toString(),pool:L(c.pool,s),token:c.pool.token,valueUSD:d.multipliedBy(c.pool.oracle.price).toString(),emodeCap:s}})}catch(h){console.error(h)}}}else{if(p(c.supplyBalance).gt(0)){const l=p(c.supplyBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,p.ROUND_DOWN);o.push({id:`${c.pool.uniqueId}_navi-lending-supply-${B()}`,wallet:e,protocol:"navi",type:"navi-lending-supply",market:c.market,"navi-lending-supply":{amount:l.toString(),pool:c.pool,token:c.pool.token,valueUSD:l.multipliedBy(c.pool.oracle.price).toString()}})}if(p(c.borrowBalance).gt(0)){const l=p(c.borrowBalance).shiftedBy(-9).decimalPlaces(c.pool.token.decimals,p.ROUND_DOWN);o.push({id:`${c.pool.uniqueId}_navi-lending-borrow-${B()}`,wallet:e,protocol:"navi",market:c.market,type:"navi-lending-borrow","navi-lending-borrow":{amount:l.toString(),pool:c.pool,token:c.pool.token,valueUSD:l.multipliedBy(c.pool.oracle.price).toString()}})}}}),o});class U{constructor(n){this._positions=[],this._overview={hf:1/0,netVaule:"0",netWorthApr:"0",totalSupplyValue:"0",totalBorrowValue:"0",totalsupplyApy:"0",totalBorrowApy:"0",maxLiquidationValue:"0",maxLoanToVaule:"0",supply:{},borrow:{}},this.positions=n}get positions(){return this._positions}get overview(){return this._overview}set positions(n){this._positions=n,this._overview=this.getPositionsOverview(n)}filterPositionsByPool(n){const r=!!n.isEMode?["navi-lending-emode-supply","navi-lending-emode-borrow"]:["navi-lending-supply","navi-lending-borrow"];return new U(this.positions.filter(t=>{const a=t[t.type];return r.includes(t.type)&&a.pool.uniqueId===n.uniqueId}))}deposit(n,o){const r=!!n.isEMode;let t;return r?t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-emode-supply","navi-lending-emode-supply":{amount:o.toString(),valueUSD:p(o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n,emodeCap:{}}}:t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-supply","navi-lending-supply":{amount:o.toString(),valueUSD:p(o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n}},new U([...this.positions,t])}withdraw(n,o){const r=!!n.isEMode;let t;return r?t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-emode-supply","navi-lending-emode-supply":{amount:(-o).toString(),valueUSD:p(-o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n,emodeCap:{}}}:t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-supply","navi-lending-supply":{amount:(-o).toString(),valueUSD:p(-o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n}},new U([...this.positions,t])}borrow(n,o){const r=!!n.isEMode;let t;return r?t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-emode-borrow","navi-lending-emode-borrow":{amount:o.toString(),valueUSD:p(o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n,emodeCap:{}}}:t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-borrow","navi-lending-borrow":{amount:o.toString(),valueUSD:p(o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n}},new U([...this.positions,t])}repay(n,o){const r=!!n.isEMode;let t;return r?t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-emode-borrow","navi-lending-emode-borrow":{amount:(-o).toString(),valueUSD:p(-o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n,emodeCap:{}}}:t={id:B(),wallet:"",protocol:"navi",market:"",type:"navi-lending-borrow","navi-lending-borrow":{amount:(-o).toString(),valueUSD:p(-o).multipliedBy(n.oracle.price).toString(),token:n.token,pool:n}},new U([...this.positions,t])}getPositionsOverview(n){const o={},r={};let t=new p(0),a=new p(0),i=new p(0),c=new p(0),s=new p(0),l=new p(0);n.forEach(y=>{if(y.type==="navi-lending-supply"){const u=y["navi-lending-supply"];t=t.plus(u.valueUSD),s=s.plus(new p(u.valueUSD).multipliedBy(u.pool.liquidationFactor.threshold)),l=l.plus(new p(u.valueUSD).multipliedBy(u.pool.ltvValue))}else if(y.type==="navi-lending-borrow")a=a.plus(y["navi-lending-borrow"].valueUSD);else if(y.type==="navi-lending-emode-supply"){const u=y["navi-lending-emode-supply"];t=t.plus(u.valueUSD);const b=u.pool.emode;s=s.plus(new p(u.valueUSD).multipliedBy(b.lt)),l=l.plus(new p(u.valueUSD).multipliedBy(b.ltv))}else y.type==="navi-lending-emode-borrow"&&(a=a.plus(y["navi-lending-emode-borrow"].valueUSD))}),a=p.max(a,0),t=p.max(t,0),s=p.max(s,0),l=p.max(l,0),n.forEach(y=>{if(y.type==="navi-lending-supply"){const u=y["navi-lending-supply"],b=u.pool.supplyIncentiveApyInfo.apy;t.gt(0)&&(i=i.plus(new p(u.valueUSD).dividedBy(t).multipliedBy(new p(b).dividedBy(100)))),o[u.pool.suiCoinType]=p(o[u.pool.suiCoinType]||0).plus(u.amount).toString()}else if(y.type==="navi-lending-borrow"){const u=y["navi-lending-borrow"],b=u.pool.borrowIncentiveApyInfo.apy;a.gt(0)&&(c=c.plus(new p(u.valueUSD).dividedBy(a).multipliedBy(new p(b).dividedBy(100)))),r[u.pool.suiCoinType]=p(r[u.pool.suiCoinType]||0).plus(u.amount).toString()}else if(y.type==="navi-lending-emode-supply"){const u=y["navi-lending-emode-supply"],b=u.pool.supplyIncentiveApyInfo.apy;t.gt(0)&&(i=i.plus(new p(u.valueUSD).dividedBy(t).multipliedBy(new p(b).dividedBy(100)))),o[u.pool.suiCoinType]=p(o[u.pool.suiCoinType]||0).plus(u.amount).toString()}else if(y.type==="navi-lending-emode-borrow"){const u=y["navi-lending-emode-borrow"],b=u.pool.borrowIncentiveApyInfo.apy;a.gt(0)&&(c=c.plus(new p(u.valueUSD).dividedBy(a).multipliedBy(new p(b).dividedBy(100)))),r[u.pool.suiCoinType]=p(r[u.pool.suiCoinType]||0).plus(u.amount).toString()}});const d=t.minus(a),g=t.minus(a).eq(0)?new p(0):t.multipliedBy(i).minus(a.multipliedBy(c)).div(t.minus(a));return{hf:a.toNumber()!==0?s.dividedBy(a).toNumber():1/0,netVaule:d.toString(),netWorthApr:g.toString(),totalSupplyValue:t.toString(),totalBorrowValue:a.toString(),totalsupplyApy:i.toString(),totalBorrowApy:c.toString(),maxLiquidationValue:s.toString(),maxLoanToVaule:l.toString(),supply:o,borrow:r}}}async function Qe(e,n,o,r){const t=await k({...r,cacheTime:w});t.limter&&e.moveCall({target:`${t.limter}::navi_adaptor::verify_navi_position_healthy`,arguments:[e.object("0x06"),e.object(t.storage),e.object(t.priceOracle),f(n,e.pure.address),e.pure.u256(new p(o).shiftedBy(27).toNumber())]})}const ge=new K.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:1e4});async function Xe(e){try{const n=[],o=await ge.getLatestPriceFeeds(e);if(!o)return n;const r=Math.floor(new Date().valueOf()/1e3);for(const t of o){const a=t.getPriceUnchecked();if(a.publishTime>r){console.warn(`pyth price feed is invalid, id: ${t.id}, publish time: ${a.publishTime}, current timestamp: ${r}`);continue}r-t.getPriceUnchecked().publishTime>30&&(console.info(`stale price feed, id: ${t.id}, publish time: ${a.publishTime}, current timestamp: ${r}`),n.push(t.id))}return n}catch(n){throw new Error(`failed to get pyth stale price feed id, msg: ${n.message}`)}}async function xe(e,n){try{const o=[],r=n?.client??$,t=e.map(i=>i.priceInfoObject),a=await r.multiGetObjects({ids:Array.from(new Set(t)),options:{showContent:!0}});for(const i of a){const c=i.data;if(!c||!c.content||c.content.dataType!=="moveObject"){console.warn(`fetched object ${c?.objectId} datatype should be moveObject`);continue}const s=e.find(u=>u.priceInfoObject==c.objectId);if(!s){console.warn(`unable to find pyth info from array, priceInfoObject: ${c.objectId}`);continue}const l=c.content.fields.price_info.fields.price_feed.fields.price.fields,{magnitude:d,negative:g}=l.price.fields,h=l.conf,y=l.timestamp;o.push({priceFeedId:s.priceFeedId,priceInfoObject:s.priceInfoObject,price:g?"-"+d:d,conf:h,publishTime:Number(y),expiration:s.expiration})}return o}catch(o){console.error(o,`Polling Sui on-chain price for ${e} failed.`);return}}async function ye(e,n){try{const o=[],r=await xe(e,n);if(!r)return o;const t=Math.floor(new Date().valueOf()/1e3);for(const a of r){if(a.publishTime>t){console.warn(`pyth price feed is invalid, id: ${a.priceFeedId}, publish time: ${a.publishTime}, current timestamp: ${t}`);continue}const i=a.expiration||60;t-a.publishTime>i&&(console.info(`stale price feed, id: ${a.priceFeedId}, publish time: ${a.publishTime}, current timestamp: ${t}`),o.push(a.priceFeedId))}return o}catch(o){throw new Error(`failed to get pyth stale price feed id, msg: ${o.message}`)}}async function be(e,n,o){const r=o?.client??$,t=await k({...o,cacheTime:w});try{const a=await ge.getPriceFeedsUpdateData(n);return await new K.SuiPythClient(r,t.oracle.pythStateId,t.oracle.wormholeStateId).updatePriceFeeds(e,a,n)}catch(a){throw new Error(`failed to update pyth price feeds, msg: ${a.message}`)}}async function he(e,n,o){const r=await k({...o,cacheTime:w});if(o?.updatePythPriceFeeds){const t=n.filter(a=>!!a.pythPriceFeedId&&!!a.pythPriceInfoObject).map(a=>({priceFeedId:a.pythPriceFeedId,priceInfoObject:a.pythPriceInfoObject,expiration:30}));try{const a=await ye(t,o);a.length>0&&await be(e,a,o)}catch{console.error("Failed to update Pyth price feeds")}}for(const t of n)o?.env==="dev"?e.moveCall({target:`${r.oracle.packageId}::oracle_pro::update_single_price`,arguments:[e.object("0x6"),e.object(r.oracle.oracleConfig),e.object(r.oracle.priceOracle),e.object(r.oracle.supraOracleHolder),e.object(t.pythPriceInfoObject),e.pure.address(t.feedId)]}):e.moveCall({target:`${r.oracle.packageId}::oracle_pro::update_single_price_v2`,arguments:[e.object("0x6"),e.object(r.oracle.oracleConfig),e.object(r.oracle.priceOracle),e.object(r.oracle.supraOracleHolder),e.object(t.pythPriceInfoObject),e.object(r.oracle.switchboardAggregator),e.pure.address(t.feedId)]});return e}async function Z(e){return(await k({...e,cacheTime:w})).oracle.feeds}function we(e,n){return e.filter(o=>!!(n?.lendingState&&n.lendingState.find(t=>t.assetId===o.assetId)||n?.lendingPositions&&n.lendingPositions.find(t=>["navi-lending-supply","navi-lending-borrow","navi-lending-emode-supply","navi-lending-emode-borrow"].includes(t.type)?t[t.type]?.pool?.id===o.assetId:!1)||n?.pools&&n.pools.find(t=>t.id===o.assetId)))}async function et(e,n,o,r){try{const t=await Z({...r}),a=[];o.forEach(l=>{a.includes(l.market)||a.push(l.market)});const i=await fe(n,{...r,markets:a}),c=we(t,{lendingPositions:i,pools:o});return await he(e,c,{updatePythPriceFeeds:!0,...r})}catch(t){if(r?.throws)throw t;return console.error(t),e}}const H=A(T(async e=>{const n=`https://open-api.naviprotocol.io/api/navi/flashloan?env=${e?.env||"prod"}&sdk=${E.version}&market=${e?.market||D}`,o=await fetch(n,{headers:M}).then(r=>r.json());return Object.keys(o.data).map(r=>({...o.data[r],coinType:r}))}));async function tt(e,n){return(await H(n)).find(r=>typeof e=="string"?v(r.coinType)===v(e):typeof e=="number"?r.assetId===e:r.assetId===e.id)||null}async function ot(e,n,o,r){const t=await k({...r,cacheTime:w}),a=await P(n,r);if(!(await H({...r,cacheTime:w})).some(s=>v(s.coinType)===v(a.suiCoinType)))throw new Error("Pool does not support flashloan");if(t.version===1){const[s,l]=e.moveCall({target:`${t.package}::lending::flash_loan_with_ctx`,arguments:[e.object(t.flashloanConfig),e.object(a.contract.pool),f(o,e.pure.u64)],typeArguments:[a.suiCoinType]});return[s,l]}else{const[s,l]=e.moveCall({target:`${t.package}::lending::flash_loan_with_ctx_v2`,arguments:[e.object(t.flashloanConfig),e.object(a.contract.pool),f(o,e.pure.u64),e.object("0x05")],typeArguments:[a.suiCoinType]});return[s,l]}}async function nt(e,n,o,r,t){const a=await k({...t,cacheTime:w}),i=await P(n,t);if(!(await H({...t,cacheTime:w})).some(d=>v(d.coinType)===v(i.suiCoinType)))throw new Error("Pool does not support flashloan");const[l]=e.moveCall({target:`${a.package}::lending::flash_repay_with_ctx`,arguments:[e.object("0x06"),e.object(a.storage),e.object(i.contract.pool),f(o,e.object),f(r,e.object)],typeArguments:[i.suiCoinType]});return[l]}async function rt(e,n,o,r,t,a){const i={...a,cacheTime:w},c=await k(i),s=await P(n,i),l=await P(r,i);if(c.version===1){const[d,g]=e.moveCall({target:`${c.package}::incentive_v3::liquidation`,arguments:[e.object("0x06"),e.object(c.priceOracle),e.object(c.storage),e.pure.u8(s.id),e.object(s.contract.pool),f(o,e.object),e.pure.u8(l.id),e.object(l.contract.pool),f(t,e.pure.address),e.object(c.incentiveV2),e.object(c.incentiveV3)],typeArguments:[s.suiCoinType,l.suiCoinType]});return[d,g]}else{const[d,g]=e.moveCall({target:`${c.package}::incentive_v3::liquidation_v2`,arguments:[e.object("0x06"),e.object(c.priceOracle),e.object(c.storage),e.pure.u8(s.id),e.object(s.contract.pool),f(o,e.object),e.pure.u8(l.id),e.object(l.contract.pool),f(t,e.pure.address),e.object(c.incentiveV2),e.object(c.incentiveV3),e.object("0x05")],typeArguments:[s.suiCoinType,l.suiCoinType]});return[d,g]}}async function at(e,n,o){const r=o?.client??$,t=new N.Transaction,a=await R({...o,markets:Object.values(V),cacheTime:w}),i=await Z(o);for(let d of n){const g=await k({...o,cacheTime:w,market:d.market});t.moveCall({target:`${g.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,arguments:[t.object("0x06"),t.object(g.storage),t.object(g.incentiveV3),t.pure.address(d.address)]})}const c=await r.devInspectTransactionBlock({transactionBlock:t,sender:e}),s=[];c?.results?.forEach(d=>{s.push(q({results:[d]},[C.bcs.vector(C.bcs.string()),C.bcs.vector(C.bcs.string()),C.bcs.vector(C.bcs.u8()),C.bcs.vector(C.bcs.Address),C.bcs.vector(C.bcs.u256())]))});const l=[];return s.forEach((d,g)=>{const h=n[g];if(d.length===5&&Array.isArray(d[0])){const y=d[0].length;for(let u=0;u<y;u++){const b=i.find(I=>v(I.coinType)===v(d[1][u])),j=a.find(I=>v(I.coinType)===v(d[0][u])&&I.market===h.market);!b||!j||l.push({assetId:j.id,assetCoinType:v(d[0][u]),rewardCoinType:v(d[1][u]),option:Number(d[2][u]),userClaimableReward:Number(d[4][u])/Math.pow(10,b.priceDecimal),ruleIds:Array.isArray(d[3][u])?d[3][u]:[d[3][u]],market:h.market,owner:h.owner,address:h.address,emodeId:h.emodeId})}}}),l}async function ct(e,n){const o=(n?.markets||[V.main]).map(a=>_(a));let r=[];try{r=await Y(e,n)}catch(a){console.error(a)}const t=o.map(a=>({address:e,owner:e,market:a.key})).concat(r.filter(a=>!!o.find(i=>i.id===a.marketId)).map(a=>{const i=_(a.marketId);return{address:a.accountCap,owner:e,market:i.key,emodeId:a.emodeId}}));return await at(e,t,n)}function st(e){const n=new Map;e.forEach(r=>{const t=r.assetId,a=r.option,i=`${t}-${a}-${r.rewardCoinType}-${r.market}`;n.has(i)?n.get(i).total+=r.userClaimableReward:n.set(i,{assetId:t,rewardType:a,coinType:r.rewardCoinType,total:Number(r.userClaimableReward),market:r.market})});const o=new Map;for(const{assetId:r,rewardType:t,coinType:a,total:i,market:c}of n.values()){const s=`${r}-${t}-${c}`;o.has(s)||o.set(s,{assetId:r,rewardType:t,market:c,rewards:new Map});const l=o.get(s);l.rewards.set(a,(l.rewards.get(a)||0)+i)}return Array.from(o.values()).map(r=>({assetId:r.assetId,rewardType:r.rewardType,market:r.market,rewards:Array.from(r.rewards.entries()).map(([t,a])=>({coinType:t,available:a.toFixed(6)}))}))}const it=T(async(e,n)=>{const o=`https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${e}&sdk=${E.version}&market=${n?.market||D}`;return(await fetch(o,{headers:M}).then(t=>t.json())).data}),lt=T(async(e,n)=>{const o=`https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${e}&page=${n?.page||1}&pageSize=${n?.size||400}&sdk=${E.version}&market=${n?.market||D}`,r=await fetch(o,{headers:M}).then(t=>t.json());return G({data:r.data.rewards})});async function ut(e,n,o){const r=await R({...o,markets:Object.values(V),cacheTime:w}),t=new Map;for(const i of n){const{rewardCoinType:c,ruleIds:s,market:l,owner:d,address:g,emodeId:h}=i,y=`${c}___${g}`;for(const u of s){t.has(y)||t.set(y,{assetIds:[],ruleIds:[],amount:0,market:l,owner:d,address:g,isEMode:typeof h<"u"});const b=t.get(y);b.assetIds.push(i.assetCoinType.replace("0x","")),b.ruleIds.push(u),b.amount+=i.userClaimableReward}}const a=[];for(const[i,{assetIds:c,ruleIds:s,amount:l,market:d,owner:g,address:h,isEMode:y}]of t){const u=await k({...o,cacheTime:w,market:d}),b=i.split("___")[0],j=r.find(S=>v(S.suiCoinType)===v(b)&&S.market===d);if(!j||!j.contract.rewardFundId)throw new Error(`No matching rewardFund found for reward coin: ${b} ${d}`);const I=j.contract.rewardFundId;if(o?.accountCap&&!o.customCoinReceive)throw new Error("customCoinReceive is required when accountCap is provided");if(o?.customCoinReceive){let S;o.accountCap?S=e.moveCall({target:`${u.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(u.incentiveV3),e.object(u.storage),e.object(I),e.pure.vector("string",c),e.pure.vector("address",s),f(o.accountCap,e.object)],typeArguments:[b]}):y?S=e.moveCall({target:`${u.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(u.incentiveV3),e.object(u.storage),e.object(I),e.pure.vector("string",c),e.pure.vector("address",s),f(h,e.object)],typeArguments:[b]}):S=e.moveCall({target:`${u.package}::incentive_v3::claim_reward`,arguments:[e.object("0x06"),e.object(u.incentiveV3),e.object(u.storage),e.object(I),e.pure.vector("string",c),e.pure.vector("address",s)],typeArguments:[b]});const[O]=e.moveCall({target:"0x2::coin::from_balance",arguments:[S],typeArguments:[b]});if(o?.customCoinReceive.type==="transfer"){if(!o.customCoinReceive.transfer)throw new Error("customCoinReceive.transfer is required");e.transferObjects([O],f(o.customCoinReceive.transfer,e.pure.address))}if(o?.customCoinReceive.type==="depositNAVI"){const ve=p(j.totalSupplyAmount).shiftedBy(-9),ke=p(j.supplyCapCeiling).shiftedBy(-27);ve.plus(l).isGreaterThan(ke)&&o?.customCoinReceive.depositNAVI?.fallbackReceiveAddress?e.transferObjects([O],e.pure.address(o.customCoinReceive.depositNAVI.fallbackReceiveAddress)):await ce(e,j,O,o)}else a.push({coin:O,identifier:j,owner:g,isEMode:y})}else if(o?.accountCap||y){const S=e.moveCall({target:`${u.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(u.incentiveV3),e.object(u.storage),e.object(I),e.pure.vector("string",c),e.pure.vector("address",s),f(o?.accountCap||h,e.object)],typeArguments:[b]}),[O]=e.moveCall({target:"0x2::coin::from_balance",arguments:[S],typeArguments:[b]});e.transferObjects([O],f(o?.accountCap||g,e.pure.address))}else e.moveCall({target:`${u.package}::incentive_v3::claim_reward_entry`,arguments:[e.object("0x06"),e.object(u.incentiveV3),e.object(u.storage),e.object(I),e.pure.vector("string",c),e.pure.vector("address",s)],typeArguments:[b]})}return a}exports.Address=W;exports.DEFAULT_CACHE_TIME=w;exports.DEFAULT_MARKET_IDENTITY=D;exports.FlashLoanAssetConfig=Be;exports.IncentiveAPYInfo=_e;exports.IncentivePoolInfo=te;exports.IncentivePoolInfoByPhase=Te;exports.MARKETS=V;exports.Market=se;exports.OracleInfo=Ie;exports.PoolOperator=F;exports.ReserveDataInfo=Pe;exports.UserPositions=U;exports.UserStateInfo=oe;exports.borrowCoinPTB=Fe;exports.claimLendingRewardsPTB=ut;exports.createAccountCapPTB=le;exports.createEModeCapPTB=He;exports.depositCoinPTB=ce;exports.emodeIdentityId=We;exports.enterEModePTB=pe;exports.exitEModePTB=qe;exports.filterPriceFeeds=we;exports.flashloanPTB=ot;exports.getAccountCapOwnerPTB=ue;exports.getAllFlashLoanAssets=H;exports.getBorrowFee=Re;exports.getCoins=Ze;exports.getConfig=k;exports.getFees=De;exports.getFlashLoanAsset=tt;exports.getHealthFactor=Ke;exports.getHealthFactorPTB=de;exports.getLendingPositions=fe;exports.getLendingState=ze;exports.getMarket=Le;exports.getMarketConfig=_;exports.getMarkets=ie;exports.getPool=P;exports.getPools=R;exports.getPriceFeeds=Z;exports.getPythStalePriceFeedId=Xe;exports.getPythStalePriceFeedIdV2=ye;exports.getSimulatedHealthFactor=Ye;exports.getSimulatedHealthFactorPTB=J;exports.getStats=Ue;exports.getTransactions=Je;exports.getUserAvailableLendingRewards=ct;exports.getUserClaimedRewardHistory=lt;exports.getUserEModeCaps=Y;exports.getUserTotalClaimedReward=it;exports.liquidatePTB=rt;exports.mergeCoinsPTB=Ge;exports.normalizeCoinType=v;exports.parsePoolUID=ae;exports.parseTxValue=f;exports.repayCoinPTB=Ne;exports.repayFlashLoanPTB=nt;exports.summaryLendingRewards=st;exports.updateOraclePriceBeforeUserOperationPTB=et;exports.updateOraclePricesPTB=he;exports.updatePythPriceFeeds=be;exports.verifyHealthFactorPTB=Qe;exports.withCache=A;exports.withSingleton=T;exports.withdrawCoinPTB=Oe;
2
2
  //# sourceMappingURL=index.cjs.js.map