@naviprotocol/lending 1.4.0-emode.7 → 1.4.0-emode.8

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/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.7",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){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 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;
2
2
  //# sourceMappingURL=index.cjs.js.map