@naviprotocol/lending 1.3.3 → 1.3.4-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("@mysten/sui/transactions"),i=require("@mysten/bcs"),E=require("@mysten/sui/client"),x=require("lodash.camelcase"),ee=require("@mysten/sui/utils"),N=require("@pythnetwork/pyth-sui-js"),_=require("bignumber.js"),w=require("@mysten/sui/bcs"),R=i.bcs.bytes(32).transform({input:e=>i.fromHex(e),output:e=>i.toHex(e)}),te=i.bcs.struct("IncentiveAPYInfo",{asset_id:i.bcs.u8(),apy:i.bcs.u256(),coin_types:i.bcs.vector(i.bcs.string())}),q=i.bcs.struct("IncentivePoolInfo",{pool_id:R,funds:R,phase:i.bcs.u64(),start_at:i.bcs.u64(),end_at:i.bcs.u64(),closed_at:i.bcs.u64(),total_supply:i.bcs.u64(),asset_id:i.bcs.u8(),option:i.bcs.u8(),factor:i.bcs.u256(),distributed:i.bcs.u64(),available:i.bcs.u256(),total:i.bcs.u256()}),ce=i.bcs.struct("IncentivePoolInfoByPhase",{phase:i.bcs.u64(),pools:i.bcs.vector(q)}),re=i.bcs.struct("OracleInfo",{oracle_id:i.bcs.u8(),price:i.bcs.u256(),decimals:i.bcs.u8(),valid:i.bcs.bool()}),ae=i.bcs.struct("FlashLoanAssetConfig",{id:i.bcs.string(),asset_id:i.bcs.u8(),coin_type:i.bcs.string(),pool_id:i.bcs.string(),rate_to_supplier:i.bcs.u64(),rate_to_treasury:i.bcs.u64(),max:i.bcs.u64(),min:i.bcs.u64()}),ne=i.bcs.struct("ReserveDataInfo",{id:i.bcs.u8(),oracle_id:i.bcs.u8(),coin_type:i.bcs.string(),supply_cap:i.bcs.u256(),borrow_cap:i.bcs.u256(),supply_rate:i.bcs.u256(),borrow_rate:i.bcs.u256(),supply_index:i.bcs.u256(),borrow_index:i.bcs.u256(),total_supply:i.bcs.u256(),total_borrow:i.bcs.u256(),last_update_at:i.bcs.u64(),ltv:i.bcs.u256(),treasury_factor:i.bcs.u256(),treasury_balance:i.bcs.u256(),base_rate:i.bcs.u256(),multiplier:i.bcs.u256(),jump_rate_multiplier:i.bcs.u256(),reserve_factor:i.bcs.u256(),optimal_utilization:i.bcs.u256(),liquidation_ratio:i.bcs.u256(),liquidation_bonus:i.bcs.u256(),liquidation_threshold:i.bcs.u256()}),M=i.bcs.struct("UserStateInfo",{asset_id:i.bcs.u8(),borrow_balance:i.bcs.u256(),supply_balance:i.bcs.u256()}),se="1.3.3",H={version:se},oe=H.version,ie=()=>{if(typeof process!="undefined"&&process.versions&&process.versions.node)try{const e=require("os"),c=process.version,a=e.type(),t=e.arch();return`Node.js ${c.startsWith("v")?c.substring(1):c}; ${a}/${t}`}catch{return`Node.js ${process.version}; OS/Unknown (Error)`}return"Node/Unknown"},ue=()=>{let e="";return typeof process!="undefined"&&process.versions&&process.versions.node&&(e=`lending/${oe} (${ie()})`),e},U=ue(),A=new E.SuiClient({url:E.getFullnodeUrl("mainnet")});function O(e){const c=[];return e.forEach((a,t)=>{const r=t===e.length-1;if(typeof a=="object"&&r){const{client:n,disableCache:s,cacheTime:o,...u}=a;c.push(u)}else c.push(a)}),JSON.stringify(c)}function j(e){const c={};return(...a)=>{const t=O(a);return c[t]||(c[t]=e(...a).finally(()=>{c[t]=null})),c[t]}}function I(e){let c={};return(...a)=>{const t=a[a.length-1],r=O(a),n=c[r];return!(t!=null&&t.disableCache)&&typeof(n==null?void 0:n.data)!="undefined"&&(typeof(t==null?void 0:t.cacheTime)=="undefined"||t.cacheTime>Date.now()-n.cacheAt)?n.data:e(...a).then(s=>(c[r]={data:s,cacheAt:Date.now()},s))}}function F(e){return Array.isArray(e)?e.map(c=>F(c)):e!=null&&typeof e=="object"?Object.keys(e).reduce((c,a)=>({...c,[x(a)]:F(e[a])}),{}):e}function d(e,c){return typeof e=="object"?e:c(e)}function le(e,c){return typeof c=="string"?e.object(c):typeof c=="object"&&c.$kind?c:e.object(c.contract.pool)}function k(e,c,a){if(e.results&&e.results.length>0){if(e.results[0].returnValues&&e.results[0].returnValues.length>0)return e.results[0].returnValues.map((t,r)=>(c[r]||c[0]).parse(Uint8Array.from(t[0])))}else if(e.error)return console.log(`Get an error, msg: ${e.error}`),[];return[]}function g(e){return ee.normalizeStructTag(e)}function G(e){const c=(e||0)/Math.pow(10,27);return c>Math.pow(10,5)?1/0:c}new N.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:2e4});const de=27,D=(e,c)=>{if(!Number(e)||!Number(c))return new _(0);const a=new _(1).shiftedBy(1*de),t=a.multipliedBy(new _(.5));return new _(e).multipliedBy(new _(c)).plus(t).dividedBy(a).integerValue(_.ROUND_DOWN)},P=U?{"User-Agent":U}:{},y=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/config?env=${(e==null?void 0:e.env)||"prod"}&sdk=${H.version}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data})),f=1e3*60*5;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 S=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/pools?env=${(e==null?void 0:e.env)||"prod"}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data}));async function v(e,c){const a=await S({...c,cacheTime:f});if(typeof e=="object")return e;const t=a.find(r=>typeof e=="string"?g(r.suiCoinType)===g(e):typeof e=="number"?r.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 be=I(j(async e=>(await fetch("https://open-api.naviprotocol.io/api/navi/stats",{headers:P}).then(t=>t.json())).data)),pe=I(j(async e=>await fetch("https://open-api.naviprotocol.io/api/navi/fee",{headers:P}).then(t=>t.json())));async function z(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(n!=null&&n.deprecatedAt&&Date.now()>n.deprecatedAt)throw new Error(`The lending pool for coinType ${n.suiCoinType} has been deprecated.`);const s=typeof a=="object"&&a.$kind==="GasCoin";if(g(n.suiCoinType)===g("0x2::sui::SUI")&&s){if(!(t!=null&&t.amount))throw new Error("Amount is required for sui coin");a=e.splitCoins(a,[t.amount])}let o;return typeof(t==null?void 0:t.amount)!="undefined"?o=d(t.amount,e.pure.u64):o=e.moveCall({target:"0x2::coin::value",arguments:[d(a,e.object)],typeArguments:[n.suiCoinType]}),t!=null&&t.accountCap?e.moveCall({target:`${r.package}::incentive_v3::deposit_with_account_cap`,arguments:[e.object("0x06"),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]}):e.moveCall({target:`${r.package}::incentive_v3::entry_deposit`,arguments:[e.object("0x06"),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]}),r.version===2&&n.id===0&&e.moveCall({target:`${r.package}::pool::refresh_stake`,arguments:[e.object(n.contract.pool),e.object("0x05")]}),e}async function ge(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t),s=d(a,e.pure.u64);let o;if(r.version===1)if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]});o=l}else if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[o],typeArguments:[n.suiCoinType]})}async function fe(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(n!=null&&n.deprecatedAt&&Date.now()>n.deprecatedAt)throw new Error(`The lending pool for coinType ${n.suiCoinType} has been deprecated.`);const s=d(a,e.pure.u64);let o;if(r.version===1)if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]});o=l}else if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[e.object(o)],typeArguments:[n.suiCoinType]})}async function me(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t),s=typeof a=="object"&&a.$kind==="GasCoin";if(g(n.suiCoinType)===g("0x2::sui::SUI")&&s){if(!(t!=null&&t.amount))throw new Error("Amount is required for sui coin");a=e.splitCoins(a,[t.amount])}let o;return typeof(t==null?void 0:t.amount)!="undefined"?o=d(t.amount,e.pure.u64):o=e.moveCall({target:"0x2::coin::value",arguments:[d(a,e.object)],typeArguments:[n.suiCoinType]}),t!=null&&t.accountCap?e.moveCall({target:`${r.package}::incentive_v3::repay_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]}):e.moveCall({target:`${r.package}::incentive_v3::entry_repay`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]}),e}const ye=I(j(async e=>{var r;const c=await y({...e});if(e!=null&&e.address&&typeof(e==null?void 0:e.asset)!="undefined")try{const n=await v(e.asset,e),s=(r=e==null?void 0:e.client)!=null?r:A,o=new $.Transaction;o.moveCall({target:`${c.package}::incentive_v3::get_borrow_fee_v2`,arguments:[o.object(c.incentiveV3),o.pure.address(e.address),o.pure.u8(n.id),o.pure.u64(1e4)],typeArguments:[]});const u=await s.devInspectTransactionBlock({transactionBlock:o,sender:e.address}),l=k(u,[w.bcs.u64()]);return(Number(l[0])||0)/100}catch(n){console.error(n)}const t=(await A.getObject({id:c.incentiveV3,options:{showType:!0,showOwner:!0,showContent:!0}})).data.content.fields.borrow_fee_rate;return Number(t)/100}));function he(e,c,a){const t=typeof(a==null?void 0:a.balance)=="number",r=t?a.balance:0;let n=0;const s=[];let o="";if(c.sort((l,b)=>Number(b.balance)-Number(l.balance)).forEach(l=>{if(!(t&&n>=r)&&Number(l.balance)!==0){if(o||(o=l.coinType),o!==l.coinType)throw new Error("All coins must be of the same type");n+=Number(l.balance),s.push(l.coinObjectId)}}),s.length===0)throw new Error("No coins to merge");if(t&&n<r)throw new Error(`Balance is less than the specified balance: ${n} < ${r}`);if(g(o)===g("0x2::sui::SUI")&&(a!=null&&a.useGasCoin))return t?e.splitCoins(e.gas,[e.pure.u64(r)]):e.gas;const u=s.length===1?e.object(s[0]):e.mergeCoins(s[0],s.slice(1));return t?e.splitCoins(u,[e.pure.u64(r)]):u}async function L(e,c,a,t,r,n,s){const o=await y({...s,cacheTime:f}),u=await v(a,s);return e.moveCall({target:`${o.uiGetter}::calculator_unchecked::dynamic_health_factor`,arguments:[e.object("0x06"),e.object(o.storage),e.object(o.oracle.priceOracle),le(e,u),d(c,e.pure.address),d(u.id,e.pure.u8),d(t,e.pure.u64),d(r,e.pure.u64),d(n,e.pure.bool)],typeArguments:[u.suiCoinType]})}async function W(e,c,a){return L(e,c,0,0,0,!1,a)}const we=I(async(e,c)=>{var l;const a=await y({...c,cacheTime:f}),t=new $.Transaction,r=(l=c==null?void 0:c.client)!=null?l:A,n=await S(c);t.moveCall({target:`${a.uiGetter}::getter_unchecked::get_user_state`,arguments:[t.object(a.storage),t.pure.address(e)]});const s=await r.devInspectTransactionBlock({transactionBlock:t,sender:e}),o=k(s,[w.bcs.vector(M)]);return F(o[0].filter(b=>b.supply_balance!=="0"||b.borrow_balance!=="0")).map(b=>{const h=n.find(C=>C.id===b.assetId),p=D(b.supplyBalance,h.currentSupplyIndex).toString(),m=D(b.borrowBalance,h.currentBorrowIndex).toString();return{...b,supplyBalance:p,borrowBalance:m,pool:h}}).filter(b=>!!b.pool)});async function ve(e,c){var s;const a=(s=c==null?void 0:c.client)!=null?s:A,t=new $.Transaction;await W(t,e,c);const r=await a.devInspectTransactionBlock({transactionBlock:t,sender:e}),n=k(r,[w.bcs.u256()]);return G(Number(n[0])||0)}async function Ce(e,c,a,t){var p;const r=(p=t==null?void 0:t.client)!=null?p:A,n=new $.Transaction;let s=0,o=0;const u=await v(c,t);if(a.forEach(m=>{m.type===B.Supply?s+=m.amount:m.type===B.Withdraw?s-=m.amount:m.type===B.Borrow?o+=m.amount:m.type===B.Repay&&(o-=m.amount)}),s*o<0)throw new Error("Invalid operations");const l=s>0||o>0;await L(n,e,u,Math.abs(s),Math.abs(o),l,t);const b=await r.devInspectTransactionBlock({transactionBlock:n,sender:e}),h=k(b,[w.bcs.u256()]);return G(Number(h[0])||0)}const je=j(async(e,c)=>{const a=new URLSearchParams;c!=null&&c.cursor&&a.set("cursor",c.cursor),a.set("userAddress",e);const t=`https://open-api.naviprotocol.io/api/navi/user/transactions?${a.toString()}`;return(await fetch(t,{headers:P}).then(n=>n.json())).data});async function Te(e,c){var n;let a=null;const t=[],r=(n=c==null?void 0:c.client)!=null?n:A;do{let s;if(c!=null&&c.coinType?s=await r.getCoins({owner:e,coinType:c==null?void 0:c.coinType,cursor:a,limit:100}):s=await r.getAllCoins({owner:e,cursor:a,limit:100}),!s.data||!s.data.length)break;t.push(...s.data),a=s.nextCursor}while(a);return t}const J=new N.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:1e4});async function Y(e){try{const c=[],a=await J.getLatestPriceFeeds(e);if(!a)return c;const t=Math.floor(new Date().valueOf()/1e3);for(const r of a){const n=r.getPriceUnchecked();if(n.publishTime>t){console.warn(`pyth price feed is invalid, id: ${r.id}, publish time: ${n.publishTime}, current timestamp: ${t}`);continue}t-r.getPriceUnchecked().publishTime>30&&(console.info(`stale price feed, id: ${r.id}, publish time: ${n.publishTime}, current timestamp: ${t}`),c.push(r.id))}return c}catch(c){throw new Error(`failed to get pyth stale price feed id, msg: ${c.message}`)}}async function K(e,c,a){var n;const t=(n=a==null?void 0:a.client)!=null?n:A,r=await y({...a,cacheTime:f});try{const s=await J.getPriceFeedsUpdateData(c);return await new N.SuiPythClient(t,r.oracle.pythStateId,r.oracle.wormholeStateId).updatePriceFeeds(e,s,c)}catch(s){throw new Error(`failed to update pyth price feeds, msg: ${s.message}`)}}async function _e(e,c,a){const t=await y({...a,cacheTime:f});if(a!=null&&a.updatePythPriceFeeds){const r=c.filter(n=>!!n.pythPriceFeedId).map(n=>n.pythPriceFeedId);try{const n=await Y(r);n.length>0&&await K(e,n,a)}catch{}}for(const r of c)e.moveCall({target:`${t.oracle.packageId}::oracle_pro::update_single_price`,arguments:[e.object("0x6"),e.object(t.oracle.oracleConfig),e.object(t.oracle.priceOracle),e.object(t.oracle.supraOracleHolder),e.object(r.pythPriceInfoObject),e.pure.address(r.feedId)]});return e}async function Q(e){return(await y({...e,cacheTime:f})).oracle.feeds}function Ae(e,c){return e.filter(a=>!!(c!=null&&c.lendingState&&c.lendingState.find(r=>r.assetId===a.assetId)||c!=null&&c.pools&&c.pools.find(r=>r.id===a.assetId)))}const V=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/flashloan?env=${(e==null?void 0:e.env)||"prod"}`,a=await fetch(c,{headers:P}).then(t=>t.json());return Object.keys(a.data).map(t=>({...a.data[t],coinType:t}))}));async function Ie(e,c){return(await V(c)).find(t=>typeof e=="string"?g(t.coinType)===g(e):typeof e=="number"?t.assetId===e:t.assetId===e.id)||null}async function Pe(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(!(await V({...t,cacheTime:f})).some(u=>g(u.coinType)===g(n.suiCoinType)))throw new Error("Pool does not support flashloan");if(r.version===1){const[u,l]=e.moveCall({target:`${r.package}::lending::flash_loan_with_ctx`,arguments:[e.object(r.flashloanConfig),e.object(n.contract.pool),d(a,e.pure.u64)],typeArguments:[n.suiCoinType]});return[u,l]}else{const[u,l]=e.moveCall({target:`${r.package}::lending::flash_loan_with_ctx_v2`,arguments:[e.object(r.flashloanConfig),e.object(n.contract.pool),d(a,e.pure.u64),e.object("0x05")],typeArguments:[n.suiCoinType]});return[u,l]}}async function Be(e,c,a,t,r){const n=await y({...r,cacheTime:f}),s=await v(c,r);if(!(await V({...r,cacheTime:f})).some(b=>g(b.coinType)===g(s.suiCoinType)))throw new Error("Pool does not support flashloan");const[l]=e.moveCall({target:`${n.package}::lending::flash_repay_with_ctx`,arguments:[e.object("0x06"),e.object(n.storage),e.object(s.contract.pool),d(a,e.object),d(t,e.object)],typeArguments:[s.suiCoinType]});return[l]}async function $e(e,c,a,t,r,n){const s={...n,cacheTime:f},o=await y(s),u=await v(c,s),l=await v(t,s);if(o.version===1){const[b,h]=e.moveCall({target:`${o.package}::incentive_v3::liquidation`,arguments:[e.object("0x06"),e.object(o.priceOracle),e.object(o.storage),e.pure.u8(u.id),e.object(u.contract.pool),d(a,e.object),e.pure.u8(l.id),e.object(l.contract.pool),d(r,e.pure.address),e.object(o.incentiveV2),e.object(o.incentiveV3)],typeArguments:[u.suiCoinType,l.suiCoinType]});return[b,h]}else{const[b,h]=e.moveCall({target:`${o.package}::incentive_v3::liquidation_v2`,arguments:[e.object("0x06"),e.object(o.priceOracle),e.object(o.storage),e.pure.u8(u.id),e.object(u.contract.pool),d(a,e.object),e.pure.u8(l.id),e.object(l.contract.pool),d(r,e.pure.address),e.object(o.incentiveV2),e.object(o.incentiveV3),e.object("0x05")],typeArguments:[u.suiCoinType,l.suiCoinType]});return[b,h]}}async function ke(e,c){var b;const a=await Q(c),t=await S({...c,cacheTime:f}),r=(b=c==null?void 0:c.client)!=null?b:A,n=await y({...c,cacheTime:f}),s=new $.Transaction;s.moveCall({target:`${n.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,arguments:[s.object("0x06"),s.object(n.storage),s.object(n.incentiveV3),s.pure.address(e)]});const o=await r.devInspectTransactionBlock({transactionBlock:s,sender:e}),u=k(o,[w.bcs.vector(w.bcs.string()),w.bcs.vector(w.bcs.string()),w.bcs.vector(w.bcs.u8()),w.bcs.vector(w.bcs.Address),w.bcs.vector(w.bcs.u256())]),l=[];if(u.length===5&&Array.isArray(u[0])){const h=u[0].length;for(let p=0;p<h;p++){const m=a.find(T=>g(T.coinType)===g(u[1][p])),C=t.find(T=>g(T.coinType)===g(u[0][p]));!m||!C||l.push({assetId:C.id,assetCoinType:g(u[0][p]),rewardCoinType:g(u[1][p]),option:Number(u[2][p]),userClaimableReward:Number(u[4][p])/Math.pow(10,m.priceDecimal),ruleIds:Array.isArray(u[3][p])?u[3][p]:[u[3][p]]})}}return l}function Se(e){const c=new Map;e.forEach(t=>{const r=t.assetId,n=t.option,s=`${r}-${n}-${t.rewardCoinType}`;c.has(s)?c.get(s).total+=t.userClaimableReward:c.set(s,{assetId:r,rewardType:n,coinType:t.rewardCoinType,total:Number(t.userClaimableReward)})});const a=new Map;for(const{assetId:t,rewardType:r,coinType:n,total:s}of c.values()){const o=`${t}-${r}`;a.has(o)||a.set(o,{assetId:t,rewardType:r,rewards:new Map});const u=a.get(o);u.rewards.set(n,(u.rewards.get(n)||0)+s)}return Array.from(a.values()).map(t=>({assetId:t.assetId,rewardType:t.rewardType,rewards:Array.from(t.rewards.entries()).map(([r,n])=>({coinType:r,available:n.toFixed(6)}))}))}const Fe=j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${e}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data}),Ve=j(async(e,c)=>{const a=`https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${e}&page=${(c==null?void 0:c.page)||1}&pageSize=${(c==null?void 0:c.size)||400}`,t=await fetch(a,{headers:P}).then(r=>r.json());return F({data:t.data.rewards})});async function Re(e,c,a){var o;const t=await y({...a,cacheTime:f}),r=await S({...a,cacheTime:f}),n=new Map;for(const u of c){const{rewardCoinType:l,ruleIds:b}=u;for(const h of b){n.has(l)||n.set(l,{assetIds:[],ruleIds:[],amount:0});const p=n.get(l);p.assetIds.push(u.assetCoinType.replace("0x","")),p.ruleIds.push(h),p.amount+=u.userClaimableReward}}const s=[];for(const[u,{assetIds:l,ruleIds:b,amount:h}]of n){const p=r.find(C=>g(C.suiCoinType)===g(u));if(!p||!p.contract.rewardFundId)throw new Error(`No matching rewardFund found for reward coin: ${u}`);const m=p.contract.rewardFundId;if(a!=null&&a.accountCap&&!a.customCoinReceive)throw new Error("customCoinReceive is required when accountCap is provided");if(a!=null&&a.customCoinReceive){let C;a.accountCap?C=e.moveCall({target:`${t.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b),d(a.accountCap,e.object)],typeArguments:[u]}):C=e.moveCall({target:`${t.package}::incentive_v3::claim_reward`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b)],typeArguments:[u]});const[T]=e.moveCall({target:"0x2::coin::from_balance",arguments:[C],typeArguments:[u]});if((a==null?void 0:a.customCoinReceive.type)==="transfer"){if(!a.customCoinReceive.transfer)throw new Error("customCoinReceive.transfer is required");e.transferObjects([T],d(a.customCoinReceive.transfer,e.pure.address))}if((a==null?void 0:a.customCoinReceive.type)==="depositNAVI"){const X=_(p.totalSupplyAmount).shiftedBy(-9),Z=_(p.supplyCapCeiling).shiftedBy(-27);X.plus(h).isGreaterThan(Z)&&((o=a==null?void 0:a.customCoinReceive.depositNAVI)!=null&&o.fallbackReceiveAddress)?e.transferObjects([T],e.pure.address(a.customCoinReceive.depositNAVI.fallbackReceiveAddress)):await z(e,p,T,a)}else s.push({coin:T,identifier:p})}else e.moveCall({target:`${t.package}::incentive_v3::claim_reward_entry`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b)],typeArguments:[u]})}return s}async function Ne(e,c){const a=await y({...c});return e.moveCall({target:`${a.package}::lending::create_account`,arguments:[]})}exports.Address=R;exports.DEFAULT_CACHE_TIME=f;exports.FlashLoanAssetConfig=ae;exports.IncentiveAPYInfo=te;exports.IncentivePoolInfo=q;exports.IncentivePoolInfoByPhase=ce;exports.OracleInfo=re;exports.PoolOperator=B;exports.ReserveDataInfo=ne;exports.UserStateInfo=M;exports.borrowCoinPTB=fe;exports.claimLendingRewardsPTB=Re;exports.createAccountCapPTB=Ne;exports.depositCoinPTB=z;exports.filterPriceFeeds=Ae;exports.flashloanPTB=Pe;exports.getAllFlashLoanAssets=V;exports.getBorrowFee=ye;exports.getCoins=Te;exports.getConfig=y;exports.getFees=pe;exports.getFlashLoanAsset=Ie;exports.getHealthFactor=ve;exports.getHealthFactorPTB=W;exports.getLendingState=we;exports.getPool=v;exports.getPools=S;exports.getPriceFeeds=Q;exports.getPythStalePriceFeedId=Y;exports.getSimulatedHealthFactor=Ce;exports.getSimulatedHealthFactorPTB=L;exports.getStats=be;exports.getTransactions=je;exports.getUserAvailableLendingRewards=ke;exports.getUserClaimedRewardHistory=Ve;exports.getUserTotalClaimedReward=Fe;exports.liquidatePTB=$e;exports.mergeCoinsPTB=he;exports.normalizeCoinType=g;exports.parseTxValue=d;exports.repayCoinPTB=me;exports.repayFlashLoanPTB=Be;exports.summaryLendingRewards=Se;exports.updateOraclePricesPTB=_e;exports.updatePythPriceFeeds=K;exports.withCache=I;exports.withSingleton=j;exports.withdrawCoinPTB=ge;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("@mysten/sui/transactions"),i=require("@mysten/bcs"),U=require("@mysten/sui/client"),x=require("lodash.camelcase"),ee=require("@mysten/sui/utils"),N=require("@pythnetwork/pyth-sui-js"),_=require("bignumber.js"),w=require("@mysten/sui/bcs"),R=i.bcs.bytes(32).transform({input:e=>i.fromHex(e),output:e=>i.toHex(e)}),te=i.bcs.struct("IncentiveAPYInfo",{asset_id:i.bcs.u8(),apy:i.bcs.u256(),coin_types:i.bcs.vector(i.bcs.string())}),M=i.bcs.struct("IncentivePoolInfo",{pool_id:R,funds:R,phase:i.bcs.u64(),start_at:i.bcs.u64(),end_at:i.bcs.u64(),closed_at:i.bcs.u64(),total_supply:i.bcs.u64(),asset_id:i.bcs.u8(),option:i.bcs.u8(),factor:i.bcs.u256(),distributed:i.bcs.u64(),available:i.bcs.u256(),total:i.bcs.u256()}),ce=i.bcs.struct("IncentivePoolInfoByPhase",{phase:i.bcs.u64(),pools:i.bcs.vector(M)}),re=i.bcs.struct("OracleInfo",{oracle_id:i.bcs.u8(),price:i.bcs.u256(),decimals:i.bcs.u8(),valid:i.bcs.bool()}),ae=i.bcs.struct("FlashLoanAssetConfig",{id:i.bcs.string(),asset_id:i.bcs.u8(),coin_type:i.bcs.string(),pool_id:i.bcs.string(),rate_to_supplier:i.bcs.u64(),rate_to_treasury:i.bcs.u64(),max:i.bcs.u64(),min:i.bcs.u64()}),ne=i.bcs.struct("ReserveDataInfo",{id:i.bcs.u8(),oracle_id:i.bcs.u8(),coin_type:i.bcs.string(),supply_cap:i.bcs.u256(),borrow_cap:i.bcs.u256(),supply_rate:i.bcs.u256(),borrow_rate:i.bcs.u256(),supply_index:i.bcs.u256(),borrow_index:i.bcs.u256(),total_supply:i.bcs.u256(),total_borrow:i.bcs.u256(),last_update_at:i.bcs.u64(),ltv:i.bcs.u256(),treasury_factor:i.bcs.u256(),treasury_balance:i.bcs.u256(),base_rate:i.bcs.u256(),multiplier:i.bcs.u256(),jump_rate_multiplier:i.bcs.u256(),reserve_factor:i.bcs.u256(),optimal_utilization:i.bcs.u256(),liquidation_ratio:i.bcs.u256(),liquidation_bonus:i.bcs.u256(),liquidation_threshold:i.bcs.u256()}),H=i.bcs.struct("UserStateInfo",{asset_id:i.bcs.u8(),borrow_balance:i.bcs.u256(),supply_balance:i.bcs.u256()}),se="1.3.4-dev.2",L={version:se},oe=L.version,ie=()=>{if(typeof process!="undefined"&&process.versions&&process.versions.node)try{const e=require("os"),c=process.version,a=e.type(),t=e.arch();return`Node.js ${c.startsWith("v")?c.substring(1):c}; ${a}/${t}`}catch{return`Node.js ${process.version}; OS/Unknown (Error)`}return"Node/Unknown"},ue=()=>{let e="";return typeof process!="undefined"&&process.versions&&process.versions.node&&(e=`lending/${oe} (${ie()})`),e},D=ue(),A=new U.SuiClient({url:U.getFullnodeUrl("mainnet")});function O(e){const c=[];return e.forEach((a,t)=>{const r=t===e.length-1;if(typeof a=="object"&&r){const{client:n,disableCache:s,cacheTime:o,...u}=a;c.push(u)}else c.push(a)}),JSON.stringify(c)}function j(e){const c={};return(...a)=>{const t=O(a);return c[t]||(c[t]=e(...a).finally(()=>{c[t]=null})),c[t]}}function I(e){let c={};return(...a)=>{const t=a[a.length-1],r=O(a),n=c[r];return!(t!=null&&t.disableCache)&&typeof(n==null?void 0:n.data)!="undefined"&&(typeof(t==null?void 0:t.cacheTime)=="undefined"||t.cacheTime>Date.now()-n.cacheAt)?n.data:e(...a).then(s=>(c[r]={data:s,cacheAt:Date.now()},s))}}function F(e){return Array.isArray(e)?e.map(c=>F(c)):e!=null&&typeof e=="object"?Object.keys(e).reduce((c,a)=>({...c,[x(a)]:F(e[a])}),{}):e}function d(e,c){return typeof e=="object"?e:c(e)}function le(e,c){return typeof c=="string"?e.object(c):typeof c=="object"&&c.$kind?c:e.object(c.contract.pool)}function k(e,c,a){if(e.results&&e.results.length>0){if(e.results[0].returnValues&&e.results[0].returnValues.length>0)return e.results[0].returnValues.map((t,r)=>(c[r]||c[0]).parse(Uint8Array.from(t[0])))}else if(e.error)return console.log(`Get an error, msg: ${e.error}`),[];return[]}function g(e){return ee.normalizeStructTag(e)}function G(e){const c=(e||0)/Math.pow(10,27);return c>Math.pow(10,5)?1/0:c}new N.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:2e4});const de=27,q=(e,c)=>{if(!Number(e)||!Number(c))return new _(0);const a=new _(1).shiftedBy(1*de),t=a.multipliedBy(new _(.5));return new _(e).multipliedBy(new _(c)).plus(t).dividedBy(a).integerValue(_.ROUND_DOWN)},P=D?{"User-Agent":D}:{},y=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/config?env=${(e==null?void 0:e.env)||"prod"}&sdk=${L.version}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data})),f=1e3*60*5;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 S=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/pools?env=${(e==null?void 0:e.env)||"prod"}&sdk=${L.version}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data}));async function v(e,c){const a=await S({...c,cacheTime:f});if(typeof e=="object")return e;const t=a.find(r=>typeof e=="string"?g(r.suiCoinType)===g(e):typeof e=="number"?r.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 be=I(j(async e=>(await fetch("https://open-api.naviprotocol.io/api/navi/stats",{headers:P}).then(t=>t.json())).data)),pe=I(j(async e=>await fetch("https://open-api.naviprotocol.io/api/navi/fee",{headers:P}).then(t=>t.json())));async function z(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(n!=null&&n.deprecatedAt&&Date.now()>n.deprecatedAt)throw new Error(`The lending pool for coinType ${n.suiCoinType} has been deprecated.`);const s=typeof a=="object"&&a.$kind==="GasCoin";if(g(n.suiCoinType)===g("0x2::sui::SUI")&&s){if(!(t!=null&&t.amount))throw new Error("Amount is required for sui coin");a=e.splitCoins(a,[t.amount])}let o;return typeof(t==null?void 0:t.amount)!="undefined"?o=d(t.amount,e.pure.u64):o=e.moveCall({target:"0x2::coin::value",arguments:[d(a,e.object)],typeArguments:[n.suiCoinType]}),t!=null&&t.accountCap?e.moveCall({target:`${r.package}::incentive_v3::deposit_with_account_cap`,arguments:[e.object("0x06"),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]}):e.moveCall({target:`${r.package}::incentive_v3::entry_deposit`,arguments:[e.object("0x06"),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]}),r.version===2&&n.id===0&&e.moveCall({target:`${r.package}::pool::refresh_stake`,arguments:[e.object(n.contract.pool),e.object("0x05")]}),e}async function ge(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t),s=d(a,e.pure.u64);let o;if(r.version===1)if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]});o=l}else if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::withdraw_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[o],typeArguments:[n.suiCoinType]})}async function fe(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(n!=null&&n.deprecatedAt&&Date.now()>n.deprecatedAt)throw new Error(`The lending pool for coinType ${n.suiCoinType} has been deprecated.`);const s=d(a,e.pure.u64);let o;if(r.version===1)if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]});o=l}else if(t!=null&&t.accountCap){const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_with_account_cap_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}else{const[l]=e.moveCall({target:`${r.package}::incentive_v3::borrow_v2`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),s,e.object(r.incentiveV2),e.object(r.incentiveV3),e.object("0x05")],typeArguments:[n.suiCoinType]});o=l}return e.moveCall({target:"0x2::coin::from_balance",arguments:[e.object(o)],typeArguments:[n.suiCoinType]})}async function me(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t),s=typeof a=="object"&&a.$kind==="GasCoin";if(g(n.suiCoinType)===g("0x2::sui::SUI")&&s){if(!(t!=null&&t.amount))throw new Error("Amount is required for sui coin");a=e.splitCoins(a,[t.amount])}let o;return typeof(t==null?void 0:t.amount)!="undefined"?o=d(t.amount,e.pure.u64):o=e.moveCall({target:"0x2::coin::value",arguments:[d(a,e.object)],typeArguments:[n.suiCoinType]}),t!=null&&t.accountCap?e.moveCall({target:`${r.package}::incentive_v3::repay_with_account_cap`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3),d(t.accountCap,e.object)],typeArguments:[n.suiCoinType]}):e.moveCall({target:`${r.package}::incentive_v3::entry_repay`,arguments:[e.object("0x06"),e.object(r.priceOracle),e.object(r.storage),e.object(n.contract.pool),e.pure.u8(n.id),d(a,e.object),o,e.object(r.incentiveV2),e.object(r.incentiveV3)],typeArguments:[n.suiCoinType]}),e}const ye=I(j(async e=>{var r;const c=await y({...e});if(e!=null&&e.address&&typeof(e==null?void 0:e.asset)!="undefined")try{const n=await v(e.asset,e),s=(r=e==null?void 0:e.client)!=null?r:A,o=new $.Transaction;o.moveCall({target:`${c.package}::incentive_v3::get_borrow_fee_v2`,arguments:[o.object(c.incentiveV3),o.pure.address(e.address),o.pure.u8(n.id),o.pure.u64(1e4)],typeArguments:[]});const u=await s.devInspectTransactionBlock({transactionBlock:o,sender:e.address}),l=k(u,[w.bcs.u64()]);return(Number(l[0])||0)/100}catch(n){console.error(n)}const t=(await A.getObject({id:c.incentiveV3,options:{showType:!0,showOwner:!0,showContent:!0}})).data.content.fields.borrow_fee_rate;return Number(t)/100}));function he(e,c,a){const t=typeof(a==null?void 0:a.balance)=="number",r=t?a.balance:0;let n=0;const s=[];let o="";if(c.sort((l,b)=>Number(b.balance)-Number(l.balance)).forEach(l=>{if(!(t&&n>=r)&&Number(l.balance)!==0){if(o||(o=l.coinType),o!==l.coinType)throw new Error("All coins must be of the same type");n+=Number(l.balance),s.push(l.coinObjectId)}}),s.length===0)throw new Error("No coins to merge");if(t&&n<r)throw new Error(`Balance is less than the specified balance: ${n} < ${r}`);if(g(o)===g("0x2::sui::SUI")&&(a!=null&&a.useGasCoin))return t?e.splitCoins(e.gas,[e.pure.u64(r)]):e.gas;const u=s.length===1?e.object(s[0]):e.mergeCoins(s[0],s.slice(1));return t?e.splitCoins(u,[e.pure.u64(r)]):u}async function E(e,c,a,t,r,n,s){const o=await y({...s,cacheTime:f}),u=await v(a,s);return e.moveCall({target:`${o.uiGetter}::calculator_unchecked::dynamic_health_factor`,arguments:[e.object("0x06"),e.object(o.storage),e.object(o.oracle.priceOracle),le(e,u),d(c,e.pure.address),d(u.id,e.pure.u8),d(t,e.pure.u64),d(r,e.pure.u64),d(n,e.pure.bool)],typeArguments:[u.suiCoinType]})}async function W(e,c,a){return E(e,c,0,0,0,!1,a)}const we=I(async(e,c)=>{var l;const a=await y({...c,cacheTime:f}),t=new $.Transaction,r=(l=c==null?void 0:c.client)!=null?l:A,n=await S(c);t.moveCall({target:`${a.uiGetter}::getter_unchecked::get_user_state`,arguments:[t.object(a.storage),t.pure.address(e)]});const s=await r.devInspectTransactionBlock({transactionBlock:t,sender:e}),o=k(s,[w.bcs.vector(H)]);return F(o[0].filter(b=>b.supply_balance!=="0"||b.borrow_balance!=="0")).map(b=>{const h=n.find(C=>C.id===b.assetId),p=q(b.supplyBalance,h.currentSupplyIndex).toString(),m=q(b.borrowBalance,h.currentBorrowIndex).toString();return{...b,supplyBalance:p,borrowBalance:m,pool:h}}).filter(b=>!!b.pool)});async function ve(e,c){var s;const a=(s=c==null?void 0:c.client)!=null?s:A,t=new $.Transaction;await W(t,e,c);const r=await a.devInspectTransactionBlock({transactionBlock:t,sender:e}),n=k(r,[w.bcs.u256()]);return G(Number(n[0])||0)}async function Ce(e,c,a,t){var p;const r=(p=t==null?void 0:t.client)!=null?p:A,n=new $.Transaction;let s=0,o=0;const u=await v(c,t);if(a.forEach(m=>{m.type===B.Supply?s+=m.amount:m.type===B.Withdraw?s-=m.amount:m.type===B.Borrow?o+=m.amount:m.type===B.Repay&&(o-=m.amount)}),s*o<0)throw new Error("Invalid operations");const l=s>0||o>0;await E(n,e,u,Math.abs(s),Math.abs(o),l,t);const b=await r.devInspectTransactionBlock({transactionBlock:n,sender:e}),h=k(b,[w.bcs.u256()]);return G(Number(h[0])||0)}const je=j(async(e,c)=>{const a=new URLSearchParams;c!=null&&c.cursor&&a.set("cursor",c.cursor),a.set("userAddress",e);const t=`https://open-api.naviprotocol.io/api/navi/user/transactions?${a.toString()}`;return(await fetch(t,{headers:P}).then(n=>n.json())).data});async function Te(e,c){var n;let a=null;const t=[],r=(n=c==null?void 0:c.client)!=null?n:A;do{let s;if(c!=null&&c.coinType?s=await r.getCoins({owner:e,coinType:c==null?void 0:c.coinType,cursor:a,limit:100}):s=await r.getAllCoins({owner:e,cursor:a,limit:100}),!s.data||!s.data.length)break;t.push(...s.data),a=s.nextCursor}while(a);return t}const J=new N.SuiPriceServiceConnection("https://hermes.pyth.network",{timeout:1e4});async function Y(e){try{const c=[],a=await J.getLatestPriceFeeds(e);if(!a)return c;const t=Math.floor(new Date().valueOf()/1e3);for(const r of a){const n=r.getPriceUnchecked();if(n.publishTime>t){console.warn(`pyth price feed is invalid, id: ${r.id}, publish time: ${n.publishTime}, current timestamp: ${t}`);continue}t-r.getPriceUnchecked().publishTime>30&&(console.info(`stale price feed, id: ${r.id}, publish time: ${n.publishTime}, current timestamp: ${t}`),c.push(r.id))}return c}catch(c){throw new Error(`failed to get pyth stale price feed id, msg: ${c.message}`)}}async function K(e,c,a){var n;const t=(n=a==null?void 0:a.client)!=null?n:A,r=await y({...a,cacheTime:f});try{const s=await J.getPriceFeedsUpdateData(c);return await new N.SuiPythClient(t,r.oracle.pythStateId,r.oracle.wormholeStateId).updatePriceFeeds(e,s,c)}catch(s){throw new Error(`failed to update pyth price feeds, msg: ${s.message}`)}}async function _e(e,c,a){const t=await y({...a,cacheTime:f});if(a!=null&&a.updatePythPriceFeeds){const r=c.filter(n=>!!n.pythPriceFeedId).map(n=>n.pythPriceFeedId);try{const n=await Y(r);n.length>0&&await K(e,n,a)}catch{}}for(const r of c)e.moveCall({target:`${t.oracle.packageId}::oracle_pro::update_single_price`,arguments:[e.object("0x6"),e.object(t.oracle.oracleConfig),e.object(t.oracle.priceOracle),e.object(t.oracle.supraOracleHolder),e.object(r.pythPriceInfoObject),e.pure.address(r.feedId)]});return e}async function Q(e){return(await y({...e,cacheTime:f})).oracle.feeds}function Ae(e,c){return e.filter(a=>!!(c!=null&&c.lendingState&&c.lendingState.find(r=>r.assetId===a.assetId)||c!=null&&c.pools&&c.pools.find(r=>r.id===a.assetId)))}const V=I(j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/flashloan?env=${(e==null?void 0:e.env)||"prod"}`,a=await fetch(c,{headers:P}).then(t=>t.json());return Object.keys(a.data).map(t=>({...a.data[t],coinType:t}))}));async function Ie(e,c){return(await V(c)).find(t=>typeof e=="string"?g(t.coinType)===g(e):typeof e=="number"?t.assetId===e:t.assetId===e.id)||null}async function Pe(e,c,a,t){const r=await y({...t,cacheTime:f}),n=await v(c,t);if(!(await V({...t,cacheTime:f})).some(u=>g(u.coinType)===g(n.suiCoinType)))throw new Error("Pool does not support flashloan");if(r.version===1){const[u,l]=e.moveCall({target:`${r.package}::lending::flash_loan_with_ctx`,arguments:[e.object(r.flashloanConfig),e.object(n.contract.pool),d(a,e.pure.u64)],typeArguments:[n.suiCoinType]});return[u,l]}else{const[u,l]=e.moveCall({target:`${r.package}::lending::flash_loan_with_ctx_v2`,arguments:[e.object(r.flashloanConfig),e.object(n.contract.pool),d(a,e.pure.u64),e.object("0x05")],typeArguments:[n.suiCoinType]});return[u,l]}}async function Be(e,c,a,t,r){const n=await y({...r,cacheTime:f}),s=await v(c,r);if(!(await V({...r,cacheTime:f})).some(b=>g(b.coinType)===g(s.suiCoinType)))throw new Error("Pool does not support flashloan");const[l]=e.moveCall({target:`${n.package}::lending::flash_repay_with_ctx`,arguments:[e.object("0x06"),e.object(n.storage),e.object(s.contract.pool),d(a,e.object),d(t,e.object)],typeArguments:[s.suiCoinType]});return[l]}async function $e(e,c,a,t,r,n){const s={...n,cacheTime:f},o=await y(s),u=await v(c,s),l=await v(t,s);if(o.version===1){const[b,h]=e.moveCall({target:`${o.package}::incentive_v3::liquidation`,arguments:[e.object("0x06"),e.object(o.priceOracle),e.object(o.storage),e.pure.u8(u.id),e.object(u.contract.pool),d(a,e.object),e.pure.u8(l.id),e.object(l.contract.pool),d(r,e.pure.address),e.object(o.incentiveV2),e.object(o.incentiveV3)],typeArguments:[u.suiCoinType,l.suiCoinType]});return[b,h]}else{const[b,h]=e.moveCall({target:`${o.package}::incentive_v3::liquidation_v2`,arguments:[e.object("0x06"),e.object(o.priceOracle),e.object(o.storage),e.pure.u8(u.id),e.object(u.contract.pool),d(a,e.object),e.pure.u8(l.id),e.object(l.contract.pool),d(r,e.pure.address),e.object(o.incentiveV2),e.object(o.incentiveV3),e.object("0x05")],typeArguments:[u.suiCoinType,l.suiCoinType]});return[b,h]}}async function ke(e,c){var b;const a=await Q(c),t=await S({...c,cacheTime:f}),r=(b=c==null?void 0:c.client)!=null?b:A,n=await y({...c,cacheTime:f}),s=new $.Transaction;s.moveCall({target:`${n.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,arguments:[s.object("0x06"),s.object(n.storage),s.object(n.incentiveV3),s.pure.address(e)]});const o=await r.devInspectTransactionBlock({transactionBlock:s,sender:e}),u=k(o,[w.bcs.vector(w.bcs.string()),w.bcs.vector(w.bcs.string()),w.bcs.vector(w.bcs.u8()),w.bcs.vector(w.bcs.Address),w.bcs.vector(w.bcs.u256())]),l=[];if(u.length===5&&Array.isArray(u[0])){const h=u[0].length;for(let p=0;p<h;p++){const m=a.find(T=>g(T.coinType)===g(u[1][p])),C=t.find(T=>g(T.coinType)===g(u[0][p]));!m||!C||l.push({assetId:C.id,assetCoinType:g(u[0][p]),rewardCoinType:g(u[1][p]),option:Number(u[2][p]),userClaimableReward:Number(u[4][p])/Math.pow(10,m.priceDecimal),ruleIds:Array.isArray(u[3][p])?u[3][p]:[u[3][p]]})}}return l}function Se(e){const c=new Map;e.forEach(t=>{const r=t.assetId,n=t.option,s=`${r}-${n}-${t.rewardCoinType}`;c.has(s)?c.get(s).total+=t.userClaimableReward:c.set(s,{assetId:r,rewardType:n,coinType:t.rewardCoinType,total:Number(t.userClaimableReward)})});const a=new Map;for(const{assetId:t,rewardType:r,coinType:n,total:s}of c.values()){const o=`${t}-${r}`;a.has(o)||a.set(o,{assetId:t,rewardType:r,rewards:new Map});const u=a.get(o);u.rewards.set(n,(u.rewards.get(n)||0)+s)}return Array.from(a.values()).map(t=>({assetId:t.assetId,rewardType:t.rewardType,rewards:Array.from(t.rewards.entries()).map(([r,n])=>({coinType:r,available:n.toFixed(6)}))}))}const Fe=j(async e=>{const c=`https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${e}`;return(await fetch(c,{headers:P}).then(t=>t.json())).data}),Ve=j(async(e,c)=>{const a=`https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${e}&page=${(c==null?void 0:c.page)||1}&pageSize=${(c==null?void 0:c.size)||400}`,t=await fetch(a,{headers:P}).then(r=>r.json());return F({data:t.data.rewards})});async function Re(e,c,a){var o;const t=await y({...a,cacheTime:f}),r=await S({...a,cacheTime:f}),n=new Map;for(const u of c){const{rewardCoinType:l,ruleIds:b}=u;for(const h of b){n.has(l)||n.set(l,{assetIds:[],ruleIds:[],amount:0});const p=n.get(l);p.assetIds.push(u.assetCoinType.replace("0x","")),p.ruleIds.push(h),p.amount+=u.userClaimableReward}}const s=[];for(const[u,{assetIds:l,ruleIds:b,amount:h}]of n){const p=r.find(C=>g(C.suiCoinType)===g(u));if(!p||!p.contract.rewardFundId)throw new Error(`No matching rewardFund found for reward coin: ${u}`);const m=p.contract.rewardFundId;if(a!=null&&a.accountCap&&!a.customCoinReceive)throw new Error("customCoinReceive is required when accountCap is provided");if(a!=null&&a.customCoinReceive){let C;a.accountCap?C=e.moveCall({target:`${t.package}::incentive_v3::claim_reward_with_account_cap`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b),d(a.accountCap,e.object)],typeArguments:[u]}):C=e.moveCall({target:`${t.package}::incentive_v3::claim_reward`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b)],typeArguments:[u]});const[T]=e.moveCall({target:"0x2::coin::from_balance",arguments:[C],typeArguments:[u]});if((a==null?void 0:a.customCoinReceive.type)==="transfer"){if(!a.customCoinReceive.transfer)throw new Error("customCoinReceive.transfer is required");e.transferObjects([T],d(a.customCoinReceive.transfer,e.pure.address))}if((a==null?void 0:a.customCoinReceive.type)==="depositNAVI"){const X=_(p.totalSupplyAmount).shiftedBy(-9),Z=_(p.supplyCapCeiling).shiftedBy(-27);X.plus(h).isGreaterThan(Z)&&((o=a==null?void 0:a.customCoinReceive.depositNAVI)!=null&&o.fallbackReceiveAddress)?e.transferObjects([T],e.pure.address(a.customCoinReceive.depositNAVI.fallbackReceiveAddress)):await z(e,p,T,a)}else s.push({coin:T,identifier:p})}else e.moveCall({target:`${t.package}::incentive_v3::claim_reward_entry`,arguments:[e.object("0x06"),e.object(t.incentiveV3),e.object(t.storage),e.object(m),e.pure.vector("string",l),e.pure.vector("address",b)],typeArguments:[u]})}return s}async function Ne(e,c){const a=await y({...c});return e.moveCall({target:`${a.package}::lending::create_account`,arguments:[]})}exports.Address=R;exports.DEFAULT_CACHE_TIME=f;exports.FlashLoanAssetConfig=ae;exports.IncentiveAPYInfo=te;exports.IncentivePoolInfo=M;exports.IncentivePoolInfoByPhase=ce;exports.OracleInfo=re;exports.PoolOperator=B;exports.ReserveDataInfo=ne;exports.UserStateInfo=H;exports.borrowCoinPTB=fe;exports.claimLendingRewardsPTB=Re;exports.createAccountCapPTB=Ne;exports.depositCoinPTB=z;exports.filterPriceFeeds=Ae;exports.flashloanPTB=Pe;exports.getAllFlashLoanAssets=V;exports.getBorrowFee=ye;exports.getCoins=Te;exports.getConfig=y;exports.getFees=pe;exports.getFlashLoanAsset=Ie;exports.getHealthFactor=ve;exports.getHealthFactorPTB=W;exports.getLendingState=we;exports.getPool=v;exports.getPools=S;exports.getPriceFeeds=Q;exports.getPythStalePriceFeedId=Y;exports.getSimulatedHealthFactor=Ce;exports.getSimulatedHealthFactorPTB=E;exports.getStats=be;exports.getTransactions=je;exports.getUserAvailableLendingRewards=ke;exports.getUserClaimedRewardHistory=Ve;exports.getUserTotalClaimedReward=Fe;exports.liquidatePTB=$e;exports.mergeCoinsPTB=he;exports.normalizeCoinType=g;exports.parseTxValue=d;exports.repayCoinPTB=me;exports.repayFlashLoanPTB=Be;exports.summaryLendingRewards=Se;exports.updateOraclePricesPTB=_e;exports.updatePythPriceFeeds=K;exports.withCache=I;exports.withSingleton=j;exports.withdrawCoinPTB=ge;
2
2
  //# sourceMappingURL=index.cjs.js.map