@cetusprotocol/deepbook-utils 1.1.1 → 1.1.3
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.d.ts +12 -3
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -820,6 +820,14 @@ declare class MarginUtilsModule implements IModule {
|
|
|
820
820
|
baseCoinType: string;
|
|
821
821
|
quoteCoinType: string;
|
|
822
822
|
}): Promise<string>;
|
|
823
|
+
getPoolMarginManagerBalance({ account, marginManager, baseCoinType, quoteCoinType, }: {
|
|
824
|
+
account: string;
|
|
825
|
+
marginManager: string;
|
|
826
|
+
baseCoinType: string;
|
|
827
|
+
quoteCoinType: string;
|
|
828
|
+
}): Promise<{
|
|
829
|
+
[x: string]: string;
|
|
830
|
+
}>;
|
|
823
831
|
/**
|
|
824
832
|
* Gets the borrowed shares (debt) for both base and quote coins.
|
|
825
833
|
*
|
|
@@ -916,16 +924,17 @@ declare class MarginUtilsModule implements IModule {
|
|
|
916
924
|
* @returns {Promise<{baseAsset: string, quoteAsset: string}>} Object containing asset amounts
|
|
917
925
|
* @throws {Error} If parameters are invalid, scalars are missing, or transaction fails
|
|
918
926
|
*/
|
|
919
|
-
calculateAssets({ account, marginManager, pool, baseCoin, quoteCoin,
|
|
927
|
+
calculateAssets({ account, marginManager, pool, baseCoin, quoteCoin, tx, }: {
|
|
920
928
|
account: string;
|
|
921
929
|
marginManager: string;
|
|
922
930
|
pool: string;
|
|
923
931
|
baseCoin: MarginCoinInfo;
|
|
924
932
|
quoteCoin: MarginCoinInfo;
|
|
925
|
-
|
|
933
|
+
tx?: Transaction;
|
|
926
934
|
}): Promise<{
|
|
927
935
|
baseAsset: string;
|
|
928
936
|
quoteAsset: string;
|
|
937
|
+
tx: Transaction;
|
|
929
938
|
}>;
|
|
930
939
|
/**
|
|
931
940
|
* Gets the borrowed amount (in tokens, not shares) for a margin manager.
|
|
@@ -1110,7 +1119,7 @@ declare class MarginUtilsModule implements IModule {
|
|
|
1110
1119
|
* @returns {Promise<Transaction>} The transaction object with market order operation
|
|
1111
1120
|
* @throws {Error} If parameters are invalid or decimals are missing
|
|
1112
1121
|
*/
|
|
1113
|
-
placeMarginMarketOrder({ marginManager, poolInfo, selfMatchingOption, quantity, amountLimit, isBid, payWithDeep, exactBase }: {
|
|
1122
|
+
placeMarginMarketOrder({ marginManager, poolInfo, selfMatchingOption, quantity, amountLimit, isBid, payWithDeep, exactBase, }: {
|
|
1114
1123
|
marginManager: string | TransactionArgument;
|
|
1115
1124
|
poolInfo: MarginPoolInfo;
|
|
1116
1125
|
selfMatchingOption: SelfMatchingOption;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var it=Object.create;var J=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ct=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var dt=(c,e,t)=>e in c?J(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var lt=(c,e)=>{for(var t in e)J(c,t,{get:e[t],enumerable:!0})},Pe=(c,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of at(e))!ut.call(c,n)&&n!==t&&J(c,n,{get:()=>e[n],enumerable:!(r=ot(e,n))||r.enumerable});return c};var qe=(c,e,t)=>(t=c!=null?it(ct(c)):{},Pe(e||!c||!c.__esModule?J(t,"default",{value:c,enumerable:!0}):t,c)),pt=c=>Pe(J({},"__esModule",{value:!0}),c);var De=(c,e,t)=>(dt(c,typeof e!="symbol"?e+"":e,t),t);var _r={};lt(_r,{CLOCK_ADDRESS:()=>tr,CachedContent:()=>K,CetusClmmSDK:()=>re,ClmmExpectSwapModule:()=>ar,ClmmFetcherModule:()=>or,ClmmIntegratePoolModule:()=>rr,ClmmIntegratePoolV2Module:()=>nr,ClmmIntegrateRouterModule:()=>sr,ClmmIntegrateRouterWithPartnerModule:()=>ir,ClmmIntegrateUtilsModule:()=>cr,CoinAssist:()=>B,CoinInfoAddress:()=>ur,CoinStoreAddress:()=>dr,DEEP_SCALAR:()=>le,DEFAULT_GAS_BUDGET_FOR_MERGE:()=>Bt,DEFAULT_GAS_BUDGET_FOR_SPLIT:()=>Et,DEFAULT_GAS_BUDGET_FOR_STAKE:()=>Pt,DEFAULT_GAS_BUDGET_FOR_TRANSFER:()=>vt,DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI:()=>Mt,DEFAULT_NFT_TRANSFER_GAS_FEE:()=>Dt,DeepbookClobV2Moudle:()=>pr,DeepbookCustodianV2Moudle:()=>lr,DeepbookEndpointsV2Moudle:()=>gr,DeepbookUtilsModule:()=>X,FLOAT_SCALAR:()=>U,FLOAT_SCALING:()=>$,GAS_SYMBOL:()=>qt,GAS_TYPE_ARG:()=>ae,GAS_TYPE_ARG_LONG:()=>_e,MarginUtilsModule:()=>ee,NORMALIZED_SUI_COIN_TYPE:()=>Ot,OrderType:()=>nt,RpcModule:()=>te,SUI_SYSTEM_STATE_OBJECT_ID:()=>It,SelfMatchingOption:()=>st,TransactionUtil:()=>F,YEAR_MS:()=>Ye,addHexPrefix:()=>me,asIntN:()=>Rt,asUintN:()=>Ut,bufferToHex:()=>_t,cacheTime1min:()=>ye,cacheTime24h:()=>V,cacheTime5min:()=>fe,calc100PercentRepay:()=>er,calcDebtDetail:()=>tt,calcInterestRate:()=>et,calcUtilizationRate:()=>Xe,calculateRiskRatio:()=>Jt,checkAddress:()=>bt,composeType:()=>be,d:()=>d,decimalsMultiplier:()=>ce,default:()=>br,extractAddressFromType:()=>Tt,extractStructTagFromType:()=>R,fixCoinType:()=>At,fixDown:()=>L,fixSuiObjectId:()=>Ve,fromDecimalsAmount:()=>G,getDefaultSuiInputType:()=>mr,getFutureTime:()=>z,getMoveObject:()=>de,getMoveObjectType:()=>Qe,getMovePackageContent:()=>xt,getObjectDeletedResponse:()=>Ge,getObjectDisplay:()=>zt,getObjectFields:()=>Oe,getObjectId:()=>Ae,getObjectNotExistsResponse:()=>Ke,getObjectOwner:()=>Kt,getObjectPreviousTransactionDigest:()=>Gt,getObjectReference:()=>Te,getObjectType:()=>Lt,getObjectVersion:()=>Vt,getSuiObjectData:()=>Q,hasPublicTransfer:()=>Qt,hexToNumber:()=>ht,hexToString:()=>yt,isSortedSymbols:()=>Ct,isSuiObjectResponse:()=>ze,maxDecimal:()=>ue,mulRoundUp:()=>Me,normalizeCoinType:()=>ie,patchFixSuiObjectId:()=>oe,printTransaction:()=>Ht,removeHexPrefix:()=>se,secretKeyToEd25519Keypair:()=>$t,secretKeyToSecp256k1Keypair:()=>Ft,shortAddress:()=>mt,shortString:()=>Ie,sleepTime:()=>Ce,toBuffer:()=>Ue,toDecimalsAmount:()=>W,utf8to16:()=>Re,wrapDeepBookMarginPoolInfo:()=>je,wrapDeepBookPoolInfo:()=>Se});module.exports=pt(_r);var rt=require("@mysten/sui/graphql");var We=require("@mysten/deepbook-v3"),h=require("@mysten/sui/bcs"),T=require("@mysten/sui/transactions"),S=require("@mysten/sui/utils"),Ze=require("js-base64");var he=require("@mysten/sui/transactions");var x=require("@mysten/sui/utils");var gt=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function me(c){return c.startsWith("0x")?c:`0x${c}`}function se(c){return c.startsWith("0x")?`${c.slice(2)}`:c}function Ie(c,e=4,t=4){let r=Math.max(e,1),n=Math.max(t,1);return`${c.slice(0,r+2)} ... ${c.slice(-n)}`}function mt(c,e=4,t=4){return Ie(me(c),e,t)}function bt(c,e={leadingZero:!0}){if(typeof c!="string")return!1;let t=c;if(e.leadingZero){if(!c.startsWith("0x"))return!1;t=t.substring(2)}return gt.test(t)}function Ue(c){if(!Buffer.isBuffer(c))if(Array.isArray(c))c=Buffer.from(c);else if(typeof c=="string")exports.isHexString(c)?c=Buffer.from(exports.padToEven(exports.stripHexPrefix(c)),"hex"):c=Buffer.from(c);else if(typeof c=="number")c=exports.intToBuffer(c);else if(c==null)c=Buffer.allocUnsafe(0);else if(c.toArray)c=Buffer.from(c.toArray());else throw new Error("invalid type");return c}function _t(c){return me(Ue(c).toString("hex"))}function ht(c){let e=new ArrayBuffer(4),t=new DataView(e);for(let n=0;n<c.length;n++)t.setUint8(n,c.charCodeAt(n));return t.getUint32(0,!0)}function Re(c){let e,t,r,n,i;e="";let s=c.length;for(t=0;t<s;)switch(r=c.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=c.charAt(t-1);break;case 12:case 13:n=c.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|n&63);break;case 14:n=c.charCodeAt(t++),i=c.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(n&63)<<6|(i&63)<<0);break}return e}function yt(c){let e="",t=se(c),r=t.length/2;for(let n=0;n<r;n++)e+=String.fromCharCode(Number.parseInt(t.substr(n*2,2),16));return Re(e)}var ft=0,Fe=1,wt=2;function $e(c,e){return c===e?ft:c<e?Fe:wt}function kt(c,e){let t=0,r=c.length<=e.length?c.length:e.length,n=$e(c.length,e.length);for(;t<r;){let i=$e(c.charCodeAt(t),e.charCodeAt(t));if(t+=1,i!==0)return i}return n}function Ct(c,e){return kt(c,e)===Fe}function be(c,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],n=[c,...e].filter(Boolean).join("::");return t&&t.length&&(n+=`<${t.join(", ")}>`),n}function Tt(c){return c.split("::")[0]}function R(c){try{let e=c.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let a={...R(e),type_arguments:r.map(u=>R(u).source_address)};return a.type_arguments=a.type_arguments.map(u=>B.isSuiCoin(u)?u:R(u).source_address),a.source_address=be(a.full_address,a.type_arguments),a}let n=e.split("::"),s={full_address:e,address:e===ae||e===_e?"0x2":(0,x.normalizeSuiObjectId)(n[0]),module:n[1],name:n[2],type_arguments:[],source_address:""};return s.full_address=`${s.address}::${s.module}::${s.name}`,s.source_address=be(s.full_address,s.type_arguments),s}catch{return{full_address:c,address:"",module:"",name:"",type_arguments:[],source_address:c}}}function ie(c){return R(c).source_address}function Ve(c){return c.toLowerCase().startsWith("0x")?(0,x.normalizeSuiObjectId)(c):c}var At=(c,e=!0)=>{let t=c.split("::"),r=t.shift(),n=(0,x.normalizeSuiObjectId)(r);return e&&(n=se(n)),`${n}::${t.join("::")}`};function oe(c){for(let e in c){let t=typeof c[e];if(t==="object")oe(c[e]);else if(t==="string"){let r=c[e];c[e]=Ve(r)}}}var Ot=(0,x.normalizeStructTag)(x.SUI_TYPE_ARG);var St="0x2::coin::Coin",jt=/^0x2::coin::Coin<(.+)>$/,Et=1e3,Bt=500,vt=100,Mt=100,Pt=1e3,ae="0x2::sui::SUI",_e="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",qt="SUI",Dt=450,It="0x0000000000000000000000000000000000000005",B=class{static getCoinTypeArg(e){let t=e.type.match(jt);return t?t[1]:null}static isSUI(e){let t=B.getCoinTypeArg(e);return t?B.getCoinSymbol(t)==="SUI":!1}static getCoinSymbol(e){return e.substring(e.lastIndexOf(":")+1)}static getBalance(e){return BigInt(e.fields.balance)}static totalBalance(e,t){let r=BigInt(0);return e.forEach(n=>{t===n.coinAddress&&(r+=BigInt(n.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${St}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(n=>{ie(n.coinAddress)===ie(e)&&r.push(n)}),r}static isSuiCoin(e){return R(e).full_address===ae}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let n=B.selectCoinAssetGreaterThanOrEqual(e,t,r),i=n.selectedCoins.map(a=>a.coinObjectId),s=n.remainingCoins,o=n.selectedCoins.map(a=>a.balance.toString());return{objectArray:i,remainCoins:s,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let n=B.sortByBalance(e.filter(u=>!r.includes(u.coinObjectId))),i=B.calculateTotalBalance(n);if(i<t)return{selectedCoins:[],remainingCoins:n};if(i===t)return{selectedCoins:n,remainingCoins:[]};let s=BigInt(0),o=[],a=[...n];for(;s<i;){let u=t-s,p=a.findIndex(m=>m.balance>=u);if(p!==-1){o.push(a[p]),a.splice(p,1);break}let l=a.pop();l.balance>0&&(o.push(l),s+=l.balance)}return{selectedCoins:B.sortByBalance(o),remainingCoins:B.sortByBalance(a)}}static sortByBalance(e){return e.sort((t,r)=>t.balance<r.balance?-1:t.balance>r.balance?1:0)}static sortByBalanceDes(e){return e.sort((t,r)=>t.balance>r.balance?-1:t.balance<r.balance?0:1)}static calculateTotalBalance(e){return e.reduce((t,r)=>t+r.balance,BigInt(0))}static buildCoinWithBalance(e,t,r){return e===BigInt(0)&&B.isSuiCoin(t)?r.add((0,he.coinWithBalance)({balance:e,useGasCoin:!1})):r.add((0,he.coinWithBalance)({balance:e,type:t}))}};var ye=6e4,fe=3e5,V=864e5;function z(c){return Date.parse(new Date().toString())+c}var K=class{overdueTime;value;constructor(e,t=0){this.overdueTime=t,this.value=e}isValid(){return this.value===null?!1:this.overdueTime===0?!0:!(Date.parse(new Date().toString())>this.overdueTime)}};var H=require("@mysten/bcs"),we=require("@mysten/sui/keypairs/ed25519"),ke=require("@mysten/sui/keypairs/secp256k1");var Y=qe(require("decimal.js"));function d(c){return Y.default.isDecimal(c)?c:new Y.default(c===void 0?0:c)}function ce(c){return d(10).pow(d(c).abs())}var L=(c,e)=>{try{return d(c).toDP(e,Y.default.ROUND_DOWN).toString()}catch{return c}},ue=(c,e)=>Y.default.max(d(c),d(e));function W(c,e){let t=ce(d(e));return Number(d(c).mul(t))}function Ut(c,e=32){return BigInt.asUintN(e,BigInt(c)).toString()}function Rt(c,e=32){return Number(BigInt.asIntN(e,BigInt(c)))}function G(c,e){let t=ce(d(e));return Number(d(c).div(t))}function $t(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return we.Ed25519Keypair.fromSecretKey(r)}let t=e==="hex"?(0,H.fromHEX)(c):(0,H.fromB64)(c);return we.Ed25519Keypair.fromSecretKey(t)}function Ft(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return ke.Secp256k1Keypair.fromSecretKey(r)}let t=e==="hex"?(0,H.fromHEX)(c):(0,H.fromB64)(c);return ke.Secp256k1Keypair.fromSecretKey(t)}var Ce=async c=>new Promise(e=>{setTimeout(()=>{e(1)},c)});var Ne={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},xe={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function Le(...c){let e="DeepbookV3_Utils_Sdk###"}function Q(c){return c.data}function Ge(c){if(c.error&&"object_id"in c.error&&"version"in c.error&&"digest"in c.error){let{error:e}=c;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function Ke(c){if(c.error&&"object_id"in c.error&&!("version"in c.error)&&!("digest"in c.error))return c.error.object_id}function Te(c){if("reference"in c)return c.reference;let e=Q(c);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:Ge(c)}function Ae(c){return"objectId"in c?c.objectId:Te(c)?.objectId??Ke(c)}function Vt(c){return"version"in c?c.version:Te(c)?.version}function ze(c){return c.data!==void 0}function Nt(c){return c.content!==void 0}function xt(c){let e=Q(c);if(e?.content?.dataType==="package")return e.content.disassembled}function de(c){let e="data"in c?Q(c):c;if(!(!e||!Nt(e)||e.content.dataType!=="moveObject"))return e.content}function Qe(c){return de(c)?.type}function Lt(c){let e=ze(c)?c.data:c;return!e?.type&&"data"in c?e?.content?.dataType==="package"?"package":Qe(c):e?.type}function Gt(c){return Q(c)?.previousTransaction}function Kt(c){return Q(c)?.owner}function zt(c){let e=Q(c)?.display;return e||{data:null,error:null}}function Oe(c){let e=de(c)?.fields;if(e)return"fields"in e?e.fields:e}function Qt(c){return de(c)?.hasPublicTransfer??!1}var He=require("@mysten/sui/transactions");async function Ht(c,e=!0){c.blockData.transactions.forEach((t,r)=>{})}var N=class{static async adjustTransactionForGas(e,t,r,n){n.setSender(e.senderAddress);let i=B.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(i.length===0)throw new Error("Insufficient balance");let s=B.calculateTotalBalance(t);if(s-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(n);if(B.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),i.map(u=>u.coinObjectId)).selectedCoins.length===0){let u=BigInt(o)+BigInt(500);if(s-r<u){if(r-=u,r<0)throw new Error("gas Insufficient balance");let p=new He.Transaction;return{fixAmount:r,newTx:p}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,n,i=!0,s=!1){let o=B.getCoinAssets(n,t);if(r===BigInt(0)&&o.length===0)return N.buildZeroValueCoin(t,e,n,i);let a=B.calculateTotalBalance(o);if(a<r)throw new Error(`The amount(${a}) is Insufficient balance for ${n} , expect ${r} `);return N.buildCoin(e,t,o,r,n,i,s)}static buildCoin(e,t,r,n,i,s=!0,o=!1){if(B.isSuiCoin(i)){if(s){let y=e.splitCoins(e.gas,[e.pure.u64(n)]);return{targetCoin:e.makeMoveVec({elements:[y]}),remainCoins:t,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(n===0n&&r.length>1){let y=B.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.object(y.objectArray[0]),remainCoins:y.remainCoins,tragetCoinAmount:y.amountArray[0],isMintZeroCoin:!1}}let f=B.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(n)]),remainCoins:f.remainCoins,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let a=B.selectCoinObjectIdGreaterThanOrEqual(r,n),u=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),p=a.objectArray;if(s)return{targetCoin:e.makeMoveVec({elements:p.map(f=>e.object(f))}),remainCoins:a.remainCoins,tragetCoinAmount:a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),isMintZeroCoin:!1};let[l,...m]=p,g=e.object(l),b=g,_=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),O;return m.length>0&&e.mergeCoins(g,m.map(f=>e.object(f))),o&&Number(u)>Number(n)&&(b=e.splitCoins(g,[e.pure.u64(n)]),_=n.toString(),O=g),{targetCoin:b,remainCoins:a.remainCoins,originalSplitedCoin:O,tragetCoinAmount:_,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,n=!0){let i=N.callMintZeroValueCoin(t,r),s;return n?s=t.makeMoveVec({elements:[i]}):s=i,{targetCoin:s,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,n,i=!0){let s=B.getCoinAssets(n,t);if(r.amountFirst===BigInt(0))return s.length>0?N.buildCoin(e,[...t],[...s],r.amountFirst,n,i):N.buildZeroValueCoin(t,e,n,i);let o=B.calculateTotalBalance(s);if(o>=r.amountFirst)return N.buildCoin(e,[...t],[...s],r.amountFirst,n,i);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${n} , expect ${r.amountSecond} `);return N.buildCoin(e,[...t],[...s],r.amountSecond,n,i)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let n=[];n.push(e[0],e[1]),r.push(n)}else{let n=[];n.push(e[0],e[e.length-1]),r.push(n);for(let i=1;i<e.length-1;i+=1){if(t[i-1]===0)continue;let s=[];s.push(e[0],e[i],e[e.length-1]),r.push(s)}}return r}},F=N;De(F,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));var le=1e6,U=1e9,Wt={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},Zt={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},X=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?Zt:Wt}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new T.Transaction,t=e.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`});return e.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[e.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),t],typeArguments:[]}),e.moveCall({target:"0x2::transfer::public_share_object",arguments:[t],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),e}createAndDepsit({account:e,coin:t,amountToDeposit:r}){let n=new T.Transaction;n.setSenderIfNotSet(e);let i=n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),s=(0,T.coinWithBalance)({type:t.coinType,balance:BigInt(r)});return n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[i,s],typeArguments:[t.coinType]}),n.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[n.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i],typeArguments:[]}),n.moveCall({target:"0x2::transfer::public_share_object",arguments:[i],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),n}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:n,tx:i}){let s=i||new T.Transaction;if(t){s.setSenderIfNotSet(e);let o=(0,T.coinWithBalance)({type:r.coinType,balance:BigInt(n)});return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s.object(t),o],typeArguments:[r.coinType]}),s}return null}withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:n,returnAssets:i,txb:s}){let o=s||new T.Transaction,a=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(n)],typeArguments:[r.coinType]});return i?a:(o.transferObjects([a],e),o)}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new T.Transaction}){for(let n in t)t[n].forEach(s=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(n),r.pure.u64(s.amount)],typeArguments:[s.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,n=this.getCache(r,t);if(!t&&n!==void 0)return n;try{let i=new T.Transaction;i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i.pure.address(e)],typeArguments:[]});let a=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}))?.events?.filter(p=>p.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],u=[];return a.forEach(p=>{u.push({balanceManager:p,cetusBalanceManager:""})}),this.updateCache(r,u,864e5),u||[]}catch(i){throw i instanceof Error?i:new Error(String(i))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new T.Transaction){let n=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::generate_proof_as_owner`,arguments:[r.object(t)]});return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::withdraw_settled_amounts`,arguments:[r.object(e.address),r.object(t),n],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let n=new T.Transaction;r.forEach(o=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[n.object(t)],typeArguments:[o.coinType]})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n}),s={};return i.results?.forEach((o,a)=>{let u=r[a],p=o.returnValues[0][0],l=h.bcs.U64.parse(new Uint8Array(p)),m=d(l),g=m.eq(0)?"0":m.div(Math.pow(10,u.decimals)).toString();s[u.coinType]={adjusted_balance:g,balance:m.toString()}}),s}catch(n){throw n instanceof Error?n:new Error(String(n))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new T.Transaction,n=await this.getBalanceManager(e,!0);if(!Array.isArray(n)||n.length===0)return{};n.forEach(o=>{t.forEach(a=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[a.coinType]})})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),s={};return n.forEach((o,a)=>{let u={},p=a*t.length;t.forEach((l,m)=>{let g=p+m,b=i.results?.[g];if(b){let _=b.returnValues[0][0],O=h.bcs.U64.parse(new Uint8Array(_)),f=d(O),w=f.eq(0)?"0":f.div(Math.pow(10,l.decimals)).toString();u[l.coinType]={adjusted_balance:w,balance:f.toString()}}}),s[o.balanceManager]=u}),s}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new T.Transaction;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let n=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],i=Number(h.bcs.U64.parse(new Uint8Array(n))),s=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return d(i).mul(s).div(o).div(U).toString()}catch(t){return Le("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let n=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),i=/<([^>]+)>/,s=[];return n?.data?.forEach(o=>{let a=o?.parsedJson,u=o.type.match(i);if(u){let l=u[1].split(", ");s.push({...a,baseCoinType:l[0],quoteCoinType:l[1]})}}),this.updateCache(t,s,864e5),s}async getQuoteQuantityOut(e,t,r){let n=new T.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(le).toString(),baseQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getBaseQuantityOut(e,t,r){let n=new T.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{quoteQuantityDisplay:d(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(le).toString(),quoteQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getQuantityOut(e,t,r,n){let i=new T.Transaction;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.pure.u64(r),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:n,transactionBlock:i}),o=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),a=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:d(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(a).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(u).div(le).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:a,deepRequired:u}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,n=e.quoteCoin.coinType,i=this._deep.coinType;for(let s=0;s<t.length;s++){let o=t[s];if(o.address===e.address)continue;let a=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===i&&(a.includes(r)||a.includes(n)))return o}return null}async updateDeepPrice(e,t){let r=await this.getReferencePool(e);return r?(t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::add_deep_price_point`,arguments:[t.object(e.address),t.object(r.pool_id),t.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,n,i,s,o){let a=this.deepCoin;try{let{taker_fee:u,maker_fee:p}=e,l=d(u).div(U).toString(),m=d(p).div(U).toString(),g=await this.getMarketPrice(e),b=s?r:g!=="0"?g:o;if(b==="0")throw new Error("Cannot get market price");let _=Math.pow(10,e.baseCoin.decimals).toString(),O=Math.pow(10,e.quoteCoin.decimals).toString(),f=d(b).div(_).mul(O).mul(U).toString();if(n){let A=await this.getMarketPrice(e),k=d(s?r:A!=="0"?A:o).div(_).mul(O).mul(U).toString(),M=await this.getOrderDeepPrice(e);if(!M)throw new Error("Cannot get deep price");let P=ue(k,r),D=d(t).mul(d(l)).mul(d(M.deep_per_asset)).div(d(U)),q=d(t).mul(d(m)).mul(d(M.deep_per_asset)).div(d(U));M.asset_is_base||(D=D.mul(P).div(d(U)),q=q.mul(P).div(d(U)));let I=D.ceil().toString(),ne=q.ceil().toString();return{takerFee:I,makerFee:ne,takerFeeDisplay:G(I,a.decimals).toString(),makerFeeDisplay:G(ne,a.decimals).toString(),feeType:a.coinType}}if(i){let A=ue(f,r),E=d(t).mul(A).mul(d(l).mul(1.25)).div(d(U)).ceil().toFixed(0),k=d(t).mul(A).mul(d(m).mul(1.25)).div(d(U)).ceil().toFixed(0);return{takerFee:E,makerFee:k,takerFeeDisplay:G(E,e.quoteCoin.decimals).toString(),makerFeeDisplay:G(k,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let w=d(t).mul(d(l).mul(1.25)).ceil().toFixed(0),y=d(t).mul(d(m).mul(1.25)).ceil().toFixed(0);return{takerFee:w,makerFee:y,takerFeeDisplay:G(w,e.baseCoin.decimals).toString(),makerFeeDisplay:G(y,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(u){throw u instanceof Error?u:new Error(String(u))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,n=this.getCache(r);if(n!==void 0)return n;try{let i=new T.Transaction,s=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,i)&&(s=!0),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[i.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:i}),a=s?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],u=this.parseOrderDeepPrice(new Uint8Array(a));return this.updateCache(r,u,6e4),u}catch{return await Ce(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,n=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:n}}getCoinAssets(e,t,r,n){return F.buildCoinForAmount(n,r,BigInt(d(t).abs().ceil().toString()),e,!1,!0).targetCoin}async getTransactionRelatedBalance(e,t,r,n,i,s,o){let a=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let u=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];n&&u.push(a);let p=await this.getManagerBalance({account:i,balanceManager:o,coins:u}),l=p?.[t]?.balance||"0",m=p?.[r]?.balance||"0",g=s&&p?.[a.coinType]?.balance||"0";return{baseManagerBlance:l,quoteManagerBlance:m,feeManaerBalance:g}}catch(u){throw u instanceof Error?u:new Error(String(u))}}getFeeAsset(e,t,r,n,i,s,o,a,u,p){let l=d(e).gt(0)&&u,m="0";if(!l)return{feeAsset:this.getEmptyCoin(p,t),haveDepositFee:"0"};if(s||o){let g=d(i).sub(s?n:r);m=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else m=d(i).sub(e).lt("0")?d(i).sub(e).abs().toString():"0";return{feeAsset:d(m).gt("0")?this.getCoinAssets(t,m,a,p):this.getEmptyCoin(p,t),haveDepositFee:m}}async getTransactionRelatedAssets(e,t,r,n,i,s,o,a,u){try{let p=this.deepCoin,l=(0,S.normalizeStructTag)(e.baseCoin.coinType),m=(0,S.normalizeStructTag)(e.quoteCoin.coinType),g=l===p.coinType,b=m===p.coinType,_=!g&&!b,{baseManagerBlance:O,quoteManagerBlance:f,feeManaerBalance:w}=await this.getTransactionRelatedBalance(e,l,m,_,s,o,a);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:O,quoteManagerBlance:f});let y,A,E=!1,k=await this._sdk.getOwnerCoinAssets(s);if(i){o||(r=d(r).add(d(n)).toString());let P=d(f).sub(r).toString();d(P).lt(0)?(E=!0,A=this.getCoinAssets(m,P,k,u)):A=this.getEmptyCoin(u,m),y=this.getEmptyCoin(u,l)}else{o||(t=d(t).add(d(n)).toString());let P=d(O).sub(t).toString();d(P).lt(0)?(E=!0,y=this.getCoinAssets(l,P,k,u)):y=this.getEmptyCoin(u,l),A=this.getEmptyCoin(u,m)}let M=this.getFeeAsset(n,p.coinType,t,r,w,b,g,k,o,u);return{baseAsset:y,quoteAsset:A,feeAsset:M,haveDeposit:E}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getMarketTransactionRelatedAssets(e,t,r,n,i,s,o,a,u,p){try{let l=this.deepCoin,m=(0,S.normalizeStructTag)(e.baseCoin.coinType),g=(0,S.normalizeStructTag)(e.quoteCoin.coinType),b=m===l.coinType,_=g===l.coinType,O=!b&&!_,f=await this.getTransactionRelatedBalance(e,m,g,O,s,o,a),{feeManaerBalance:w}=f,y=d(f.baseManagerBlance).add(d(p?.base||"0")).toString(),A=d(f.quoteManagerBlance).add(d(p?.quote||"0")).toString(),E=await this._sdk.getOwnerCoinAssets(s),k;o&&d(w).lt(n)?k=this.getCoinAssets(l.coinType,d(n).sub(w).toString(),E,u):k=this.getEmptyCoin(u,l.coinType);let M,P;if(i){o||(r=d(r).add(d(n)).toString());let D=d(A).sub(r).toString();if(d(D).lt(0)){let q;d(A).gt(0)&&(q=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:A,returnAssets:!0,txb:u}));let I=this.getCoinAssets(g,D,E,u);q&&u.mergeCoins(I,[q]),P=I}else P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:u});M=this.getEmptyCoin(u,m)}else{o||(t=d(t).add(d(n)).toString());let D=d(y).sub(t).toString();if(d(D).lt(0)){let q;d(y).gt(0)&&(q=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:y,returnAssets:!0,txb:u}));let I=this.getCoinAssets(m,D,E,u);q&&u.mergeCoins(I,[q]),M=I}else M=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:u});P=this.getEmptyCoin(u,g)}return{baseAsset:M,quoteAsset:P,feeAsset:k}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:n,isBid:i,maxFee:s,account:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8}){try{let p=this.deepCoin,l=e.address,m=e.baseCoin.decimals,g=e.quoteCoin.decimals,b=e.baseCoin.coinType,_=e.quoteCoin.coinType,O=d(t).mul(10**(g-m+9)).toString(),f=(0,S.normalizeStructTag)(b),w=(0,S.normalizeStructTag)(_),y=new T.Transaction,A,E,k=await this._sdk.getOwnerCoinAssets(o);if(i){let q=d(t).mul(d(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();a||(q=d(q).add(d(s)).toString()),E=F.buildCoinForAmount(y,k,BigInt(q),w,!1,!0)?.targetCoin}else{let q=r;a||(q=d(r).abs().add(d(s)).toString()),A=F.buildCoinForAmount(y,k,BigInt(d(q).abs().toString()),f,!1,!0)?.targetCoin}let M=a?d(s).gt(0)?F.buildCoinForAmount(y,k,BigInt(d(s).abs().ceil().toString()),p.coinType,!1,!0).targetCoin:this.getEmptyCoin(y,p.coinType):this.getEmptyCoin(y,p.coinType),P=y.moveCall({typeArguments:[i?b:_],target:"0x2::coin::zero",arguments:[]}),D=[y.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),y.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),y.object(l),i?P:A,i?E:P,M,y.pure.u8(n),y.pure.u8(0),y.pure.u64(O),y.pure.u64(r),y.pure.bool(i),y.pure.bool(!1),y.pure.u64(u),y.object(S.SUI_CLOCK_OBJECT_ID)];return y.moveCall({typeArguments:[f,w],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:D}),y}catch(p){throw p instanceof Error?p:new Error(String(p))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:n,account:i,payWithDeep:s,slippage:o=.01}){try{let a=e.address,u=e.baseCoin.coinType,p=e.quoteCoin.coinType,l=(0,S.normalizeStructTag)(u),m=(0,S.normalizeStructTag)(p),g=new T.Transaction,b,_,O=t,f,w=await this.getOrderBook(e,"all",6);if(r){let k=w?.ask?.[0]?.price||"0",M=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(M).plus(d(M).mul(o)).ceil().toString()}else{let k=await w?.bid?.[0]?.price||"0",M=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(M).minus(d(M).mul(o)).floor().toString()}let y=await this._sdk.getOwnerCoinAssets(i);r?(s||(f=d(f).add(d(n)).toString()),_=this.getCoinAssets(m,f,y,g),b=this.getEmptyCoin(g,l)):(s||(O=d(O).add(d(n)).toString()),_=this.getEmptyCoin(g,m),b=this.getCoinAssets(l,O,y,g));let A=s?d(n).gt(0)?F.buildCoinForAmount(g,y,BigInt(d(n).abs().ceil().toString()),this.deepCoin.coinType,!1,!0).targetCoin:this.getEmptyCoin(g,this.deepCoin.coinType):this.getEmptyCoin(g,this.deepCoin.coinType),E=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(a),b,_,A,g.pure.u8(0),g.pure.u64(t),g.pure.bool(r),g.pure.bool(s),g.pure.u64(f),g.object(S.SUI_CLOCK_OBJECT_ID)];return g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:E}),g}catch(a){throw a instanceof Error?a:new Error(String(a))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:n,isBid:i,orderType:s,maxFee:o,account:a,payWithDeep:u,expirationTimestamp:p=Date.now()+31536e8}){try{let l=this.deepCoin,m=d(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),g=t.baseCoin.coinType,b=t.quoteCoin.coinType,_=new T.Transaction,O=i?d(r).mul(d(n).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",f=i?"0":n,{baseAsset:w,quoteAsset:y,feeAsset:A,haveDeposit:E}=await this.getTransactionRelatedAssets(t,f,O,o,i,a,u,e,_);if(E){let P=[_.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),_.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),_.object(t.address),_.object(e),w,y,A.feeAsset,_.pure.u8(s),_.pure.u8(0),_.pure.u64(m),_.pure.u64(n),_.pure.bool(i),_.pure.bool(u),_.pure.u64(p),_.object(S.SUI_CLOCK_OBJECT_ID)];return _.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:P}),_}let k=new T.Transaction;d(A.haveDepositFee).gt(0)&&this.depositIntoManager({account:a,balanceManager:e,coin:l,amountToDeposit:A.haveDepositFee,tx:k});let M=[k.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),k.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),k.object(t.address),k.object(e),k.pure.u8(s),k.pure.u8(0),k.pure.u64(m),k.pure.u64(n),k.pure.bool(i),k.pure.bool(u),k.pure.u64(p),k.object(S.SUI_CLOCK_OBJECT_ID)];return k.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:M}),k}catch(l){throw l instanceof Error?l:new Error(String(l))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:n}){let i=new T.Transaction;return i.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),i.object(e),i.object(t.address),i.pure.u128(r),i.pure.u64(n),i.object(S.SUI_CLOCK_OBJECT_ID)]}),i}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new T.Transaction,i=await this.getMarketPrice(e),s=d(i).gt(0)?i:Math.pow(10,-1),o=Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(a),n.pure.u64(u),n.pure.bool(!1),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],O=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),A=d(O[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:A})}),m?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new T.Transaction,i=await this.getMarketPrice(e),s=d(i).gt(0)?d(i).div(3).toNumber():Math.pow(10,-6),o=d(i).gt(0)?i:Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(L(a,0)),n.pure.u64(L(u,0)),n.pure.bool(!0),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],O=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),A=d(O[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:A})}),m?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:n}=e,i=new T.Transaction,s=await this.getMarketPrice(e),o,a;t?(o=d(s).gt(0)?d(s).div(3).toNumber():Math.pow(10,-6),a=d(s).gt(0)?s:Math.pow(10,6)):(o=d(s).gt(0)?s:Math.pow(10,-1),a=d(s).gt(0)?d(s).mul(3).toNumber():Math.pow(10,6));let u=d(o).mul(Math.pow(10,9+n.decimals-r.decimals)).toString(),p=d(a).mul(Math.pow(10,9+n.decimals-r.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(L(u,0)),i.pure.u64(L(p,0)),i.pure.bool(t),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]});let l=this._sdk.sdkOptions.simulationAccount.address,m=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:i}),g=[],b=m.results[0].returnValues[0][0],_=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(b)),O=m.results[0].returnValues[1][0],f=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(O));return _.forEach((w,y)=>{let A=d(w).div(Math.pow(10,9+n.decimals-r.decimals)).toString(),E=d(f[y]).div(Math.pow(10,r.decimals)).toString();g.push({price:A,quantity:E})}),g?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:n,isBid:i,maxFee:s,account:o,payWithDeep:a,slippage:u=.01,settled_balances:p={base:"0",quote:"0"}}){try{let l=(0,S.normalizeStructTag)(t.baseCoin.coinType),m=(0,S.normalizeStructTag)(t.quoteCoin.coinType),g=new T.Transaction;p&&(d(p.base).gt(0)||d(p.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},g);let{baseAsset:b,quoteAsset:_,feeAsset:O}=await this.getMarketTransactionRelatedAssets(t,r,n,s,i,o,a,e,g,p),f=await this.getOrderBook(t,"all",6);if(i){let A=f?.ask?.[0]?.price||"0",E=d(A).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(E).plus(d(E).mul(u)).ceil().toString()}else{let A=await f?.bid?.[0]?.price||"0",E=d(A).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(E).minus(d(E).mul(u)).floor().toString()}let w=n,y=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(t.address),g.object(e),b,_,O,g.pure.u8(0),g.pure.u64(r),g.pure.bool(i),g.pure.bool(a),g.pure.u64(w),g.object(S.SUI_CLOCK_OBJECT_ID)];return g.setSenderIfNotSet(o),g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:y}),g}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderInfoList(e,t){try{let r=new T.Transaction;e.forEach(u=>{let p=u?.pool,l=u?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(p.pool_id),r.pure.u128(BigInt(l))],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),i=h.bcs.struct("ID",{bytes:h.bcs.Address}),s=h.bcs.struct("OrderDeepPrice",{asset_is_base:h.bcs.bool(),deep_per_asset:h.bcs.u64()}),o=h.bcs.struct("Order",{balance_manager_id:i,order_id:h.bcs.u128(),client_order_id:h.bcs.u64(),quantity:h.bcs.u64(),filled_quantity:h.bcs.u64(),fee_is_deep:h.bcs.bool(),order_deep_price:s,epoch:h.bcs.u64(),status:h.bcs.u8(),expire_timestamp:h.bcs.u64()}),a=[];return n?.results?.forEach(u=>{let p=u.returnValues[0][0],l=o.parse(new Uint8Array(p));a.push(l)}),a}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),n=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:n}}async getOpenOrder(e,t,r,n,i=!1,s=new T.Transaction){let o;if(n)o=n;else{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[s.object(e.address),i?r:s.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let m=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:s})).results[i?1:0].returnValues[0][0];o=h.bcs.struct("VecSet",{constants:h.bcs.vector(h.bcs.U128)}).parse(new Uint8Array(m)).constants}let a=o.map(l=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:l})),u=await this.getOrderInfoList(a,t)||[],p=[];return u.forEach(l=>{let m=this.decodeOrderId(BigInt(l.order_id));p.push({...l,price:m.price,isBid:m.isBid,pool:e})}),p}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),n=new T.Transaction;r.forEach(l=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[n.object(l.pool_id),n.object(t)],typeArguments:[l.baseCoinType,l.quoteCoinType]})});let s=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n})).results?.map(l=>l.returnValues?.[0]?.[0])||[],o=h.bcs.struct("VecSet",{constants:h.bcs.vector(h.bcs.U128)}),a=[];s.forEach((l,m)=>{let g=o.parse(new Uint8Array(l)).constants;g.length>0&&g.forEach(b=>{a.push({pool:r[m],orderId:b})})});let u=await this.getOrderInfoList(a,e)||[],p=[];return a.forEach((l,m)=>{let g=this.decodeOrderId(BigInt(l.orderId)),b=u.find(_=>_.order_id===l.orderId)||{};p.push({...l,...b,price:g.price,isBid:g.isBid})}),p}catch{return[]}}cancelOrders(e,t,r=new T.Transaction){return e.forEach(n=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::cancel_order`,arguments:[r.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),r.object(t),r.object(n.poolInfo.address),r.pure.u128(n.orderId),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.poolInfo.baseCoin.coinType,n.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,n,i,s){let o=this._sdk.fullClient,u=await new We.DeepBookClient({client:o,address:i,env:"testnet",balanceManagers:{test1:{address:s,tradeCap:""}}}).getLevel2Range(e,t,r,n)}processOrderBookData(e,t,r,n){let i=e.returnValues[0][0],s=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(i)),o=e.returnValues[1][0],a=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(o)),u={};return s.forEach((l,m)=>{let g=d(l).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),b=d(a[m]).div(Math.pow(10,t.decimals)).toString();u[g]?u[g]={price:g,quantity:d(u[g].quantity).add(b).toString()}:u[g]={price:g,quantity:b}}),Object.values(u)}getLevel2RangeTx(e,t,r,n,i=new T.Transaction){let{baseCoin:s,quoteCoin:o}=e,a=L(d(r).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0),u=L(d(n).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0);return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(a),i.pure.u64(u),i.pure.bool(t),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[s.coinType,o.coinType]}),i}async fetchOrderBook(e,t,r,n,i,s){let o=new T.Transaction,{baseCoin:a,quoteCoin:u}=e;try{if(t==="bid"||t==="all"){let b=n,_=r==="0"?i:r;o=this.getLevel2RangeTx(e,!0,b,_,o)}if(t==="ask"||t==="all"){let b=r==="0"?n:r,_=i;o=this.getLevel2RangeTx(e,!1,b,_,o)}let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:o}),m=[];(t==="bid"||t==="all")&&(m=l.results?.[0]?this.processOrderBookData(l.results[0],a,u,s):[]);let g=[];if(t==="ask"||t==="all"){let b=t==="ask"?0:1;g=l.results?.[b]?this.processOrderBookData(l.results[b],a,u,s):[]}return{bid:m.sort((b,_)=>_.price-b.price),ask:g.sort((b,_)=>b.price-_.price)}}catch{let l=this._sdk.sdkOptions.simulationAccount.address,m=[],g=[];try{let b=this.getLevel2RangeTx(e,!0,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});m=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{m=[]}try{let b=this.getLevel2RangeTx(e,!1,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});g=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{g=[]}return{bid:m,ask:g}}}async getOrderBook(e,t,r){let n={bid:[],ask:[]};try{let i=await this.getMarketPrice(e),s=t,o=Math.pow(10,-r),a=Math.pow(10,r),u=await this.fetchOrderBook(e,s,i,o,a,r);return{bid:u?.bid,ask:u?.ask}}catch{return n}}async getOrderBookOrigin(e,t){try{let r=new T.Transaction,n=await this.getMarketPrice(e),{baseCoin:i,quoteCoin:s}=e;if(t==="bid"||t==="all"){let l=Math.pow(10,-6),m=n,g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!0),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType]})}if(t==="ask"||t==="all"){let l=n,m=Math.pow(10,6),g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!1),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,a=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),u=[];if(t==="bid"||t==="all"){let l=a.results[0]?.returnValues[0]?.[0],m=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(l)),g=a.results[0]?.returnValues[1]?.[0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g));m.forEach((_,O)=>{let f=d(_).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),w=d(b[O]).div(Math.pow(10,i.decimals)).toString();u.push({price:f,quantity:w})})}let p=[];if(t==="ask"||t==="all"){let l=t==="ask"?0:1,m=a.results[l]?.returnValues[0]?.[0],g=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(m)),b=a.results[l]?.returnValues[1]?.[0],_=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(b));g.forEach((O,f)=>{let w=d(O).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),y=d(_[f]).div(Math.pow(10,i.decimals)).toString();p.push({price:w,quantity:y})})}return{bid:u,ask:p}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((n,i)=>[(0,S.normalizeStructTag)(n.coinType),n]))}async getAccount(e,t,r=new T.Transaction){for(let o=0;o<t.length;o++){let a=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(a.address),typeof e=="string"?r.object(e):e],typeArguments:[a.baseCoin.coinType,a.quoteCoin.coinType]})}let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),i;if(n?.events.length===0)return null;let s=[];return n?.events?.forEach((o,a)=>{i=o?.parsedJson;let u=i.account.open_orders.contents,p=i.account.owed_balances,l=i.account.settled_balances,m=i.account.unclaimed_rebates,g=i.account.taker_volume;s.push({balance_manager_id:e,open_orders:u,owed_balances:p,settled_balances:l,unclaimed_rebates:m,taker_volume:g,poolInfo:t[a]})}),s}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,n=this.getCache(r,t);if(n!==void 0)return n;let i;try{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,i,864e5),i}transformExtensions(e,t,r=!0){let n=[];for(let i of t){let{key:s}=i.fields,{value:o}=i.fields;if(s==="labels")try{o=JSON.parse(decodeURIComponent(Ze.Base64.decode(o)))}catch{}r&&(e[s]=o),n.push({key:s,value:o})}delete e.extension_fields,r||(e.extensions=n)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,n=`${r}_getCoinConfigs`,i=this.getCache(n,e);if(i)return i;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(p=>p.objectId),a=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),u=[];return a.forEach(p=>{let l=this.buildCoinConfig(p,t);this.updateCache(`${r}_${l.address}_getCoinConfig`,l,864e5),u.push({...l})}),this.updateCache(n,u,864e5),u}buildCoinConfig(e,t=!0){let r=Oe(e);r=r.value.fields;let n={...r};return n.id=Ae(e),n.address=R(r.coin_type.fields.name).full_address,r.pyth_id&&(n.pyth_id=(0,S.normalizeSuiObjectId)(r.pyth_id)),this.transformExtensions(n,r.extension_fields.fields.contents,t),delete n.coin_type,n}updateCache(e,t,r=3e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:n,quoteCoinType:i}){let s=new T.Transaction,o=B.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",s);s.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[n,i],arguments:[s.object(this.sdk.sdkOptions.deepbook.registry_id),s.pure.u64(e),s.pure.u64(t),s.pure.u64(r),o]});try{let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:s});if(a.effects.status.status==="success")return s;if(a.effects.status.status==="failure"&&a.effects.status.error&&a.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(a){throw a instanceof Error?a:new Error(String(a))}return s}};var Be=require("@cetusprotocol/common-sdk"),j=require("@mysten/sui/bcs"),C=require("@mysten/sui/transactions"),v=require("@mysten/sui/utils");var Jt=({totalAssetsValue:c,totalDebtValue:e})=>d(e).eq(0)||d(c).eq(0)?"0":d(c).div(d(e)).toString(),Se=c=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i}=c.value.fields,{liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}=c.value.fields.risk_ratios.fields;return{id:c.id.id,name:c.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i,liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}},je=(c,e)=>{let{deposit_coin_type:t}=e,r=c.id.id,{max_utilization_rate:n,min_borrow:i,protocol_spread:s,supply_cap:o}=c.config.fields.margin_pool_config.fields,{maintainer_fees:a,protocol_fees:u}=c.protocol_fees.fields,{total_supply:p,total_borrow:l}=c.state.fields,m=d(o).sub(p).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:p,total_borrow:l,available_supply:m,max_utilization_rate:n,min_borrow:i,protocol_spread:s,maintainer_fees:a,protocol_fees:u}};var ge=require("@pythnetwork/pyth-sui-js");var Ee=10n;function Yt(c,e){if(!Ee)throw new Error("oraclePriceMultiplierDecimal is required");if(c===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(Ee- -e);return c*t}return c/10n**(e+Ee)}var Z=class{_sdk;connection;suiPythClient;hasChangeConnection=!1;_cache={};constructor(e){this._sdk=e,this.connection=new ge.SuiPriceServiceConnection(this.sdk.sdkOptions.pythUrl),this.suiPythClient=new ge.SuiPythClient(this._sdk.fullClient,this._sdk.sdkOptions.margin_utils.pyth_state_id,this._sdk.sdkOptions.margin_utils.wormhole_state_id)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,n=null;try{r=await this.connection.getPriceFeedsUpdateData(e)}catch(o){n=o}if(r==null)throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes. Detailed error: ${n?.message}`);let i=[];try{i=await this.suiPythClient.updatePriceFeeds(t,r,e)}catch(o){throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes in the pythUrls parameter when initializing AggregatorClient, for example: new AggregatorClient({ pythUrls: ["https://your-pyth-node-url"] }). Detailed error: ${o}`)}let s=new Map;for(let o=0;o<e.length;o++)s.set(e[o],i[o]);return s}priceCheck(e,t=60){let r=Math.floor(Date.now()/1e3);if(!(Math.abs(r-e.last_update_time)>t))return e}async getLatestPrice(e,t=!1){let r={},n=[];if(t?e.forEach(o=>{let a=this._sdk.getCache(`getLatestPrice_${o.coinType}`);a&&this.priceCheck(a,60)?r[o.coinType]=a:n.push(o.coinType)}):n=e.map(o=>o.coinType),n.length===0)return r;let i=e.map(o=>o.feed);return(await this.connection.getLatestPriceUpdates(i))?.parsed?.forEach((o,a)=>{let u=o.price;if(u){let{price:p,expo:l}=u,m=d(p).mul(d(10).pow(d(l))).toString(),b={coin_type:e[a].coinType,price:m,oracle_price:0n,last_update_time:u.publish_time};b.oracle_price=Yt(BigInt(p),BigInt(l)),r[n[a]]=b,this._sdk.updateCache(`getLatestPrice_${b.coin_type}`,b)}}),r}};var ee=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new Z(e),this._deep=e.sdkOptions.network==="mainnet"?xe:Ne}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new C.Transaction){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");if(!e.baseCoin?.coinType||!e.quoteCoin?.coinType)throw new Error("Base and quote coin types are required");let{baseCoin:r,quoteCoin:n}=e;try{let{margin_manager:i,initializer:s}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:i,initializer:s,baseCoin:r,quoteCoin:n},t),{tx:t,margin_manager:i,initializer:s}}catch(i){throw new Error(`Failed to create and share margin manager: ${i instanceof Error?i.message:String(i)}`)}}createMarginManager(e,t=new C.Transaction){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:n,quoteCoin:i}=e;try{let[s,o]=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::create_margin_manager`,arguments:[t.object(this.sdk.sdkOptions.margin_utils.versioned_id),t.object(r),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),t.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.coinType,i.coinType]});return{tx:t,margin_manager:s,initializer:o}}catch(s){throw new Error(`Failed to create margin manager: ${s instanceof Error?s.message:String(s)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:n},i=new C.Transaction){try{return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,n.coinType]}),i}catch(s){throw new Error(`Failed to share margin manager: ${s instanceof Error?s.message:String(s)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
|
|
1
|
+
"use strict";var it=Object.create;var J=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ct=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var lt=(c,e,t)=>e in c?J(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var dt=(c,e)=>{for(var t in e)J(c,t,{get:e[t],enumerable:!0})},Pe=(c,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of at(e))!ut.call(c,n)&&n!==t&&J(c,n,{get:()=>e[n],enumerable:!(r=ot(e,n))||r.enumerable});return c};var qe=(c,e,t)=>(t=c!=null?it(ct(c)):{},Pe(e||!c||!c.__esModule?J(t,"default",{value:c,enumerable:!0}):t,c)),pt=c=>Pe(J({},"__esModule",{value:!0}),c);var De=(c,e,t)=>(lt(c,typeof e!="symbol"?e+"":e,t),t);var _r={};dt(_r,{CLOCK_ADDRESS:()=>tr,CachedContent:()=>K,CetusClmmSDK:()=>re,ClmmExpectSwapModule:()=>ar,ClmmFetcherModule:()=>or,ClmmIntegratePoolModule:()=>rr,ClmmIntegratePoolV2Module:()=>nr,ClmmIntegrateRouterModule:()=>sr,ClmmIntegrateRouterWithPartnerModule:()=>ir,ClmmIntegrateUtilsModule:()=>cr,CoinAssist:()=>B,CoinInfoAddress:()=>ur,CoinStoreAddress:()=>lr,DEEP_SCALAR:()=>de,DEFAULT_GAS_BUDGET_FOR_MERGE:()=>Bt,DEFAULT_GAS_BUDGET_FOR_SPLIT:()=>Et,DEFAULT_GAS_BUDGET_FOR_STAKE:()=>Pt,DEFAULT_GAS_BUDGET_FOR_TRANSFER:()=>vt,DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI:()=>Mt,DEFAULT_NFT_TRANSFER_GAS_FEE:()=>Dt,DeepbookClobV2Moudle:()=>pr,DeepbookCustodianV2Moudle:()=>dr,DeepbookEndpointsV2Moudle:()=>gr,DeepbookUtilsModule:()=>X,FLOAT_SCALAR:()=>U,FLOAT_SCALING:()=>$,GAS_SYMBOL:()=>qt,GAS_TYPE_ARG:()=>ae,GAS_TYPE_ARG_LONG:()=>_e,MarginUtilsModule:()=>ee,NORMALIZED_SUI_COIN_TYPE:()=>Ot,OrderType:()=>nt,RpcModule:()=>te,SUI_SYSTEM_STATE_OBJECT_ID:()=>It,SelfMatchingOption:()=>st,TransactionUtil:()=>F,YEAR_MS:()=>Ye,addHexPrefix:()=>me,asIntN:()=>Rt,asUintN:()=>Ut,bufferToHex:()=>_t,cacheTime1min:()=>ye,cacheTime24h:()=>V,cacheTime5min:()=>fe,calc100PercentRepay:()=>er,calcDebtDetail:()=>tt,calcInterestRate:()=>et,calcUtilizationRate:()=>Xe,calculateRiskRatio:()=>Jt,checkAddress:()=>bt,composeType:()=>be,d:()=>d,decimalsMultiplier:()=>ce,default:()=>br,extractAddressFromType:()=>Tt,extractStructTagFromType:()=>R,fixCoinType:()=>At,fixDown:()=>L,fixSuiObjectId:()=>Ve,fromDecimalsAmount:()=>G,getDefaultSuiInputType:()=>mr,getFutureTime:()=>z,getMoveObject:()=>le,getMoveObjectType:()=>Qe,getMovePackageContent:()=>xt,getObjectDeletedResponse:()=>Ge,getObjectDisplay:()=>zt,getObjectFields:()=>Oe,getObjectId:()=>Ae,getObjectNotExistsResponse:()=>Ke,getObjectOwner:()=>Kt,getObjectPreviousTransactionDigest:()=>Gt,getObjectReference:()=>Te,getObjectType:()=>Lt,getObjectVersion:()=>Vt,getSuiObjectData:()=>Q,hasPublicTransfer:()=>Qt,hexToNumber:()=>ht,hexToString:()=>yt,isSortedSymbols:()=>Ct,isSuiObjectResponse:()=>ze,maxDecimal:()=>ue,mulRoundUp:()=>Me,normalizeCoinType:()=>ie,patchFixSuiObjectId:()=>oe,printTransaction:()=>Ht,removeHexPrefix:()=>se,secretKeyToEd25519Keypair:()=>$t,secretKeyToSecp256k1Keypair:()=>Ft,shortAddress:()=>mt,shortString:()=>Ie,sleepTime:()=>Ce,toBuffer:()=>Ue,toDecimalsAmount:()=>W,utf8to16:()=>Re,wrapDeepBookMarginPoolInfo:()=>je,wrapDeepBookPoolInfo:()=>Se});module.exports=pt(_r);var rt=require("@mysten/sui/graphql");var We=require("@mysten/deepbook-v3"),h=require("@mysten/sui/bcs"),T=require("@mysten/sui/transactions"),S=require("@mysten/sui/utils"),Ze=require("js-base64");var he=require("@mysten/sui/transactions");var x=require("@mysten/sui/utils");var gt=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function me(c){return c.startsWith("0x")?c:`0x${c}`}function se(c){return c.startsWith("0x")?`${c.slice(2)}`:c}function Ie(c,e=4,t=4){let r=Math.max(e,1),n=Math.max(t,1);return`${c.slice(0,r+2)} ... ${c.slice(-n)}`}function mt(c,e=4,t=4){return Ie(me(c),e,t)}function bt(c,e={leadingZero:!0}){if(typeof c!="string")return!1;let t=c;if(e.leadingZero){if(!c.startsWith("0x"))return!1;t=t.substring(2)}return gt.test(t)}function Ue(c){if(!Buffer.isBuffer(c))if(Array.isArray(c))c=Buffer.from(c);else if(typeof c=="string")exports.isHexString(c)?c=Buffer.from(exports.padToEven(exports.stripHexPrefix(c)),"hex"):c=Buffer.from(c);else if(typeof c=="number")c=exports.intToBuffer(c);else if(c==null)c=Buffer.allocUnsafe(0);else if(c.toArray)c=Buffer.from(c.toArray());else throw new Error("invalid type");return c}function _t(c){return me(Ue(c).toString("hex"))}function ht(c){let e=new ArrayBuffer(4),t=new DataView(e);for(let n=0;n<c.length;n++)t.setUint8(n,c.charCodeAt(n));return t.getUint32(0,!0)}function Re(c){let e,t,r,n,i;e="";let s=c.length;for(t=0;t<s;)switch(r=c.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=c.charAt(t-1);break;case 12:case 13:n=c.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|n&63);break;case 14:n=c.charCodeAt(t++),i=c.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(n&63)<<6|(i&63)<<0);break}return e}function yt(c){let e="",t=se(c),r=t.length/2;for(let n=0;n<r;n++)e+=String.fromCharCode(Number.parseInt(t.substr(n*2,2),16));return Re(e)}var ft=0,Fe=1,wt=2;function $e(c,e){return c===e?ft:c<e?Fe:wt}function kt(c,e){let t=0,r=c.length<=e.length?c.length:e.length,n=$e(c.length,e.length);for(;t<r;){let i=$e(c.charCodeAt(t),e.charCodeAt(t));if(t+=1,i!==0)return i}return n}function Ct(c,e){return kt(c,e)===Fe}function be(c,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],n=[c,...e].filter(Boolean).join("::");return t&&t.length&&(n+=`<${t.join(", ")}>`),n}function Tt(c){return c.split("::")[0]}function R(c){try{let e=c.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let a={...R(e),type_arguments:r.map(u=>R(u).source_address)};return a.type_arguments=a.type_arguments.map(u=>B.isSuiCoin(u)?u:R(u).source_address),a.source_address=be(a.full_address,a.type_arguments),a}let n=e.split("::"),s={full_address:e,address:e===ae||e===_e?"0x2":(0,x.normalizeSuiObjectId)(n[0]),module:n[1],name:n[2],type_arguments:[],source_address:""};return s.full_address=`${s.address}::${s.module}::${s.name}`,s.source_address=be(s.full_address,s.type_arguments),s}catch{return{full_address:c,address:"",module:"",name:"",type_arguments:[],source_address:c}}}function ie(c){return R(c).source_address}function Ve(c){return c.toLowerCase().startsWith("0x")?(0,x.normalizeSuiObjectId)(c):c}var At=(c,e=!0)=>{let t=c.split("::"),r=t.shift(),n=(0,x.normalizeSuiObjectId)(r);return e&&(n=se(n)),`${n}::${t.join("::")}`};function oe(c){for(let e in c){let t=typeof c[e];if(t==="object")oe(c[e]);else if(t==="string"){let r=c[e];c[e]=Ve(r)}}}var Ot=(0,x.normalizeStructTag)(x.SUI_TYPE_ARG);var St="0x2::coin::Coin",jt=/^0x2::coin::Coin<(.+)>$/,Et=1e3,Bt=500,vt=100,Mt=100,Pt=1e3,ae="0x2::sui::SUI",_e="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",qt="SUI",Dt=450,It="0x0000000000000000000000000000000000000005",B=class{static getCoinTypeArg(e){let t=e.type.match(jt);return t?t[1]:null}static isSUI(e){let t=B.getCoinTypeArg(e);return t?B.getCoinSymbol(t)==="SUI":!1}static getCoinSymbol(e){return e.substring(e.lastIndexOf(":")+1)}static getBalance(e){return BigInt(e.fields.balance)}static totalBalance(e,t){let r=BigInt(0);return e.forEach(n=>{t===n.coinAddress&&(r+=BigInt(n.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${St}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(n=>{ie(n.coinAddress)===ie(e)&&r.push(n)}),r}static isSuiCoin(e){return R(e).full_address===ae}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let n=B.selectCoinAssetGreaterThanOrEqual(e,t,r),i=n.selectedCoins.map(a=>a.coinObjectId),s=n.remainingCoins,o=n.selectedCoins.map(a=>a.balance.toString());return{objectArray:i,remainCoins:s,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let n=B.sortByBalance(e.filter(u=>!r.includes(u.coinObjectId))),i=B.calculateTotalBalance(n);if(i<t)return{selectedCoins:[],remainingCoins:n};if(i===t)return{selectedCoins:n,remainingCoins:[]};let s=BigInt(0),o=[],a=[...n];for(;s<i;){let u=t-s,p=a.findIndex(m=>m.balance>=u);if(p!==-1){o.push(a[p]),a.splice(p,1);break}let l=a.pop();l.balance>0&&(o.push(l),s+=l.balance)}return{selectedCoins:B.sortByBalance(o),remainingCoins:B.sortByBalance(a)}}static sortByBalance(e){return e.sort((t,r)=>t.balance<r.balance?-1:t.balance>r.balance?1:0)}static sortByBalanceDes(e){return e.sort((t,r)=>t.balance>r.balance?-1:t.balance<r.balance?0:1)}static calculateTotalBalance(e){return e.reduce((t,r)=>t+r.balance,BigInt(0))}static buildCoinWithBalance(e,t,r){return e===BigInt(0)&&B.isSuiCoin(t)?r.add((0,he.coinWithBalance)({balance:e,useGasCoin:!1})):r.add((0,he.coinWithBalance)({balance:e,type:t}))}};var ye=6e4,fe=3e5,V=864e5;function z(c){return Date.parse(new Date().toString())+c}var K=class{overdueTime;value;constructor(e,t=0){this.overdueTime=t,this.value=e}isValid(){return this.value===null?!1:this.overdueTime===0?!0:!(Date.parse(new Date().toString())>this.overdueTime)}};var H=require("@mysten/bcs"),we=require("@mysten/sui/keypairs/ed25519"),ke=require("@mysten/sui/keypairs/secp256k1");var Y=qe(require("decimal.js"));function d(c){return Y.default.isDecimal(c)?c:new Y.default(c===void 0?0:c)}function ce(c){return d(10).pow(d(c).abs())}var L=(c,e)=>{try{return d(c).toDP(e,Y.default.ROUND_DOWN).toString()}catch{return c}},ue=(c,e)=>Y.default.max(d(c),d(e));function W(c,e){let t=ce(d(e));return Number(d(c).mul(t))}function Ut(c,e=32){return BigInt.asUintN(e,BigInt(c)).toString()}function Rt(c,e=32){return Number(BigInt.asIntN(e,BigInt(c)))}function G(c,e){let t=ce(d(e));return Number(d(c).div(t))}function $t(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return we.Ed25519Keypair.fromSecretKey(r)}let t=e==="hex"?(0,H.fromHEX)(c):(0,H.fromB64)(c);return we.Ed25519Keypair.fromSecretKey(t)}function Ft(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return ke.Secp256k1Keypair.fromSecretKey(r)}let t=e==="hex"?(0,H.fromHEX)(c):(0,H.fromB64)(c);return ke.Secp256k1Keypair.fromSecretKey(t)}var Ce=async c=>new Promise(e=>{setTimeout(()=>{e(1)},c)});var Ne={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},xe={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function Le(...c){let e="DeepbookV3_Utils_Sdk###"}function Q(c){return c.data}function Ge(c){if(c.error&&"object_id"in c.error&&"version"in c.error&&"digest"in c.error){let{error:e}=c;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function Ke(c){if(c.error&&"object_id"in c.error&&!("version"in c.error)&&!("digest"in c.error))return c.error.object_id}function Te(c){if("reference"in c)return c.reference;let e=Q(c);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:Ge(c)}function Ae(c){return"objectId"in c?c.objectId:Te(c)?.objectId??Ke(c)}function Vt(c){return"version"in c?c.version:Te(c)?.version}function ze(c){return c.data!==void 0}function Nt(c){return c.content!==void 0}function xt(c){let e=Q(c);if(e?.content?.dataType==="package")return e.content.disassembled}function le(c){let e="data"in c?Q(c):c;if(!(!e||!Nt(e)||e.content.dataType!=="moveObject"))return e.content}function Qe(c){return le(c)?.type}function Lt(c){let e=ze(c)?c.data:c;return!e?.type&&"data"in c?e?.content?.dataType==="package"?"package":Qe(c):e?.type}function Gt(c){return Q(c)?.previousTransaction}function Kt(c){return Q(c)?.owner}function zt(c){let e=Q(c)?.display;return e||{data:null,error:null}}function Oe(c){let e=le(c)?.fields;if(e)return"fields"in e?e.fields:e}function Qt(c){return le(c)?.hasPublicTransfer??!1}var He=require("@mysten/sui/transactions");async function Ht(c,e=!0){c.blockData.transactions.forEach((t,r)=>{})}var N=class{static async adjustTransactionForGas(e,t,r,n){n.setSender(e.senderAddress);let i=B.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(i.length===0)throw new Error("Insufficient balance");let s=B.calculateTotalBalance(t);if(s-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(n);if(B.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),i.map(u=>u.coinObjectId)).selectedCoins.length===0){let u=BigInt(o)+BigInt(500);if(s-r<u){if(r-=u,r<0)throw new Error("gas Insufficient balance");let p=new He.Transaction;return{fixAmount:r,newTx:p}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,n,i=!0,s=!1){let o=B.getCoinAssets(n,t);if(r===BigInt(0)&&o.length===0)return N.buildZeroValueCoin(t,e,n,i);let a=B.calculateTotalBalance(o);if(a<r)throw new Error(`The amount(${a}) is Insufficient balance for ${n} , expect ${r} `);return N.buildCoin(e,t,o,r,n,i,s)}static buildCoin(e,t,r,n,i,s=!0,o=!1){if(B.isSuiCoin(i)){if(s){let y=e.splitCoins(e.gas,[e.pure.u64(n)]);return{targetCoin:e.makeMoveVec({elements:[y]}),remainCoins:t,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(n===0n&&r.length>1){let y=B.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.object(y.objectArray[0]),remainCoins:y.remainCoins,tragetCoinAmount:y.amountArray[0],isMintZeroCoin:!1}}let f=B.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(n)]),remainCoins:f.remainCoins,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let a=B.selectCoinObjectIdGreaterThanOrEqual(r,n),u=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),p=a.objectArray;if(s)return{targetCoin:e.makeMoveVec({elements:p.map(f=>e.object(f))}),remainCoins:a.remainCoins,tragetCoinAmount:a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),isMintZeroCoin:!1};let[l,...m]=p,g=e.object(l),b=g,_=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),O;return m.length>0&&e.mergeCoins(g,m.map(f=>e.object(f))),o&&Number(u)>Number(n)&&(b=e.splitCoins(g,[e.pure.u64(n)]),_=n.toString(),O=g),{targetCoin:b,remainCoins:a.remainCoins,originalSplitedCoin:O,tragetCoinAmount:_,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,n=!0){let i=N.callMintZeroValueCoin(t,r),s;return n?s=t.makeMoveVec({elements:[i]}):s=i,{targetCoin:s,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,n,i=!0){let s=B.getCoinAssets(n,t);if(r.amountFirst===BigInt(0))return s.length>0?N.buildCoin(e,[...t],[...s],r.amountFirst,n,i):N.buildZeroValueCoin(t,e,n,i);let o=B.calculateTotalBalance(s);if(o>=r.amountFirst)return N.buildCoin(e,[...t],[...s],r.amountFirst,n,i);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${n} , expect ${r.amountSecond} `);return N.buildCoin(e,[...t],[...s],r.amountSecond,n,i)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let n=[];n.push(e[0],e[1]),r.push(n)}else{let n=[];n.push(e[0],e[e.length-1]),r.push(n);for(let i=1;i<e.length-1;i+=1){if(t[i-1]===0)continue;let s=[];s.push(e[0],e[i],e[e.length-1]),r.push(s)}}return r}},F=N;De(F,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));var de=1e6,U=1e9,Wt={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},Zt={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},X=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?Zt:Wt}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new T.Transaction,t=e.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`});return e.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[e.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),t],typeArguments:[]}),e.moveCall({target:"0x2::transfer::public_share_object",arguments:[t],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),e}createAndDepsit({account:e,coin:t,amountToDeposit:r}){let n=new T.Transaction;n.setSenderIfNotSet(e);let i=n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),s=(0,T.coinWithBalance)({type:t.coinType,balance:BigInt(r)});return n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[i,s],typeArguments:[t.coinType]}),n.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[n.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i],typeArguments:[]}),n.moveCall({target:"0x2::transfer::public_share_object",arguments:[i],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),n}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:n,tx:i}){let s=i||new T.Transaction;if(t){s.setSenderIfNotSet(e);let o=(0,T.coinWithBalance)({type:r.coinType,balance:BigInt(n)});return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s.object(t),o],typeArguments:[r.coinType]}),s}return null}withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:n,returnAssets:i,txb:s}){let o=s||new T.Transaction,a=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(n)],typeArguments:[r.coinType]});return i?a:(o.transferObjects([a],e),o)}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new T.Transaction}){for(let n in t)t[n].forEach(s=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(n),r.pure.u64(s.amount)],typeArguments:[s.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,n=this.getCache(r,t);if(!t&&n!==void 0)return n;try{let i=new T.Transaction;i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i.pure.address(e)],typeArguments:[]});let a=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}))?.events?.filter(p=>p.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],u=[];return a.forEach(p=>{u.push({balanceManager:p,cetusBalanceManager:""})}),this.updateCache(r,u,864e5),u||[]}catch(i){throw i instanceof Error?i:new Error(String(i))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new T.Transaction){let n=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::generate_proof_as_owner`,arguments:[r.object(t)]});return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::withdraw_settled_amounts`,arguments:[r.object(e.address),r.object(t),n],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let n=new T.Transaction;r.forEach(o=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[n.object(t)],typeArguments:[o.coinType]})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n}),s={};return i.results?.forEach((o,a)=>{let u=r[a],p=o.returnValues[0][0],l=h.bcs.U64.parse(new Uint8Array(p)),m=d(l),g=m.eq(0)?"0":m.div(Math.pow(10,u.decimals)).toString();s[u.coinType]={adjusted_balance:g,balance:m.toString()}}),s}catch(n){throw n instanceof Error?n:new Error(String(n))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new T.Transaction,n=await this.getBalanceManager(e,!0);if(!Array.isArray(n)||n.length===0)return{};n.forEach(o=>{t.forEach(a=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[a.coinType]})})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),s={};return n.forEach((o,a)=>{let u={},p=a*t.length;t.forEach((l,m)=>{let g=p+m,b=i.results?.[g];if(b){let _=b.returnValues[0][0],O=h.bcs.U64.parse(new Uint8Array(_)),f=d(O),w=f.eq(0)?"0":f.div(Math.pow(10,l.decimals)).toString();u[l.coinType]={adjusted_balance:w,balance:f.toString()}}}),s[o.balanceManager]=u}),s}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new T.Transaction;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let n=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],i=Number(h.bcs.U64.parse(new Uint8Array(n))),s=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return d(i).mul(s).div(o).div(U).toString()}catch(t){return Le("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let n=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),i=/<([^>]+)>/,s=[];return n?.data?.forEach(o=>{let a=o?.parsedJson,u=o.type.match(i);if(u){let l=u[1].split(", ");s.push({...a,baseCoinType:l[0],quoteCoinType:l[1]})}}),this.updateCache(t,s,864e5),s}async getQuoteQuantityOut(e,t,r){let n=new T.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(de).toString(),baseQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getBaseQuantityOut(e,t,r){let n=new T.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{quoteQuantityDisplay:d(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(de).toString(),quoteQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getQuantityOut(e,t,r,n){let i=new T.Transaction;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.pure.u64(r),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:n,transactionBlock:i}),o=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),a=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=Number(h.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:d(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(a).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(u).div(de).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:a,deepRequired:u}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,n=e.quoteCoin.coinType,i=this._deep.coinType;for(let s=0;s<t.length;s++){let o=t[s];if(o.address===e.address)continue;let a=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===i&&(a.includes(r)||a.includes(n)))return o}return null}async updateDeepPrice(e,t){let r=await this.getReferencePool(e);return r?(t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::add_deep_price_point`,arguments:[t.object(e.address),t.object(r.pool_id),t.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,n,i,s,o){let a=this.deepCoin;try{let{taker_fee:u,maker_fee:p}=e,l=d(u).div(U).toString(),m=d(p).div(U).toString(),g=await this.getMarketPrice(e),b=s?r:g!=="0"?g:o;if(b==="0")throw new Error("Cannot get market price");let _=Math.pow(10,e.baseCoin.decimals).toString(),O=Math.pow(10,e.quoteCoin.decimals).toString(),f=d(b).div(_).mul(O).mul(U).toString();if(n){let A=await this.getMarketPrice(e),k=d(s?r:A!=="0"?A:o).div(_).mul(O).mul(U).toString(),M=await this.getOrderDeepPrice(e);if(!M)throw new Error("Cannot get deep price");let P=ue(k,r),D=d(t).mul(d(l)).mul(d(M.deep_per_asset)).div(d(U)),q=d(t).mul(d(m)).mul(d(M.deep_per_asset)).div(d(U));M.asset_is_base||(D=D.mul(P).div(d(U)),q=q.mul(P).div(d(U)));let I=D.ceil().toString(),ne=q.ceil().toString();return{takerFee:I,makerFee:ne,takerFeeDisplay:G(I,a.decimals).toString(),makerFeeDisplay:G(ne,a.decimals).toString(),feeType:a.coinType}}if(i){let A=ue(f,r),E=d(t).mul(A).mul(d(l).mul(1.25)).div(d(U)).ceil().toFixed(0),k=d(t).mul(A).mul(d(m).mul(1.25)).div(d(U)).ceil().toFixed(0);return{takerFee:E,makerFee:k,takerFeeDisplay:G(E,e.quoteCoin.decimals).toString(),makerFeeDisplay:G(k,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let w=d(t).mul(d(l).mul(1.25)).ceil().toFixed(0),y=d(t).mul(d(m).mul(1.25)).ceil().toFixed(0);return{takerFee:w,makerFee:y,takerFeeDisplay:G(w,e.baseCoin.decimals).toString(),makerFeeDisplay:G(y,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(u){throw u instanceof Error?u:new Error(String(u))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,n=this.getCache(r);if(n!==void 0)return n;try{let i=new T.Transaction,s=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,i)&&(s=!0),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[i.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:i}),a=s?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],u=this.parseOrderDeepPrice(new Uint8Array(a));return this.updateCache(r,u,6e4),u}catch{return await Ce(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,n=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:n}}getCoinAssets(e,t,r,n){return F.buildCoinForAmount(n,r,BigInt(d(t).abs().ceil().toString()),e,!1,!0).targetCoin}async getTransactionRelatedBalance(e,t,r,n,i,s,o){let a=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let u=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];n&&u.push(a);let p=await this.getManagerBalance({account:i,balanceManager:o,coins:u}),l=p?.[t]?.balance||"0",m=p?.[r]?.balance||"0",g=s&&p?.[a.coinType]?.balance||"0";return{baseManagerBlance:l,quoteManagerBlance:m,feeManaerBalance:g}}catch(u){throw u instanceof Error?u:new Error(String(u))}}getFeeAsset(e,t,r,n,i,s,o,a,u,p){let l=d(e).gt(0)&&u,m="0";if(!l)return{feeAsset:this.getEmptyCoin(p,t),haveDepositFee:"0"};if(s||o){let g=d(i).sub(s?n:r);m=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else m=d(i).sub(e).lt("0")?d(i).sub(e).abs().toString():"0";return{feeAsset:d(m).gt("0")?this.getCoinAssets(t,m,a,p):this.getEmptyCoin(p,t),haveDepositFee:m}}async getTransactionRelatedAssets(e,t,r,n,i,s,o,a,u){try{let p=this.deepCoin,l=(0,S.normalizeStructTag)(e.baseCoin.coinType),m=(0,S.normalizeStructTag)(e.quoteCoin.coinType),g=l===p.coinType,b=m===p.coinType,_=!g&&!b,{baseManagerBlance:O,quoteManagerBlance:f,feeManaerBalance:w}=await this.getTransactionRelatedBalance(e,l,m,_,s,o,a);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:O,quoteManagerBlance:f});let y,A,E=!1,k=await this._sdk.getOwnerCoinAssets(s);if(i){o||(r=d(r).add(d(n)).toString());let P=d(f).sub(r).toString();d(P).lt(0)?(E=!0,A=this.getCoinAssets(m,P,k,u)):A=this.getEmptyCoin(u,m),y=this.getEmptyCoin(u,l)}else{o||(t=d(t).add(d(n)).toString());let P=d(O).sub(t).toString();d(P).lt(0)?(E=!0,y=this.getCoinAssets(l,P,k,u)):y=this.getEmptyCoin(u,l),A=this.getEmptyCoin(u,m)}let M=this.getFeeAsset(n,p.coinType,t,r,w,b,g,k,o,u);return{baseAsset:y,quoteAsset:A,feeAsset:M,haveDeposit:E}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getMarketTransactionRelatedAssets(e,t,r,n,i,s,o,a,u,p){try{let l=this.deepCoin,m=(0,S.normalizeStructTag)(e.baseCoin.coinType),g=(0,S.normalizeStructTag)(e.quoteCoin.coinType),b=m===l.coinType,_=g===l.coinType,O=!b&&!_,f=await this.getTransactionRelatedBalance(e,m,g,O,s,o,a),{feeManaerBalance:w}=f,y=d(f.baseManagerBlance).add(d(p?.base||"0")).toString(),A=d(f.quoteManagerBlance).add(d(p?.quote||"0")).toString(),E=await this._sdk.getOwnerCoinAssets(s),k;o&&d(w).lt(n)?k=this.getCoinAssets(l.coinType,d(n).sub(w).toString(),E,u):k=this.getEmptyCoin(u,l.coinType);let M,P;if(i){o||(r=d(r).add(d(n)).toString());let D=d(A).sub(r).toString();if(d(D).lt(0)){let q;d(A).gt(0)&&(q=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:A,returnAssets:!0,txb:u}));let I=this.getCoinAssets(g,D,E,u);q&&u.mergeCoins(I,[q]),P=I}else P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:u});M=this.getEmptyCoin(u,m)}else{o||(t=d(t).add(d(n)).toString());let D=d(y).sub(t).toString();if(d(D).lt(0)){let q;d(y).gt(0)&&(q=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:y,returnAssets:!0,txb:u}));let I=this.getCoinAssets(m,D,E,u);q&&u.mergeCoins(I,[q]),M=I}else M=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:u});P=this.getEmptyCoin(u,g)}return{baseAsset:M,quoteAsset:P,feeAsset:k}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:n,isBid:i,maxFee:s,account:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8}){try{let p=this.deepCoin,l=e.address,m=e.baseCoin.decimals,g=e.quoteCoin.decimals,b=e.baseCoin.coinType,_=e.quoteCoin.coinType,O=d(t).mul(10**(g-m+9)).toString(),f=(0,S.normalizeStructTag)(b),w=(0,S.normalizeStructTag)(_),y=new T.Transaction,A,E,k=await this._sdk.getOwnerCoinAssets(o);if(i){let q=d(t).mul(d(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();a||(q=d(q).add(d(s)).toString()),E=F.buildCoinForAmount(y,k,BigInt(q),w,!1,!0)?.targetCoin}else{let q=r;a||(q=d(r).abs().add(d(s)).toString()),A=F.buildCoinForAmount(y,k,BigInt(d(q).abs().toString()),f,!1,!0)?.targetCoin}let M=a?d(s).gt(0)?F.buildCoinForAmount(y,k,BigInt(d(s).abs().ceil().toString()),p.coinType,!1,!0).targetCoin:this.getEmptyCoin(y,p.coinType):this.getEmptyCoin(y,p.coinType),P=y.moveCall({typeArguments:[i?b:_],target:"0x2::coin::zero",arguments:[]}),D=[y.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),y.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),y.object(l),i?P:A,i?E:P,M,y.pure.u8(n),y.pure.u8(0),y.pure.u64(O),y.pure.u64(r),y.pure.bool(i),y.pure.bool(!1),y.pure.u64(u),y.object(S.SUI_CLOCK_OBJECT_ID)];return y.moveCall({typeArguments:[f,w],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:D}),y}catch(p){throw p instanceof Error?p:new Error(String(p))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:n,account:i,payWithDeep:s,slippage:o=.01}){try{let a=e.address,u=e.baseCoin.coinType,p=e.quoteCoin.coinType,l=(0,S.normalizeStructTag)(u),m=(0,S.normalizeStructTag)(p),g=new T.Transaction,b,_,O=t,f,w=await this.getOrderBook(e,"all",6);if(r){let k=w?.ask?.[0]?.price||"0",M=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(M).plus(d(M).mul(o)).ceil().toString()}else{let k=await w?.bid?.[0]?.price||"0",M=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(M).minus(d(M).mul(o)).floor().toString()}let y=await this._sdk.getOwnerCoinAssets(i);r?(s||(f=d(f).add(d(n)).toString()),_=this.getCoinAssets(m,f,y,g),b=this.getEmptyCoin(g,l)):(s||(O=d(O).add(d(n)).toString()),_=this.getEmptyCoin(g,m),b=this.getCoinAssets(l,O,y,g));let A=s?d(n).gt(0)?F.buildCoinForAmount(g,y,BigInt(d(n).abs().ceil().toString()),this.deepCoin.coinType,!1,!0).targetCoin:this.getEmptyCoin(g,this.deepCoin.coinType):this.getEmptyCoin(g,this.deepCoin.coinType),E=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(a),b,_,A,g.pure.u8(0),g.pure.u64(t),g.pure.bool(r),g.pure.bool(s),g.pure.u64(f),g.object(S.SUI_CLOCK_OBJECT_ID)];return g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:E}),g}catch(a){throw a instanceof Error?a:new Error(String(a))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:n,isBid:i,orderType:s,maxFee:o,account:a,payWithDeep:u,expirationTimestamp:p=Date.now()+31536e8}){try{let l=this.deepCoin,m=d(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),g=t.baseCoin.coinType,b=t.quoteCoin.coinType,_=new T.Transaction,O=i?d(r).mul(d(n).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",f=i?"0":n,{baseAsset:w,quoteAsset:y,feeAsset:A,haveDeposit:E}=await this.getTransactionRelatedAssets(t,f,O,o,i,a,u,e,_);if(E){let P=[_.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),_.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),_.object(t.address),_.object(e),w,y,A.feeAsset,_.pure.u8(s),_.pure.u8(0),_.pure.u64(m),_.pure.u64(n),_.pure.bool(i),_.pure.bool(u),_.pure.u64(p),_.object(S.SUI_CLOCK_OBJECT_ID)];return _.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:P}),_}let k=new T.Transaction;d(A.haveDepositFee).gt(0)&&this.depositIntoManager({account:a,balanceManager:e,coin:l,amountToDeposit:A.haveDepositFee,tx:k});let M=[k.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),k.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),k.object(t.address),k.object(e),k.pure.u8(s),k.pure.u8(0),k.pure.u64(m),k.pure.u64(n),k.pure.bool(i),k.pure.bool(u),k.pure.u64(p),k.object(S.SUI_CLOCK_OBJECT_ID)];return k.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:M}),k}catch(l){throw l instanceof Error?l:new Error(String(l))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:n}){let i=new T.Transaction;return i.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),i.object(e),i.object(t.address),i.pure.u128(r),i.pure.u64(n),i.object(S.SUI_CLOCK_OBJECT_ID)]}),i}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new T.Transaction,i=await this.getMarketPrice(e),s=d(i).gt(0)?i:Math.pow(10,-1),o=Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(a),n.pure.u64(u),n.pure.bool(!1),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],O=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),A=d(O[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:A})}),m?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new T.Transaction,i=await this.getMarketPrice(e),s=d(i).gt(0)?d(i).div(3).toNumber():Math.pow(10,-6),o=d(i).gt(0)?i:Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(L(a,0)),n.pure.u64(L(u,0)),n.pure.bool(!0),n.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],O=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),A=d(O[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:A})}),m?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:n}=e,i=new T.Transaction,s=await this.getMarketPrice(e),o,a;t?(o=d(s).gt(0)?d(s).div(3).toNumber():Math.pow(10,-6),a=d(s).gt(0)?s:Math.pow(10,6)):(o=d(s).gt(0)?s:Math.pow(10,-1),a=d(s).gt(0)?d(s).mul(3).toNumber():Math.pow(10,6));let u=d(o).mul(Math.pow(10,9+n.decimals-r.decimals)).toString(),p=d(a).mul(Math.pow(10,9+n.decimals-r.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(L(u,0)),i.pure.u64(L(p,0)),i.pure.bool(t),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]});let l=this._sdk.sdkOptions.simulationAccount.address,m=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:i}),g=[],b=m.results[0].returnValues[0][0],_=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(b)),O=m.results[0].returnValues[1][0],f=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(O));return _.forEach((w,y)=>{let A=d(w).div(Math.pow(10,9+n.decimals-r.decimals)).toString(),E=d(f[y]).div(Math.pow(10,r.decimals)).toString();g.push({price:A,quantity:E})}),g?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:n,isBid:i,maxFee:s,account:o,payWithDeep:a,slippage:u=.01,settled_balances:p={base:"0",quote:"0"}}){try{let l=(0,S.normalizeStructTag)(t.baseCoin.coinType),m=(0,S.normalizeStructTag)(t.quoteCoin.coinType),g=new T.Transaction;p&&(d(p.base).gt(0)||d(p.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},g);let{baseAsset:b,quoteAsset:_,feeAsset:O}=await this.getMarketTransactionRelatedAssets(t,r,n,s,i,o,a,e,g,p),f=await this.getOrderBook(t,"all",6);if(i){let A=f?.ask?.[0]?.price||"0",E=d(A).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(E).plus(d(E).mul(u)).ceil().toString()}else{let A=await f?.bid?.[0]?.price||"0",E=d(A).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(E).minus(d(E).mul(u)).floor().toString()}let w=n,y=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(t.address),g.object(e),b,_,O,g.pure.u8(0),g.pure.u64(r),g.pure.bool(i),g.pure.bool(a),g.pure.u64(w),g.object(S.SUI_CLOCK_OBJECT_ID)];return g.setSenderIfNotSet(o),g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:y}),g}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderInfoList(e,t){try{let r=new T.Transaction;e.forEach(u=>{let p=u?.pool,l=u?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(p.pool_id),r.pure.u128(BigInt(l))],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),i=h.bcs.struct("ID",{bytes:h.bcs.Address}),s=h.bcs.struct("OrderDeepPrice",{asset_is_base:h.bcs.bool(),deep_per_asset:h.bcs.u64()}),o=h.bcs.struct("Order",{balance_manager_id:i,order_id:h.bcs.u128(),client_order_id:h.bcs.u64(),quantity:h.bcs.u64(),filled_quantity:h.bcs.u64(),fee_is_deep:h.bcs.bool(),order_deep_price:s,epoch:h.bcs.u64(),status:h.bcs.u8(),expire_timestamp:h.bcs.u64()}),a=[];return n?.results?.forEach(u=>{let p=u.returnValues[0][0],l=o.parse(new Uint8Array(p));a.push(l)}),a}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),n=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:n}}async getOpenOrder(e,t,r,n,i=!1,s=new T.Transaction){let o;if(n)o=n;else{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[s.object(e.address),i?r:s.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let m=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:s})).results[i?1:0].returnValues[0][0];o=h.bcs.struct("VecSet",{constants:h.bcs.vector(h.bcs.U128)}).parse(new Uint8Array(m)).constants}if(o.length===0)return[];let a=o.map(l=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:l})),u=await this.getOrderInfoList(a,t)||[],p=[];return u.forEach(l=>{let m=this.decodeOrderId(BigInt(l.order_id));p.push({...l,price:m.price,isBid:m.isBid,pool:e})}),p}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),n=new T.Transaction;r.forEach(l=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[n.object(l.pool_id),n.object(t)],typeArguments:[l.baseCoinType,l.quoteCoinType]})});let s=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n})).results?.map(l=>l.returnValues?.[0]?.[0])||[],o=h.bcs.struct("VecSet",{constants:h.bcs.vector(h.bcs.U128)}),a=[];s.forEach((l,m)=>{let g=o.parse(new Uint8Array(l)).constants;g.length>0&&g.forEach(b=>{a.push({pool:r[m],orderId:b})})});let u=await this.getOrderInfoList(a,e)||[],p=[];return a.forEach((l,m)=>{let g=this.decodeOrderId(BigInt(l.orderId)),b=u.find(_=>_.order_id===l.orderId)||{};p.push({...l,...b,price:g.price,isBid:g.isBid})}),p}catch{return[]}}cancelOrders(e,t,r=new T.Transaction){return e.forEach(n=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::cancel_order`,arguments:[r.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),r.object(t),r.object(n.poolInfo.address),r.pure.u128(n.orderId),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.poolInfo.baseCoin.coinType,n.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,n,i,s){let o=this._sdk.fullClient,u=await new We.DeepBookClient({client:o,address:i,env:"testnet",balanceManagers:{test1:{address:s,tradeCap:""}}}).getLevel2Range(e,t,r,n)}processOrderBookData(e,t,r,n){let i=e.returnValues[0][0],s=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(i)),o=e.returnValues[1][0],a=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(o)),u={};return s.forEach((l,m)=>{let g=d(l).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),b=d(a[m]).div(Math.pow(10,t.decimals)).toString();u[g]?u[g]={price:g,quantity:d(u[g].quantity).add(b).toString()}:u[g]={price:g,quantity:b}}),Object.values(u)}getLevel2RangeTx(e,t,r,n,i=new T.Transaction){let{baseCoin:s,quoteCoin:o}=e,a=L(d(r).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0),u=L(d(n).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0);return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(a),i.pure.u64(u),i.pure.bool(t),i.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[s.coinType,o.coinType]}),i}async fetchOrderBook(e,t,r,n,i,s){let o=new T.Transaction,{baseCoin:a,quoteCoin:u}=e;try{if(t==="bid"||t==="all"){let b=n,_=r==="0"?i:r;o=this.getLevel2RangeTx(e,!0,b,_,o)}if(t==="ask"||t==="all"){let b=r==="0"?n:r,_=i;o=this.getLevel2RangeTx(e,!1,b,_,o)}let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:o}),m=[];(t==="bid"||t==="all")&&(m=l.results?.[0]?this.processOrderBookData(l.results[0],a,u,s):[]);let g=[];if(t==="ask"||t==="all"){let b=t==="ask"?0:1;g=l.results?.[b]?this.processOrderBookData(l.results[b],a,u,s):[]}return{bid:m.sort((b,_)=>_.price-b.price),ask:g.sort((b,_)=>b.price-_.price)}}catch{let l=this._sdk.sdkOptions.simulationAccount.address,m=[],g=[];try{let b=this.getLevel2RangeTx(e,!0,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});m=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{m=[]}try{let b=this.getLevel2RangeTx(e,!1,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});g=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{g=[]}return{bid:m,ask:g}}}async getOrderBook(e,t,r){let n={bid:[],ask:[]};try{let i=await this.getMarketPrice(e),s=t,o=Math.pow(10,-r),a=Math.pow(10,r),u=await this.fetchOrderBook(e,s,i,o,a,r);return{bid:u?.bid,ask:u?.ask}}catch{return n}}async getOrderBookOrigin(e,t){try{let r=new T.Transaction,n=await this.getMarketPrice(e),{baseCoin:i,quoteCoin:s}=e;if(t==="bid"||t==="all"){let l=Math.pow(10,-6),m=n,g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!0),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType]})}if(t==="ask"||t==="all"){let l=n,m=Math.pow(10,6),g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!1),r.object(S.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,a=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),u=[];if(t==="bid"||t==="all"){let l=a.results[0]?.returnValues[0]?.[0],m=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(l)),g=a.results[0]?.returnValues[1]?.[0],b=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(g));m.forEach((_,O)=>{let f=d(_).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),w=d(b[O]).div(Math.pow(10,i.decimals)).toString();u.push({price:f,quantity:w})})}let p=[];if(t==="ask"||t==="all"){let l=t==="ask"?0:1,m=a.results[l]?.returnValues[0]?.[0],g=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(m)),b=a.results[l]?.returnValues[1]?.[0],_=h.bcs.vector(h.bcs.u64()).parse(new Uint8Array(b));g.forEach((O,f)=>{let w=d(O).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),y=d(_[f]).div(Math.pow(10,i.decimals)).toString();p.push({price:w,quantity:y})})}return{bid:u,ask:p}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((n,i)=>[(0,S.normalizeStructTag)(n.coinType),n]))}async getAccount(e,t,r=new T.Transaction){for(let o=0;o<t.length;o++){let a=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(a.address),typeof e=="string"?r.object(e):e],typeArguments:[a.baseCoin.coinType,a.quoteCoin.coinType]})}let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),i;if(n?.events.length===0)return null;let s=[];return n?.events?.forEach((o,a)=>{i=o?.parsedJson;let u=i.account.open_orders.contents,p=i.account.owed_balances,l=i.account.settled_balances,m=i.account.unclaimed_rebates,g=i.account.taker_volume;s.push({balance_manager_id:e,open_orders:u,owed_balances:p,settled_balances:l,unclaimed_rebates:m,taker_volume:g,poolInfo:t[a]})}),s}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,n=this.getCache(r,t);if(n!==void 0)return n;let i;try{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,i,864e5),i}transformExtensions(e,t,r=!0){let n=[];for(let i of t){let{key:s}=i.fields,{value:o}=i.fields;if(s==="labels")try{o=JSON.parse(decodeURIComponent(Ze.Base64.decode(o)))}catch{}r&&(e[s]=o),n.push({key:s,value:o})}delete e.extension_fields,r||(e.extensions=n)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,n=`${r}_getCoinConfigs`,i=this.getCache(n,e);if(i)return i;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(p=>p.objectId),a=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),u=[];return a.forEach(p=>{let l=this.buildCoinConfig(p,t);this.updateCache(`${r}_${l.address}_getCoinConfig`,l,864e5),u.push({...l})}),this.updateCache(n,u,864e5),u}buildCoinConfig(e,t=!0){let r=Oe(e);r=r.value.fields;let n={...r};return n.id=Ae(e),n.address=R(r.coin_type.fields.name).full_address,r.pyth_id&&(n.pyth_id=(0,S.normalizeSuiObjectId)(r.pyth_id)),this.transformExtensions(n,r.extension_fields.fields.contents,t),delete n.coin_type,n}updateCache(e,t,r=3e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:n,quoteCoinType:i}){let s=new T.Transaction,o=B.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",s);s.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[n,i],arguments:[s.object(this.sdk.sdkOptions.deepbook.registry_id),s.pure.u64(e),s.pure.u64(t),s.pure.u64(r),o]});try{let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:s});if(a.effects.status.status==="success")return s;if(a.effects.status.status==="failure"&&a.effects.status.error&&a.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(a){throw a instanceof Error?a:new Error(String(a))}return s}};var Be=require("@cetusprotocol/common-sdk"),j=require("@mysten/sui/bcs"),C=require("@mysten/sui/transactions"),v=require("@mysten/sui/utils");var Jt=({totalAssetsValue:c,totalDebtValue:e})=>d(e).eq(0)||d(c).eq(0)?"0":d(c).div(d(e)).toString(),Se=c=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i}=c.value.fields,{liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}=c.value.fields.risk_ratios.fields;return{id:c.id.id,name:c.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i,liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}},je=(c,e)=>{let{deposit_coin_type:t}=e,r=c.id.id,{max_utilization_rate:n,min_borrow:i,protocol_spread:s,supply_cap:o}=c.config.fields.margin_pool_config.fields,{maintainer_fees:a,protocol_fees:u}=c.protocol_fees.fields,{total_supply:p,total_borrow:l}=c.state.fields,m=d(o).sub(p).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:p,total_borrow:l,available_supply:m,max_utilization_rate:n,min_borrow:i,protocol_spread:s,maintainer_fees:a,protocol_fees:u}};var ge=require("@pythnetwork/pyth-sui-js");var Ee=10n;function Yt(c,e){if(!Ee)throw new Error("oraclePriceMultiplierDecimal is required");if(c===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(Ee- -e);return c*t}return c/10n**(e+Ee)}var Z=class{_sdk;connection;suiPythClient;hasChangeConnection=!1;_cache={};constructor(e){this._sdk=e,this.connection=new ge.SuiPriceServiceConnection(this.sdk.sdkOptions.pythUrl),this.suiPythClient=new ge.SuiPythClient(this._sdk.fullClient,this._sdk.sdkOptions.margin_utils.pyth_state_id,this._sdk.sdkOptions.margin_utils.wormhole_state_id)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,n=null;try{r=await this.connection.getPriceFeedsUpdateData(e)}catch(o){n=o}if(r==null)throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes. Detailed error: ${n?.message}`);let i=[];try{i=await this.suiPythClient.updatePriceFeeds(t,r,e)}catch(o){throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes in the pythUrls parameter when initializing AggregatorClient, for example: new AggregatorClient({ pythUrls: ["https://your-pyth-node-url"] }). Detailed error: ${o}`)}let s=new Map;for(let o=0;o<e.length;o++)s.set(e[o],i[o]);return s}priceCheck(e,t=60){let r=Math.floor(Date.now()/1e3);if(!(Math.abs(r-e.last_update_time)>t))return e}async getLatestPrice(e,t=!1){let r={},n=[];if(t?e.forEach(o=>{let a=this._sdk.getCache(`getLatestPrice_${o.coinType}`);a&&this.priceCheck(a,60)?r[o.coinType]=a:n.push(o.coinType)}):n=e.map(o=>o.coinType),n.length===0)return r;let i=e.map(o=>o.feed);return(await this.connection.getLatestPriceUpdates(i))?.parsed?.forEach((o,a)=>{let u=o.price;if(u){let{price:p,expo:l}=u,m=d(p).mul(d(10).pow(d(l))).toString(),b={coin_type:e[a].coinType,price:m,oracle_price:0n,last_update_time:u.publish_time};b.oracle_price=Yt(BigInt(p),BigInt(l)),r[n[a]]=b,this._sdk.updateCache(`getLatestPrice_${b.coin_type}`,b)}}),r}};var ee=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new Z(e),this._deep=e.sdkOptions.network==="mainnet"?xe:Ne}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new C.Transaction){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");if(!e.baseCoin?.coinType||!e.quoteCoin?.coinType)throw new Error("Base and quote coin types are required");let{baseCoin:r,quoteCoin:n}=e;try{let{margin_manager:i,initializer:s}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:i,initializer:s,baseCoin:r,quoteCoin:n},t),{tx:t,margin_manager:i,initializer:s}}catch(i){throw new Error(`Failed to create and share margin manager: ${i instanceof Error?i.message:String(i)}`)}}createMarginManager(e,t=new C.Transaction){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:n,quoteCoin:i}=e;try{let[s,o]=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::create_margin_manager`,arguments:[t.object(this.sdk.sdkOptions.margin_utils.versioned_id),t.object(r),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),t.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.coinType,i.coinType]});return{tx:t,margin_manager:s,initializer:o}}catch(s){throw new Error(`Failed to create margin manager: ${s instanceof Error?s.message:String(s)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:n},i=new C.Transaction){try{return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,n.coinType]}),i}catch(s){throw new Error(`Failed to share margin manager: ${s instanceof Error?s.message:String(s)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
|
|
2
2
|
query Events($filter: EventFilter) {
|
|
3
3
|
events(filter: $filter) {
|
|
4
4
|
nodes {
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
`,r={filter:{sender:e,type:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::BalanceManagerEvent`}};try{let n=await this.sdk.graphqlClient.query({query:t,variables:r});return n?.data?.events?.nodes?n.data.events.nodes.map(s=>s?.contents?.json):[]}catch(n){throw new Error(`Failed to query balance managers: ${n instanceof Error?n.message:String(n)}`)}}async getMarginManagerByAccount(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::CreateMarginManagerEvent`}))?.data||[]).filter(i=>i.parsedJson?.owner===e).map(i=>i?.parsedJson)}catch(t){throw new Error(`Failed to get margin managers by account: ${t instanceof Error?t.message:String(t)}`)}}async getBaseBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getQuoteBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get quote balance: ${s instanceof Error?s.message:String(s)}`)}}async getDeepBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::borrowed_shares`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||s.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);let o=j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])),a=j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]));return{baseBorrowedShare:o,quoteBorrowedShare:a}}catch(s){throw new Error(`Failed to get borrowed shares: ${s instanceof Error?s.message:String(s)}`)}}managerState=({account:e,marginManager:t,baseCoin:r,quoteCoin:n,pool:i,baseMarginPool:s,quoteMarginPool:o,decimals:a=6,basePriceFeedObjectId:u,quotePriceFeedObjectId:p})=>l=>{l.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::manager_state`,arguments:[l.object(t),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(u),l.object(p),l.object(i),l.object(s),l.object(o),l.object.clock()],typeArguments:[r.coinType,n.coinType]})};async getManagerState(e,t=new C.Transaction){let{account:r,marginManager:n,baseCoin:i,quoteCoin:s,pool:o,baseMarginPool:a,quoteMarginPool:u,decimals:p=6}=e;if(!r||!n||!o||!a||!u)throw new Error("All required parameters must be provided");if(!i?.feed||!s?.feed)throw new Error("Base and quote coin feeds are required");if(!i.scalar||!s.scalar)throw new Error("Base and quote coin scalars are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],t),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");t.add(this.managerState({...e,basePriceFeedObjectId:m,quotePriceFeedObjectId:g}));let b=await this.sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:t});if(!b.results||!b.results[0]||!b.results[0].returnValues||b.results[0].returnValues.length<14)throw new Error(`Failed to get margin manager state: ${b.effects?.status?.error||"Unknown error"}`);let _=(0,v.normalizeSuiAddress)(j.bcs.Address.parse(new Uint8Array(b.results[0].returnValues[0][0]))),O=(0,v.normalizeSuiAddress)(j.bcs.Address.parse(new Uint8Array(b.results[0].returnValues[1][0]))),f=Number(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[2][0])))/1e9,w=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[3][0]))),i.scalar,p),y=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[4][0]))),s.scalar,p),A=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[5][0]))),i.scalar,p),E=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[6][0]))),s.scalar,p),k=j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[7][0])),M=Number(j.bcs.u8().parse(new Uint8Array(b.results[0].returnValues[8][0]))),P=j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[9][0])),D=Number(j.bcs.u8().parse(new Uint8Array(b.results[0].returnValues[10][0]))),q=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[11][0]))),I=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[12][0]))),ne=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[13][0])));return{managerId:_,deepbookPoolId:O,riskRatio:f,baseAsset:w,quoteAsset:y,baseDebt:A,quoteDebt:E,basePythPrice:k.toString(),basePythDecimals:M,quotePythPrice:P.toString(),quotePythDecimals:D,currentPrice:q,lowestTriggerAbovePrice:I,highestTriggerBelowPrice:ne}}catch(l){throw new Error(`Failed to get manager state: ${l instanceof Error?l.message:String(l)}`)}}async calculateAssets({account:e,marginManager:t,pool:r,baseCoin:n,quoteCoin:i,decimals:s=6}){if(!e||!t||!r)throw new Error("Account, marginManager, and pool are required");if(!n?.coinType||!i?.coinType)throw new Error("Base and quote coin types are required");let o=new C.Transaction;try{o.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::calculate_assets`,arguments:[o.object(t),o.object(r)],typeArguments:[n.coinType,i.coinType]});let a=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:o});if(!a.results||!a.results[0]||!a.results[0].returnValues||a.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${a.effects?.status?.error||"Unknown error"}`);let u=a.results[0].returnValues[0][0],p=a.results[0].returnValues[1][0];if(!n.scalar||!i.scalar)throw new Error("Base and quote coin scalars are required");let l=j.bcs.U64.parse(new Uint8Array(u)),m=j.bcs.U64.parse(new Uint8Array(p));return{baseAsset:l.toString(),quoteAsset:m.toString()}}catch(a){throw new Error(`Failed to calculate assets: ${a instanceof Error?a.message:String(a)}`)}}async getBorrowedAmount({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n,baseMarginPool:i,quoteMarginPool:s}){if(!e||!t||!r||!n||!i||!s)throw new Error("All parameters are required");try{let{baseBorrowedShare:o,quoteBorrowedShare:a}=await this.getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}),u=!!d(o).gt(d(a)),p=u?i:s,l=u?o:a,m=new C.Transaction;m.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_pool::borrow_shares_to_amount`,arguments:[m.object(p),m.pure.u64(BigInt(l)),m.object.clock()],typeArguments:[u?r:n]});let g=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:m});if(!g.results||!g.results[0]||!g.results[0].returnValues||!g.results[0].returnValues[0])throw new Error(`Transaction failed: ${g.effects?.status?.error||"Unknown error"}`);let b=j.bcs.U64.parse(new Uint8Array(g.results[0].returnValues[0][0]));return u?{baseBorrowedAmount:b.toString(),quoteBorrowedAmount:"0"}:{baseBorrowedAmount:"0",quoteBorrowedAmount:b.toString()}}catch(o){throw new Error(`Failed to get borrowed amount: ${o instanceof Error?o.message:String(o)}`)}}async deposit({marginManager:e,baseCoin:t,quoteCoin:r,amount:n,depositCoinType:i},s=new C.Transaction){if(!e)throw new Error("Margin manager is required");if(!t?.coinType||!r?.coinType)throw new Error("Base and quote coin types are required");if(!n||BigInt(n)<=0n)throw new Error("Valid deposit amount is required");if(!t.feed||!r.feed)throw new Error("Base and quote coin feeds are required");try{let o=Be.CoinAssist.buildCoinWithBalance(BigInt(n),i,s),a=await this.pythPrice.updatePythPriceIDs([t.feed,r.feed],s),u=a.get(t.feed),p=a.get(r.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::deposit`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?s.object(e):e,s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(u),s.object(p),o,s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType,i]}),s}catch(o){throw new Error(`Failed to deposit: ${o instanceof Error?o.message:String(o)}`)}}async withdraw({account:e,marginManager:t,baseMarginPool:r,quoteMarginPool:n,baseCoin:i,quoteCoin:s,pool:o,amount:a,withdrawCoinType:u},p=new C.Transaction){if(!e||!t||!r||!n||!o)throw new Error("All required parameters must be provided");if(!i?.coinType||!s?.coinType)throw new Error("Base and quote coin types are required");if(!a||BigInt(a)<=0n)throw new Error("Valid withdraw amount is required");if(!i.feed||!s.feed)throw new Error("Base and quote coin feeds are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],p),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");let b=p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw`,arguments:[p.object(this._sdk.sdkOptions.margin_utils.global_config_id),p.object(this._sdk.sdkOptions.margin_utils.versioned_id),p.object(t),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(r),p.object(n),p.object(m),p.object(g),p.object(o),p.pure.u64(BigInt(a)),p.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType,u]});return p.transferObjects([b],e),p}catch(l){throw new Error(`Failed to withdraw: ${l instanceof Error?l.message:String(l)}`)}}async borrowBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C.Transaction){if(!e||!t||!i)throw new Error("Margin manager, base margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_base`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow base: ${a instanceof Error?a.message:String(a)}`)}}async borrowQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C.Transaction){if(!e||!t||!i)throw new Error("Margin manager, quote margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_quote`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?o.object(e):e,o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow quote: ${a instanceof Error?a.message:String(a)}`)}}async repayBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, baseMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:r.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_base`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay base: ${a instanceof Error?a.message:String(a)}`)}}async repayQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, quoteMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:n.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_quote`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay quote: ${a instanceof Error?a.message:String(a)}`)}}async repay({marginManager:e,baseMarginPool:t,quoteMarginPool:r,baseCoin:n,quoteCoin:i,isBase:s,amount:o},a=new C.Transaction){try{let u=this.sdk.senderAddress,p,l=o;o||(p=await this.getBorrowedAmount({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType,baseMarginPool:t,quoteMarginPool:r}),l=s?p.baseBorrowedAmount:p.quoteBorrowedAmount);let m,g={marginManager:e,baseCoin:n,quoteCoin:i,depositCoinType:s?n.coinType:i.coinType};if(s){let b=await this.getBaseBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}else{let b=await this.getQuoteBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}d(m).gt(0)&&await this.deposit({...g,amount:m},a),a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::${s?"repay_base":"repay_quote"}`,arguments:[a.object(this._sdk.sdkOptions.margin_utils.global_config_id),a.object(this._sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(s?t:r),a.object.option({type:"u64",value:o?a.pure.u64(o):null}),a.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.coinType,i.coinType]})}catch{}return a}async placeMarginMarketOrder({marginManager:e,poolInfo:t,selfMatchingOption:r,quantity:n,amountLimit:i,isBid:s,payWithDeep:o,exactBase:a},u=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!n||BigInt(W(n,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order quantity is required");if(!i||BigInt(W(i,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order amount limit is required");let{id:p,baseCoin:l,quoteCoin:m}=t;if(l.decimals===void 0||m.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{return u.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_market_order`,arguments:[u.object(this.sdk.sdkOptions.margin_utils.global_config_id),u.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?u.object(e):e,u.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),u.object(p),u.pure.u8(r),u.pure.u64(n),u.pure.bool(s),u.pure.bool(o),u.pure.bool(a===void 0?!s:a),u.pure.u64(i),u.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[l.coinType,m.coinType]}),u}catch(g){throw new Error(`Failed to place market order: ${g instanceof Error?g.message:String(g)}`)}}async placeMarginLimitOrder({marginManager:e,poolInfo:t,orderType:r,selfMatchingOption:n,priceInput:i,quantity:s,isBid:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8},p=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!i||!s)throw new Error("Price and quantity are required");let{id:l,baseCoin:m,quoteCoin:g}=t;if(m.decimals===void 0||g.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{let b=BigInt(d(i).mul(10**(g.decimals-m.decimals+9)).toString()),_=BigInt(W(s,m.decimals));if(b<=0n||_<=0n)throw new Error("Price and quantity must be greater than zero");return p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_limit_order`,arguments:[p.object(this.sdk.sdkOptions.margin_utils.global_config_id),p.object(this.sdk.sdkOptions.margin_utils.versioned_id),p.object(e),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(l),p.pure.u8(r),p.pure.u8(n),p.pure.u64(b),p.pure.u64(_),p.pure.bool(o),p.pure.bool(a),p.pure.u64(u),p.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[m.coinType,g.coinType]}),p}catch(b){throw new Error(`Failed to place limit order: ${b instanceof Error?b.message:String(b)}`)}}modifyMarginOrder({marginManager:e,poolInfo:t,orderId:r,newQuantity:n},i=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All parameters (marginManager, poolInfo, orderId, newQuantity) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(t.baseCoin.decimals===void 0)throw new Error("Base coin decimals are required");try{let s=BigInt(W(n,t.baseCoin.decimals));if(s<=0n)throw new Error("New quantity must be greater than zero");return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::modify_margin_order`,arguments:[i.object(this.sdk.sdkOptions.margin_utils.global_config_id),i.object(this.sdk.sdkOptions.margin_utils.versioned_id),i.object(e),i.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),i.object(t.id),i.pure.u128(r),i.pure.u64(s),i.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),i}catch(s){throw new Error(`Failed to modify order: ${s instanceof Error?s.message:String(s)}`)}}cancelMarginOrder({marginManager:e,poolInfo:t,orderId:r},n=new C.Transaction){if(!e||!t||!r)throw new Error("All parameters (marginManager, poolInfo, orderId) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_margin_order`,arguments:[n.object(this.sdk.sdkOptions.margin_utils.global_config_id),n.object(this.sdk.sdkOptions.margin_utils.versioned_id),n.object(e),n.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),n.object(t.id),n.pure.u128(r),n.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),n}catch(i){throw new Error(`Failed to cancel order: ${i instanceof Error?i.message:String(i)}`)}}cancelAllMarginOrders({marginManager:e,poolInfo:t},r=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return r.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_all_margin_orders`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.global_config_id),r.object(this.sdk.sdkOptions.margin_utils.versioned_id),r.object(e),r.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t.id),r.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),r}catch(n){throw new Error(`Failed to cancel all orders: ${n instanceof Error?n.message:String(n)}`)}}placeReduceOnlyLimitOrder({marginManager:e,poolInfo:t,marginPoolId:r,orderType:n,selfMatchingOption:i,priceInput:s,quantity:o,isBid:a,payWithDeep:u,expirationTimestamp:p},l=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return l.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_limit_order`,arguments:[l.object(this.sdk.sdkOptions.margin_utils.global_config_id),l.object(this.sdk.sdkOptions.margin_utils.versioned_id),l.object(e),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(t.id),l.object(r),l.pure.u8(n),l.pure.u8(i),l.pure.u64(s),l.pure.u64(o),l.pure.bool(a),l.pure.bool(u),l.pure.u64(p),l.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,a?t.quoteCoin.coinType:t.baseCoin.coinType]}),l}catch(m){throw new Error(`Failed to place reduce only limit order: ${m instanceof Error?m.message:String(m)}`)}}placeReduceOnlyMarketOrder({marginManager:e,poolInfo:t,marginPoolId:r,selfMatchingOption:n,quantity:i,isBid:s,payWithDeep:o},a=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_market_order`,arguments:[a.object(this.sdk.sdkOptions.margin_utils.global_config_id),a.object(this.sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(t.id),a.object(r),a.pure.u8(n),a.pure.u64(i),a.pure.bool(s),a.pure.bool(o),a.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,s?t.quoteCoin.coinType:t.baseCoin.coinType]}),a}catch(u){throw new Error(`Failed to place reduce only market order: ${u instanceof Error?u.message:String(u)}`)}}async getAccountOpenOrders({poolInfo:e,marginManager:t}){try{let r=new C.Transaction,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(t)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getOpenOrder(e,this.sdk.senderAddress,n,void 0,!0,r)}catch(r){throw new Error(`Failed to get account open orders: ${r instanceof Error?r.message:String(r)}`)}}async getAccountAllMarketsOpenOrders(e,t){try{if(!e||!t||t.length===0)throw new Error("Account or pools are required");let r=[];for(let n=0;n<t.length;n++){let i=new C.Transaction,s=t[n];if(s.margin_manager_id){let o=await i.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[i.object(s.margin_manager_id)],typeArguments:[s.baseCoin.coinType,s.quoteCoin.coinType]}),a=await this.sdk.DeepbookUtils.getOpenOrder(s,this.sdk.senderAddress,o,void 0,!0,i);r.push(...a)}}return r}catch(r){throw new Error(`Failed to get account all markets open orders: ${r instanceof Error?r.message:String(r)}`)}}mintSupplierCap(e=new C.Transaction,t){let r=e.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::mint_supplier_cap`,arguments:[e.object(this._sdk.sdkOptions.margin_utils.versioned_id),e.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),e.object(v.SUI_CLOCK_OBJECT_ID)]});return t&&e.transferObjects([r],this.sdk.senderAddress),{tx:e,supplierCap:r}}async querySupplierCap(){try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::SupplierCapCreatedEvent`}))?.data||[]).filter(n=>n.parsedJson?.owner===this.sdk.senderAddress)[0].parsedJson.supplier_cap_id}catch(e){throw new Error(`Failed to get account supplyCap: ${e instanceof Error?e.message:String(e)}`)}}mintSupplierCapAndSupply({marginPool:e,supplyCoinType:t,amount:r}){let n=new C.Transaction,{supplierCap:i}=this.mintSupplierCap(n,!1);return this.supply({marginPool:e,supplierCap:i,supplyCoinType:t,amount:r,tx:n}),n.transferObjects([i],this.sdk.senderAddress),n}supply({marginPool:e,supplierCap:t,supplyCoinType:r,amount:n,tx:i}){let s=i??new C.Transaction;if(!t)throw new Error("Either supplierCap must be provided");let o=Be.CoinAssist.buildCoinWithBalance(BigInt(n),r,s);return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supply`,typeArguments:[r],arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),o,s.pure.option("address","0x0"),s.object(v.SUI_CLOCK_OBJECT_ID)]}),s}supplierWithdraw({marginPool:e,withdrawCoinType:t,amount:r,supplierCapId:n,hasSwap:i,withdrawAll:s,tx:o=new C.Transaction}){let a=o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supplier_withdraw`,typeArguments:[t],arguments:[o.object(this._sdk.sdkOptions.margin_utils.global_config_id),o.object(this._sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(n),o.object.option({type:"u64",value:s?null:o.pure.u64(r)}),o.object(v.SUI_CLOCK_OBJECT_ID)]});return i?a:(o.transferObjects([a],this.sdk.senderAddress),o)}withdrawReferralFees({marginPool:e}){let t=new C.Transaction,r=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw_referral_fees`,arguments:[t.object(this._sdk.sdkOptions.margin_utils.versioned_id),t.object(e),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object.option({type:"0x1",value:null}),t.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[this.deepCoin.coinType]});return t.transferObjects([r],this.sdk.senderAddress),t}async getUserSupplyAmount({marginPool:e,supplyCoin:t,supplierCapId:r}){let n=new C.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::get_user_supply_amount`,typeArguments:[t.coinType],arguments:[n.object(e),n.object(r),n.object(v.SUI_CLOCK_OBJECT_ID)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);return this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),t.scalar,t.decimals)}async getDeepBookMarginRegistry(){let t=(await this.sdk.fullClient.getObject({id:this._sdk.sdkOptions.margin_utils.margin_registry_id,options:{showContent:!0}})).data.content.fields.inner.fields.id.id,r=await this.sdk.fullClient.getDynamicFieldObject({parentId:t,name:{type:"u64",value:"1"}}),n=r.data.content.fields.value.fields.pool_registry.fields.id.id,i=r.data.content.fields.value.fields.margin_pools.fields.id.id;return{pool_registry_table_id:n,margin_pool_table_id:i}}async getDeepBookPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.pool_registry_table_id}),t=e.map(i=>i.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[];for(let i=0;i<r.length;i++){let s=r[i].data.content.fields;n.push(Se(s))}return n}async getDeepBookMarginPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.margin_pool_table_id}),t=e.map(a=>a.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[],i=[];for(let a=0;a<r.length;a++){let u=r[a].data.content.fields;i.push(u.value),n.push({deposit_coin_type:u.name.fields.name,id:u.id.id})}let s=await this.sdk.fullClient.batchGetObjects(i,{showContent:!0}),o=[];for(let a=0;a<s.length;a++){let u=s[a].data.content.fields;o.push(je(u,n[a]))}return o}async getBaseQuantityOutInput(e,t,r){let n=new C.Transaction;n.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}${r?"::pool::get_base_quantity_out":"::pool::get_base_quantity_out_input_fee"}`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[n.object(e.address),n.pure.u64(t),n.object(v.SUI_CLOCK_OBJECT_ID)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);let s=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0])),o=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0])),a=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0]));return{base_amount:s.toString(),quote_amount:o.toString(),deep_fee_amount:a.toString()}}async getQuoteQuantityOutInput(e,t){let r=new C.Transaction;r.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::get_quote_quantity_out`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[r.object(e.address),r.pure.u64(t),r.object(v.SUI_CLOCK_OBJECT_ID)]});let n=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:r});if(!n.results||!n.results[0]||!n.results[0].returnValues||!n.results[0].returnValues[0])throw new Error(`Transaction failed: ${n.effects?.status?.error||"Unknown error"}`);let i=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[0][0])),s=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[1][0])),o=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[2][0]));return{base_amount:i.toString(),quote_amount:s.toString(),deep_fee_amount:o.toString()}}async getAccount(e,t){if(!e||!t)throw new Error("marginManager and poolInfo are required");let r=new C.Transaction,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(e)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getAccount(n,[t],r)}async withdrawSettledAmounts({poolInfo:e,marginManager:t},r=new C.Transaction){return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::pool_proxy::withdraw_settled_amounts`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t),r.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}#e(e,t,r){if(t<=0||r<0)throw new Error("Scalar must be positive and decimals must be non-negative");let n=BigInt(t),i=e/n,s=e%n;if(s===0n)return i.toString();let o=t.toString().length-1,p=s.toString().padStart(o,"0").slice(0,r).replace(/0+$/,"");return p?`${i}.${p}`:i.toString()}async getMarginPoolStateForInterest(e){if(!e)throw new Error("marginPoolId is required");let t=await this.sdk.fullClient.getObject({id:e,options:{showContent:!0}});if(!t.data?.content?.fields)throw new Error(`Failed to fetch margin pool: ${e}`);let r=t.data.content.fields,n=r.state.fields,i=r.config.fields,s=i.interest_config.fields,o=i.margin_pool_config.fields;return{poolState:{total_supply:BigInt(n.total_supply),total_borrow:BigInt(n.total_borrow),supply_shares:BigInt(n.supply_shares),borrow_shares:BigInt(n.borrow_shares),last_update_timestamp:BigInt(n.last_update_timestamp)},interestConfig:{base_rate:BigInt(s.base_rate),base_slope:BigInt(s.base_slope),optimal_utilization:BigInt(s.optimal_utilization),excess_slope:BigInt(s.excess_slope)},marginPoolConfig:{protocol_spread:BigInt(o.protocol_spread),max_utilization_rate:BigInt(o.max_utilization_rate),min_borrow:BigInt(o.min_borrow),supply_cap:BigInt(o.supply_cap)}}}async getChainTimestamp(){let e=await this.sdk.fullClient.getLatestCheckpointSequenceNumber(),t=await this.sdk.fullClient.getCheckpoint({id:e});return BigInt(t.timestampMs)}};var Je=require("@mysten/sui/client"),te=class extends Je.SuiClient{async queryEventsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.queryEvents({query:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async getOwnedObjectsByPage(e,t,r="all"){let n=[],i=!0,s=r==="all",o=s?null:r.cursor;do{let a=await this.getOwnedObjects({owner:e,...t,cursor:o,limit:s?null:r.limit});a.data?(n=[...n,...a.data],i=a.hasNextPage,o=a.nextCursor):i=!1}while(s&&i);return{data:n,nextCursor:o,hasNextPage:i}}async getDynamicFieldsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.getDynamicFields({parentId:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async batchGetObjects(e,t,r=50){let n=[];try{for(let i=0;i<Math.ceil(e.length/r);i++){let s=await this.multiGetObjects({ids:e.slice(i*r,r*(i+1)),options:t});n=[...n,...s]}}catch{}return n}async calculationTxGas(e){let{sender:t}=e.blockData;if(t===void 0)throw Error("sdk sender is empty");let r=await this.devInspectTransactionBlock({transactionBlock:e,sender:t}),{gasUsed:n}=r.effects;return Number(n.computationCost)+Number(n.storageCost)-Number(n.storageRebate)}async sendTransaction(e,t){try{return await this.signAndExecuteTransaction({transaction:t,signer:e,options:{showEffects:!0,showEvents:!0}})}catch{}}};var ve=qe(require("decimal.js"));ve.default.config({precision:64,rounding:ve.default.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var $=1000000000n,Ye=365n*24n*60n*60n*1000n;function Xe(c,e){return e===0n?0n:c*$/e}function et(c,e){let{base_rate:t,base_slope:r,optimal_utilization:n,excess_slope:i}=e;if(c<n)return t+c*r/$;{let s=c-n,o=n*r/$,a=s*i/$;return t+o+a}}function Me(c,e){let t=c*e,r=t/$;return t%$>0n?r+1n:r}function tt(c,e,t,r){let n=e.borrow_shares===0n?$:e.total_borrow*$/e.borrow_shares,i=Me(c,n),s=Xe(e.total_borrow,e.total_supply),o=et(s,t),a=r-e.last_update_timestamp,u=e.total_borrow*o/$*a/Ye,p=e.borrow_shares===0n?0n:Me(u,c*$/e.borrow_shares),l=i+p;return{confirmedDebt:i,estimatedInterest:p,totalDebt:l,annualInterestRate:o}}function er(c,e,t,r,n=60000n){let i=r+n,{totalDebt:s}=tt(c,e,t,i);return s}var re=class{_cache={};_rpcModule;_deepbookUtils;_marginUtils;_pythPrice;_graphqlClient;_sdkOptions;_senderAddress="";constructor(e){this._sdkOptions=e,this._rpcModule=new te({url:e.fullRpcUrl}),this._deepbookUtils=new X(this),this._marginUtils=new ee(this),this._pythPrice=new Z(this),this._graphqlClient=new rt.SuiGraphQLClient({url:e.graphqlUrl}),oe(this._sdkOptions)}get senderAddress(){return this._senderAddress}set senderAddress(e){this._senderAddress=e}get DeepbookUtils(){return this._deepbookUtils}get MarginUtils(){return this._marginUtils}get PythPrice(){return this._pythPrice}get fullClient(){return this._rpcModule}get graphqlClient(){return this._graphqlClient}get sdkOptions(){return this._sdkOptions}async getOwnerCoinAssets(e,t,r=!0){let n=[],i=null,s=`${this.sdkOptions.fullRpcUrl}_${e}_${t}_getOwnerCoinAssets`,o=this.getCache(s,r);if(o)return o;for(;;){let a=await(t?this.fullClient.getCoins({owner:e,coinType:t,cursor:i}):this.fullClient.getAllCoins({owner:e,cursor:i}));if(a.data.forEach(u=>{BigInt(u.balance)>0&&n.push({coinAddress:R(u.coinType).source_address,coinObjectId:u.coinObjectId,balance:BigInt(u.balance)})}),i=a.nextCursor,!a.hasNextPage)break}return this.updateCache(s,n,30*1e3),n}async getOwnerCoinBalances(e,t){let r=[];return t?r=[await this.fullClient.getBalance({owner:e,coinType:t})]:r=[...await this.fullClient.getAllBalances({owner:e})],r}updateCache(e,t,r=864e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}};var tr="0x0000000000000000000000000000000000000000000000000000000000000006",rr="pool_script",nr="pool_script_v2",sr="router",ir="router_with_partner",or="fetcher_script",ar="expect_swap",cr="utils",ur="0x1::coin::CoinInfo",dr="0x1::coin::CoinStore",lr="custodian_v2",pr="clob_v2",gr="endpoints_v2",mr=c=>{if(typeof c=="string"&&c.startsWith("0x"))return"object";if(typeof c=="number"||typeof c=="bigint")return"u64";if(typeof c=="boolean")return"bool";throw new Error(`Unknown type for value: ${c}`)};var nt=(n=>(n[n.NO_RESTRICTION=0]="NO_RESTRICTION",n[n.IMMEDIATE_OR_CANCEL=1]="IMMEDIATE_OR_CANCEL",n[n.FILL_OR_KILL=2]="FILL_OR_KILL",n[n.POST_ONLY=3]="POST_ONLY",n))(nt||{}),st=(r=>(r[r.SELF_MATCHING_ALLOWED=0]="SELF_MATCHING_ALLOWED",r[r.CANCEL_TAKER=1]="CANCEL_TAKER",r[r.CANCEL_MAKER=2]="CANCEL_MAKER",r))(st||{});var br=re;0&&(module.exports={CLOCK_ADDRESS,CachedContent,CetusClmmSDK,ClmmExpectSwapModule,ClmmFetcherModule,ClmmIntegratePoolModule,ClmmIntegratePoolV2Module,ClmmIntegrateRouterModule,ClmmIntegrateRouterWithPartnerModule,ClmmIntegrateUtilsModule,CoinAssist,CoinInfoAddress,CoinStoreAddress,DEEP_SCALAR,DEFAULT_GAS_BUDGET_FOR_MERGE,DEFAULT_GAS_BUDGET_FOR_SPLIT,DEFAULT_GAS_BUDGET_FOR_STAKE,DEFAULT_GAS_BUDGET_FOR_TRANSFER,DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI,DEFAULT_NFT_TRANSFER_GAS_FEE,DeepbookClobV2Moudle,DeepbookCustodianV2Moudle,DeepbookEndpointsV2Moudle,DeepbookUtilsModule,FLOAT_SCALAR,FLOAT_SCALING,GAS_SYMBOL,GAS_TYPE_ARG,GAS_TYPE_ARG_LONG,MarginUtilsModule,NORMALIZED_SUI_COIN_TYPE,OrderType,RpcModule,SUI_SYSTEM_STATE_OBJECT_ID,SelfMatchingOption,TransactionUtil,YEAR_MS,addHexPrefix,asIntN,asUintN,bufferToHex,cacheTime1min,cacheTime24h,cacheTime5min,calc100PercentRepay,calcDebtDetail,calcInterestRate,calcUtilizationRate,calculateRiskRatio,checkAddress,composeType,d,decimalsMultiplier,extractAddressFromType,extractStructTagFromType,fixCoinType,fixDown,fixSuiObjectId,fromDecimalsAmount,getDefaultSuiInputType,getFutureTime,getMoveObject,getMoveObjectType,getMovePackageContent,getObjectDeletedResponse,getObjectDisplay,getObjectFields,getObjectId,getObjectNotExistsResponse,getObjectOwner,getObjectPreviousTransactionDigest,getObjectReference,getObjectType,getObjectVersion,getSuiObjectData,hasPublicTransfer,hexToNumber,hexToString,isSortedSymbols,isSuiObjectResponse,maxDecimal,mulRoundUp,normalizeCoinType,patchFixSuiObjectId,printTransaction,removeHexPrefix,secretKeyToEd25519Keypair,secretKeyToSecp256k1Keypair,shortAddress,shortString,sleepTime,toBuffer,toDecimalsAmount,utf8to16,wrapDeepBookMarginPoolInfo,wrapDeepBookPoolInfo});
|
|
15
|
+
`,r={filter:{sender:e,type:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::BalanceManagerEvent`}};try{let n=await this.sdk.graphqlClient.query({query:t,variables:r});return n?.data?.events?.nodes?n.data.events.nodes.map(s=>s?.contents?.json):[]}catch(n){throw new Error(`Failed to query balance managers: ${n instanceof Error?n.message:String(n)}`)}}async getMarginManagerByAccount(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::CreateMarginManagerEvent`}))?.data||[]).filter(i=>i.parsedJson?.owner===e).map(i=>i?.parsedJson)}catch(t){throw new Error(`Failed to get margin managers by account: ${t instanceof Error?t.message:String(t)}`)}}async getBaseBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getQuoteBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get quote balance: ${s instanceof Error?s.message:String(s)}`)}}async getDeepBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getPoolMarginManagerBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManagers, baseCoinType, quoteCoinType) are required");let i=new C.Transaction,s=r===this.deepCoin.coinType,o=n===this.deepCoin.coinType,a=s||o;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]}),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]}),a||i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let u=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!u.results||!u.results[0]||!u.results[0].returnValues||!u.results[0].returnValues[0])throw new Error(`Transaction failed: ${u.effects?.status?.error||"Unknown error"}`);let p=j.bcs.U64.parse(new Uint8Array(u.results[0].returnValues[0][0])),l=j.bcs.U64.parse(new Uint8Array(u.results[1].returnValues[0][0])),m=a?s?p:l:j.bcs.U64.parse(new Uint8Array(u.results[2].returnValues[0][0]));return{[r]:p.toString(),[n]:l.toString(),[this.deepCoin.coinType]:m.toString()}}catch(u){throw new Error(`Failed to getPoolMarginManagerBalance: ${u instanceof Error?u.message:String(u)}`)}}async getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C.Transaction;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::borrowed_shares`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||s.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);let o=j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])),a=j.bcs.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]));return{baseBorrowedShare:o,quoteBorrowedShare:a}}catch(s){throw new Error(`Failed to get borrowed shares: ${s instanceof Error?s.message:String(s)}`)}}managerState=({account:e,marginManager:t,baseCoin:r,quoteCoin:n,pool:i,baseMarginPool:s,quoteMarginPool:o,decimals:a=6,basePriceFeedObjectId:u,quotePriceFeedObjectId:p})=>l=>{l.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::manager_state`,arguments:[l.object(t),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(u),l.object(p),l.object(i),l.object(s),l.object(o),l.object.clock()],typeArguments:[r.coinType,n.coinType]})};async getManagerState(e,t=new C.Transaction){let{account:r,marginManager:n,baseCoin:i,quoteCoin:s,pool:o,baseMarginPool:a,quoteMarginPool:u,decimals:p=6}=e;if(!r||!n||!o||!a||!u)throw new Error("All required parameters must be provided");if(!i?.feed||!s?.feed)throw new Error("Base and quote coin feeds are required");if(!i.scalar||!s.scalar)throw new Error("Base and quote coin scalars are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],t),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");t.add(this.managerState({...e,basePriceFeedObjectId:m,quotePriceFeedObjectId:g}));let b=await this.sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:t});if(!b.results||!b.results[0]||!b.results[0].returnValues||b.results[0].returnValues.length<14)throw new Error(`Failed to get margin manager state: ${b.effects?.status?.error||"Unknown error"}`);let _=(0,v.normalizeSuiAddress)(j.bcs.Address.parse(new Uint8Array(b.results[0].returnValues[0][0]))),O=(0,v.normalizeSuiAddress)(j.bcs.Address.parse(new Uint8Array(b.results[0].returnValues[1][0]))),f=Number(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[2][0])))/1e9,w=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[3][0]))),i.scalar,p),y=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[4][0]))),s.scalar,p),A=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[5][0]))),i.scalar,p),E=this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[6][0]))),s.scalar,p),k=j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[7][0])),M=Number(j.bcs.u8().parse(new Uint8Array(b.results[0].returnValues[8][0]))),P=j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[9][0])),D=Number(j.bcs.u8().parse(new Uint8Array(b.results[0].returnValues[10][0]))),q=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[11][0]))),I=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[12][0]))),ne=BigInt(j.bcs.U64.parse(new Uint8Array(b.results[0].returnValues[13][0])));return{managerId:_,deepbookPoolId:O,riskRatio:f,baseAsset:w,quoteAsset:y,baseDebt:A,quoteDebt:E,basePythPrice:k.toString(),basePythDecimals:M,quotePythPrice:P.toString(),quotePythDecimals:D,currentPrice:q,lowestTriggerAbovePrice:I,highestTriggerBelowPrice:ne}}catch(l){throw new Error(`Failed to get manager state: ${l instanceof Error?l.message:String(l)}`)}}async calculateAssets({account:e,marginManager:t,pool:r,baseCoin:n,quoteCoin:i,tx:s=new C.Transaction}){if(!e||!t||!r)throw new Error("Account, marginManager, and pool are required");if(!n?.coinType||!i?.coinType)throw new Error("Base and quote coin types are required");try{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::calculate_assets`,arguments:[s.object(t),s.object(r)],typeArguments:[n.coinType,i.coinType]});let o=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:s});if(!o.results||!o.results[0]||!o.results[0].returnValues||o.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${o.effects?.status?.error||"Unknown error"}`);let a=o.results[0].returnValues[0][0],u=o.results[0].returnValues[1][0];if(!n.scalar||!i.scalar)throw new Error("Base and quote coin scalars are required");let p=j.bcs.U64.parse(new Uint8Array(a)),l=j.bcs.U64.parse(new Uint8Array(u));return{baseAsset:p.toString(),quoteAsset:l.toString(),tx:s}}catch(o){throw new Error(`Failed to calculate assets: ${o instanceof Error?o.message:String(o)}`)}}async getBorrowedAmount({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n,baseMarginPool:i,quoteMarginPool:s}){if(!e||!t||!r||!n||!i||!s)throw new Error("All parameters are required");try{let{baseBorrowedShare:o,quoteBorrowedShare:a}=await this.getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}),u=!!d(o).gt(d(a)),p=u?i:s,l=u?o:a,m=new C.Transaction;m.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_pool::borrow_shares_to_amount`,arguments:[m.object(p),m.pure.u64(BigInt(l)),m.object.clock()],typeArguments:[u?r:n]});let g=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:m});if(!g.results||!g.results[0]||!g.results[0].returnValues||!g.results[0].returnValues[0])throw new Error(`Transaction failed: ${g.effects?.status?.error||"Unknown error"}`);let b=j.bcs.U64.parse(new Uint8Array(g.results[0].returnValues[0][0]));return u?{baseBorrowedAmount:b.toString(),quoteBorrowedAmount:"0"}:{baseBorrowedAmount:"0",quoteBorrowedAmount:b.toString()}}catch(o){throw new Error(`Failed to get borrowed amount: ${o instanceof Error?o.message:String(o)}`)}}async deposit({marginManager:e,baseCoin:t,quoteCoin:r,amount:n,depositCoinType:i},s=new C.Transaction){if(!e)throw new Error("Margin manager is required");if(!t?.coinType||!r?.coinType)throw new Error("Base and quote coin types are required");if(!n||BigInt(n)<=0n)throw new Error("Valid deposit amount is required");if(!t.feed||!r.feed)throw new Error("Base and quote coin feeds are required");try{let o=Be.CoinAssist.buildCoinWithBalance(BigInt(n),i,s),a=await this.pythPrice.updatePythPriceIDs([t.feed,r.feed],s),u=a.get(t.feed),p=a.get(r.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::deposit`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?s.object(e):e,s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(u),s.object(p),o,s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.coinType,r.coinType,i]}),s}catch(o){throw new Error(`Failed to deposit: ${o instanceof Error?o.message:String(o)}`)}}async withdraw({account:e,marginManager:t,baseMarginPool:r,quoteMarginPool:n,baseCoin:i,quoteCoin:s,pool:o,amount:a,withdrawCoinType:u},p=new C.Transaction){if(!e||!t||!r||!n||!o)throw new Error("All required parameters must be provided");if(!i?.coinType||!s?.coinType)throw new Error("Base and quote coin types are required");if(!a||BigInt(a)<=0n)throw new Error("Valid withdraw amount is required");if(!i.feed||!s.feed)throw new Error("Base and quote coin feeds are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],p),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");let b=p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw`,arguments:[p.object(this._sdk.sdkOptions.margin_utils.global_config_id),p.object(this._sdk.sdkOptions.margin_utils.versioned_id),p.object(t),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(r),p.object(n),p.object(m),p.object(g),p.object(o),p.pure.u64(BigInt(a)),p.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[i.coinType,s.coinType,u]});return p.transferObjects([b],e),p}catch(l){throw new Error(`Failed to withdraw: ${l instanceof Error?l.message:String(l)}`)}}async borrowBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C.Transaction){if(!e||!t||!i)throw new Error("Margin manager, base margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_base`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow base: ${a instanceof Error?a.message:String(a)}`)}}async borrowQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C.Transaction){if(!e||!t||!i)throw new Error("Margin manager, quote margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_quote`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?o.object(e):e,o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow quote: ${a instanceof Error?a.message:String(a)}`)}}async repayBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, baseMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:r.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_base`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay base: ${a instanceof Error?a.message:String(a)}`)}}async repayQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, quoteMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:n.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_quote`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay quote: ${a instanceof Error?a.message:String(a)}`)}}async repay({marginManager:e,baseMarginPool:t,quoteMarginPool:r,baseCoin:n,quoteCoin:i,isBase:s,amount:o},a=new C.Transaction){try{let u=this.sdk.senderAddress,p,l=o;o||(p=await this.getBorrowedAmount({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType,baseMarginPool:t,quoteMarginPool:r}),l=s?p.baseBorrowedAmount:p.quoteBorrowedAmount);let m,g={marginManager:e,baseCoin:n,quoteCoin:i,depositCoinType:s?n.coinType:i.coinType};if(s){let b=await this.getBaseBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}else{let b=await this.getQuoteBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}d(m).gt(0)&&await this.deposit({...g,amount:m},a),a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::${s?"repay_base":"repay_quote"}`,arguments:[a.object(this._sdk.sdkOptions.margin_utils.global_config_id),a.object(this._sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(s?t:r),a.object.option({type:"u64",value:o?a.pure.u64(o):null}),a.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[n.coinType,i.coinType]})}catch{}return a}async placeMarginMarketOrder({marginManager:e,poolInfo:t,selfMatchingOption:r,quantity:n,amountLimit:i,isBid:s,payWithDeep:o,exactBase:a},u=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!n||BigInt(W(n,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order quantity is required");if(!i||BigInt(W(i,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order amount limit is required");let{id:p,baseCoin:l,quoteCoin:m}=t;if(l.decimals===void 0||m.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{return u.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_market_order`,arguments:[u.object(this.sdk.sdkOptions.margin_utils.global_config_id),u.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?u.object(e):e,u.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),u.object(p),u.pure.u8(r),u.pure.u64(n),u.pure.bool(s),u.pure.bool(o),u.pure.bool(a===void 0?!s:a),u.pure.u64(i),u.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[l.coinType,m.coinType]}),u}catch(g){throw new Error(`Failed to place market order: ${g instanceof Error?g.message:String(g)}`)}}async placeMarginLimitOrder({marginManager:e,poolInfo:t,orderType:r,selfMatchingOption:n,priceInput:i,quantity:s,isBid:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8},p=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!i||!s)throw new Error("Price and quantity are required");let{id:l,baseCoin:m,quoteCoin:g}=t;if(m.decimals===void 0||g.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{let b=BigInt(d(i).mul(10**(g.decimals-m.decimals+9)).toString()),_=BigInt(W(s,m.decimals));if(b<=0n||_<=0n)throw new Error("Price and quantity must be greater than zero");return p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_limit_order`,arguments:[p.object(this.sdk.sdkOptions.margin_utils.global_config_id),p.object(this.sdk.sdkOptions.margin_utils.versioned_id),p.object(e),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(l),p.pure.u8(r),p.pure.u8(n),p.pure.u64(b),p.pure.u64(_),p.pure.bool(o),p.pure.bool(a),p.pure.u64(u),p.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[m.coinType,g.coinType]}),p}catch(b){throw new Error(`Failed to place limit order: ${b instanceof Error?b.message:String(b)}`)}}modifyMarginOrder({marginManager:e,poolInfo:t,orderId:r,newQuantity:n},i=new C.Transaction){if(!e||!t||!r||!n)throw new Error("All parameters (marginManager, poolInfo, orderId, newQuantity) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(t.baseCoin.decimals===void 0)throw new Error("Base coin decimals are required");try{let s=BigInt(W(n,t.baseCoin.decimals));if(s<=0n)throw new Error("New quantity must be greater than zero");return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::modify_margin_order`,arguments:[i.object(this.sdk.sdkOptions.margin_utils.global_config_id),i.object(this.sdk.sdkOptions.margin_utils.versioned_id),i.object(e),i.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),i.object(t.id),i.pure.u128(r),i.pure.u64(s),i.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),i}catch(s){throw new Error(`Failed to modify order: ${s instanceof Error?s.message:String(s)}`)}}cancelMarginOrder({marginManager:e,poolInfo:t,orderId:r},n=new C.Transaction){if(!e||!t||!r)throw new Error("All parameters (marginManager, poolInfo, orderId) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_margin_order`,arguments:[n.object(this.sdk.sdkOptions.margin_utils.global_config_id),n.object(this.sdk.sdkOptions.margin_utils.versioned_id),n.object(e),n.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),n.object(t.id),n.pure.u128(r),n.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),n}catch(i){throw new Error(`Failed to cancel order: ${i instanceof Error?i.message:String(i)}`)}}cancelAllMarginOrders({marginManager:e,poolInfo:t},r=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return r.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_all_margin_orders`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.global_config_id),r.object(this.sdk.sdkOptions.margin_utils.versioned_id),r.object(e),r.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t.id),r.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),r}catch(n){throw new Error(`Failed to cancel all orders: ${n instanceof Error?n.message:String(n)}`)}}placeReduceOnlyLimitOrder({marginManager:e,poolInfo:t,marginPoolId:r,orderType:n,selfMatchingOption:i,priceInput:s,quantity:o,isBid:a,payWithDeep:u,expirationTimestamp:p},l=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return l.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_limit_order`,arguments:[l.object(this.sdk.sdkOptions.margin_utils.global_config_id),l.object(this.sdk.sdkOptions.margin_utils.versioned_id),l.object(e),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(t.id),l.object(r),l.pure.u8(n),l.pure.u8(i),l.pure.u64(s),l.pure.u64(o),l.pure.bool(a),l.pure.bool(u),l.pure.u64(p),l.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,a?t.quoteCoin.coinType:t.baseCoin.coinType]}),l}catch(m){throw new Error(`Failed to place reduce only limit order: ${m instanceof Error?m.message:String(m)}`)}}placeReduceOnlyMarketOrder({marginManager:e,poolInfo:t,marginPoolId:r,selfMatchingOption:n,quantity:i,isBid:s,payWithDeep:o},a=new C.Transaction){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_market_order`,arguments:[a.object(this.sdk.sdkOptions.margin_utils.global_config_id),a.object(this.sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(t.id),a.object(r),a.pure.u8(n),a.pure.u64(i),a.pure.bool(s),a.pure.bool(o),a.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,s?t.quoteCoin.coinType:t.baseCoin.coinType]}),a}catch(u){throw new Error(`Failed to place reduce only market order: ${u instanceof Error?u.message:String(u)}`)}}async getAccountOpenOrders({poolInfo:e,marginManager:t}){try{let r=new C.Transaction,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(t)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getOpenOrder(e,this.sdk.senderAddress,n,void 0,!0,r)}catch(r){throw new Error(`Failed to get account open orders: ${r instanceof Error?r.message:String(r)}`)}}async getAccountAllMarketsOpenOrders(e,t){try{if(!e||!t||t.length===0)throw new Error("Account or pools are required");let r=[];for(let n=0;n<t.length;n++){let i=new C.Transaction,s=t[n];if(s.margin_manager_id){let o=await i.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[i.object(s.margin_manager_id)],typeArguments:[s.baseCoin.coinType,s.quoteCoin.coinType]}),a=await this.sdk.DeepbookUtils.getOpenOrder(s,this.sdk.senderAddress,o,void 0,!0,i);r.push(...a)}}return r}catch(r){throw new Error(`Failed to get account all markets open orders: ${r instanceof Error?r.message:String(r)}`)}}mintSupplierCap(e=new C.Transaction,t){let r=e.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::mint_supplier_cap`,arguments:[e.object(this._sdk.sdkOptions.margin_utils.versioned_id),e.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),e.object(v.SUI_CLOCK_OBJECT_ID)]});return t&&e.transferObjects([r],this.sdk.senderAddress),{tx:e,supplierCap:r}}async querySupplierCap(){try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::SupplierCapCreatedEvent`}))?.data||[]).filter(n=>n.parsedJson?.owner===this.sdk.senderAddress)[0].parsedJson.supplier_cap_id}catch(e){throw new Error(`Failed to get account supplyCap: ${e instanceof Error?e.message:String(e)}`)}}mintSupplierCapAndSupply({marginPool:e,supplyCoinType:t,amount:r}){let n=new C.Transaction,{supplierCap:i}=this.mintSupplierCap(n,!1);return this.supply({marginPool:e,supplierCap:i,supplyCoinType:t,amount:r,tx:n}),n.transferObjects([i],this.sdk.senderAddress),n}supply({marginPool:e,supplierCap:t,supplyCoinType:r,amount:n,tx:i}){let s=i??new C.Transaction;if(!t)throw new Error("Either supplierCap must be provided");let o=Be.CoinAssist.buildCoinWithBalance(BigInt(n),r,s);return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supply`,typeArguments:[r],arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),o,s.pure.option("address","0x0"),s.object(v.SUI_CLOCK_OBJECT_ID)]}),s}supplierWithdraw({marginPool:e,withdrawCoinType:t,amount:r,supplierCapId:n,hasSwap:i,withdrawAll:s,tx:o=new C.Transaction}){let a=o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supplier_withdraw`,typeArguments:[t],arguments:[o.object(this._sdk.sdkOptions.margin_utils.global_config_id),o.object(this._sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(n),o.object.option({type:"u64",value:s?null:o.pure.u64(r)}),o.object(v.SUI_CLOCK_OBJECT_ID)]});return i?a:(o.transferObjects([a],this.sdk.senderAddress),o)}withdrawReferralFees({marginPool:e}){let t=new C.Transaction,r=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw_referral_fees`,arguments:[t.object(this._sdk.sdkOptions.margin_utils.versioned_id),t.object(e),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object.option({type:"0x1",value:null}),t.object(v.SUI_CLOCK_OBJECT_ID)],typeArguments:[this.deepCoin.coinType]});return t.transferObjects([r],this.sdk.senderAddress),t}async getUserSupplyAmount({marginPool:e,supplyCoin:t,supplierCapId:r}){let n=new C.Transaction;n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::get_user_supply_amount`,typeArguments:[t.coinType],arguments:[n.object(e),n.object(r),n.object(v.SUI_CLOCK_OBJECT_ID)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);return this.#e(BigInt(j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),t.scalar,t.decimals)}async getDeepBookMarginRegistry(){let t=(await this.sdk.fullClient.getObject({id:this._sdk.sdkOptions.margin_utils.margin_registry_id,options:{showContent:!0}})).data.content.fields.inner.fields.id.id,r=await this.sdk.fullClient.getDynamicFieldObject({parentId:t,name:{type:"u64",value:"1"}}),n=r.data.content.fields.value.fields.pool_registry.fields.id.id,i=r.data.content.fields.value.fields.margin_pools.fields.id.id;return{pool_registry_table_id:n,margin_pool_table_id:i}}async getDeepBookPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.pool_registry_table_id}),t=e.map(i=>i.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[];for(let i=0;i<r.length;i++){let s=r[i].data.content.fields;n.push(Se(s))}return n}async getDeepBookMarginPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.margin_pool_table_id}),t=e.map(a=>a.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[],i=[];for(let a=0;a<r.length;a++){let u=r[a].data.content.fields;i.push(u.value),n.push({deposit_coin_type:u.name.fields.name,id:u.id.id})}let s=await this.sdk.fullClient.batchGetObjects(i,{showContent:!0}),o=[];for(let a=0;a<s.length;a++){let u=s[a].data.content.fields;o.push(je(u,n[a]))}return o}async getBaseQuantityOutInput(e,t,r){let n=new C.Transaction;n.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}${r?"::pool::get_base_quantity_out":"::pool::get_base_quantity_out_input_fee"}`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[n.object(e.address),n.pure.u64(t),n.object(v.SUI_CLOCK_OBJECT_ID)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);let s=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[0][0])),o=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[1][0])),a=j.bcs.U64.parse(new Uint8Array(i.results[0].returnValues[2][0]));return{base_amount:s.toString(),quote_amount:o.toString(),deep_fee_amount:a.toString()}}async getQuoteQuantityOutInput(e,t){let r=new C.Transaction;r.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::get_quote_quantity_out`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[r.object(e.address),r.pure.u64(t),r.object(v.SUI_CLOCK_OBJECT_ID)]});let n=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:r});if(!n.results||!n.results[0]||!n.results[0].returnValues||!n.results[0].returnValues[0])throw new Error(`Transaction failed: ${n.effects?.status?.error||"Unknown error"}`);let i=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[0][0])),s=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[1][0])),o=j.bcs.U64.parse(new Uint8Array(n.results[0].returnValues[2][0]));return{base_amount:i.toString(),quote_amount:s.toString(),deep_fee_amount:o.toString()}}async getAccount(e,t){if(!e||!t)throw new Error("marginManager and poolInfo are required");let r=new C.Transaction,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(e)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getAccount(n,[t],r)}async withdrawSettledAmounts({poolInfo:e,marginManager:t},r=new C.Transaction){return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::pool_proxy::withdraw_settled_amounts`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t),r.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}#e(e,t,r){if(t<=0||r<0)throw new Error("Scalar must be positive and decimals must be non-negative");let n=BigInt(t),i=e/n,s=e%n;if(s===0n)return i.toString();let o=t.toString().length-1,p=s.toString().padStart(o,"0").slice(0,r).replace(/0+$/,"");return p?`${i}.${p}`:i.toString()}async getMarginPoolStateForInterest(e){if(!e)throw new Error("marginPoolId is required");let t=await this.sdk.fullClient.getObject({id:e,options:{showContent:!0}});if(!t.data?.content?.fields)throw new Error(`Failed to fetch margin pool: ${e}`);let r=t.data.content.fields,n=r.state.fields,i=r.config.fields,s=i.interest_config.fields,o=i.margin_pool_config.fields;return{poolState:{total_supply:BigInt(n.total_supply),total_borrow:BigInt(n.total_borrow),supply_shares:BigInt(n.supply_shares),borrow_shares:BigInt(n.borrow_shares),last_update_timestamp:BigInt(n.last_update_timestamp)},interestConfig:{base_rate:BigInt(s.base_rate),base_slope:BigInt(s.base_slope),optimal_utilization:BigInt(s.optimal_utilization),excess_slope:BigInt(s.excess_slope)},marginPoolConfig:{protocol_spread:BigInt(o.protocol_spread),max_utilization_rate:BigInt(o.max_utilization_rate),min_borrow:BigInt(o.min_borrow),supply_cap:BigInt(o.supply_cap)}}}async getChainTimestamp(){let e=await this.sdk.fullClient.getLatestCheckpointSequenceNumber(),t=await this.sdk.fullClient.getCheckpoint({id:e});return BigInt(t.timestampMs)}};var Je=require("@mysten/sui/client"),te=class extends Je.SuiClient{async queryEventsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.queryEvents({query:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async getOwnedObjectsByPage(e,t,r="all"){let n=[],i=!0,s=r==="all",o=s?null:r.cursor;do{let a=await this.getOwnedObjects({owner:e,...t,cursor:o,limit:s?null:r.limit});a.data?(n=[...n,...a.data],i=a.hasNextPage,o=a.nextCursor):i=!1}while(s&&i);return{data:n,nextCursor:o,hasNextPage:i}}async getDynamicFieldsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.getDynamicFields({parentId:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async batchGetObjects(e,t,r=50){let n=[];try{for(let i=0;i<Math.ceil(e.length/r);i++){let s=await this.multiGetObjects({ids:e.slice(i*r,r*(i+1)),options:t});n=[...n,...s]}}catch{}return n}async calculationTxGas(e){let{sender:t}=e.blockData;if(t===void 0)throw Error("sdk sender is empty");let r=await this.devInspectTransactionBlock({transactionBlock:e,sender:t}),{gasUsed:n}=r.effects;return Number(n.computationCost)+Number(n.storageCost)-Number(n.storageRebate)}async sendTransaction(e,t){try{return await this.signAndExecuteTransaction({transaction:t,signer:e,options:{showEffects:!0,showEvents:!0}})}catch{}}};var ve=qe(require("decimal.js"));ve.default.config({precision:64,rounding:ve.default.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var $=1000000000n,Ye=365n*24n*60n*60n*1000n;function Xe(c,e){return e===0n?0n:c*$/e}function et(c,e){let{base_rate:t,base_slope:r,optimal_utilization:n,excess_slope:i}=e;if(c<n)return t+c*r/$;{let s=c-n,o=n*r/$,a=s*i/$;return t+o+a}}function Me(c,e){let t=c*e,r=t/$;return t%$>0n?r+1n:r}function tt(c,e,t,r){let n=e.borrow_shares===0n?$:e.total_borrow*$/e.borrow_shares,i=Me(c,n),s=Xe(e.total_borrow,e.total_supply),o=et(s,t),a=r-e.last_update_timestamp,u=e.total_borrow*o/$*a/Ye,p=e.borrow_shares===0n?0n:Me(u,c*$/e.borrow_shares),l=i+p;return{confirmedDebt:i,estimatedInterest:p,totalDebt:l,annualInterestRate:o}}function er(c,e,t,r,n=60000n){let i=r+n,{totalDebt:s}=tt(c,e,t,i);return s}var re=class{_cache={};_rpcModule;_deepbookUtils;_marginUtils;_pythPrice;_graphqlClient;_sdkOptions;_senderAddress="";constructor(e){this._sdkOptions=e,this._rpcModule=new te({url:e.fullRpcUrl}),this._deepbookUtils=new X(this),this._marginUtils=new ee(this),this._pythPrice=new Z(this),this._graphqlClient=new rt.SuiGraphQLClient({url:e.graphqlUrl}),oe(this._sdkOptions)}get senderAddress(){return this._senderAddress}set senderAddress(e){this._senderAddress=e}get DeepbookUtils(){return this._deepbookUtils}get MarginUtils(){return this._marginUtils}get PythPrice(){return this._pythPrice}get fullClient(){return this._rpcModule}get graphqlClient(){return this._graphqlClient}get sdkOptions(){return this._sdkOptions}async getOwnerCoinAssets(e,t,r=!0){let n=[],i=null,s=`${this.sdkOptions.fullRpcUrl}_${e}_${t}_getOwnerCoinAssets`,o=this.getCache(s,r);if(o)return o;for(;;){let a=await(t?this.fullClient.getCoins({owner:e,coinType:t,cursor:i}):this.fullClient.getAllCoins({owner:e,cursor:i}));if(a.data.forEach(u=>{BigInt(u.balance)>0&&n.push({coinAddress:R(u.coinType).source_address,coinObjectId:u.coinObjectId,balance:BigInt(u.balance)})}),i=a.nextCursor,!a.hasNextPage)break}return this.updateCache(s,n,30*1e3),n}async getOwnerCoinBalances(e,t){let r=[];return t?r=[await this.fullClient.getBalance({owner:e,coinType:t})]:r=[...await this.fullClient.getAllBalances({owner:e})],r}updateCache(e,t,r=864e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}};var tr="0x0000000000000000000000000000000000000000000000000000000000000006",rr="pool_script",nr="pool_script_v2",sr="router",ir="router_with_partner",or="fetcher_script",ar="expect_swap",cr="utils",ur="0x1::coin::CoinInfo",lr="0x1::coin::CoinStore",dr="custodian_v2",pr="clob_v2",gr="endpoints_v2",mr=c=>{if(typeof c=="string"&&c.startsWith("0x"))return"object";if(typeof c=="number"||typeof c=="bigint")return"u64";if(typeof c=="boolean")return"bool";throw new Error(`Unknown type for value: ${c}`)};var nt=(n=>(n[n.NO_RESTRICTION=0]="NO_RESTRICTION",n[n.IMMEDIATE_OR_CANCEL=1]="IMMEDIATE_OR_CANCEL",n[n.FILL_OR_KILL=2]="FILL_OR_KILL",n[n.POST_ONLY=3]="POST_ONLY",n))(nt||{}),st=(r=>(r[r.SELF_MATCHING_ALLOWED=0]="SELF_MATCHING_ALLOWED",r[r.CANCEL_TAKER=1]="CANCEL_TAKER",r[r.CANCEL_MAKER=2]="CANCEL_MAKER",r))(st||{});var br=re;0&&(module.exports={CLOCK_ADDRESS,CachedContent,CetusClmmSDK,ClmmExpectSwapModule,ClmmFetcherModule,ClmmIntegratePoolModule,ClmmIntegratePoolV2Module,ClmmIntegrateRouterModule,ClmmIntegrateRouterWithPartnerModule,ClmmIntegrateUtilsModule,CoinAssist,CoinInfoAddress,CoinStoreAddress,DEEP_SCALAR,DEFAULT_GAS_BUDGET_FOR_MERGE,DEFAULT_GAS_BUDGET_FOR_SPLIT,DEFAULT_GAS_BUDGET_FOR_STAKE,DEFAULT_GAS_BUDGET_FOR_TRANSFER,DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI,DEFAULT_NFT_TRANSFER_GAS_FEE,DeepbookClobV2Moudle,DeepbookCustodianV2Moudle,DeepbookEndpointsV2Moudle,DeepbookUtilsModule,FLOAT_SCALAR,FLOAT_SCALING,GAS_SYMBOL,GAS_TYPE_ARG,GAS_TYPE_ARG_LONG,MarginUtilsModule,NORMALIZED_SUI_COIN_TYPE,OrderType,RpcModule,SUI_SYSTEM_STATE_OBJECT_ID,SelfMatchingOption,TransactionUtil,YEAR_MS,addHexPrefix,asIntN,asUintN,bufferToHex,cacheTime1min,cacheTime24h,cacheTime5min,calc100PercentRepay,calcDebtDetail,calcInterestRate,calcUtilizationRate,calculateRiskRatio,checkAddress,composeType,d,decimalsMultiplier,extractAddressFromType,extractStructTagFromType,fixCoinType,fixDown,fixSuiObjectId,fromDecimalsAmount,getDefaultSuiInputType,getFutureTime,getMoveObject,getMoveObjectType,getMovePackageContent,getObjectDeletedResponse,getObjectDisplay,getObjectFields,getObjectId,getObjectNotExistsResponse,getObjectOwner,getObjectPreviousTransactionDigest,getObjectReference,getObjectType,getObjectVersion,getSuiObjectData,hasPublicTransfer,hexToNumber,hexToString,isSortedSymbols,isSuiObjectResponse,maxDecimal,mulRoundUp,normalizeCoinType,patchFixSuiObjectId,printTransaction,removeHexPrefix,secretKeyToEd25519Keypair,secretKeyToSecp256k1Keypair,shortAddress,shortString,sleepTime,toBuffer,toDecimalsAmount,utf8to16,wrapDeepBookMarginPoolInfo,wrapDeepBookPoolInfo});
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Ve=Object.defineProperty;var Ne=(c,e,t)=>e in c?Ve(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var ge=(c,e,t)=>(Ne(c,typeof e!="symbol"?e+"":e,t),t);import{SuiGraphQLClient as wt}from"@mysten/sui/graphql";import{DeepBookClient as ot}from"@mysten/deepbook-v3";import{bcs as h}from"@mysten/sui/bcs";import{Transaction as O,coinWithBalance as qe}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as q,normalizeStructTag as U,normalizeSuiObjectId as at}from"@mysten/sui/utils";import{Base64 as ct}from"js-base64";import{coinWithBalance as fe}from"@mysten/sui/transactions";import{SUI_TYPE_ARG as ze,normalizeStructTag as Qe,normalizeSuiObjectId as se}from"@mysten/sui/utils";var xe=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function me(c){return c.startsWith("0x")?c:`0x${c}`}function ne(c){return c.startsWith("0x")?`${c.slice(2)}`:c}function Le(c,e=4,t=4){let r=Math.max(e,1),n=Math.max(t,1);return`${c.slice(0,r+2)} ... ${c.slice(-n)}`}function At(c,e=4,t=4){return Le(me(c),e,t)}function Ot(c,e={leadingZero:!0}){if(typeof c!="string")return!1;let t=c;if(e.leadingZero){if(!c.startsWith("0x"))return!1;t=t.substring(2)}return xe.test(t)}function Ge(c){if(!Buffer.isBuffer(c))if(Array.isArray(c))c=Buffer.from(c);else if(typeof c=="string")exports.isHexString(c)?c=Buffer.from(exports.padToEven(exports.stripHexPrefix(c)),"hex"):c=Buffer.from(c);else if(typeof c=="number")c=exports.intToBuffer(c);else if(c==null)c=Buffer.allocUnsafe(0);else if(c.toArray)c=Buffer.from(c.toArray());else throw new Error("invalid type");return c}function St(c){return me(Ge(c).toString("hex"))}function jt(c){let e=new ArrayBuffer(4),t=new DataView(e);for(let n=0;n<c.length;n++)t.setUint8(n,c.charCodeAt(n));return t.getUint32(0,!0)}function Ke(c){let e,t,r,n,i;e="";let s=c.length;for(t=0;t<s;)switch(r=c.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=c.charAt(t-1);break;case 12:case 13:n=c.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|n&63);break;case 14:n=c.charCodeAt(t++),i=c.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(n&63)<<6|(i&63)<<0);break}return e}function Et(c){let e="",t=ne(c),r=t.length/2;for(let n=0;n<r;n++)e+=String.fromCharCode(Number.parseInt(t.substr(n*2,2),16));return Ke(e)}var He=0,he=1,We=2;function be(c,e){return c===e?He:c<e?he:We}function Ze(c,e){let t=0,r=c.length<=e.length?c.length:e.length,n=be(c.length,e.length);for(;t<r;){let i=be(c.charCodeAt(t),e.charCodeAt(t));if(t+=1,i!==0)return i}return n}function qt(c,e){return Ze(c,e)===he}function _e(c,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],n=[c,...e].filter(Boolean).join("::");return t&&t.length&&(n+=`<${t.join(", ")}>`),n}function Dt(c){return c.split("::")[0]}function $(c){try{let e=c.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let a={...$(e),type_arguments:r.map(u=>$(u).source_address)};return a.type_arguments=a.type_arguments.map(u=>E.isSuiCoin(u)?u:$(u).source_address),a.source_address=_e(a.full_address,a.type_arguments),a}let n=e.split("::"),s={full_address:e,address:e===ae||e===ye?"0x2":se(n[0]),module:n[1],name:n[2],type_arguments:[],source_address:""};return s.full_address=`${s.address}::${s.module}::${s.name}`,s.source_address=_e(s.full_address,s.type_arguments),s}catch{return{full_address:c,address:"",module:"",name:"",type_arguments:[],source_address:c}}}function ie(c){return $(c).source_address}function Je(c){return c.toLowerCase().startsWith("0x")?se(c):c}var It=(c,e=!0)=>{let t=c.split("::"),r=t.shift(),n=se(r);return e&&(n=ne(n)),`${n}::${t.join("::")}`};function oe(c){for(let e in c){let t=typeof c[e];if(t==="object")oe(c[e]);else if(t==="string"){let r=c[e];c[e]=Je(r)}}}var Ut=Qe(ze);var Ye="0x2::coin::Coin",Xe=/^0x2::coin::Coin<(.+)>$/,Vt=1e3,Nt=500,xt=100,Lt=100,Gt=1e3,ae="0x2::sui::SUI",ye="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",Kt="SUI",zt=450,Qt="0x0000000000000000000000000000000000000005",E=class{static getCoinTypeArg(e){let t=e.type.match(Xe);return t?t[1]:null}static isSUI(e){let t=E.getCoinTypeArg(e);return t?E.getCoinSymbol(t)==="SUI":!1}static getCoinSymbol(e){return e.substring(e.lastIndexOf(":")+1)}static getBalance(e){return BigInt(e.fields.balance)}static totalBalance(e,t){let r=BigInt(0);return e.forEach(n=>{t===n.coinAddress&&(r+=BigInt(n.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${Ye}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(n=>{ie(n.coinAddress)===ie(e)&&r.push(n)}),r}static isSuiCoin(e){return $(e).full_address===ae}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let n=E.selectCoinAssetGreaterThanOrEqual(e,t,r),i=n.selectedCoins.map(a=>a.coinObjectId),s=n.remainingCoins,o=n.selectedCoins.map(a=>a.balance.toString());return{objectArray:i,remainCoins:s,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let n=E.sortByBalance(e.filter(u=>!r.includes(u.coinObjectId))),i=E.calculateTotalBalance(n);if(i<t)return{selectedCoins:[],remainingCoins:n};if(i===t)return{selectedCoins:n,remainingCoins:[]};let s=BigInt(0),o=[],a=[...n];for(;s<i;){let u=t-s,p=a.findIndex(m=>m.balance>=u);if(p!==-1){o.push(a[p]),a.splice(p,1);break}let l=a.pop();l.balance>0&&(o.push(l),s+=l.balance)}return{selectedCoins:E.sortByBalance(o),remainingCoins:E.sortByBalance(a)}}static sortByBalance(e){return e.sort((t,r)=>t.balance<r.balance?-1:t.balance>r.balance?1:0)}static sortByBalanceDes(e){return e.sort((t,r)=>t.balance>r.balance?-1:t.balance<r.balance?0:1)}static calculateTotalBalance(e){return e.reduce((t,r)=>t+r.balance,BigInt(0))}static buildCoinWithBalance(e,t,r){return e===BigInt(0)&&E.isSuiCoin(t)?r.add(fe({balance:e,useGasCoin:!1})):r.add(fe({balance:e,type:t}))}};var we=6e4,ke=3e5,x=864e5;function z(c){return Date.parse(new Date().toString())+c}var K=class{overdueTime;value;constructor(e,t=0){this.overdueTime=t,this.value=e}isValid(){return this.value===null?!1:this.overdueTime===0?!0:!(Date.parse(new Date().toString())>this.overdueTime)}};import{fromB64 as Ae,fromHEX as Oe}from"@mysten/bcs";import{Ed25519Keypair as Ce}from"@mysten/sui/keypairs/ed25519";import{Secp256k1Keypair as Te}from"@mysten/sui/keypairs/secp256k1";import J from"decimal.js";function d(c){return J.isDecimal(c)?c:new J(c===void 0?0:c)}function ce(c){return d(10).pow(d(c).abs())}var L=(c,e)=>{try{return d(c).toDP(e,J.ROUND_DOWN).toString()}catch{return c}},ue=(c,e)=>J.max(d(c),d(e));function W(c,e){let t=ce(d(e));return Number(d(c).mul(t))}function rr(c,e=32){return BigInt.asUintN(e,BigInt(c)).toString()}function nr(c,e=32){return Number(BigInt.asIntN(e,BigInt(c)))}function G(c,e){let t=ce(d(e));return Number(d(c).div(t))}function sr(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return Ce.fromSecretKey(r)}let t=e==="hex"?Oe(c):Ae(c);return Ce.fromSecretKey(t)}function ir(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return Te.fromSecretKey(r)}let t=e==="hex"?Oe(c):Ae(c);return Te.fromSecretKey(t)}var Se=async c=>new Promise(e=>{setTimeout(()=>{e(1)},c)});var je={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},Ee={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function Be(...c){let e="DeepbookV3_Utils_Sdk###"}function Q(c){return c.data}function et(c){if(c.error&&"object_id"in c.error&&"version"in c.error&&"digest"in c.error){let{error:e}=c;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function tt(c){if(c.error&&"object_id"in c.error&&!("version"in c.error)&&!("digest"in c.error))return c.error.object_id}function ve(c){if("reference"in c)return c.reference;let e=Q(c);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:et(c)}function Me(c){return"objectId"in c?c.objectId:ve(c)?.objectId??tt(c)}function ur(c){return"version"in c?c.version:ve(c)?.version}function rt(c){return c.data!==void 0}function nt(c){return c.content!==void 0}function dr(c){let e=Q(c);if(e?.content?.dataType==="package")return e.content.disassembled}function de(c){let e="data"in c?Q(c):c;if(!(!e||!nt(e)||e.content.dataType!=="moveObject"))return e.content}function st(c){return de(c)?.type}function lr(c){let e=rt(c)?c.data:c;return!e?.type&&"data"in c?e?.content?.dataType==="package"?"package":st(c):e?.type}function pr(c){return Q(c)?.previousTransaction}function gr(c){return Q(c)?.owner}function mr(c){let e=Q(c)?.display;return e||{data:null,error:null}}function Pe(c){let e=de(c)?.fields;if(e)return"fields"in e?e.fields:e}function br(c){return de(c)?.hasPublicTransfer??!1}import{Transaction as it}from"@mysten/sui/transactions";async function fr(c,e=!0){c.blockData.transactions.forEach((t,r)=>{})}var V=class{static async adjustTransactionForGas(e,t,r,n){n.setSender(e.senderAddress);let i=E.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(i.length===0)throw new Error("Insufficient balance");let s=E.calculateTotalBalance(t);if(s-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(n);if(E.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),i.map(u=>u.coinObjectId)).selectedCoins.length===0){let u=BigInt(o)+BigInt(500);if(s-r<u){if(r-=u,r<0)throw new Error("gas Insufficient balance");let p=new it;return{fixAmount:r,newTx:p}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,n,i=!0,s=!1){let o=E.getCoinAssets(n,t);if(r===BigInt(0)&&o.length===0)return V.buildZeroValueCoin(t,e,n,i);let a=E.calculateTotalBalance(o);if(a<r)throw new Error(`The amount(${a}) is Insufficient balance for ${n} , expect ${r} `);return V.buildCoin(e,t,o,r,n,i,s)}static buildCoin(e,t,r,n,i,s=!0,o=!1){if(E.isSuiCoin(i)){if(s){let y=e.splitCoins(e.gas,[e.pure.u64(n)]);return{targetCoin:e.makeMoveVec({elements:[y]}),remainCoins:t,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(n===0n&&r.length>1){let y=E.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.object(y.objectArray[0]),remainCoins:y.remainCoins,tragetCoinAmount:y.amountArray[0],isMintZeroCoin:!1}}let f=E.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(n)]),remainCoins:f.remainCoins,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let a=E.selectCoinObjectIdGreaterThanOrEqual(r,n),u=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),p=a.objectArray;if(s)return{targetCoin:e.makeMoveVec({elements:p.map(f=>e.object(f))}),remainCoins:a.remainCoins,tragetCoinAmount:a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),isMintZeroCoin:!1};let[l,...m]=p,g=e.object(l),b=g,_=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),A;return m.length>0&&e.mergeCoins(g,m.map(f=>e.object(f))),o&&Number(u)>Number(n)&&(b=e.splitCoins(g,[e.pure.u64(n)]),_=n.toString(),A=g),{targetCoin:b,remainCoins:a.remainCoins,originalSplitedCoin:A,tragetCoinAmount:_,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,n=!0){let i=V.callMintZeroValueCoin(t,r),s;return n?s=t.makeMoveVec({elements:[i]}):s=i,{targetCoin:s,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,n,i=!0){let s=E.getCoinAssets(n,t);if(r.amountFirst===BigInt(0))return s.length>0?V.buildCoin(e,[...t],[...s],r.amountFirst,n,i):V.buildZeroValueCoin(t,e,n,i);let o=E.calculateTotalBalance(s);if(o>=r.amountFirst)return V.buildCoin(e,[...t],[...s],r.amountFirst,n,i);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${n} , expect ${r.amountSecond} `);return V.buildCoin(e,[...t],[...s],r.amountSecond,n,i)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let n=[];n.push(e[0],e[1]),r.push(n)}else{let n=[];n.push(e[0],e[e.length-1]),r.push(n);for(let i=1;i<e.length-1;i+=1){if(t[i-1]===0)continue;let s=[];s.push(e[0],e[i],e[e.length-1]),r.push(s)}}return r}},N=V;ge(N,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));var le=1e6,R=1e9,ut={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},dt={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},X=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?dt:ut}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new O,t=e.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`});return e.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[e.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),t],typeArguments:[]}),e.moveCall({target:"0x2::transfer::public_share_object",arguments:[t],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),e}createAndDepsit({account:e,coin:t,amountToDeposit:r}){let n=new O;n.setSenderIfNotSet(e);let i=n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),s=qe({type:t.coinType,balance:BigInt(r)});return n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[i,s],typeArguments:[t.coinType]}),n.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[n.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i],typeArguments:[]}),n.moveCall({target:"0x2::transfer::public_share_object",arguments:[i],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),n}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:n,tx:i}){let s=i||new O;if(t){s.setSenderIfNotSet(e);let o=qe({type:r.coinType,balance:BigInt(n)});return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s.object(t),o],typeArguments:[r.coinType]}),s}return null}withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:n,returnAssets:i,txb:s}){let o=s||new O,a=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(n)],typeArguments:[r.coinType]});return i?a:(o.transferObjects([a],e),o)}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new O}){for(let n in t)t[n].forEach(s=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(n),r.pure.u64(s.amount)],typeArguments:[s.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,n=this.getCache(r,t);if(!t&&n!==void 0)return n;try{let i=new O;i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i.pure.address(e)],typeArguments:[]});let a=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}))?.events?.filter(p=>p.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],u=[];return a.forEach(p=>{u.push({balanceManager:p,cetusBalanceManager:""})}),this.updateCache(r,u,864e5),u||[]}catch(i){throw i instanceof Error?i:new Error(String(i))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new O){let n=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::generate_proof_as_owner`,arguments:[r.object(t)]});return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::withdraw_settled_amounts`,arguments:[r.object(e.address),r.object(t),n],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let n=new O;r.forEach(o=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[n.object(t)],typeArguments:[o.coinType]})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n}),s={};return i.results?.forEach((o,a)=>{let u=r[a],p=o.returnValues[0][0],l=h.U64.parse(new Uint8Array(p)),m=d(l),g=m.eq(0)?"0":m.div(Math.pow(10,u.decimals)).toString();s[u.coinType]={adjusted_balance:g,balance:m.toString()}}),s}catch(n){throw n instanceof Error?n:new Error(String(n))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new O,n=await this.getBalanceManager(e,!0);if(!Array.isArray(n)||n.length===0)return{};n.forEach(o=>{t.forEach(a=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[a.coinType]})})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),s={};return n.forEach((o,a)=>{let u={},p=a*t.length;t.forEach((l,m)=>{let g=p+m,b=i.results?.[g];if(b){let _=b.returnValues[0][0],A=h.U64.parse(new Uint8Array(_)),f=d(A),w=f.eq(0)?"0":f.div(Math.pow(10,l.decimals)).toString();u[l.coinType]={adjusted_balance:w,balance:f.toString()}}}),s[o.balanceManager]=u}),s}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new O;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let n=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],i=Number(h.U64.parse(new Uint8Array(n))),s=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return d(i).mul(s).div(o).div(R).toString()}catch(t){return Be("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let n=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),i=/<([^>]+)>/,s=[];return n?.data?.forEach(o=>{let a=o?.parsedJson,u=o.type.match(i);if(u){let l=u[1].split(", ");s.push({...a,baseCoinType:l[0],quoteCoinType:l[1]})}}),this.updateCache(t,s,864e5),s}async getQuoteQuantityOut(e,t,r){let n=new O;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(le).toString(),baseQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getBaseQuantityOut(e,t,r){let n=new O;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{quoteQuantityDisplay:d(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(le).toString(),quoteQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getQuantityOut(e,t,r,n){let i=new O;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.pure.u64(r),i.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:n,transactionBlock:i}),o=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),a=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:d(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(a).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(u).div(le).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:a,deepRequired:u}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,n=e.quoteCoin.coinType,i=this._deep.coinType;for(let s=0;s<t.length;s++){let o=t[s];if(o.address===e.address)continue;let a=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===i&&(a.includes(r)||a.includes(n)))return o}return null}async updateDeepPrice(e,t){let r=await this.getReferencePool(e);return r?(t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::add_deep_price_point`,arguments:[t.object(e.address),t.object(r.pool_id),t.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,n,i,s,o){let a=this.deepCoin;try{let{taker_fee:u,maker_fee:p}=e,l=d(u).div(R).toString(),m=d(p).div(R).toString(),g=await this.getMarketPrice(e),b=s?r:g!=="0"?g:o;if(b==="0")throw new Error("Cannot get market price");let _=Math.pow(10,e.baseCoin.decimals).toString(),A=Math.pow(10,e.quoteCoin.decimals).toString(),f=d(b).div(_).mul(A).mul(R).toString();if(n){let T=await this.getMarketPrice(e),k=d(s?r:T!=="0"?T:o).div(_).mul(A).mul(R).toString(),B=await this.getOrderDeepPrice(e);if(!B)throw new Error("Cannot get deep price");let M=ue(k,r),D=d(t).mul(d(l)).mul(d(B.deep_per_asset)).div(d(R)),P=d(t).mul(d(m)).mul(d(B.deep_per_asset)).div(d(R));B.asset_is_base||(D=D.mul(M).div(d(R)),P=P.mul(M).div(d(R)));let I=D.ceil().toString(),Z=P.ceil().toString();return{takerFee:I,makerFee:Z,takerFeeDisplay:G(I,a.decimals).toString(),makerFeeDisplay:G(Z,a.decimals).toString(),feeType:a.coinType}}if(i){let T=ue(f,r),j=d(t).mul(T).mul(d(l).mul(1.25)).div(d(R)).ceil().toFixed(0),k=d(t).mul(T).mul(d(m).mul(1.25)).div(d(R)).ceil().toFixed(0);return{takerFee:j,makerFee:k,takerFeeDisplay:G(j,e.quoteCoin.decimals).toString(),makerFeeDisplay:G(k,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let w=d(t).mul(d(l).mul(1.25)).ceil().toFixed(0),y=d(t).mul(d(m).mul(1.25)).ceil().toFixed(0);return{takerFee:w,makerFee:y,takerFeeDisplay:G(w,e.baseCoin.decimals).toString(),makerFeeDisplay:G(y,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(u){throw u instanceof Error?u:new Error(String(u))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,n=this.getCache(r);if(n!==void 0)return n;try{let i=new O,s=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,i)&&(s=!0),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[i.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:i}),a=s?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],u=this.parseOrderDeepPrice(new Uint8Array(a));return this.updateCache(r,u,6e4),u}catch{return await Se(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,n=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:n}}getCoinAssets(e,t,r,n){return N.buildCoinForAmount(n,r,BigInt(d(t).abs().ceil().toString()),e,!1,!0).targetCoin}async getTransactionRelatedBalance(e,t,r,n,i,s,o){let a=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let u=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];n&&u.push(a);let p=await this.getManagerBalance({account:i,balanceManager:o,coins:u}),l=p?.[t]?.balance||"0",m=p?.[r]?.balance||"0",g=s&&p?.[a.coinType]?.balance||"0";return{baseManagerBlance:l,quoteManagerBlance:m,feeManaerBalance:g}}catch(u){throw u instanceof Error?u:new Error(String(u))}}getFeeAsset(e,t,r,n,i,s,o,a,u,p){let l=d(e).gt(0)&&u,m="0";if(!l)return{feeAsset:this.getEmptyCoin(p,t),haveDepositFee:"0"};if(s||o){let g=d(i).sub(s?n:r);m=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else m=d(i).sub(e).lt("0")?d(i).sub(e).abs().toString():"0";return{feeAsset:d(m).gt("0")?this.getCoinAssets(t,m,a,p):this.getEmptyCoin(p,t),haveDepositFee:m}}async getTransactionRelatedAssets(e,t,r,n,i,s,o,a,u){try{let p=this.deepCoin,l=U(e.baseCoin.coinType),m=U(e.quoteCoin.coinType),g=l===p.coinType,b=m===p.coinType,_=!g&&!b,{baseManagerBlance:A,quoteManagerBlance:f,feeManaerBalance:w}=await this.getTransactionRelatedBalance(e,l,m,_,s,o,a);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:A,quoteManagerBlance:f});let y,T,j=!1,k=await this._sdk.getOwnerCoinAssets(s);if(i){o||(r=d(r).add(d(n)).toString());let M=d(f).sub(r).toString();d(M).lt(0)?(j=!0,T=this.getCoinAssets(m,M,k,u)):T=this.getEmptyCoin(u,m),y=this.getEmptyCoin(u,l)}else{o||(t=d(t).add(d(n)).toString());let M=d(A).sub(t).toString();d(M).lt(0)?(j=!0,y=this.getCoinAssets(l,M,k,u)):y=this.getEmptyCoin(u,l),T=this.getEmptyCoin(u,m)}let B=this.getFeeAsset(n,p.coinType,t,r,w,b,g,k,o,u);return{baseAsset:y,quoteAsset:T,feeAsset:B,haveDeposit:j}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getMarketTransactionRelatedAssets(e,t,r,n,i,s,o,a,u,p){try{let l=this.deepCoin,m=U(e.baseCoin.coinType),g=U(e.quoteCoin.coinType),b=m===l.coinType,_=g===l.coinType,A=!b&&!_,f=await this.getTransactionRelatedBalance(e,m,g,A,s,o,a),{feeManaerBalance:w}=f,y=d(f.baseManagerBlance).add(d(p?.base||"0")).toString(),T=d(f.quoteManagerBlance).add(d(p?.quote||"0")).toString(),j=await this._sdk.getOwnerCoinAssets(s),k;o&&d(w).lt(n)?k=this.getCoinAssets(l.coinType,d(n).sub(w).toString(),j,u):k=this.getEmptyCoin(u,l.coinType);let B,M;if(i){o||(r=d(r).add(d(n)).toString());let D=d(T).sub(r).toString();if(d(D).lt(0)){let P;d(T).gt(0)&&(P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:T,returnAssets:!0,txb:u}));let I=this.getCoinAssets(g,D,j,u);P&&u.mergeCoins(I,[P]),M=I}else M=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:u});B=this.getEmptyCoin(u,m)}else{o||(t=d(t).add(d(n)).toString());let D=d(y).sub(t).toString();if(d(D).lt(0)){let P;d(y).gt(0)&&(P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:y,returnAssets:!0,txb:u}));let I=this.getCoinAssets(m,D,j,u);P&&u.mergeCoins(I,[P]),B=I}else B=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:u});M=this.getEmptyCoin(u,g)}return{baseAsset:B,quoteAsset:M,feeAsset:k}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:n,isBid:i,maxFee:s,account:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8}){try{let p=this.deepCoin,l=e.address,m=e.baseCoin.decimals,g=e.quoteCoin.decimals,b=e.baseCoin.coinType,_=e.quoteCoin.coinType,A=d(t).mul(10**(g-m+9)).toString(),f=U(b),w=U(_),y=new O,T,j,k=await this._sdk.getOwnerCoinAssets(o);if(i){let P=d(t).mul(d(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();a||(P=d(P).add(d(s)).toString()),j=N.buildCoinForAmount(y,k,BigInt(P),w,!1,!0)?.targetCoin}else{let P=r;a||(P=d(r).abs().add(d(s)).toString()),T=N.buildCoinForAmount(y,k,BigInt(d(P).abs().toString()),f,!1,!0)?.targetCoin}let B=a?d(s).gt(0)?N.buildCoinForAmount(y,k,BigInt(d(s).abs().ceil().toString()),p.coinType,!1,!0).targetCoin:this.getEmptyCoin(y,p.coinType):this.getEmptyCoin(y,p.coinType),M=y.moveCall({typeArguments:[i?b:_],target:"0x2::coin::zero",arguments:[]}),D=[y.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),y.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),y.object(l),i?M:T,i?j:M,B,y.pure.u8(n),y.pure.u8(0),y.pure.u64(A),y.pure.u64(r),y.pure.bool(i),y.pure.bool(!1),y.pure.u64(u),y.object(q)];return y.moveCall({typeArguments:[f,w],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:D}),y}catch(p){throw p instanceof Error?p:new Error(String(p))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:n,account:i,payWithDeep:s,slippage:o=.01}){try{let a=e.address,u=e.baseCoin.coinType,p=e.quoteCoin.coinType,l=U(u),m=U(p),g=new O,b,_,A=t,f,w=await this.getOrderBook(e,"all",6);if(r){let k=w?.ask?.[0]?.price||"0",B=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(B).plus(d(B).mul(o)).ceil().toString()}else{let k=await w?.bid?.[0]?.price||"0",B=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(B).minus(d(B).mul(o)).floor().toString()}let y=await this._sdk.getOwnerCoinAssets(i);r?(s||(f=d(f).add(d(n)).toString()),_=this.getCoinAssets(m,f,y,g),b=this.getEmptyCoin(g,l)):(s||(A=d(A).add(d(n)).toString()),_=this.getEmptyCoin(g,m),b=this.getCoinAssets(l,A,y,g));let T=s?d(n).gt(0)?N.buildCoinForAmount(g,y,BigInt(d(n).abs().ceil().toString()),this.deepCoin.coinType,!1,!0).targetCoin:this.getEmptyCoin(g,this.deepCoin.coinType):this.getEmptyCoin(g,this.deepCoin.coinType),j=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(a),b,_,T,g.pure.u8(0),g.pure.u64(t),g.pure.bool(r),g.pure.bool(s),g.pure.u64(f),g.object(q)];return g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:j}),g}catch(a){throw a instanceof Error?a:new Error(String(a))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:n,isBid:i,orderType:s,maxFee:o,account:a,payWithDeep:u,expirationTimestamp:p=Date.now()+31536e8}){try{let l=this.deepCoin,m=d(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),g=t.baseCoin.coinType,b=t.quoteCoin.coinType,_=new O,A=i?d(r).mul(d(n).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",f=i?"0":n,{baseAsset:w,quoteAsset:y,feeAsset:T,haveDeposit:j}=await this.getTransactionRelatedAssets(t,f,A,o,i,a,u,e,_);if(j){let M=[_.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),_.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),_.object(t.address),_.object(e),w,y,T.feeAsset,_.pure.u8(s),_.pure.u8(0),_.pure.u64(m),_.pure.u64(n),_.pure.bool(i),_.pure.bool(u),_.pure.u64(p),_.object(q)];return _.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:M}),_}let k=new O;d(T.haveDepositFee).gt(0)&&this.depositIntoManager({account:a,balanceManager:e,coin:l,amountToDeposit:T.haveDepositFee,tx:k});let B=[k.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),k.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),k.object(t.address),k.object(e),k.pure.u8(s),k.pure.u8(0),k.pure.u64(m),k.pure.u64(n),k.pure.bool(i),k.pure.bool(u),k.pure.u64(p),k.object(q)];return k.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:B}),k}catch(l){throw l instanceof Error?l:new Error(String(l))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:n}){let i=new O;return i.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),i.object(e),i.object(t.address),i.pure.u128(r),i.pure.u64(n),i.object(q)]}),i}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new O,i=await this.getMarketPrice(e),s=d(i).gt(0)?i:Math.pow(10,-1),o=Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(a),n.pure.u64(u),n.pure.bool(!1),n.object(q)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.vector(h.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],A=h.vector(h.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),T=d(A[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:T})}),m?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new O,i=await this.getMarketPrice(e),s=d(i).gt(0)?d(i).div(3).toNumber():Math.pow(10,-6),o=d(i).gt(0)?i:Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(L(a,0)),n.pure.u64(L(u,0)),n.pure.bool(!0),n.object(q)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.vector(h.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],A=h.vector(h.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),T=d(A[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:T})}),m?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:n}=e,i=new O,s=await this.getMarketPrice(e),o,a;t?(o=d(s).gt(0)?d(s).div(3).toNumber():Math.pow(10,-6),a=d(s).gt(0)?s:Math.pow(10,6)):(o=d(s).gt(0)?s:Math.pow(10,-1),a=d(s).gt(0)?d(s).mul(3).toNumber():Math.pow(10,6));let u=d(o).mul(Math.pow(10,9+n.decimals-r.decimals)).toString(),p=d(a).mul(Math.pow(10,9+n.decimals-r.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(L(u,0)),i.pure.u64(L(p,0)),i.pure.bool(t),i.object(q)],typeArguments:[r.coinType,n.coinType]});let l=this._sdk.sdkOptions.simulationAccount.address,m=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:i}),g=[],b=m.results[0].returnValues[0][0],_=h.vector(h.u64()).parse(new Uint8Array(b)),A=m.results[0].returnValues[1][0],f=h.vector(h.u64()).parse(new Uint8Array(A));return _.forEach((w,y)=>{let T=d(w).div(Math.pow(10,9+n.decimals-r.decimals)).toString(),j=d(f[y]).div(Math.pow(10,r.decimals)).toString();g.push({price:T,quantity:j})}),g?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:n,isBid:i,maxFee:s,account:o,payWithDeep:a,slippage:u=.01,settled_balances:p={base:"0",quote:"0"}}){try{let l=U(t.baseCoin.coinType),m=U(t.quoteCoin.coinType),g=new O;p&&(d(p.base).gt(0)||d(p.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},g);let{baseAsset:b,quoteAsset:_,feeAsset:A}=await this.getMarketTransactionRelatedAssets(t,r,n,s,i,o,a,e,g,p),f=await this.getOrderBook(t,"all",6);if(i){let T=f?.ask?.[0]?.price||"0",j=d(T).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(j).plus(d(j).mul(u)).ceil().toString()}else{let T=await f?.bid?.[0]?.price||"0",j=d(T).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(j).minus(d(j).mul(u)).floor().toString()}let w=n,y=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(t.address),g.object(e),b,_,A,g.pure.u8(0),g.pure.u64(r),g.pure.bool(i),g.pure.bool(a),g.pure.u64(w),g.object(q)];return g.setSenderIfNotSet(o),g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:y}),g}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderInfoList(e,t){try{let r=new O;e.forEach(u=>{let p=u?.pool,l=u?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(p.pool_id),r.pure.u128(BigInt(l))],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),i=h.struct("ID",{bytes:h.Address}),s=h.struct("OrderDeepPrice",{asset_is_base:h.bool(),deep_per_asset:h.u64()}),o=h.struct("Order",{balance_manager_id:i,order_id:h.u128(),client_order_id:h.u64(),quantity:h.u64(),filled_quantity:h.u64(),fee_is_deep:h.bool(),order_deep_price:s,epoch:h.u64(),status:h.u8(),expire_timestamp:h.u64()}),a=[];return n?.results?.forEach(u=>{let p=u.returnValues[0][0],l=o.parse(new Uint8Array(p));a.push(l)}),a}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),n=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:n}}async getOpenOrder(e,t,r,n,i=!1,s=new O){let o;if(n)o=n;else{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[s.object(e.address),i?r:s.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let m=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:s})).results[i?1:0].returnValues[0][0];o=h.struct("VecSet",{constants:h.vector(h.U128)}).parse(new Uint8Array(m)).constants}let a=o.map(l=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:l})),u=await this.getOrderInfoList(a,t)||[],p=[];return u.forEach(l=>{let m=this.decodeOrderId(BigInt(l.order_id));p.push({...l,price:m.price,isBid:m.isBid,pool:e})}),p}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),n=new O;r.forEach(l=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[n.object(l.pool_id),n.object(t)],typeArguments:[l.baseCoinType,l.quoteCoinType]})});let s=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n})).results?.map(l=>l.returnValues?.[0]?.[0])||[],o=h.struct("VecSet",{constants:h.vector(h.U128)}),a=[];s.forEach((l,m)=>{let g=o.parse(new Uint8Array(l)).constants;g.length>0&&g.forEach(b=>{a.push({pool:r[m],orderId:b})})});let u=await this.getOrderInfoList(a,e)||[],p=[];return a.forEach((l,m)=>{let g=this.decodeOrderId(BigInt(l.orderId)),b=u.find(_=>_.order_id===l.orderId)||{};p.push({...l,...b,price:g.price,isBid:g.isBid})}),p}catch{return[]}}cancelOrders(e,t,r=new O){return e.forEach(n=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::cancel_order`,arguments:[r.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),r.object(t),r.object(n.poolInfo.address),r.pure.u128(n.orderId),r.object(q)],typeArguments:[n.poolInfo.baseCoin.coinType,n.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,n,i,s){let o=this._sdk.fullClient,u=await new ot({client:o,address:i,env:"testnet",balanceManagers:{test1:{address:s,tradeCap:""}}}).getLevel2Range(e,t,r,n)}processOrderBookData(e,t,r,n){let i=e.returnValues[0][0],s=h.vector(h.u64()).parse(new Uint8Array(i)),o=e.returnValues[1][0],a=h.vector(h.u64()).parse(new Uint8Array(o)),u={};return s.forEach((l,m)=>{let g=d(l).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),b=d(a[m]).div(Math.pow(10,t.decimals)).toString();u[g]?u[g]={price:g,quantity:d(u[g].quantity).add(b).toString()}:u[g]={price:g,quantity:b}}),Object.values(u)}getLevel2RangeTx(e,t,r,n,i=new O){let{baseCoin:s,quoteCoin:o}=e,a=L(d(r).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0),u=L(d(n).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0);return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(a),i.pure.u64(u),i.pure.bool(t),i.object(q)],typeArguments:[s.coinType,o.coinType]}),i}async fetchOrderBook(e,t,r,n,i,s){let o=new O,{baseCoin:a,quoteCoin:u}=e;try{if(t==="bid"||t==="all"){let b=n,_=r==="0"?i:r;o=this.getLevel2RangeTx(e,!0,b,_,o)}if(t==="ask"||t==="all"){let b=r==="0"?n:r,_=i;o=this.getLevel2RangeTx(e,!1,b,_,o)}let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:o}),m=[];(t==="bid"||t==="all")&&(m=l.results?.[0]?this.processOrderBookData(l.results[0],a,u,s):[]);let g=[];if(t==="ask"||t==="all"){let b=t==="ask"?0:1;g=l.results?.[b]?this.processOrderBookData(l.results[b],a,u,s):[]}return{bid:m.sort((b,_)=>_.price-b.price),ask:g.sort((b,_)=>b.price-_.price)}}catch{let l=this._sdk.sdkOptions.simulationAccount.address,m=[],g=[];try{let b=this.getLevel2RangeTx(e,!0,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});m=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{m=[]}try{let b=this.getLevel2RangeTx(e,!1,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});g=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{g=[]}return{bid:m,ask:g}}}async getOrderBook(e,t,r){let n={bid:[],ask:[]};try{let i=await this.getMarketPrice(e),s=t,o=Math.pow(10,-r),a=Math.pow(10,r),u=await this.fetchOrderBook(e,s,i,o,a,r);return{bid:u?.bid,ask:u?.ask}}catch{return n}}async getOrderBookOrigin(e,t){try{let r=new O,n=await this.getMarketPrice(e),{baseCoin:i,quoteCoin:s}=e;if(t==="bid"||t==="all"){let l=Math.pow(10,-6),m=n,g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!0),r.object(q)],typeArguments:[i.coinType,s.coinType]})}if(t==="ask"||t==="all"){let l=n,m=Math.pow(10,6),g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!1),r.object(q)],typeArguments:[i.coinType,s.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,a=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),u=[];if(t==="bid"||t==="all"){let l=a.results[0]?.returnValues[0]?.[0],m=h.vector(h.u64()).parse(new Uint8Array(l)),g=a.results[0]?.returnValues[1]?.[0],b=h.vector(h.u64()).parse(new Uint8Array(g));m.forEach((_,A)=>{let f=d(_).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),w=d(b[A]).div(Math.pow(10,i.decimals)).toString();u.push({price:f,quantity:w})})}let p=[];if(t==="ask"||t==="all"){let l=t==="ask"?0:1,m=a.results[l]?.returnValues[0]?.[0],g=h.vector(h.u64()).parse(new Uint8Array(m)),b=a.results[l]?.returnValues[1]?.[0],_=h.vector(h.u64()).parse(new Uint8Array(b));g.forEach((A,f)=>{let w=d(A).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),y=d(_[f]).div(Math.pow(10,i.decimals)).toString();p.push({price:w,quantity:y})})}return{bid:u,ask:p}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((n,i)=>[U(n.coinType),n]))}async getAccount(e,t,r=new O){for(let o=0;o<t.length;o++){let a=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(a.address),typeof e=="string"?r.object(e):e],typeArguments:[a.baseCoin.coinType,a.quoteCoin.coinType]})}let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),i;if(n?.events.length===0)return null;let s=[];return n?.events?.forEach((o,a)=>{i=o?.parsedJson;let u=i.account.open_orders.contents,p=i.account.owed_balances,l=i.account.settled_balances,m=i.account.unclaimed_rebates,g=i.account.taker_volume;s.push({balance_manager_id:e,open_orders:u,owed_balances:p,settled_balances:l,unclaimed_rebates:m,taker_volume:g,poolInfo:t[a]})}),s}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,n=this.getCache(r,t);if(n!==void 0)return n;let i;try{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,i,864e5),i}transformExtensions(e,t,r=!0){let n=[];for(let i of t){let{key:s}=i.fields,{value:o}=i.fields;if(s==="labels")try{o=JSON.parse(decodeURIComponent(ct.decode(o)))}catch{}r&&(e[s]=o),n.push({key:s,value:o})}delete e.extension_fields,r||(e.extensions=n)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,n=`${r}_getCoinConfigs`,i=this.getCache(n,e);if(i)return i;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(p=>p.objectId),a=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),u=[];return a.forEach(p=>{let l=this.buildCoinConfig(p,t);this.updateCache(`${r}_${l.address}_getCoinConfig`,l,864e5),u.push({...l})}),this.updateCache(n,u,864e5),u}buildCoinConfig(e,t=!0){let r=Pe(e);r=r.value.fields;let n={...r};return n.id=Me(e),n.address=$(r.coin_type.fields.name).full_address,r.pyth_id&&(n.pyth_id=at(r.pyth_id)),this.transformExtensions(n,r.extension_fields.fields.contents,t),delete n.coin_type,n}updateCache(e,t,r=3e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:n,quoteCoinType:i}){let s=new O,o=E.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",s);s.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[n,i],arguments:[s.object(this.sdk.sdkOptions.deepbook.registry_id),s.pure.u64(e),s.pure.u64(t),s.pure.u64(r),o]});try{let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:s});if(a.effects.status.status==="success")return s;if(a.effects.status.status==="failure"&&a.effects.status.error&&a.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(a){throw a instanceof Error?a:new Error(String(a))}return s}};import{CoinAssist as Ue}from"@cetusprotocol/common-sdk";import{bcs as S}from"@mysten/sui/bcs";import{Transaction as C}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as v,normalizeSuiAddress as Re}from"@mysten/sui/utils";var Fr=({totalAssetsValue:c,totalDebtValue:e})=>d(e).eq(0)||d(c).eq(0)?"0":d(c).div(d(e)).toString(),De=c=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i}=c.value.fields,{liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}=c.value.fields.risk_ratios.fields;return{id:c.id.id,name:c.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i,liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}},Ie=(c,e)=>{let{deposit_coin_type:t}=e,r=c.id.id,{max_utilization_rate:n,min_borrow:i,protocol_spread:s,supply_cap:o}=c.config.fields.margin_pool_config.fields,{maintainer_fees:a,protocol_fees:u}=c.protocol_fees.fields,{total_supply:p,total_borrow:l}=c.state.fields,m=d(o).sub(p).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:p,total_borrow:l,available_supply:m,max_utilization_rate:n,min_borrow:i,protocol_spread:s,maintainer_fees:a,protocol_fees:u}};import{SuiPriceServiceConnection as lt,SuiPythClient as pt}from"@pythnetwork/pyth-sui-js";var pe=10n;function gt(c,e){if(!pe)throw new Error("oraclePriceMultiplierDecimal is required");if(c===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(pe- -e);return c*t}return c/10n**(e+pe)}var H=class{_sdk;connection;suiPythClient;hasChangeConnection=!1;_cache={};constructor(e){this._sdk=e,this.connection=new lt(this.sdk.sdkOptions.pythUrl),this.suiPythClient=new pt(this._sdk.fullClient,this._sdk.sdkOptions.margin_utils.pyth_state_id,this._sdk.sdkOptions.margin_utils.wormhole_state_id)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,n=null;try{r=await this.connection.getPriceFeedsUpdateData(e)}catch(o){n=o}if(r==null)throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes. Detailed error: ${n?.message}`);let i=[];try{i=await this.suiPythClient.updatePriceFeeds(t,r,e)}catch(o){throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes in the pythUrls parameter when initializing AggregatorClient, for example: new AggregatorClient({ pythUrls: ["https://your-pyth-node-url"] }). Detailed error: ${o}`)}let s=new Map;for(let o=0;o<e.length;o++)s.set(e[o],i[o]);return s}priceCheck(e,t=60){let r=Math.floor(Date.now()/1e3);if(!(Math.abs(r-e.last_update_time)>t))return e}async getLatestPrice(e,t=!1){let r={},n=[];if(t?e.forEach(o=>{let a=this._sdk.getCache(`getLatestPrice_${o.coinType}`);a&&this.priceCheck(a,60)?r[o.coinType]=a:n.push(o.coinType)}):n=e.map(o=>o.coinType),n.length===0)return r;let i=e.map(o=>o.feed);return(await this.connection.getLatestPriceUpdates(i))?.parsed?.forEach((o,a)=>{let u=o.price;if(u){let{price:p,expo:l}=u,m=d(p).mul(d(10).pow(d(l))).toString(),b={coin_type:e[a].coinType,price:m,oracle_price:0n,last_update_time:u.publish_time};b.oracle_price=gt(BigInt(p),BigInt(l)),r[n[a]]=b,this._sdk.updateCache(`getLatestPrice_${b.coin_type}`,b)}}),r}};var ee=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new H(e),this._deep=e.sdkOptions.network==="mainnet"?Ee:je}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new C){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");if(!e.baseCoin?.coinType||!e.quoteCoin?.coinType)throw new Error("Base and quote coin types are required");let{baseCoin:r,quoteCoin:n}=e;try{let{margin_manager:i,initializer:s}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:i,initializer:s,baseCoin:r,quoteCoin:n},t),{tx:t,margin_manager:i,initializer:s}}catch(i){throw new Error(`Failed to create and share margin manager: ${i instanceof Error?i.message:String(i)}`)}}createMarginManager(e,t=new C){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:n,quoteCoin:i}=e;try{let[s,o]=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::create_margin_manager`,arguments:[t.object(this.sdk.sdkOptions.margin_utils.versioned_id),t.object(r),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),t.object(v)],typeArguments:[n.coinType,i.coinType]});return{tx:t,margin_manager:s,initializer:o}}catch(s){throw new Error(`Failed to create margin manager: ${s instanceof Error?s.message:String(s)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:n},i=new C){try{return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,n.coinType]}),i}catch(s){throw new Error(`Failed to share margin manager: ${s instanceof Error?s.message:String(s)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
|
|
1
|
+
var Ve=Object.defineProperty;var Ne=(c,e,t)=>e in c?Ve(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var ge=(c,e,t)=>(Ne(c,typeof e!="symbol"?e+"":e,t),t);import{SuiGraphQLClient as wt}from"@mysten/sui/graphql";import{DeepBookClient as ot}from"@mysten/deepbook-v3";import{bcs as h}from"@mysten/sui/bcs";import{Transaction as O,coinWithBalance as qe}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as q,normalizeStructTag as U,normalizeSuiObjectId as at}from"@mysten/sui/utils";import{Base64 as ct}from"js-base64";import{coinWithBalance as fe}from"@mysten/sui/transactions";import{SUI_TYPE_ARG as ze,normalizeStructTag as Qe,normalizeSuiObjectId as se}from"@mysten/sui/utils";var xe=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function me(c){return c.startsWith("0x")?c:`0x${c}`}function ne(c){return c.startsWith("0x")?`${c.slice(2)}`:c}function Le(c,e=4,t=4){let r=Math.max(e,1),n=Math.max(t,1);return`${c.slice(0,r+2)} ... ${c.slice(-n)}`}function At(c,e=4,t=4){return Le(me(c),e,t)}function Ot(c,e={leadingZero:!0}){if(typeof c!="string")return!1;let t=c;if(e.leadingZero){if(!c.startsWith("0x"))return!1;t=t.substring(2)}return xe.test(t)}function Ge(c){if(!Buffer.isBuffer(c))if(Array.isArray(c))c=Buffer.from(c);else if(typeof c=="string")exports.isHexString(c)?c=Buffer.from(exports.padToEven(exports.stripHexPrefix(c)),"hex"):c=Buffer.from(c);else if(typeof c=="number")c=exports.intToBuffer(c);else if(c==null)c=Buffer.allocUnsafe(0);else if(c.toArray)c=Buffer.from(c.toArray());else throw new Error("invalid type");return c}function St(c){return me(Ge(c).toString("hex"))}function jt(c){let e=new ArrayBuffer(4),t=new DataView(e);for(let n=0;n<c.length;n++)t.setUint8(n,c.charCodeAt(n));return t.getUint32(0,!0)}function Ke(c){let e,t,r,n,i;e="";let s=c.length;for(t=0;t<s;)switch(r=c.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=c.charAt(t-1);break;case 12:case 13:n=c.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|n&63);break;case 14:n=c.charCodeAt(t++),i=c.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(n&63)<<6|(i&63)<<0);break}return e}function Et(c){let e="",t=ne(c),r=t.length/2;for(let n=0;n<r;n++)e+=String.fromCharCode(Number.parseInt(t.substr(n*2,2),16));return Ke(e)}var He=0,he=1,We=2;function be(c,e){return c===e?He:c<e?he:We}function Ze(c,e){let t=0,r=c.length<=e.length?c.length:e.length,n=be(c.length,e.length);for(;t<r;){let i=be(c.charCodeAt(t),e.charCodeAt(t));if(t+=1,i!==0)return i}return n}function qt(c,e){return Ze(c,e)===he}function _e(c,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],n=[c,...e].filter(Boolean).join("::");return t&&t.length&&(n+=`<${t.join(", ")}>`),n}function Dt(c){return c.split("::")[0]}function $(c){try{let e=c.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let a={...$(e),type_arguments:r.map(u=>$(u).source_address)};return a.type_arguments=a.type_arguments.map(u=>E.isSuiCoin(u)?u:$(u).source_address),a.source_address=_e(a.full_address,a.type_arguments),a}let n=e.split("::"),s={full_address:e,address:e===ae||e===ye?"0x2":se(n[0]),module:n[1],name:n[2],type_arguments:[],source_address:""};return s.full_address=`${s.address}::${s.module}::${s.name}`,s.source_address=_e(s.full_address,s.type_arguments),s}catch{return{full_address:c,address:"",module:"",name:"",type_arguments:[],source_address:c}}}function ie(c){return $(c).source_address}function Je(c){return c.toLowerCase().startsWith("0x")?se(c):c}var It=(c,e=!0)=>{let t=c.split("::"),r=t.shift(),n=se(r);return e&&(n=ne(n)),`${n}::${t.join("::")}`};function oe(c){for(let e in c){let t=typeof c[e];if(t==="object")oe(c[e]);else if(t==="string"){let r=c[e];c[e]=Je(r)}}}var Ut=Qe(ze);var Ye="0x2::coin::Coin",Xe=/^0x2::coin::Coin<(.+)>$/,Vt=1e3,Nt=500,xt=100,Lt=100,Gt=1e3,ae="0x2::sui::SUI",ye="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",Kt="SUI",zt=450,Qt="0x0000000000000000000000000000000000000005",E=class{static getCoinTypeArg(e){let t=e.type.match(Xe);return t?t[1]:null}static isSUI(e){let t=E.getCoinTypeArg(e);return t?E.getCoinSymbol(t)==="SUI":!1}static getCoinSymbol(e){return e.substring(e.lastIndexOf(":")+1)}static getBalance(e){return BigInt(e.fields.balance)}static totalBalance(e,t){let r=BigInt(0);return e.forEach(n=>{t===n.coinAddress&&(r+=BigInt(n.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${Ye}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(n=>{ie(n.coinAddress)===ie(e)&&r.push(n)}),r}static isSuiCoin(e){return $(e).full_address===ae}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let n=E.selectCoinAssetGreaterThanOrEqual(e,t,r),i=n.selectedCoins.map(a=>a.coinObjectId),s=n.remainingCoins,o=n.selectedCoins.map(a=>a.balance.toString());return{objectArray:i,remainCoins:s,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let n=E.sortByBalance(e.filter(u=>!r.includes(u.coinObjectId))),i=E.calculateTotalBalance(n);if(i<t)return{selectedCoins:[],remainingCoins:n};if(i===t)return{selectedCoins:n,remainingCoins:[]};let s=BigInt(0),o=[],a=[...n];for(;s<i;){let u=t-s,p=a.findIndex(m=>m.balance>=u);if(p!==-1){o.push(a[p]),a.splice(p,1);break}let l=a.pop();l.balance>0&&(o.push(l),s+=l.balance)}return{selectedCoins:E.sortByBalance(o),remainingCoins:E.sortByBalance(a)}}static sortByBalance(e){return e.sort((t,r)=>t.balance<r.balance?-1:t.balance>r.balance?1:0)}static sortByBalanceDes(e){return e.sort((t,r)=>t.balance>r.balance?-1:t.balance<r.balance?0:1)}static calculateTotalBalance(e){return e.reduce((t,r)=>t+r.balance,BigInt(0))}static buildCoinWithBalance(e,t,r){return e===BigInt(0)&&E.isSuiCoin(t)?r.add(fe({balance:e,useGasCoin:!1})):r.add(fe({balance:e,type:t}))}};var we=6e4,ke=3e5,x=864e5;function z(c){return Date.parse(new Date().toString())+c}var K=class{overdueTime;value;constructor(e,t=0){this.overdueTime=t,this.value=e}isValid(){return this.value===null?!1:this.overdueTime===0?!0:!(Date.parse(new Date().toString())>this.overdueTime)}};import{fromB64 as Ae,fromHEX as Oe}from"@mysten/bcs";import{Ed25519Keypair as Ce}from"@mysten/sui/keypairs/ed25519";import{Secp256k1Keypair as Te}from"@mysten/sui/keypairs/secp256k1";import J from"decimal.js";function d(c){return J.isDecimal(c)?c:new J(c===void 0?0:c)}function ce(c){return d(10).pow(d(c).abs())}var L=(c,e)=>{try{return d(c).toDP(e,J.ROUND_DOWN).toString()}catch{return c}},ue=(c,e)=>J.max(d(c),d(e));function W(c,e){let t=ce(d(e));return Number(d(c).mul(t))}function rr(c,e=32){return BigInt.asUintN(e,BigInt(c)).toString()}function nr(c,e=32){return Number(BigInt.asIntN(e,BigInt(c)))}function G(c,e){let t=ce(d(e));return Number(d(c).div(t))}function sr(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return Ce.fromSecretKey(r)}let t=e==="hex"?Oe(c):Ae(c);return Ce.fromSecretKey(t)}function ir(c,e="hex"){if(c instanceof Uint8Array){let r=Buffer.from(c);return Te.fromSecretKey(r)}let t=e==="hex"?Oe(c):Ae(c);return Te.fromSecretKey(t)}var Se=async c=>new Promise(e=>{setTimeout(()=>{e(1)},c)});var je={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},Ee={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function Be(...c){let e="DeepbookV3_Utils_Sdk###"}function Q(c){return c.data}function et(c){if(c.error&&"object_id"in c.error&&"version"in c.error&&"digest"in c.error){let{error:e}=c;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function tt(c){if(c.error&&"object_id"in c.error&&!("version"in c.error)&&!("digest"in c.error))return c.error.object_id}function ve(c){if("reference"in c)return c.reference;let e=Q(c);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:et(c)}function Me(c){return"objectId"in c?c.objectId:ve(c)?.objectId??tt(c)}function ur(c){return"version"in c?c.version:ve(c)?.version}function rt(c){return c.data!==void 0}function nt(c){return c.content!==void 0}function lr(c){let e=Q(c);if(e?.content?.dataType==="package")return e.content.disassembled}function le(c){let e="data"in c?Q(c):c;if(!(!e||!nt(e)||e.content.dataType!=="moveObject"))return e.content}function st(c){return le(c)?.type}function dr(c){let e=rt(c)?c.data:c;return!e?.type&&"data"in c?e?.content?.dataType==="package"?"package":st(c):e?.type}function pr(c){return Q(c)?.previousTransaction}function gr(c){return Q(c)?.owner}function mr(c){let e=Q(c)?.display;return e||{data:null,error:null}}function Pe(c){let e=le(c)?.fields;if(e)return"fields"in e?e.fields:e}function br(c){return le(c)?.hasPublicTransfer??!1}import{Transaction as it}from"@mysten/sui/transactions";async function fr(c,e=!0){c.blockData.transactions.forEach((t,r)=>{})}var V=class{static async adjustTransactionForGas(e,t,r,n){n.setSender(e.senderAddress);let i=E.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(i.length===0)throw new Error("Insufficient balance");let s=E.calculateTotalBalance(t);if(s-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(n);if(E.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),i.map(u=>u.coinObjectId)).selectedCoins.length===0){let u=BigInt(o)+BigInt(500);if(s-r<u){if(r-=u,r<0)throw new Error("gas Insufficient balance");let p=new it;return{fixAmount:r,newTx:p}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,n,i=!0,s=!1){let o=E.getCoinAssets(n,t);if(r===BigInt(0)&&o.length===0)return V.buildZeroValueCoin(t,e,n,i);let a=E.calculateTotalBalance(o);if(a<r)throw new Error(`The amount(${a}) is Insufficient balance for ${n} , expect ${r} `);return V.buildCoin(e,t,o,r,n,i,s)}static buildCoin(e,t,r,n,i,s=!0,o=!1){if(E.isSuiCoin(i)){if(s){let y=e.splitCoins(e.gas,[e.pure.u64(n)]);return{targetCoin:e.makeMoveVec({elements:[y]}),remainCoins:t,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(n===0n&&r.length>1){let y=E.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.object(y.objectArray[0]),remainCoins:y.remainCoins,tragetCoinAmount:y.amountArray[0],isMintZeroCoin:!1}}let f=E.selectCoinObjectIdGreaterThanOrEqual(r,n);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(n)]),remainCoins:f.remainCoins,tragetCoinAmount:n.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let a=E.selectCoinObjectIdGreaterThanOrEqual(r,n),u=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),p=a.objectArray;if(s)return{targetCoin:e.makeMoveVec({elements:p.map(f=>e.object(f))}),remainCoins:a.remainCoins,tragetCoinAmount:a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),isMintZeroCoin:!1};let[l,...m]=p,g=e.object(l),b=g,_=a.amountArray.reduce((f,w)=>Number(f)+Number(w),0).toString(),A;return m.length>0&&e.mergeCoins(g,m.map(f=>e.object(f))),o&&Number(u)>Number(n)&&(b=e.splitCoins(g,[e.pure.u64(n)]),_=n.toString(),A=g),{targetCoin:b,remainCoins:a.remainCoins,originalSplitedCoin:A,tragetCoinAmount:_,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,n=!0){let i=V.callMintZeroValueCoin(t,r),s;return n?s=t.makeMoveVec({elements:[i]}):s=i,{targetCoin:s,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,n,i=!0){let s=E.getCoinAssets(n,t);if(r.amountFirst===BigInt(0))return s.length>0?V.buildCoin(e,[...t],[...s],r.amountFirst,n,i):V.buildZeroValueCoin(t,e,n,i);let o=E.calculateTotalBalance(s);if(o>=r.amountFirst)return V.buildCoin(e,[...t],[...s],r.amountFirst,n,i);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${n} , expect ${r.amountSecond} `);return V.buildCoin(e,[...t],[...s],r.amountSecond,n,i)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let n=[];n.push(e[0],e[1]),r.push(n)}else{let n=[];n.push(e[0],e[e.length-1]),r.push(n);for(let i=1;i<e.length-1;i+=1){if(t[i-1]===0)continue;let s=[];s.push(e[0],e[i],e[e.length-1]),r.push(s)}}return r}},N=V;ge(N,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));var de=1e6,R=1e9,ut={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},lt={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},X=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?lt:ut}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new O,t=e.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`});return e.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[e.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),t],typeArguments:[]}),e.moveCall({target:"0x2::transfer::public_share_object",arguments:[t],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),e}createAndDepsit({account:e,coin:t,amountToDeposit:r}){let n=new O;n.setSenderIfNotSet(e);let i=n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),s=qe({type:t.coinType,balance:BigInt(r)});return n.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[i,s],typeArguments:[t.coinType]}),n.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[n.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i],typeArguments:[]}),n.moveCall({target:"0x2::transfer::public_share_object",arguments:[i],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),n}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:n,tx:i}){let s=i||new O;if(t){s.setSenderIfNotSet(e);let o=qe({type:r.coinType,balance:BigInt(n)});return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s.object(t),o],typeArguments:[r.coinType]}),s}return null}withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:n,returnAssets:i,txb:s}){let o=s||new O,a=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(n)],typeArguments:[r.coinType]});return i?a:(o.transferObjects([a],e),o)}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new O}){for(let n in t)t[n].forEach(s=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(n),r.pure.u64(s.amount)],typeArguments:[s.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,n=this.getCache(r,t);if(!t&&n!==void 0)return n;try{let i=new O;i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),i.pure.address(e)],typeArguments:[]});let a=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}))?.events?.filter(p=>p.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],u=[];return a.forEach(p=>{u.push({balanceManager:p,cetusBalanceManager:""})}),this.updateCache(r,u,864e5),u||[]}catch(i){throw i instanceof Error?i:new Error(String(i))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new O){let n=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::generate_proof_as_owner`,arguments:[r.object(t)]});return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::withdraw_settled_amounts`,arguments:[r.object(e.address),r.object(t),n],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let n=new O;r.forEach(o=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[n.object(t)],typeArguments:[o.coinType]})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n}),s={};return i.results?.forEach((o,a)=>{let u=r[a],p=o.returnValues[0][0],l=h.U64.parse(new Uint8Array(p)),m=d(l),g=m.eq(0)?"0":m.div(Math.pow(10,u.decimals)).toString();s[u.coinType]={adjusted_balance:g,balance:m.toString()}}),s}catch(n){throw n instanceof Error?n:new Error(String(n))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new O,n=await this.getBalanceManager(e,!0);if(!Array.isArray(n)||n.length===0)return{};n.forEach(o=>{t.forEach(a=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[a.coinType]})})});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),s={};return n.forEach((o,a)=>{let u={},p=a*t.length;t.forEach((l,m)=>{let g=p+m,b=i.results?.[g];if(b){let _=b.returnValues[0][0],A=h.U64.parse(new Uint8Array(_)),f=d(A),w=f.eq(0)?"0":f.div(Math.pow(10,l.decimals)).toString();u[l.coinType]={adjusted_balance:w,balance:f.toString()}}}),s[o.balanceManager]=u}),s}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new O;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let n=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],i=Number(h.U64.parse(new Uint8Array(n))),s=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return d(i).mul(s).div(o).div(R).toString()}catch(t){return Be("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let n=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),i=/<([^>]+)>/,s=[];return n?.data?.forEach(o=>{let a=o?.parsedJson,u=o.type.match(i);if(u){let l=u[1].split(", ");s.push({...a,baseCoinType:l[0],quoteCoinType:l[1]})}}),this.updateCache(t,s,864e5),s}async getQuoteQuantityOut(e,t,r){let n=new O;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(de).toString(),baseQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getBaseQuantityOut(e,t,r){let n=new O;n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[n.object(e.address),n.pure.u64(t),n.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:n}),s=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),o=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[1][0]))),a=String(h.U64.parse(new Uint8Array(i.results[0].returnValues[2][0])));return{quoteQuantityDisplay:d(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(s).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(a).div(de).toString(),quoteQuantity:t,baseOut:s,quoteOut:o,deepRequired:a}}async getQuantityOut(e,t,r,n){let i=new O;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.pure.u64(r),i.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:n,transactionBlock:i}),o=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),a=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=Number(h.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:d(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:d(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:d(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:d(a).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:d(u).div(de).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:a,deepRequired:u}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,n=e.quoteCoin.coinType,i=this._deep.coinType;for(let s=0;s<t.length;s++){let o=t[s];if(o.address===e.address)continue;let a=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===i&&(a.includes(r)||a.includes(n)))return o}return null}async updateDeepPrice(e,t){let r=await this.getReferencePool(e);return r?(t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::add_deep_price_point`,arguments:[t.object(e.address),t.object(r.pool_id),t.object(q)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,n,i,s,o){let a=this.deepCoin;try{let{taker_fee:u,maker_fee:p}=e,l=d(u).div(R).toString(),m=d(p).div(R).toString(),g=await this.getMarketPrice(e),b=s?r:g!=="0"?g:o;if(b==="0")throw new Error("Cannot get market price");let _=Math.pow(10,e.baseCoin.decimals).toString(),A=Math.pow(10,e.quoteCoin.decimals).toString(),f=d(b).div(_).mul(A).mul(R).toString();if(n){let T=await this.getMarketPrice(e),k=d(s?r:T!=="0"?T:o).div(_).mul(A).mul(R).toString(),B=await this.getOrderDeepPrice(e);if(!B)throw new Error("Cannot get deep price");let M=ue(k,r),D=d(t).mul(d(l)).mul(d(B.deep_per_asset)).div(d(R)),P=d(t).mul(d(m)).mul(d(B.deep_per_asset)).div(d(R));B.asset_is_base||(D=D.mul(M).div(d(R)),P=P.mul(M).div(d(R)));let I=D.ceil().toString(),Z=P.ceil().toString();return{takerFee:I,makerFee:Z,takerFeeDisplay:G(I,a.decimals).toString(),makerFeeDisplay:G(Z,a.decimals).toString(),feeType:a.coinType}}if(i){let T=ue(f,r),j=d(t).mul(T).mul(d(l).mul(1.25)).div(d(R)).ceil().toFixed(0),k=d(t).mul(T).mul(d(m).mul(1.25)).div(d(R)).ceil().toFixed(0);return{takerFee:j,makerFee:k,takerFeeDisplay:G(j,e.quoteCoin.decimals).toString(),makerFeeDisplay:G(k,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let w=d(t).mul(d(l).mul(1.25)).ceil().toFixed(0),y=d(t).mul(d(m).mul(1.25)).ceil().toFixed(0);return{takerFee:w,makerFee:y,takerFeeDisplay:G(w,e.baseCoin.decimals).toString(),makerFeeDisplay:G(y,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(u){throw u instanceof Error?u:new Error(String(u))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,n=this.getCache(r);if(n!==void 0)return n;try{let i=new O,s=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,i)&&(s=!0),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[i.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:i}),a=s?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],u=this.parseOrderDeepPrice(new Uint8Array(a));return this.updateCache(r,u,6e4),u}catch{return await Se(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,n=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:n}}getCoinAssets(e,t,r,n){return N.buildCoinForAmount(n,r,BigInt(d(t).abs().ceil().toString()),e,!1,!0).targetCoin}async getTransactionRelatedBalance(e,t,r,n,i,s,o){let a=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let u=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];n&&u.push(a);let p=await this.getManagerBalance({account:i,balanceManager:o,coins:u}),l=p?.[t]?.balance||"0",m=p?.[r]?.balance||"0",g=s&&p?.[a.coinType]?.balance||"0";return{baseManagerBlance:l,quoteManagerBlance:m,feeManaerBalance:g}}catch(u){throw u instanceof Error?u:new Error(String(u))}}getFeeAsset(e,t,r,n,i,s,o,a,u,p){let l=d(e).gt(0)&&u,m="0";if(!l)return{feeAsset:this.getEmptyCoin(p,t),haveDepositFee:"0"};if(s||o){let g=d(i).sub(s?n:r);m=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else m=d(i).sub(e).lt("0")?d(i).sub(e).abs().toString():"0";return{feeAsset:d(m).gt("0")?this.getCoinAssets(t,m,a,p):this.getEmptyCoin(p,t),haveDepositFee:m}}async getTransactionRelatedAssets(e,t,r,n,i,s,o,a,u){try{let p=this.deepCoin,l=U(e.baseCoin.coinType),m=U(e.quoteCoin.coinType),g=l===p.coinType,b=m===p.coinType,_=!g&&!b,{baseManagerBlance:A,quoteManagerBlance:f,feeManaerBalance:w}=await this.getTransactionRelatedBalance(e,l,m,_,s,o,a);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:A,quoteManagerBlance:f});let y,T,j=!1,k=await this._sdk.getOwnerCoinAssets(s);if(i){o||(r=d(r).add(d(n)).toString());let M=d(f).sub(r).toString();d(M).lt(0)?(j=!0,T=this.getCoinAssets(m,M,k,u)):T=this.getEmptyCoin(u,m),y=this.getEmptyCoin(u,l)}else{o||(t=d(t).add(d(n)).toString());let M=d(A).sub(t).toString();d(M).lt(0)?(j=!0,y=this.getCoinAssets(l,M,k,u)):y=this.getEmptyCoin(u,l),T=this.getEmptyCoin(u,m)}let B=this.getFeeAsset(n,p.coinType,t,r,w,b,g,k,o,u);return{baseAsset:y,quoteAsset:T,feeAsset:B,haveDeposit:j}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getMarketTransactionRelatedAssets(e,t,r,n,i,s,o,a,u,p){try{let l=this.deepCoin,m=U(e.baseCoin.coinType),g=U(e.quoteCoin.coinType),b=m===l.coinType,_=g===l.coinType,A=!b&&!_,f=await this.getTransactionRelatedBalance(e,m,g,A,s,o,a),{feeManaerBalance:w}=f,y=d(f.baseManagerBlance).add(d(p?.base||"0")).toString(),T=d(f.quoteManagerBlance).add(d(p?.quote||"0")).toString(),j=await this._sdk.getOwnerCoinAssets(s),k;o&&d(w).lt(n)?k=this.getCoinAssets(l.coinType,d(n).sub(w).toString(),j,u):k=this.getEmptyCoin(u,l.coinType);let B,M;if(i){o||(r=d(r).add(d(n)).toString());let D=d(T).sub(r).toString();if(d(D).lt(0)){let P;d(T).gt(0)&&(P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:T,returnAssets:!0,txb:u}));let I=this.getCoinAssets(g,D,j,u);P&&u.mergeCoins(I,[P]),M=I}else M=this.withdrawFromManager({account:s,balanceManager:a,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:u});B=this.getEmptyCoin(u,m)}else{o||(t=d(t).add(d(n)).toString());let D=d(y).sub(t).toString();if(d(D).lt(0)){let P;d(y).gt(0)&&(P=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:y,returnAssets:!0,txb:u}));let I=this.getCoinAssets(m,D,j,u);P&&u.mergeCoins(I,[P]),B=I}else B=this.withdrawFromManager({account:s,balanceManager:a,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:u});M=this.getEmptyCoin(u,g)}return{baseAsset:B,quoteAsset:M,feeAsset:k}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:n,isBid:i,maxFee:s,account:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8}){try{let p=this.deepCoin,l=e.address,m=e.baseCoin.decimals,g=e.quoteCoin.decimals,b=e.baseCoin.coinType,_=e.quoteCoin.coinType,A=d(t).mul(10**(g-m+9)).toString(),f=U(b),w=U(_),y=new O,T,j,k=await this._sdk.getOwnerCoinAssets(o);if(i){let P=d(t).mul(d(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();a||(P=d(P).add(d(s)).toString()),j=N.buildCoinForAmount(y,k,BigInt(P),w,!1,!0)?.targetCoin}else{let P=r;a||(P=d(r).abs().add(d(s)).toString()),T=N.buildCoinForAmount(y,k,BigInt(d(P).abs().toString()),f,!1,!0)?.targetCoin}let B=a?d(s).gt(0)?N.buildCoinForAmount(y,k,BigInt(d(s).abs().ceil().toString()),p.coinType,!1,!0).targetCoin:this.getEmptyCoin(y,p.coinType):this.getEmptyCoin(y,p.coinType),M=y.moveCall({typeArguments:[i?b:_],target:"0x2::coin::zero",arguments:[]}),D=[y.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),y.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),y.object(l),i?M:T,i?j:M,B,y.pure.u8(n),y.pure.u8(0),y.pure.u64(A),y.pure.u64(r),y.pure.bool(i),y.pure.bool(!1),y.pure.u64(u),y.object(q)];return y.moveCall({typeArguments:[f,w],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:D}),y}catch(p){throw p instanceof Error?p:new Error(String(p))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:n,account:i,payWithDeep:s,slippage:o=.01}){try{let a=e.address,u=e.baseCoin.coinType,p=e.quoteCoin.coinType,l=U(u),m=U(p),g=new O,b,_,A=t,f,w=await this.getOrderBook(e,"all",6);if(r){let k=w?.ask?.[0]?.price||"0",B=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(B).plus(d(B).mul(o)).ceil().toString()}else{let k=await w?.bid?.[0]?.price||"0",B=d(k).mul(d(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();f=d(B).minus(d(B).mul(o)).floor().toString()}let y=await this._sdk.getOwnerCoinAssets(i);r?(s||(f=d(f).add(d(n)).toString()),_=this.getCoinAssets(m,f,y,g),b=this.getEmptyCoin(g,l)):(s||(A=d(A).add(d(n)).toString()),_=this.getEmptyCoin(g,m),b=this.getCoinAssets(l,A,y,g));let T=s?d(n).gt(0)?N.buildCoinForAmount(g,y,BigInt(d(n).abs().ceil().toString()),this.deepCoin.coinType,!1,!0).targetCoin:this.getEmptyCoin(g,this.deepCoin.coinType):this.getEmptyCoin(g,this.deepCoin.coinType),j=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(a),b,_,T,g.pure.u8(0),g.pure.u64(t),g.pure.bool(r),g.pure.bool(s),g.pure.u64(f),g.object(q)];return g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:j}),g}catch(a){throw a instanceof Error?a:new Error(String(a))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:n,isBid:i,orderType:s,maxFee:o,account:a,payWithDeep:u,expirationTimestamp:p=Date.now()+31536e8}){try{let l=this.deepCoin,m=d(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),g=t.baseCoin.coinType,b=t.quoteCoin.coinType,_=new O,A=i?d(r).mul(d(n).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",f=i?"0":n,{baseAsset:w,quoteAsset:y,feeAsset:T,haveDeposit:j}=await this.getTransactionRelatedAssets(t,f,A,o,i,a,u,e,_);if(j){let M=[_.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),_.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),_.object(t.address),_.object(e),w,y,T.feeAsset,_.pure.u8(s),_.pure.u8(0),_.pure.u64(m),_.pure.u64(n),_.pure.bool(i),_.pure.bool(u),_.pure.u64(p),_.object(q)];return _.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:M}),_}let k=new O;d(T.haveDepositFee).gt(0)&&this.depositIntoManager({account:a,balanceManager:e,coin:l,amountToDeposit:T.haveDepositFee,tx:k});let B=[k.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),k.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),k.object(t.address),k.object(e),k.pure.u8(s),k.pure.u8(0),k.pure.u64(m),k.pure.u64(n),k.pure.bool(i),k.pure.bool(u),k.pure.u64(p),k.object(q)];return k.moveCall({typeArguments:[g,b],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:B}),k}catch(l){throw l instanceof Error?l:new Error(String(l))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:n}){let i=new O;return i.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),i.object(e),i.object(t.address),i.pure.u128(r),i.pure.u64(n),i.object(q)]}),i}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new O,i=await this.getMarketPrice(e),s=d(i).gt(0)?i:Math.pow(10,-1),o=Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(a),n.pure.u64(u),n.pure.bool(!1),n.object(q)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.vector(h.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],A=h.vector(h.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),T=d(A[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:T})}),m?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,n=new O,i=await this.getMarketPrice(e),s=d(i).gt(0)?d(i).div(3).toNumber():Math.pow(10,-6),o=d(i).gt(0)?i:Math.pow(10,6),a=d(s).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),u=d(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[n.object(e.address),n.pure.u64(L(a,0)),n.pure.u64(L(u,0)),n.pure.bool(!0),n.object(q)],typeArguments:[t.coinType,r.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:n}),m=[],g=l.results[0].returnValues[0][0],b=h.vector(h.u64()).parse(new Uint8Array(g)),_=l.results[0].returnValues[1][0],A=h.vector(h.u64()).parse(new Uint8Array(_));return b.forEach((f,w)=>{let y=d(f).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),T=d(A[w]).div(Math.pow(10,t.decimals)).toString();m.push({price:y,quantity:T})}),m?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:n}=e,i=new O,s=await this.getMarketPrice(e),o,a;t?(o=d(s).gt(0)?d(s).div(3).toNumber():Math.pow(10,-6),a=d(s).gt(0)?s:Math.pow(10,6)):(o=d(s).gt(0)?s:Math.pow(10,-1),a=d(s).gt(0)?d(s).mul(3).toNumber():Math.pow(10,6));let u=d(o).mul(Math.pow(10,9+n.decimals-r.decimals)).toString(),p=d(a).mul(Math.pow(10,9+n.decimals-r.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(L(u,0)),i.pure.u64(L(p,0)),i.pure.bool(t),i.object(q)],typeArguments:[r.coinType,n.coinType]});let l=this._sdk.sdkOptions.simulationAccount.address,m=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:i}),g=[],b=m.results[0].returnValues[0][0],_=h.vector(h.u64()).parse(new Uint8Array(b)),A=m.results[0].returnValues[1][0],f=h.vector(h.u64()).parse(new Uint8Array(A));return _.forEach((w,y)=>{let T=d(w).div(Math.pow(10,9+n.decimals-r.decimals)).toString(),j=d(f[y]).div(Math.pow(10,r.decimals)).toString();g.push({price:T,quantity:j})}),g?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:n,isBid:i,maxFee:s,account:o,payWithDeep:a,slippage:u=.01,settled_balances:p={base:"0",quote:"0"}}){try{let l=U(t.baseCoin.coinType),m=U(t.quoteCoin.coinType),g=new O;p&&(d(p.base).gt(0)||d(p.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},g);let{baseAsset:b,quoteAsset:_,feeAsset:A}=await this.getMarketTransactionRelatedAssets(t,r,n,s,i,o,a,e,g,p),f=await this.getOrderBook(t,"all",6);if(i){let T=f?.ask?.[0]?.price||"0",j=d(T).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(j).plus(d(j).mul(u)).ceil().toString()}else{let T=await f?.bid?.[0]?.price||"0",j=d(T).mul(d(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();n=d(j).minus(d(j).mul(u)).floor().toString()}let w=n,y=[g.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),g.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),g.object(t.address),g.object(e),b,_,A,g.pure.u8(0),g.pure.u64(r),g.pure.bool(i),g.pure.bool(a),g.pure.u64(w),g.object(q)];return g.setSenderIfNotSet(o),g.moveCall({typeArguments:[l,m],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:y}),g}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderInfoList(e,t){try{let r=new O;e.forEach(u=>{let p=u?.pool,l=u?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(p.pool_id),r.pure.u128(BigInt(l))],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),i=h.struct("ID",{bytes:h.Address}),s=h.struct("OrderDeepPrice",{asset_is_base:h.bool(),deep_per_asset:h.u64()}),o=h.struct("Order",{balance_manager_id:i,order_id:h.u128(),client_order_id:h.u64(),quantity:h.u64(),filled_quantity:h.u64(),fee_is_deep:h.bool(),order_deep_price:s,epoch:h.u64(),status:h.u8(),expire_timestamp:h.u64()}),a=[];return n?.results?.forEach(u=>{let p=u.returnValues[0][0],l=o.parse(new Uint8Array(p));a.push(l)}),a}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),n=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:n}}async getOpenOrder(e,t,r,n,i=!1,s=new O){let o;if(n)o=n;else{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[s.object(e.address),i?r:s.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let m=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:s})).results[i?1:0].returnValues[0][0];o=h.struct("VecSet",{constants:h.vector(h.U128)}).parse(new Uint8Array(m)).constants}if(o.length===0)return[];let a=o.map(l=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:l})),u=await this.getOrderInfoList(a,t)||[],p=[];return u.forEach(l=>{let m=this.decodeOrderId(BigInt(l.order_id));p.push({...l,price:m.price,isBid:m.isBid,pool:e})}),p}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),n=new O;r.forEach(l=>{n.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[n.object(l.pool_id),n.object(t)],typeArguments:[l.baseCoinType,l.quoteCoinType]})});let s=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:n})).results?.map(l=>l.returnValues?.[0]?.[0])||[],o=h.struct("VecSet",{constants:h.vector(h.U128)}),a=[];s.forEach((l,m)=>{let g=o.parse(new Uint8Array(l)).constants;g.length>0&&g.forEach(b=>{a.push({pool:r[m],orderId:b})})});let u=await this.getOrderInfoList(a,e)||[],p=[];return a.forEach((l,m)=>{let g=this.decodeOrderId(BigInt(l.orderId)),b=u.find(_=>_.order_id===l.orderId)||{};p.push({...l,...b,price:g.price,isBid:g.isBid})}),p}catch{return[]}}cancelOrders(e,t,r=new O){return e.forEach(n=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::cancel_order`,arguments:[r.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),r.object(t),r.object(n.poolInfo.address),r.pure.u128(n.orderId),r.object(q)],typeArguments:[n.poolInfo.baseCoin.coinType,n.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,n,i,s){let o=this._sdk.fullClient,u=await new ot({client:o,address:i,env:"testnet",balanceManagers:{test1:{address:s,tradeCap:""}}}).getLevel2Range(e,t,r,n)}processOrderBookData(e,t,r,n){let i=e.returnValues[0][0],s=h.vector(h.u64()).parse(new Uint8Array(i)),o=e.returnValues[1][0],a=h.vector(h.u64()).parse(new Uint8Array(o)),u={};return s.forEach((l,m)=>{let g=d(l).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),b=d(a[m]).div(Math.pow(10,t.decimals)).toString();u[g]?u[g]={price:g,quantity:d(u[g].quantity).add(b).toString()}:u[g]={price:g,quantity:b}}),Object.values(u)}getLevel2RangeTx(e,t,r,n,i=new O){let{baseCoin:s,quoteCoin:o}=e,a=L(d(r).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0),u=L(d(n).mul(Math.pow(10,9+o.decimals-s.decimals)).toString(),0);return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(a),i.pure.u64(u),i.pure.bool(t),i.object(q)],typeArguments:[s.coinType,o.coinType]}),i}async fetchOrderBook(e,t,r,n,i,s){let o=new O,{baseCoin:a,quoteCoin:u}=e;try{if(t==="bid"||t==="all"){let b=n,_=r==="0"?i:r;o=this.getLevel2RangeTx(e,!0,b,_,o)}if(t==="ask"||t==="all"){let b=r==="0"?n:r,_=i;o=this.getLevel2RangeTx(e,!1,b,_,o)}let p=this._sdk.sdkOptions.simulationAccount.address,l=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:o}),m=[];(t==="bid"||t==="all")&&(m=l.results?.[0]?this.processOrderBookData(l.results[0],a,u,s):[]);let g=[];if(t==="ask"||t==="all"){let b=t==="ask"?0:1;g=l.results?.[b]?this.processOrderBookData(l.results[b],a,u,s):[]}return{bid:m.sort((b,_)=>_.price-b.price),ask:g.sort((b,_)=>b.price-_.price)}}catch{let l=this._sdk.sdkOptions.simulationAccount.address,m=[],g=[];try{let b=this.getLevel2RangeTx(e,!0,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});m=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{m=[]}try{let b=this.getLevel2RangeTx(e,!1,n,r),_=await this._sdk.fullClient.devInspectTransactionBlock({sender:l,transactionBlock:b});g=_.results?.[0]?this.processOrderBookData(_.results[0],a,u,s):[]}catch{g=[]}return{bid:m,ask:g}}}async getOrderBook(e,t,r){let n={bid:[],ask:[]};try{let i=await this.getMarketPrice(e),s=t,o=Math.pow(10,-r),a=Math.pow(10,r),u=await this.fetchOrderBook(e,s,i,o,a,r);return{bid:u?.bid,ask:u?.ask}}catch{return n}}async getOrderBookOrigin(e,t){try{let r=new O,n=await this.getMarketPrice(e),{baseCoin:i,quoteCoin:s}=e;if(t==="bid"||t==="all"){let l=Math.pow(10,-6),m=n,g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!0),r.object(q)],typeArguments:[i.coinType,s.coinType]})}if(t==="ask"||t==="all"){let l=n,m=Math.pow(10,6),g=d(l).mul(Math.pow(10,9+s.decimals-i.decimals)).toString(),b=d(m).mul(Math.pow(10,9+s.decimals-i.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(g),r.pure.u64(b),r.pure.bool(!1),r.object(q)],typeArguments:[i.coinType,s.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,a=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),u=[];if(t==="bid"||t==="all"){let l=a.results[0]?.returnValues[0]?.[0],m=h.vector(h.u64()).parse(new Uint8Array(l)),g=a.results[0]?.returnValues[1]?.[0],b=h.vector(h.u64()).parse(new Uint8Array(g));m.forEach((_,A)=>{let f=d(_).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),w=d(b[A]).div(Math.pow(10,i.decimals)).toString();u.push({price:f,quantity:w})})}let p=[];if(t==="ask"||t==="all"){let l=t==="ask"?0:1,m=a.results[l]?.returnValues[0]?.[0],g=h.vector(h.u64()).parse(new Uint8Array(m)),b=a.results[l]?.returnValues[1]?.[0],_=h.vector(h.u64()).parse(new Uint8Array(b));g.forEach((A,f)=>{let w=d(A).div(Math.pow(10,9+s.decimals-i.decimals)).toString(),y=d(_[f]).div(Math.pow(10,i.decimals)).toString();p.push({price:w,quantity:y})})}return{bid:u,ask:p}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((n,i)=>[U(n.coinType),n]))}async getAccount(e,t,r=new O){for(let o=0;o<t.length;o++){let a=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(a.address),typeof e=="string"?r.object(e):e],typeArguments:[a.baseCoin.coinType,a.quoteCoin.coinType]})}let n=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),i;if(n?.events.length===0)return null;let s=[];return n?.events?.forEach((o,a)=>{i=o?.parsedJson;let u=i.account.open_orders.contents,p=i.account.owed_balances,l=i.account.settled_balances,m=i.account.unclaimed_rebates,g=i.account.taker_volume;s.push({balance_manager_id:e,open_orders:u,owed_balances:p,settled_balances:l,unclaimed_rebates:m,taker_volume:g,poolInfo:t[a]})}),s}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,n=this.getCache(r,t);if(n!==void 0)return n;let i;try{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{i=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,i,864e5),i}transformExtensions(e,t,r=!0){let n=[];for(let i of t){let{key:s}=i.fields,{value:o}=i.fields;if(s==="labels")try{o=JSON.parse(decodeURIComponent(ct.decode(o)))}catch{}r&&(e[s]=o),n.push({key:s,value:o})}delete e.extension_fields,r||(e.extensions=n)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,n=`${r}_getCoinConfigs`,i=this.getCache(n,e);if(i)return i;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(p=>p.objectId),a=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),u=[];return a.forEach(p=>{let l=this.buildCoinConfig(p,t);this.updateCache(`${r}_${l.address}_getCoinConfig`,l,864e5),u.push({...l})}),this.updateCache(n,u,864e5),u}buildCoinConfig(e,t=!0){let r=Pe(e);r=r.value.fields;let n={...r};return n.id=Me(e),n.address=$(r.coin_type.fields.name).full_address,r.pyth_id&&(n.pyth_id=at(r.pyth_id)),this.transformExtensions(n,r.extension_fields.fields.contents,t),delete n.coin_type,n}updateCache(e,t,r=3e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:n,quoteCoinType:i}){let s=new O,o=E.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",s);s.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[n,i],arguments:[s.object(this.sdk.sdkOptions.deepbook.registry_id),s.pure.u64(e),s.pure.u64(t),s.pure.u64(r),o]});try{let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:s});if(a.effects.status.status==="success")return s;if(a.effects.status.status==="failure"&&a.effects.status.error&&a.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(a){throw a instanceof Error?a:new Error(String(a))}return s}};import{CoinAssist as Ue}from"@cetusprotocol/common-sdk";import{bcs as S}from"@mysten/sui/bcs";import{Transaction as C}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as v,normalizeSuiAddress as Re}from"@mysten/sui/utils";var Fr=({totalAssetsValue:c,totalDebtValue:e})=>d(e).eq(0)||d(c).eq(0)?"0":d(c).div(d(e)).toString(),De=c=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i}=c.value.fields,{liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}=c.value.fields.risk_ratios.fields;return{id:c.id.id,name:c.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:n,user_liquidation_reward:i,liquidation_risk_ratio:s,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:a,target_liquidation_risk_ratio:u}},Ie=(c,e)=>{let{deposit_coin_type:t}=e,r=c.id.id,{max_utilization_rate:n,min_borrow:i,protocol_spread:s,supply_cap:o}=c.config.fields.margin_pool_config.fields,{maintainer_fees:a,protocol_fees:u}=c.protocol_fees.fields,{total_supply:p,total_borrow:l}=c.state.fields,m=d(o).sub(p).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:p,total_borrow:l,available_supply:m,max_utilization_rate:n,min_borrow:i,protocol_spread:s,maintainer_fees:a,protocol_fees:u}};import{SuiPriceServiceConnection as dt,SuiPythClient as pt}from"@pythnetwork/pyth-sui-js";var pe=10n;function gt(c,e){if(!pe)throw new Error("oraclePriceMultiplierDecimal is required");if(c===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(pe- -e);return c*t}return c/10n**(e+pe)}var H=class{_sdk;connection;suiPythClient;hasChangeConnection=!1;_cache={};constructor(e){this._sdk=e,this.connection=new dt(this.sdk.sdkOptions.pythUrl),this.suiPythClient=new pt(this._sdk.fullClient,this._sdk.sdkOptions.margin_utils.pyth_state_id,this._sdk.sdkOptions.margin_utils.wormhole_state_id)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,n=null;try{r=await this.connection.getPriceFeedsUpdateData(e)}catch(o){n=o}if(r==null)throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes. Detailed error: ${n?.message}`);let i=[];try{i=await this.suiPythClient.updatePriceFeeds(t,r,e)}catch(o){throw new Error(`All Pyth price nodes are unavailable. Cannot fetch price data. Please switch to or add new available Pyth nodes in the pythUrls parameter when initializing AggregatorClient, for example: new AggregatorClient({ pythUrls: ["https://your-pyth-node-url"] }). Detailed error: ${o}`)}let s=new Map;for(let o=0;o<e.length;o++)s.set(e[o],i[o]);return s}priceCheck(e,t=60){let r=Math.floor(Date.now()/1e3);if(!(Math.abs(r-e.last_update_time)>t))return e}async getLatestPrice(e,t=!1){let r={},n=[];if(t?e.forEach(o=>{let a=this._sdk.getCache(`getLatestPrice_${o.coinType}`);a&&this.priceCheck(a,60)?r[o.coinType]=a:n.push(o.coinType)}):n=e.map(o=>o.coinType),n.length===0)return r;let i=e.map(o=>o.feed);return(await this.connection.getLatestPriceUpdates(i))?.parsed?.forEach((o,a)=>{let u=o.price;if(u){let{price:p,expo:l}=u,m=d(p).mul(d(10).pow(d(l))).toString(),b={coin_type:e[a].coinType,price:m,oracle_price:0n,last_update_time:u.publish_time};b.oracle_price=gt(BigInt(p),BigInt(l)),r[n[a]]=b,this._sdk.updateCache(`getLatestPrice_${b.coin_type}`,b)}}),r}};var ee=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new H(e),this._deep=e.sdkOptions.network==="mainnet"?Ee:je}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new C){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");if(!e.baseCoin?.coinType||!e.quoteCoin?.coinType)throw new Error("Base and quote coin types are required");let{baseCoin:r,quoteCoin:n}=e;try{let{margin_manager:i,initializer:s}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:i,initializer:s,baseCoin:r,quoteCoin:n},t),{tx:t,margin_manager:i,initializer:s}}catch(i){throw new Error(`Failed to create and share margin manager: ${i instanceof Error?i.message:String(i)}`)}}createMarginManager(e,t=new C){if(!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:n,quoteCoin:i}=e;try{let[s,o]=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::create_margin_manager`,arguments:[t.object(this.sdk.sdkOptions.margin_utils.versioned_id),t.object(r),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),t.object(v)],typeArguments:[n.coinType,i.coinType]});return{tx:t,margin_manager:s,initializer:o}}catch(s){throw new Error(`Failed to create margin manager: ${s instanceof Error?s.message:String(s)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:n},i=new C){try{return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,n.coinType]}),i}catch(s){throw new Error(`Failed to share margin manager: ${s instanceof Error?s.message:String(s)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
|
|
2
2
|
query Events($filter: EventFilter) {
|
|
3
3
|
events(filter: $filter) {
|
|
4
4
|
nodes {
|
|
@@ -12,4 +12,4 @@ var Ve=Object.defineProperty;var Ne=(c,e,t)=>e in c?Ve(c,e,{enumerable:!0,config
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
`,r={filter:{sender:e,type:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::BalanceManagerEvent`}};try{let n=await this.sdk.graphqlClient.query({query:t,variables:r});return n?.data?.events?.nodes?n.data.events.nodes.map(s=>s?.contents?.json):[]}catch(n){throw new Error(`Failed to query balance managers: ${n instanceof Error?n.message:String(n)}`)}}async getMarginManagerByAccount(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::CreateMarginManagerEvent`}))?.data||[]).filter(i=>i.parsedJson?.owner===e).map(i=>i?.parsedJson)}catch(t){throw new Error(`Failed to get margin managers by account: ${t instanceof Error?t.message:String(t)}`)}}async getBaseBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getQuoteBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get quote balance: ${s instanceof Error?s.message:String(s)}`)}}async getDeepBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::borrowed_shares`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||s.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);let o=S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])),a=S.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]));return{baseBorrowedShare:o,quoteBorrowedShare:a}}catch(s){throw new Error(`Failed to get borrowed shares: ${s instanceof Error?s.message:String(s)}`)}}managerState=({account:e,marginManager:t,baseCoin:r,quoteCoin:n,pool:i,baseMarginPool:s,quoteMarginPool:o,decimals:a=6,basePriceFeedObjectId:u,quotePriceFeedObjectId:p})=>l=>{l.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::manager_state`,arguments:[l.object(t),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(u),l.object(p),l.object(i),l.object(s),l.object(o),l.object.clock()],typeArguments:[r.coinType,n.coinType]})};async getManagerState(e,t=new C){let{account:r,marginManager:n,baseCoin:i,quoteCoin:s,pool:o,baseMarginPool:a,quoteMarginPool:u,decimals:p=6}=e;if(!r||!n||!o||!a||!u)throw new Error("All required parameters must be provided");if(!i?.feed||!s?.feed)throw new Error("Base and quote coin feeds are required");if(!i.scalar||!s.scalar)throw new Error("Base and quote coin scalars are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],t),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");t.add(this.managerState({...e,basePriceFeedObjectId:m,quotePriceFeedObjectId:g}));let b=await this.sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:t});if(!b.results||!b.results[0]||!b.results[0].returnValues||b.results[0].returnValues.length<14)throw new Error(`Failed to get margin manager state: ${b.effects?.status?.error||"Unknown error"}`);let _=Re(S.Address.parse(new Uint8Array(b.results[0].returnValues[0][0]))),A=Re(S.Address.parse(new Uint8Array(b.results[0].returnValues[1][0]))),f=Number(S.U64.parse(new Uint8Array(b.results[0].returnValues[2][0])))/1e9,w=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[3][0]))),i.scalar,p),y=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[4][0]))),s.scalar,p),T=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[5][0]))),i.scalar,p),j=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[6][0]))),s.scalar,p),k=S.U64.parse(new Uint8Array(b.results[0].returnValues[7][0])),B=Number(S.u8().parse(new Uint8Array(b.results[0].returnValues[8][0]))),M=S.U64.parse(new Uint8Array(b.results[0].returnValues[9][0])),D=Number(S.u8().parse(new Uint8Array(b.results[0].returnValues[10][0]))),P=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[11][0]))),I=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[12][0]))),Z=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[13][0])));return{managerId:_,deepbookPoolId:A,riskRatio:f,baseAsset:w,quoteAsset:y,baseDebt:T,quoteDebt:j,basePythPrice:k.toString(),basePythDecimals:B,quotePythPrice:M.toString(),quotePythDecimals:D,currentPrice:P,lowestTriggerAbovePrice:I,highestTriggerBelowPrice:Z}}catch(l){throw new Error(`Failed to get manager state: ${l instanceof Error?l.message:String(l)}`)}}async calculateAssets({account:e,marginManager:t,pool:r,baseCoin:n,quoteCoin:i,decimals:s=6}){if(!e||!t||!r)throw new Error("Account, marginManager, and pool are required");if(!n?.coinType||!i?.coinType)throw new Error("Base and quote coin types are required");let o=new C;try{o.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::calculate_assets`,arguments:[o.object(t),o.object(r)],typeArguments:[n.coinType,i.coinType]});let a=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:o});if(!a.results||!a.results[0]||!a.results[0].returnValues||a.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${a.effects?.status?.error||"Unknown error"}`);let u=a.results[0].returnValues[0][0],p=a.results[0].returnValues[1][0];if(!n.scalar||!i.scalar)throw new Error("Base and quote coin scalars are required");let l=S.U64.parse(new Uint8Array(u)),m=S.U64.parse(new Uint8Array(p));return{baseAsset:l.toString(),quoteAsset:m.toString()}}catch(a){throw new Error(`Failed to calculate assets: ${a instanceof Error?a.message:String(a)}`)}}async getBorrowedAmount({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n,baseMarginPool:i,quoteMarginPool:s}){if(!e||!t||!r||!n||!i||!s)throw new Error("All parameters are required");try{let{baseBorrowedShare:o,quoteBorrowedShare:a}=await this.getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}),u=!!d(o).gt(d(a)),p=u?i:s,l=u?o:a,m=new C;m.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_pool::borrow_shares_to_amount`,arguments:[m.object(p),m.pure.u64(BigInt(l)),m.object.clock()],typeArguments:[u?r:n]});let g=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:m});if(!g.results||!g.results[0]||!g.results[0].returnValues||!g.results[0].returnValues[0])throw new Error(`Transaction failed: ${g.effects?.status?.error||"Unknown error"}`);let b=S.U64.parse(new Uint8Array(g.results[0].returnValues[0][0]));return u?{baseBorrowedAmount:b.toString(),quoteBorrowedAmount:"0"}:{baseBorrowedAmount:"0",quoteBorrowedAmount:b.toString()}}catch(o){throw new Error(`Failed to get borrowed amount: ${o instanceof Error?o.message:String(o)}`)}}async deposit({marginManager:e,baseCoin:t,quoteCoin:r,amount:n,depositCoinType:i},s=new C){if(!e)throw new Error("Margin manager is required");if(!t?.coinType||!r?.coinType)throw new Error("Base and quote coin types are required");if(!n||BigInt(n)<=0n)throw new Error("Valid deposit amount is required");if(!t.feed||!r.feed)throw new Error("Base and quote coin feeds are required");try{let o=Ue.buildCoinWithBalance(BigInt(n),i,s),a=await this.pythPrice.updatePythPriceIDs([t.feed,r.feed],s),u=a.get(t.feed),p=a.get(r.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::deposit`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?s.object(e):e,s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(u),s.object(p),o,s.object(v)],typeArguments:[t.coinType,r.coinType,i]}),s}catch(o){throw new Error(`Failed to deposit: ${o instanceof Error?o.message:String(o)}`)}}async withdraw({account:e,marginManager:t,baseMarginPool:r,quoteMarginPool:n,baseCoin:i,quoteCoin:s,pool:o,amount:a,withdrawCoinType:u},p=new C){if(!e||!t||!r||!n||!o)throw new Error("All required parameters must be provided");if(!i?.coinType||!s?.coinType)throw new Error("Base and quote coin types are required");if(!a||BigInt(a)<=0n)throw new Error("Valid withdraw amount is required");if(!i.feed||!s.feed)throw new Error("Base and quote coin feeds are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],p),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");let b=p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw`,arguments:[p.object(this._sdk.sdkOptions.margin_utils.global_config_id),p.object(this._sdk.sdkOptions.margin_utils.versioned_id),p.object(t),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(r),p.object(n),p.object(m),p.object(g),p.object(o),p.pure.u64(BigInt(a)),p.object(v)],typeArguments:[i.coinType,s.coinType,u]});return p.transferObjects([b],e),p}catch(l){throw new Error(`Failed to withdraw: ${l instanceof Error?l.message:String(l)}`)}}async borrowBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C){if(!e||!t||!i)throw new Error("Margin manager, base margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_base`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow base: ${a instanceof Error?a.message:String(a)}`)}}async borrowQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C){if(!e||!t||!i)throw new Error("Margin manager, quote margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_quote`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?o.object(e):e,o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow quote: ${a instanceof Error?a.message:String(a)}`)}}async repayBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, baseMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:r.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_base`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay base: ${a instanceof Error?a.message:String(a)}`)}}async repayQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, quoteMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:n.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_quote`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay quote: ${a instanceof Error?a.message:String(a)}`)}}async repay({marginManager:e,baseMarginPool:t,quoteMarginPool:r,baseCoin:n,quoteCoin:i,isBase:s,amount:o},a=new C){try{let u=this.sdk.senderAddress,p,l=o;o||(p=await this.getBorrowedAmount({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType,baseMarginPool:t,quoteMarginPool:r}),l=s?p.baseBorrowedAmount:p.quoteBorrowedAmount);let m,g={marginManager:e,baseCoin:n,quoteCoin:i,depositCoinType:s?n.coinType:i.coinType};if(s){let b=await this.getBaseBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}else{let b=await this.getQuoteBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}d(m).gt(0)&&await this.deposit({...g,amount:m},a),a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::${s?"repay_base":"repay_quote"}`,arguments:[a.object(this._sdk.sdkOptions.margin_utils.global_config_id),a.object(this._sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(s?t:r),a.object.option({type:"u64",value:o?a.pure.u64(o):null}),a.object(v)],typeArguments:[n.coinType,i.coinType]})}catch{}return a}async placeMarginMarketOrder({marginManager:e,poolInfo:t,selfMatchingOption:r,quantity:n,amountLimit:i,isBid:s,payWithDeep:o,exactBase:a},u=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!n||BigInt(W(n,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order quantity is required");if(!i||BigInt(W(i,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order amount limit is required");let{id:p,baseCoin:l,quoteCoin:m}=t;if(l.decimals===void 0||m.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{return u.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_market_order`,arguments:[u.object(this.sdk.sdkOptions.margin_utils.global_config_id),u.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?u.object(e):e,u.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),u.object(p),u.pure.u8(r),u.pure.u64(n),u.pure.bool(s),u.pure.bool(o),u.pure.bool(a===void 0?!s:a),u.pure.u64(i),u.object(v)],typeArguments:[l.coinType,m.coinType]}),u}catch(g){throw new Error(`Failed to place market order: ${g instanceof Error?g.message:String(g)}`)}}async placeMarginLimitOrder({marginManager:e,poolInfo:t,orderType:r,selfMatchingOption:n,priceInput:i,quantity:s,isBid:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8},p=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!i||!s)throw new Error("Price and quantity are required");let{id:l,baseCoin:m,quoteCoin:g}=t;if(m.decimals===void 0||g.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{let b=BigInt(d(i).mul(10**(g.decimals-m.decimals+9)).toString()),_=BigInt(W(s,m.decimals));if(b<=0n||_<=0n)throw new Error("Price and quantity must be greater than zero");return p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_limit_order`,arguments:[p.object(this.sdk.sdkOptions.margin_utils.global_config_id),p.object(this.sdk.sdkOptions.margin_utils.versioned_id),p.object(e),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(l),p.pure.u8(r),p.pure.u8(n),p.pure.u64(b),p.pure.u64(_),p.pure.bool(o),p.pure.bool(a),p.pure.u64(u),p.object(v)],typeArguments:[m.coinType,g.coinType]}),p}catch(b){throw new Error(`Failed to place limit order: ${b instanceof Error?b.message:String(b)}`)}}modifyMarginOrder({marginManager:e,poolInfo:t,orderId:r,newQuantity:n},i=new C){if(!e||!t||!r||!n)throw new Error("All parameters (marginManager, poolInfo, orderId, newQuantity) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(t.baseCoin.decimals===void 0)throw new Error("Base coin decimals are required");try{let s=BigInt(W(n,t.baseCoin.decimals));if(s<=0n)throw new Error("New quantity must be greater than zero");return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::modify_margin_order`,arguments:[i.object(this.sdk.sdkOptions.margin_utils.global_config_id),i.object(this.sdk.sdkOptions.margin_utils.versioned_id),i.object(e),i.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),i.object(t.id),i.pure.u128(r),i.pure.u64(s),i.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),i}catch(s){throw new Error(`Failed to modify order: ${s instanceof Error?s.message:String(s)}`)}}cancelMarginOrder({marginManager:e,poolInfo:t,orderId:r},n=new C){if(!e||!t||!r)throw new Error("All parameters (marginManager, poolInfo, orderId) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_margin_order`,arguments:[n.object(this.sdk.sdkOptions.margin_utils.global_config_id),n.object(this.sdk.sdkOptions.margin_utils.versioned_id),n.object(e),n.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),n.object(t.id),n.pure.u128(r),n.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),n}catch(i){throw new Error(`Failed to cancel order: ${i instanceof Error?i.message:String(i)}`)}}cancelAllMarginOrders({marginManager:e,poolInfo:t},r=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return r.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_all_margin_orders`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.global_config_id),r.object(this.sdk.sdkOptions.margin_utils.versioned_id),r.object(e),r.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t.id),r.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),r}catch(n){throw new Error(`Failed to cancel all orders: ${n instanceof Error?n.message:String(n)}`)}}placeReduceOnlyLimitOrder({marginManager:e,poolInfo:t,marginPoolId:r,orderType:n,selfMatchingOption:i,priceInput:s,quantity:o,isBid:a,payWithDeep:u,expirationTimestamp:p},l=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return l.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_limit_order`,arguments:[l.object(this.sdk.sdkOptions.margin_utils.global_config_id),l.object(this.sdk.sdkOptions.margin_utils.versioned_id),l.object(e),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(t.id),l.object(r),l.pure.u8(n),l.pure.u8(i),l.pure.u64(s),l.pure.u64(o),l.pure.bool(a),l.pure.bool(u),l.pure.u64(p),l.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,a?t.quoteCoin.coinType:t.baseCoin.coinType]}),l}catch(m){throw new Error(`Failed to place reduce only limit order: ${m instanceof Error?m.message:String(m)}`)}}placeReduceOnlyMarketOrder({marginManager:e,poolInfo:t,marginPoolId:r,selfMatchingOption:n,quantity:i,isBid:s,payWithDeep:o},a=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_market_order`,arguments:[a.object(this.sdk.sdkOptions.margin_utils.global_config_id),a.object(this.sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(t.id),a.object(r),a.pure.u8(n),a.pure.u64(i),a.pure.bool(s),a.pure.bool(o),a.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,s?t.quoteCoin.coinType:t.baseCoin.coinType]}),a}catch(u){throw new Error(`Failed to place reduce only market order: ${u instanceof Error?u.message:String(u)}`)}}async getAccountOpenOrders({poolInfo:e,marginManager:t}){try{let r=new C,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(t)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getOpenOrder(e,this.sdk.senderAddress,n,void 0,!0,r)}catch(r){throw new Error(`Failed to get account open orders: ${r instanceof Error?r.message:String(r)}`)}}async getAccountAllMarketsOpenOrders(e,t){try{if(!e||!t||t.length===0)throw new Error("Account or pools are required");let r=[];for(let n=0;n<t.length;n++){let i=new C,s=t[n];if(s.margin_manager_id){let o=await i.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[i.object(s.margin_manager_id)],typeArguments:[s.baseCoin.coinType,s.quoteCoin.coinType]}),a=await this.sdk.DeepbookUtils.getOpenOrder(s,this.sdk.senderAddress,o,void 0,!0,i);r.push(...a)}}return r}catch(r){throw new Error(`Failed to get account all markets open orders: ${r instanceof Error?r.message:String(r)}`)}}mintSupplierCap(e=new C,t){let r=e.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::mint_supplier_cap`,arguments:[e.object(this._sdk.sdkOptions.margin_utils.versioned_id),e.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),e.object(v)]});return t&&e.transferObjects([r],this.sdk.senderAddress),{tx:e,supplierCap:r}}async querySupplierCap(){try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::SupplierCapCreatedEvent`}))?.data||[]).filter(n=>n.parsedJson?.owner===this.sdk.senderAddress)[0].parsedJson.supplier_cap_id}catch(e){throw new Error(`Failed to get account supplyCap: ${e instanceof Error?e.message:String(e)}`)}}mintSupplierCapAndSupply({marginPool:e,supplyCoinType:t,amount:r}){let n=new C,{supplierCap:i}=this.mintSupplierCap(n,!1);return this.supply({marginPool:e,supplierCap:i,supplyCoinType:t,amount:r,tx:n}),n.transferObjects([i],this.sdk.senderAddress),n}supply({marginPool:e,supplierCap:t,supplyCoinType:r,amount:n,tx:i}){let s=i??new C;if(!t)throw new Error("Either supplierCap must be provided");let o=Ue.buildCoinWithBalance(BigInt(n),r,s);return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supply`,typeArguments:[r],arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),o,s.pure.option("address","0x0"),s.object(v)]}),s}supplierWithdraw({marginPool:e,withdrawCoinType:t,amount:r,supplierCapId:n,hasSwap:i,withdrawAll:s,tx:o=new C}){let a=o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supplier_withdraw`,typeArguments:[t],arguments:[o.object(this._sdk.sdkOptions.margin_utils.global_config_id),o.object(this._sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(n),o.object.option({type:"u64",value:s?null:o.pure.u64(r)}),o.object(v)]});return i?a:(o.transferObjects([a],this.sdk.senderAddress),o)}withdrawReferralFees({marginPool:e}){let t=new C,r=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw_referral_fees`,arguments:[t.object(this._sdk.sdkOptions.margin_utils.versioned_id),t.object(e),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object.option({type:"0x1",value:null}),t.object(v)],typeArguments:[this.deepCoin.coinType]});return t.transferObjects([r],this.sdk.senderAddress),t}async getUserSupplyAmount({marginPool:e,supplyCoin:t,supplierCapId:r}){let n=new C;n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::get_user_supply_amount`,typeArguments:[t.coinType],arguments:[n.object(e),n.object(r),n.object(v)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);return this.#e(BigInt(S.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),t.scalar,t.decimals)}async getDeepBookMarginRegistry(){let t=(await this.sdk.fullClient.getObject({id:this._sdk.sdkOptions.margin_utils.margin_registry_id,options:{showContent:!0}})).data.content.fields.inner.fields.id.id,r=await this.sdk.fullClient.getDynamicFieldObject({parentId:t,name:{type:"u64",value:"1"}}),n=r.data.content.fields.value.fields.pool_registry.fields.id.id,i=r.data.content.fields.value.fields.margin_pools.fields.id.id;return{pool_registry_table_id:n,margin_pool_table_id:i}}async getDeepBookPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.pool_registry_table_id}),t=e.map(i=>i.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[];for(let i=0;i<r.length;i++){let s=r[i].data.content.fields;n.push(De(s))}return n}async getDeepBookMarginPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.margin_pool_table_id}),t=e.map(a=>a.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[],i=[];for(let a=0;a<r.length;a++){let u=r[a].data.content.fields;i.push(u.value),n.push({deposit_coin_type:u.name.fields.name,id:u.id.id})}let s=await this.sdk.fullClient.batchGetObjects(i,{showContent:!0}),o=[];for(let a=0;a<s.length;a++){let u=s[a].data.content.fields;o.push(Ie(u,n[a]))}return o}async getBaseQuantityOutInput(e,t,r){let n=new C;n.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}${r?"::pool::get_base_quantity_out":"::pool::get_base_quantity_out_input_fee"}`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[n.object(e.address),n.pure.u64(t),n.object(v)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);let s=S.U64.parse(new Uint8Array(i.results[0].returnValues[0][0])),o=S.U64.parse(new Uint8Array(i.results[0].returnValues[1][0])),a=S.U64.parse(new Uint8Array(i.results[0].returnValues[2][0]));return{base_amount:s.toString(),quote_amount:o.toString(),deep_fee_amount:a.toString()}}async getQuoteQuantityOutInput(e,t){let r=new C;r.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::get_quote_quantity_out`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[r.object(e.address),r.pure.u64(t),r.object(v)]});let n=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:r});if(!n.results||!n.results[0]||!n.results[0].returnValues||!n.results[0].returnValues[0])throw new Error(`Transaction failed: ${n.effects?.status?.error||"Unknown error"}`);let i=S.U64.parse(new Uint8Array(n.results[0].returnValues[0][0])),s=S.U64.parse(new Uint8Array(n.results[0].returnValues[1][0])),o=S.U64.parse(new Uint8Array(n.results[0].returnValues[2][0]));return{base_amount:i.toString(),quote_amount:s.toString(),deep_fee_amount:o.toString()}}async getAccount(e,t){if(!e||!t)throw new Error("marginManager and poolInfo are required");let r=new C,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(e)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getAccount(n,[t],r)}async withdrawSettledAmounts({poolInfo:e,marginManager:t},r=new C){return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::pool_proxy::withdraw_settled_amounts`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t),r.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}#e(e,t,r){if(t<=0||r<0)throw new Error("Scalar must be positive and decimals must be non-negative");let n=BigInt(t),i=e/n,s=e%n;if(s===0n)return i.toString();let o=t.toString().length-1,p=s.toString().padStart(o,"0").slice(0,r).replace(/0+$/,"");return p?`${i}.${p}`:i.toString()}async getMarginPoolStateForInterest(e){if(!e)throw new Error("marginPoolId is required");let t=await this.sdk.fullClient.getObject({id:e,options:{showContent:!0}});if(!t.data?.content?.fields)throw new Error(`Failed to fetch margin pool: ${e}`);let r=t.data.content.fields,n=r.state.fields,i=r.config.fields,s=i.interest_config.fields,o=i.margin_pool_config.fields;return{poolState:{total_supply:BigInt(n.total_supply),total_borrow:BigInt(n.total_borrow),supply_shares:BigInt(n.supply_shares),borrow_shares:BigInt(n.borrow_shares),last_update_timestamp:BigInt(n.last_update_timestamp)},interestConfig:{base_rate:BigInt(s.base_rate),base_slope:BigInt(s.base_slope),optimal_utilization:BigInt(s.optimal_utilization),excess_slope:BigInt(s.excess_slope)},marginPoolConfig:{protocol_spread:BigInt(o.protocol_spread),max_utilization_rate:BigInt(o.max_utilization_rate),min_borrow:BigInt(o.min_borrow),supply_cap:BigInt(o.supply_cap)}}}async getChainTimestamp(){let e=await this.sdk.fullClient.getLatestCheckpointSequenceNumber(),t=await this.sdk.fullClient.getCheckpoint({id:e});return BigInt(t.timestampMs)}};import{SuiClient as bt}from"@mysten/sui/client";var te=class extends bt{async queryEventsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.queryEvents({query:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async getOwnedObjectsByPage(e,t,r="all"){let n=[],i=!0,s=r==="all",o=s?null:r.cursor;do{let a=await this.getOwnedObjects({owner:e,...t,cursor:o,limit:s?null:r.limit});a.data?(n=[...n,...a.data],i=a.hasNextPage,o=a.nextCursor):i=!1}while(s&&i);return{data:n,nextCursor:o,hasNextPage:i}}async getDynamicFieldsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.getDynamicFields({parentId:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async batchGetObjects(e,t,r=50){let n=[];try{for(let i=0;i<Math.ceil(e.length/r);i++){let s=await this.multiGetObjects({ids:e.slice(i*r,r*(i+1)),options:t});n=[...n,...s]}}catch{}return n}async calculationTxGas(e){let{sender:t}=e.blockData;if(t===void 0)throw Error("sdk sender is empty");let r=await this.devInspectTransactionBlock({transactionBlock:e,sender:t}),{gasUsed:n}=r.effects;return Number(n.computationCost)+Number(n.storageCost)-Number(n.storageRebate)}async sendTransaction(e,t){try{return await this.signAndExecuteTransaction({transaction:t,signer:e,options:{showEffects:!0,showEvents:!0}})}catch{}}};import $e from"decimal.js";$e.config({precision:64,rounding:$e.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var F=1000000000n,_t=365n*24n*60n*60n*1000n;function ht(c,e){return e===0n?0n:c*F/e}function yt(c,e){let{base_rate:t,base_slope:r,optimal_utilization:n,excess_slope:i}=e;if(c<n)return t+c*r/F;{let s=c-n,o=n*r/F,a=s*i/F;return t+o+a}}function Fe(c,e){let t=c*e,r=t/F;return t%F>0n?r+1n:r}function ft(c,e,t,r){let n=e.borrow_shares===0n?F:e.total_borrow*F/e.borrow_shares,i=Fe(c,n),s=ht(e.total_borrow,e.total_supply),o=yt(s,t),a=r-e.last_update_timestamp,u=e.total_borrow*o/F*a/_t,p=e.borrow_shares===0n?0n:Fe(u,c*F/e.borrow_shares),l=i+p;return{confirmedDebt:i,estimatedInterest:p,totalDebt:l,annualInterestRate:o}}function sn(c,e,t,r,n=60000n){let i=r+n,{totalDebt:s}=ft(c,e,t,i);return s}var re=class{_cache={};_rpcModule;_deepbookUtils;_marginUtils;_pythPrice;_graphqlClient;_sdkOptions;_senderAddress="";constructor(e){this._sdkOptions=e,this._rpcModule=new te({url:e.fullRpcUrl}),this._deepbookUtils=new X(this),this._marginUtils=new ee(this),this._pythPrice=new H(this),this._graphqlClient=new wt({url:e.graphqlUrl}),oe(this._sdkOptions)}get senderAddress(){return this._senderAddress}set senderAddress(e){this._senderAddress=e}get DeepbookUtils(){return this._deepbookUtils}get MarginUtils(){return this._marginUtils}get PythPrice(){return this._pythPrice}get fullClient(){return this._rpcModule}get graphqlClient(){return this._graphqlClient}get sdkOptions(){return this._sdkOptions}async getOwnerCoinAssets(e,t,r=!0){let n=[],i=null,s=`${this.sdkOptions.fullRpcUrl}_${e}_${t}_getOwnerCoinAssets`,o=this.getCache(s,r);if(o)return o;for(;;){let a=await(t?this.fullClient.getCoins({owner:e,coinType:t,cursor:i}):this.fullClient.getAllCoins({owner:e,cursor:i}));if(a.data.forEach(u=>{BigInt(u.balance)>0&&n.push({coinAddress:$(u.coinType).source_address,coinObjectId:u.coinObjectId,balance:BigInt(u.balance)})}),i=a.nextCursor,!a.hasNextPage)break}return this.updateCache(s,n,30*1e3),n}async getOwnerCoinBalances(e,t){let r=[];return t?r=[await this.fullClient.getBalance({owner:e,coinType:t})]:r=[...await this.fullClient.getAllBalances({owner:e})],r}updateCache(e,t,r=864e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}};var jn="0x0000000000000000000000000000000000000000000000000000000000000006",En="pool_script",Bn="pool_script_v2",vn="router",Mn="router_with_partner",Pn="fetcher_script",qn="expect_swap",Dn="utils",In="0x1::coin::CoinInfo",Un="0x1::coin::CoinStore",Rn="custodian_v2",$n="clob_v2",Fn="endpoints_v2",Vn=c=>{if(typeof c=="string"&&c.startsWith("0x"))return"object";if(typeof c=="number"||typeof c=="bigint")return"u64";if(typeof c=="boolean")return"bool";throw new Error(`Unknown type for value: ${c}`)};var kt=(n=>(n[n.NO_RESTRICTION=0]="NO_RESTRICTION",n[n.IMMEDIATE_OR_CANCEL=1]="IMMEDIATE_OR_CANCEL",n[n.FILL_OR_KILL=2]="FILL_OR_KILL",n[n.POST_ONLY=3]="POST_ONLY",n))(kt||{}),Ct=(r=>(r[r.SELF_MATCHING_ALLOWED=0]="SELF_MATCHING_ALLOWED",r[r.CANCEL_TAKER=1]="CANCEL_TAKER",r[r.CANCEL_MAKER=2]="CANCEL_MAKER",r))(Ct||{});var es=re;export{jn as CLOCK_ADDRESS,K as CachedContent,re as CetusClmmSDK,qn as ClmmExpectSwapModule,Pn as ClmmFetcherModule,En as ClmmIntegratePoolModule,Bn as ClmmIntegratePoolV2Module,vn as ClmmIntegrateRouterModule,Mn as ClmmIntegrateRouterWithPartnerModule,Dn as ClmmIntegrateUtilsModule,E as CoinAssist,In as CoinInfoAddress,Un as CoinStoreAddress,le as DEEP_SCALAR,Nt as DEFAULT_GAS_BUDGET_FOR_MERGE,Vt as DEFAULT_GAS_BUDGET_FOR_SPLIT,Gt as DEFAULT_GAS_BUDGET_FOR_STAKE,xt as DEFAULT_GAS_BUDGET_FOR_TRANSFER,Lt as DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI,zt as DEFAULT_NFT_TRANSFER_GAS_FEE,$n as DeepbookClobV2Moudle,Rn as DeepbookCustodianV2Moudle,Fn as DeepbookEndpointsV2Moudle,X as DeepbookUtilsModule,R as FLOAT_SCALAR,F as FLOAT_SCALING,Kt as GAS_SYMBOL,ae as GAS_TYPE_ARG,ye as GAS_TYPE_ARG_LONG,ee as MarginUtilsModule,Ut as NORMALIZED_SUI_COIN_TYPE,kt as OrderType,te as RpcModule,Qt as SUI_SYSTEM_STATE_OBJECT_ID,Ct as SelfMatchingOption,N as TransactionUtil,_t as YEAR_MS,me as addHexPrefix,nr as asIntN,rr as asUintN,St as bufferToHex,we as cacheTime1min,x as cacheTime24h,ke as cacheTime5min,sn as calc100PercentRepay,ft as calcDebtDetail,yt as calcInterestRate,ht as calcUtilizationRate,Fr as calculateRiskRatio,Ot as checkAddress,_e as composeType,d,ce as decimalsMultiplier,es as default,Dt as extractAddressFromType,$ as extractStructTagFromType,It as fixCoinType,L as fixDown,Je as fixSuiObjectId,G as fromDecimalsAmount,Vn as getDefaultSuiInputType,z as getFutureTime,de as getMoveObject,st as getMoveObjectType,dr as getMovePackageContent,et as getObjectDeletedResponse,mr as getObjectDisplay,Pe as getObjectFields,Me as getObjectId,tt as getObjectNotExistsResponse,gr as getObjectOwner,pr as getObjectPreviousTransactionDigest,ve as getObjectReference,lr as getObjectType,ur as getObjectVersion,Q as getSuiObjectData,br as hasPublicTransfer,jt as hexToNumber,Et as hexToString,qt as isSortedSymbols,rt as isSuiObjectResponse,ue as maxDecimal,Fe as mulRoundUp,ie as normalizeCoinType,oe as patchFixSuiObjectId,fr as printTransaction,ne as removeHexPrefix,sr as secretKeyToEd25519Keypair,ir as secretKeyToSecp256k1Keypair,At as shortAddress,Le as shortString,Se as sleepTime,Ge as toBuffer,W as toDecimalsAmount,Ke as utf8to16,Ie as wrapDeepBookMarginPoolInfo,De as wrapDeepBookPoolInfo};
|
|
15
|
+
`,r={filter:{sender:e,type:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::BalanceManagerEvent`}};try{let n=await this.sdk.graphqlClient.query({query:t,variables:r});return n?.data?.events?.nodes?n.data.events.nodes.map(s=>s?.contents?.json):[]}catch(n){throw new Error(`Failed to query balance managers: ${n instanceof Error?n.message:String(n)}`)}}async getMarginManagerByAccount(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::CreateMarginManagerEvent`}))?.data||[]).filter(i=>i.parsedJson?.owner===e).map(i=>i?.parsedJson)}catch(t){throw new Error(`Failed to get margin managers by account: ${t instanceof Error?t.message:String(t)}`)}}async getBaseBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getQuoteBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get quote balance: ${s instanceof Error?s.message:String(s)}`)}}async getDeepBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||!s.results[0].returnValues[0])throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);return S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])).toString()}catch(s){throw new Error(`Failed to get base balance: ${s instanceof Error?s.message:String(s)}`)}}async getPoolMarginManagerBalance({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManagers, baseCoinType, quoteCoinType) are required");let i=new C,s=r===this.deepCoin.coinType,o=n===this.deepCoin.coinType,a=s||o;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::base_balance`,arguments:[i.object(t)],typeArguments:[r,n]}),i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::quote_balance`,arguments:[i.object(t)],typeArguments:[r,n]}),a||i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::deep_balance`,arguments:[i.object(t)],typeArguments:[r,n]});let u=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!u.results||!u.results[0]||!u.results[0].returnValues||!u.results[0].returnValues[0])throw new Error(`Transaction failed: ${u.effects?.status?.error||"Unknown error"}`);let p=S.U64.parse(new Uint8Array(u.results[0].returnValues[0][0])),l=S.U64.parse(new Uint8Array(u.results[1].returnValues[0][0])),m=a?s?p:l:S.U64.parse(new Uint8Array(u.results[2].returnValues[0][0]));return{[r]:p.toString(),[n]:l.toString(),[this.deepCoin.coinType]:m.toString()}}catch(u){throw new Error(`Failed to getPoolMarginManagerBalance: ${u instanceof Error?u.message:String(u)}`)}}async getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}){if(!e||!t||!r||!n)throw new Error("All parameters (account, marginManager, baseCoinType, quoteCoinType) are required");let i=new C;try{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::borrowed_shares`,arguments:[i.object(t)],typeArguments:[r,n]});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i});if(!s.results||!s.results[0]||!s.results[0].returnValues||s.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${s.effects?.status?.error||"Unknown error"}`);let o=S.U64.parse(new Uint8Array(s.results[0].returnValues[0][0])),a=S.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]));return{baseBorrowedShare:o,quoteBorrowedShare:a}}catch(s){throw new Error(`Failed to get borrowed shares: ${s instanceof Error?s.message:String(s)}`)}}managerState=({account:e,marginManager:t,baseCoin:r,quoteCoin:n,pool:i,baseMarginPool:s,quoteMarginPool:o,decimals:a=6,basePriceFeedObjectId:u,quotePriceFeedObjectId:p})=>l=>{l.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::manager_state`,arguments:[l.object(t),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(u),l.object(p),l.object(i),l.object(s),l.object(o),l.object.clock()],typeArguments:[r.coinType,n.coinType]})};async getManagerState(e,t=new C){let{account:r,marginManager:n,baseCoin:i,quoteCoin:s,pool:o,baseMarginPool:a,quoteMarginPool:u,decimals:p=6}=e;if(!r||!n||!o||!a||!u)throw new Error("All required parameters must be provided");if(!i?.feed||!s?.feed)throw new Error("Base and quote coin feeds are required");if(!i.scalar||!s.scalar)throw new Error("Base and quote coin scalars are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],t),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");t.add(this.managerState({...e,basePriceFeedObjectId:m,quotePriceFeedObjectId:g}));let b=await this.sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:t});if(!b.results||!b.results[0]||!b.results[0].returnValues||b.results[0].returnValues.length<14)throw new Error(`Failed to get margin manager state: ${b.effects?.status?.error||"Unknown error"}`);let _=Re(S.Address.parse(new Uint8Array(b.results[0].returnValues[0][0]))),A=Re(S.Address.parse(new Uint8Array(b.results[0].returnValues[1][0]))),f=Number(S.U64.parse(new Uint8Array(b.results[0].returnValues[2][0])))/1e9,w=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[3][0]))),i.scalar,p),y=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[4][0]))),s.scalar,p),T=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[5][0]))),i.scalar,p),j=this.#e(BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[6][0]))),s.scalar,p),k=S.U64.parse(new Uint8Array(b.results[0].returnValues[7][0])),B=Number(S.u8().parse(new Uint8Array(b.results[0].returnValues[8][0]))),M=S.U64.parse(new Uint8Array(b.results[0].returnValues[9][0])),D=Number(S.u8().parse(new Uint8Array(b.results[0].returnValues[10][0]))),P=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[11][0]))),I=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[12][0]))),Z=BigInt(S.U64.parse(new Uint8Array(b.results[0].returnValues[13][0])));return{managerId:_,deepbookPoolId:A,riskRatio:f,baseAsset:w,quoteAsset:y,baseDebt:T,quoteDebt:j,basePythPrice:k.toString(),basePythDecimals:B,quotePythPrice:M.toString(),quotePythDecimals:D,currentPrice:P,lowestTriggerAbovePrice:I,highestTriggerBelowPrice:Z}}catch(l){throw new Error(`Failed to get manager state: ${l instanceof Error?l.message:String(l)}`)}}async calculateAssets({account:e,marginManager:t,pool:r,baseCoin:n,quoteCoin:i,tx:s=new C}){if(!e||!t||!r)throw new Error("Account, marginManager, and pool are required");if(!n?.coinType||!i?.coinType)throw new Error("Base and quote coin types are required");try{s.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_manager::calculate_assets`,arguments:[s.object(t),s.object(r)],typeArguments:[n.coinType,i.coinType]});let o=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:s});if(!o.results||!o.results[0]||!o.results[0].returnValues||o.results[0].returnValues.length<2)throw new Error(`Transaction failed: ${o.effects?.status?.error||"Unknown error"}`);let a=o.results[0].returnValues[0][0],u=o.results[0].returnValues[1][0];if(!n.scalar||!i.scalar)throw new Error("Base and quote coin scalars are required");let p=S.U64.parse(new Uint8Array(a)),l=S.U64.parse(new Uint8Array(u));return{baseAsset:p.toString(),quoteAsset:l.toString(),tx:s}}catch(o){throw new Error(`Failed to calculate assets: ${o instanceof Error?o.message:String(o)}`)}}async getBorrowedAmount({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n,baseMarginPool:i,quoteMarginPool:s}){if(!e||!t||!r||!n||!i||!s)throw new Error("All parameters are required");try{let{baseBorrowedShare:o,quoteBorrowedShare:a}=await this.getBorrowedShares({account:e,marginManager:t,baseCoinType:r,quoteCoinType:n}),u=!!d(o).gt(d(a)),p=u?i:s,l=u?o:a,m=new C;m.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_package_id}::margin_pool::borrow_shares_to_amount`,arguments:[m.object(p),m.pure.u64(BigInt(l)),m.object.clock()],typeArguments:[u?r:n]});let g=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:m});if(!g.results||!g.results[0]||!g.results[0].returnValues||!g.results[0].returnValues[0])throw new Error(`Transaction failed: ${g.effects?.status?.error||"Unknown error"}`);let b=S.U64.parse(new Uint8Array(g.results[0].returnValues[0][0]));return u?{baseBorrowedAmount:b.toString(),quoteBorrowedAmount:"0"}:{baseBorrowedAmount:"0",quoteBorrowedAmount:b.toString()}}catch(o){throw new Error(`Failed to get borrowed amount: ${o instanceof Error?o.message:String(o)}`)}}async deposit({marginManager:e,baseCoin:t,quoteCoin:r,amount:n,depositCoinType:i},s=new C){if(!e)throw new Error("Margin manager is required");if(!t?.coinType||!r?.coinType)throw new Error("Base and quote coin types are required");if(!n||BigInt(n)<=0n)throw new Error("Valid deposit amount is required");if(!t.feed||!r.feed)throw new Error("Base and quote coin feeds are required");try{let o=Ue.buildCoinWithBalance(BigInt(n),i,s),a=await this.pythPrice.updatePythPriceIDs([t.feed,r.feed],s),u=a.get(t.feed),p=a.get(r.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::deposit`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?s.object(e):e,s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(u),s.object(p),o,s.object(v)],typeArguments:[t.coinType,r.coinType,i]}),s}catch(o){throw new Error(`Failed to deposit: ${o instanceof Error?o.message:String(o)}`)}}async withdraw({account:e,marginManager:t,baseMarginPool:r,quoteMarginPool:n,baseCoin:i,quoteCoin:s,pool:o,amount:a,withdrawCoinType:u},p=new C){if(!e||!t||!r||!n||!o)throw new Error("All required parameters must be provided");if(!i?.coinType||!s?.coinType)throw new Error("Base and quote coin types are required");if(!a||BigInt(a)<=0n)throw new Error("Valid withdraw amount is required");if(!i.feed||!s.feed)throw new Error("Base and quote coin feeds are required");try{let l=await this.pythPrice.updatePythPriceIDs([i.feed,s.feed],p),m=l.get(i.feed),g=l.get(s.feed);if(!m||!g)throw new Error("Failed to get price feed object IDs");let b=p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw`,arguments:[p.object(this._sdk.sdkOptions.margin_utils.global_config_id),p.object(this._sdk.sdkOptions.margin_utils.versioned_id),p.object(t),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(r),p.object(n),p.object(m),p.object(g),p.object(o),p.pure.u64(BigInt(a)),p.object(v)],typeArguments:[i.coinType,s.coinType,u]});return p.transferObjects([b],e),p}catch(l){throw new Error(`Failed to withdraw: ${l instanceof Error?l.message:String(l)}`)}}async borrowBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C){if(!e||!t||!i)throw new Error("Margin manager, base margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_base`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow base: ${a instanceof Error?a.message:String(a)}`)}}async borrowQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,pool:i,amount:s},o=new C){if(!e||!t||!i)throw new Error("Margin manager, quote margin pool, and pool are required");if(!r?.coinType||!n?.coinType)throw new Error("Base and quote coin types are required");if(!s||BigInt(s)<=0n)throw new Error("Valid borrow amount is required");if(!r.feed||!n.feed)throw new Error("Base and quote coin feeds are required");try{let a=await this.pythPrice.updatePythPriceIDs([r.feed,n.feed],o),u=a.get(r.feed),p=a.get(n.feed);if(!u||!p)throw new Error("Failed to get price feed object IDs");return o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::borrow_quote`,arguments:[o.object(this.sdk.sdkOptions.margin_utils.global_config_id),o.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?o.object(e):e,o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(t),o.object(u),o.object(p),o.object(i),o.pure.u64(BigInt(s)),o.object(v)],typeArguments:[r.coinType,n.coinType]}),o}catch(a){throw new Error(`Failed to borrow quote: ${a instanceof Error?a.message:String(a)}`)}}async repayBase({marginManager:e,baseMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, baseMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:r.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_base`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay base: ${a instanceof Error?a.message:String(a)}`)}}async repayQuote({marginManager:e,quoteMarginPool:t,baseCoin:r,quoteCoin:n,amount:i},s=new C){if(!e||!t||!r||!n)throw new Error("All required parameters (marginManager, quoteMarginPool, baseCoin, quoteCoin) are required");if(i&&BigInt(i)<=0n)throw new Error("Repay amount must be greater than zero if provided");let o={marginManager:e,baseCoin:r,quoteCoin:n,amount:i,depositCoinType:n.coinType};await this.deposit(o,s);try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::repay_quote`,arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),s.object.option({type:"u64",value:i?s.pure.u64(i):null}),s.object(v)],typeArguments:[r.coinType,n.coinType]}),s}catch(a){throw new Error(`Failed to repay quote: ${a instanceof Error?a.message:String(a)}`)}}async repay({marginManager:e,baseMarginPool:t,quoteMarginPool:r,baseCoin:n,quoteCoin:i,isBase:s,amount:o},a=new C){try{let u=this.sdk.senderAddress,p,l=o;o||(p=await this.getBorrowedAmount({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType,baseMarginPool:t,quoteMarginPool:r}),l=s?p.baseBorrowedAmount:p.quoteBorrowedAmount);let m,g={marginManager:e,baseCoin:n,quoteCoin:i,depositCoinType:s?n.coinType:i.coinType};if(s){let b=await this.getBaseBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}else{let b=await this.getQuoteBalance({account:u,marginManager:e,baseCoinType:n?.coinType,quoteCoinType:i?.coinType});m=d(l).sub(b).toString()}d(m).gt(0)&&await this.deposit({...g,amount:m},a),a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::${s?"repay_base":"repay_quote"}`,arguments:[a.object(this._sdk.sdkOptions.margin_utils.global_config_id),a.object(this._sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(s?t:r),a.object.option({type:"u64",value:o?a.pure.u64(o):null}),a.object(v)],typeArguments:[n.coinType,i.coinType]})}catch{}return a}async placeMarginMarketOrder({marginManager:e,poolInfo:t,selfMatchingOption:r,quantity:n,amountLimit:i,isBid:s,payWithDeep:o,exactBase:a},u=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!n||BigInt(W(n,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order quantity is required");if(!i||BigInt(W(i,t.baseCoin.decimals||0))<=0n)throw new Error("Valid order amount limit is required");let{id:p,baseCoin:l,quoteCoin:m}=t;if(l.decimals===void 0||m.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{return u.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_market_order`,arguments:[u.object(this.sdk.sdkOptions.margin_utils.global_config_id),u.object(this.sdk.sdkOptions.margin_utils.versioned_id),typeof e=="string"?u.object(e):e,u.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),u.object(p),u.pure.u8(r),u.pure.u64(n),u.pure.bool(s),u.pure.bool(o),u.pure.bool(a===void 0?!s:a),u.pure.u64(i),u.object(v)],typeArguments:[l.coinType,m.coinType]}),u}catch(g){throw new Error(`Failed to place market order: ${g instanceof Error?g.message:String(g)}`)}}async placeMarginLimitOrder({marginManager:e,poolInfo:t,orderType:r,selfMatchingOption:n,priceInput:i,quantity:s,isBid:o,payWithDeep:a,expirationTimestamp:u=Date.now()+31536e8},p=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!i||!s)throw new Error("Price and quantity are required");let{id:l,baseCoin:m,quoteCoin:g}=t;if(m.decimals===void 0||g.decimals===void 0)throw new Error("Base and quote coin decimals are required");try{let b=BigInt(d(i).mul(10**(g.decimals-m.decimals+9)).toString()),_=BigInt(W(s,m.decimals));if(b<=0n||_<=0n)throw new Error("Price and quantity must be greater than zero");return p.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_margin_limit_order`,arguments:[p.object(this.sdk.sdkOptions.margin_utils.global_config_id),p.object(this.sdk.sdkOptions.margin_utils.versioned_id),p.object(e),p.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),p.object(l),p.pure.u8(r),p.pure.u8(n),p.pure.u64(b),p.pure.u64(_),p.pure.bool(o),p.pure.bool(a),p.pure.u64(u),p.object(v)],typeArguments:[m.coinType,g.coinType]}),p}catch(b){throw new Error(`Failed to place limit order: ${b instanceof Error?b.message:String(b)}`)}}modifyMarginOrder({marginManager:e,poolInfo:t,orderId:r,newQuantity:n},i=new C){if(!e||!t||!r||!n)throw new Error("All parameters (marginManager, poolInfo, orderId, newQuantity) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(t.baseCoin.decimals===void 0)throw new Error("Base coin decimals are required");try{let s=BigInt(W(n,t.baseCoin.decimals));if(s<=0n)throw new Error("New quantity must be greater than zero");return i.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::modify_margin_order`,arguments:[i.object(this.sdk.sdkOptions.margin_utils.global_config_id),i.object(this.sdk.sdkOptions.margin_utils.versioned_id),i.object(e),i.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),i.object(t.id),i.pure.u128(r),i.pure.u64(s),i.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),i}catch(s){throw new Error(`Failed to modify order: ${s instanceof Error?s.message:String(s)}`)}}cancelMarginOrder({marginManager:e,poolInfo:t,orderId:r},n=new C){if(!e||!t||!r)throw new Error("All parameters (marginManager, poolInfo, orderId) are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_margin_order`,arguments:[n.object(this.sdk.sdkOptions.margin_utils.global_config_id),n.object(this.sdk.sdkOptions.margin_utils.versioned_id),n.object(e),n.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),n.object(t.id),n.pure.u128(r),n.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),n}catch(i){throw new Error(`Failed to cancel order: ${i instanceof Error?i.message:String(i)}`)}}cancelAllMarginOrders({marginManager:e,poolInfo:t},r=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");try{return r.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::cancel_all_margin_orders`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.global_config_id),r.object(this.sdk.sdkOptions.margin_utils.versioned_id),r.object(e),r.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t.id),r.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]}),r}catch(n){throw new Error(`Failed to cancel all orders: ${n instanceof Error?n.message:String(n)}`)}}placeReduceOnlyLimitOrder({marginManager:e,poolInfo:t,marginPoolId:r,orderType:n,selfMatchingOption:i,priceInput:s,quantity:o,isBid:a,payWithDeep:u,expirationTimestamp:p},l=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return l.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_limit_order`,arguments:[l.object(this.sdk.sdkOptions.margin_utils.global_config_id),l.object(this.sdk.sdkOptions.margin_utils.versioned_id),l.object(e),l.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),l.object(t.id),l.object(r),l.pure.u8(n),l.pure.u8(i),l.pure.u64(s),l.pure.u64(o),l.pure.bool(a),l.pure.bool(u),l.pure.u64(p),l.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,a?t.quoteCoin.coinType:t.baseCoin.coinType]}),l}catch(m){throw new Error(`Failed to place reduce only limit order: ${m instanceof Error?m.message:String(m)}`)}}placeReduceOnlyMarketOrder({marginManager:e,poolInfo:t,marginPoolId:r,selfMatchingOption:n,quantity:i,isBid:s,payWithDeep:o},a=new C){if(!e||!t)throw new Error("Margin manager and pool info are required");if(!t.id||!t.baseCoin?.coinType||!t.quoteCoin?.coinType)throw new Error("Pool info must contain valid id, baseCoin, and quoteCoin");if(!r)throw new Error("Margin pool id is required");try{return a.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::place_reduce_only_market_order`,arguments:[a.object(this.sdk.sdkOptions.margin_utils.global_config_id),a.object(this.sdk.sdkOptions.margin_utils.versioned_id),a.object(e),a.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),a.object(t.id),a.object(r),a.pure.u8(n),a.pure.u64(i),a.pure.bool(s),a.pure.bool(o),a.object(v)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType,s?t.quoteCoin.coinType:t.baseCoin.coinType]}),a}catch(u){throw new Error(`Failed to place reduce only market order: ${u instanceof Error?u.message:String(u)}`)}}async getAccountOpenOrders({poolInfo:e,marginManager:t}){try{let r=new C,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(t)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getOpenOrder(e,this.sdk.senderAddress,n,void 0,!0,r)}catch(r){throw new Error(`Failed to get account open orders: ${r instanceof Error?r.message:String(r)}`)}}async getAccountAllMarketsOpenOrders(e,t){try{if(!e||!t||t.length===0)throw new Error("Account or pools are required");let r=[];for(let n=0;n<t.length;n++){let i=new C,s=t[n];if(s.margin_manager_id){let o=await i.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[i.object(s.margin_manager_id)],typeArguments:[s.baseCoin.coinType,s.quoteCoin.coinType]}),a=await this.sdk.DeepbookUtils.getOpenOrder(s,this.sdk.senderAddress,o,void 0,!0,i);r.push(...a)}}return r}catch(r){throw new Error(`Failed to get account all markets open orders: ${r instanceof Error?r.message:String(r)}`)}}mintSupplierCap(e=new C,t){let r=e.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::mint_supplier_cap`,arguments:[e.object(this._sdk.sdkOptions.margin_utils.versioned_id),e.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),e.object(v)]});return t&&e.transferObjects([r],this.sdk.senderAddress),{tx:e,supplierCap:r}}async querySupplierCap(){try{return((await this.sdk.fullClient.queryEventsByPage({MoveEventType:`${this._sdk.sdkOptions.margin_utils.package_id}::margin_utils::SupplierCapCreatedEvent`}))?.data||[]).filter(n=>n.parsedJson?.owner===this.sdk.senderAddress)[0].parsedJson.supplier_cap_id}catch(e){throw new Error(`Failed to get account supplyCap: ${e instanceof Error?e.message:String(e)}`)}}mintSupplierCapAndSupply({marginPool:e,supplyCoinType:t,amount:r}){let n=new C,{supplierCap:i}=this.mintSupplierCap(n,!1);return this.supply({marginPool:e,supplierCap:i,supplyCoinType:t,amount:r,tx:n}),n.transferObjects([i],this.sdk.senderAddress),n}supply({marginPool:e,supplierCap:t,supplyCoinType:r,amount:n,tx:i}){let s=i??new C;if(!t)throw new Error("Either supplierCap must be provided");let o=Ue.buildCoinWithBalance(BigInt(n),r,s);return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supply`,typeArguments:[r],arguments:[s.object(this._sdk.sdkOptions.margin_utils.global_config_id),s.object(this._sdk.sdkOptions.margin_utils.versioned_id),s.object(e),s.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),s.object(t),o,s.pure.option("address","0x0"),s.object(v)]}),s}supplierWithdraw({marginPool:e,withdrawCoinType:t,amount:r,supplierCapId:n,hasSwap:i,withdrawAll:s,tx:o=new C}){let a=o.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::supplier_withdraw`,typeArguments:[t],arguments:[o.object(this._sdk.sdkOptions.margin_utils.global_config_id),o.object(this._sdk.sdkOptions.margin_utils.versioned_id),o.object(e),o.object(this._sdk.sdkOptions.margin_utils.margin_registry_id),o.object(n),o.object.option({type:"u64",value:s?null:o.pure.u64(r)}),o.object(v)]});return i?a:(o.transferObjects([a],this.sdk.senderAddress),o)}withdrawReferralFees({marginPool:e}){let t=new C,r=t.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::withdraw_referral_fees`,arguments:[t.object(this._sdk.sdkOptions.margin_utils.versioned_id),t.object(e),t.object(this._sdk.sdkOptions.margin_utils.registry_id),t.object.option({type:"0x1",value:null}),t.object(v)],typeArguments:[this.deepCoin.coinType]});return t.transferObjects([r],this.sdk.senderAddress),t}async getUserSupplyAmount({marginPool:e,supplyCoin:t,supplierCapId:r}){let n=new C;n.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::get_user_supply_amount`,typeArguments:[t.coinType],arguments:[n.object(e),n.object(r),n.object(v)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);return this.#e(BigInt(S.U64.parse(new Uint8Array(i.results[0].returnValues[0][0]))),t.scalar,t.decimals)}async getDeepBookMarginRegistry(){let t=(await this.sdk.fullClient.getObject({id:this._sdk.sdkOptions.margin_utils.margin_registry_id,options:{showContent:!0}})).data.content.fields.inner.fields.id.id,r=await this.sdk.fullClient.getDynamicFieldObject({parentId:t,name:{type:"u64",value:"1"}}),n=r.data.content.fields.value.fields.pool_registry.fields.id.id,i=r.data.content.fields.value.fields.margin_pools.fields.id.id;return{pool_registry_table_id:n,margin_pool_table_id:i}}async getDeepBookPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.pool_registry_table_id}),t=e.map(i=>i.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[];for(let i=0;i<r.length;i++){let s=r[i].data.content.fields;n.push(De(s))}return n}async getDeepBookMarginPool(){let{data:e}=await this.sdk.fullClient.getDynamicFields({parentId:this.sdk.sdkOptions.margin_utils.margin_pool_table_id}),t=e.map(a=>a.objectId),r=await this.sdk.fullClient.batchGetObjects(t,{showContent:!0}),n=[],i=[];for(let a=0;a<r.length;a++){let u=r[a].data.content.fields;i.push(u.value),n.push({deposit_coin_type:u.name.fields.name,id:u.id.id})}let s=await this.sdk.fullClient.batchGetObjects(i,{showContent:!0}),o=[];for(let a=0;a<s.length;a++){let u=s[a].data.content.fields;o.push(Ie(u,n[a]))}return o}async getBaseQuantityOutInput(e,t,r){let n=new C;n.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}${r?"::pool::get_base_quantity_out":"::pool::get_base_quantity_out_input_fee"}`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[n.object(e.address),n.pure.u64(t),n.object(v)]});let i=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:n});if(!i.results||!i.results[0]||!i.results[0].returnValues||!i.results[0].returnValues[0])throw new Error(`Transaction failed: ${i.effects?.status?.error||"Unknown error"}`);let s=S.U64.parse(new Uint8Array(i.results[0].returnValues[0][0])),o=S.U64.parse(new Uint8Array(i.results[0].returnValues[1][0])),a=S.U64.parse(new Uint8Array(i.results[0].returnValues[2][0]));return{base_amount:s.toString(),quote_amount:o.toString(),deep_fee_amount:a.toString()}}async getQuoteQuantityOutInput(e,t){let r=new C;r.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::get_quote_quantity_out`,typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType],arguments:[r.object(e.address),r.pure.u64(t),r.object(v)]});let n=await this.sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:r});if(!n.results||!n.results[0]||!n.results[0].returnValues||!n.results[0].returnValues[0])throw new Error(`Transaction failed: ${n.effects?.status?.error||"Unknown error"}`);let i=S.U64.parse(new Uint8Array(n.results[0].returnValues[0][0])),s=S.U64.parse(new Uint8Array(n.results[0].returnValues[1][0])),o=S.U64.parse(new Uint8Array(n.results[0].returnValues[2][0]));return{base_amount:i.toString(),quote_amount:s.toString(),deep_fee_amount:o.toString()}}async getAccount(e,t){if(!e||!t)throw new Error("marginManager and poolInfo are required");let r=new C,n=r.moveCall({target:`${this.sdk.sdkOptions.deepbook.margin_published_at}::margin_manager::balance_manager`,arguments:[r.object(e)],typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType]});return await this.sdk.DeepbookUtils.getAccount(n,[t],r)}async withdrawSettledAmounts({poolInfo:e,marginManager:t},r=new C){return r.moveCall({target:`${this._sdk.sdkOptions.deepbook.margin_published_at}::pool_proxy::withdraw_settled_amounts`,arguments:[r.object(this.sdk.sdkOptions.margin_utils.margin_registry_id),r.object(t),r.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}#e(e,t,r){if(t<=0||r<0)throw new Error("Scalar must be positive and decimals must be non-negative");let n=BigInt(t),i=e/n,s=e%n;if(s===0n)return i.toString();let o=t.toString().length-1,p=s.toString().padStart(o,"0").slice(0,r).replace(/0+$/,"");return p?`${i}.${p}`:i.toString()}async getMarginPoolStateForInterest(e){if(!e)throw new Error("marginPoolId is required");let t=await this.sdk.fullClient.getObject({id:e,options:{showContent:!0}});if(!t.data?.content?.fields)throw new Error(`Failed to fetch margin pool: ${e}`);let r=t.data.content.fields,n=r.state.fields,i=r.config.fields,s=i.interest_config.fields,o=i.margin_pool_config.fields;return{poolState:{total_supply:BigInt(n.total_supply),total_borrow:BigInt(n.total_borrow),supply_shares:BigInt(n.supply_shares),borrow_shares:BigInt(n.borrow_shares),last_update_timestamp:BigInt(n.last_update_timestamp)},interestConfig:{base_rate:BigInt(s.base_rate),base_slope:BigInt(s.base_slope),optimal_utilization:BigInt(s.optimal_utilization),excess_slope:BigInt(s.excess_slope)},marginPoolConfig:{protocol_spread:BigInt(o.protocol_spread),max_utilization_rate:BigInt(o.max_utilization_rate),min_borrow:BigInt(o.min_borrow),supply_cap:BigInt(o.supply_cap)}}}async getChainTimestamp(){let e=await this.sdk.fullClient.getLatestCheckpointSequenceNumber(),t=await this.sdk.fullClient.getCheckpoint({id:e});return BigInt(t.timestampMs)}};import{SuiClient as bt}from"@mysten/sui/client";var te=class extends bt{async queryEventsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.queryEvents({query:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async getOwnedObjectsByPage(e,t,r="all"){let n=[],i=!0,s=r==="all",o=s?null:r.cursor;do{let a=await this.getOwnedObjects({owner:e,...t,cursor:o,limit:s?null:r.limit});a.data?(n=[...n,...a.data],i=a.hasNextPage,o=a.nextCursor):i=!1}while(s&&i);return{data:n,nextCursor:o,hasNextPage:i}}async getDynamicFieldsByPage(e,t="all"){let r=[],n=!0,i=t==="all",s=i?null:t.cursor;do{let o=await this.getDynamicFields({parentId:e,cursor:s,limit:i?null:t.limit});o.data?(r=[...r,...o.data],n=o.hasNextPage,s=o.nextCursor):n=!1}while(i&&n);return{data:r,nextCursor:s,hasNextPage:n}}async batchGetObjects(e,t,r=50){let n=[];try{for(let i=0;i<Math.ceil(e.length/r);i++){let s=await this.multiGetObjects({ids:e.slice(i*r,r*(i+1)),options:t});n=[...n,...s]}}catch{}return n}async calculationTxGas(e){let{sender:t}=e.blockData;if(t===void 0)throw Error("sdk sender is empty");let r=await this.devInspectTransactionBlock({transactionBlock:e,sender:t}),{gasUsed:n}=r.effects;return Number(n.computationCost)+Number(n.storageCost)-Number(n.storageRebate)}async sendTransaction(e,t){try{return await this.signAndExecuteTransaction({transaction:t,signer:e,options:{showEffects:!0,showEvents:!0}})}catch{}}};import $e from"decimal.js";$e.config({precision:64,rounding:$e.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var F=1000000000n,_t=365n*24n*60n*60n*1000n;function ht(c,e){return e===0n?0n:c*F/e}function yt(c,e){let{base_rate:t,base_slope:r,optimal_utilization:n,excess_slope:i}=e;if(c<n)return t+c*r/F;{let s=c-n,o=n*r/F,a=s*i/F;return t+o+a}}function Fe(c,e){let t=c*e,r=t/F;return t%F>0n?r+1n:r}function ft(c,e,t,r){let n=e.borrow_shares===0n?F:e.total_borrow*F/e.borrow_shares,i=Fe(c,n),s=ht(e.total_borrow,e.total_supply),o=yt(s,t),a=r-e.last_update_timestamp,u=e.total_borrow*o/F*a/_t,p=e.borrow_shares===0n?0n:Fe(u,c*F/e.borrow_shares),l=i+p;return{confirmedDebt:i,estimatedInterest:p,totalDebt:l,annualInterestRate:o}}function sn(c,e,t,r,n=60000n){let i=r+n,{totalDebt:s}=ft(c,e,t,i);return s}var re=class{_cache={};_rpcModule;_deepbookUtils;_marginUtils;_pythPrice;_graphqlClient;_sdkOptions;_senderAddress="";constructor(e){this._sdkOptions=e,this._rpcModule=new te({url:e.fullRpcUrl}),this._deepbookUtils=new X(this),this._marginUtils=new ee(this),this._pythPrice=new H(this),this._graphqlClient=new wt({url:e.graphqlUrl}),oe(this._sdkOptions)}get senderAddress(){return this._senderAddress}set senderAddress(e){this._senderAddress=e}get DeepbookUtils(){return this._deepbookUtils}get MarginUtils(){return this._marginUtils}get PythPrice(){return this._pythPrice}get fullClient(){return this._rpcModule}get graphqlClient(){return this._graphqlClient}get sdkOptions(){return this._sdkOptions}async getOwnerCoinAssets(e,t,r=!0){let n=[],i=null,s=`${this.sdkOptions.fullRpcUrl}_${e}_${t}_getOwnerCoinAssets`,o=this.getCache(s,r);if(o)return o;for(;;){let a=await(t?this.fullClient.getCoins({owner:e,coinType:t,cursor:i}):this.fullClient.getAllCoins({owner:e,cursor:i}));if(a.data.forEach(u=>{BigInt(u.balance)>0&&n.push({coinAddress:$(u.coinType).source_address,coinObjectId:u.coinObjectId,balance:BigInt(u.balance)})}),i=a.nextCursor,!a.hasNextPage)break}return this.updateCache(s,n,30*1e3),n}async getOwnerCoinBalances(e,t){let r=[];return t?r=[await this.fullClient.getBalance({owner:e,coinType:t})]:r=[...await this.fullClient.getAllBalances({owner:e})],r}updateCache(e,t,r=864e5){let n=this._cache[e];n?(n.overdueTime=z(r),n.value=t):n=new K(t,z(r)),this._cache[e]=n}getCache(e,t=!1){let r=this._cache[e],n=r?.isValid();if(!t&&n)return r.value;n||delete this._cache[e]}};var jn="0x0000000000000000000000000000000000000000000000000000000000000006",En="pool_script",Bn="pool_script_v2",vn="router",Mn="router_with_partner",Pn="fetcher_script",qn="expect_swap",Dn="utils",In="0x1::coin::CoinInfo",Un="0x1::coin::CoinStore",Rn="custodian_v2",$n="clob_v2",Fn="endpoints_v2",Vn=c=>{if(typeof c=="string"&&c.startsWith("0x"))return"object";if(typeof c=="number"||typeof c=="bigint")return"u64";if(typeof c=="boolean")return"bool";throw new Error(`Unknown type for value: ${c}`)};var kt=(n=>(n[n.NO_RESTRICTION=0]="NO_RESTRICTION",n[n.IMMEDIATE_OR_CANCEL=1]="IMMEDIATE_OR_CANCEL",n[n.FILL_OR_KILL=2]="FILL_OR_KILL",n[n.POST_ONLY=3]="POST_ONLY",n))(kt||{}),Ct=(r=>(r[r.SELF_MATCHING_ALLOWED=0]="SELF_MATCHING_ALLOWED",r[r.CANCEL_TAKER=1]="CANCEL_TAKER",r[r.CANCEL_MAKER=2]="CANCEL_MAKER",r))(Ct||{});var es=re;export{jn as CLOCK_ADDRESS,K as CachedContent,re as CetusClmmSDK,qn as ClmmExpectSwapModule,Pn as ClmmFetcherModule,En as ClmmIntegratePoolModule,Bn as ClmmIntegratePoolV2Module,vn as ClmmIntegrateRouterModule,Mn as ClmmIntegrateRouterWithPartnerModule,Dn as ClmmIntegrateUtilsModule,E as CoinAssist,In as CoinInfoAddress,Un as CoinStoreAddress,de as DEEP_SCALAR,Nt as DEFAULT_GAS_BUDGET_FOR_MERGE,Vt as DEFAULT_GAS_BUDGET_FOR_SPLIT,Gt as DEFAULT_GAS_BUDGET_FOR_STAKE,xt as DEFAULT_GAS_BUDGET_FOR_TRANSFER,Lt as DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI,zt as DEFAULT_NFT_TRANSFER_GAS_FEE,$n as DeepbookClobV2Moudle,Rn as DeepbookCustodianV2Moudle,Fn as DeepbookEndpointsV2Moudle,X as DeepbookUtilsModule,R as FLOAT_SCALAR,F as FLOAT_SCALING,Kt as GAS_SYMBOL,ae as GAS_TYPE_ARG,ye as GAS_TYPE_ARG_LONG,ee as MarginUtilsModule,Ut as NORMALIZED_SUI_COIN_TYPE,kt as OrderType,te as RpcModule,Qt as SUI_SYSTEM_STATE_OBJECT_ID,Ct as SelfMatchingOption,N as TransactionUtil,_t as YEAR_MS,me as addHexPrefix,nr as asIntN,rr as asUintN,St as bufferToHex,we as cacheTime1min,x as cacheTime24h,ke as cacheTime5min,sn as calc100PercentRepay,ft as calcDebtDetail,yt as calcInterestRate,ht as calcUtilizationRate,Fr as calculateRiskRatio,Ot as checkAddress,_e as composeType,d,ce as decimalsMultiplier,es as default,Dt as extractAddressFromType,$ as extractStructTagFromType,It as fixCoinType,L as fixDown,Je as fixSuiObjectId,G as fromDecimalsAmount,Vn as getDefaultSuiInputType,z as getFutureTime,le as getMoveObject,st as getMoveObjectType,lr as getMovePackageContent,et as getObjectDeletedResponse,mr as getObjectDisplay,Pe as getObjectFields,Me as getObjectId,tt as getObjectNotExistsResponse,gr as getObjectOwner,pr as getObjectPreviousTransactionDigest,ve as getObjectReference,dr as getObjectType,ur as getObjectVersion,Q as getSuiObjectData,br as hasPublicTransfer,jt as hexToNumber,Et as hexToString,qt as isSortedSymbols,rt as isSuiObjectResponse,ue as maxDecimal,Fe as mulRoundUp,ie as normalizeCoinType,oe as patchFixSuiObjectId,fr as printTransaction,ne as removeHexPrefix,sr as secretKeyToEd25519Keypair,ir as secretKeyToSecp256k1Keypair,At as shortAddress,Le as shortString,Se as sleepTime,Ge as toBuffer,W as toDecimalsAmount,Ke as utf8to16,Ie as wrapDeepBookMarginPoolInfo,De as wrapDeepBookPoolInfo};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cetusprotocol/deepbook-utils",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "cetus deepbook utils sdk",
|
|
5
5
|
"typings": "dist/index.d.ts",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
},
|
|
80
80
|
"overrides": {
|
|
81
81
|
"chalk": "5.3.0",
|
|
82
|
-
"strip-ansi": "
|
|
82
|
+
"strip-ansi": "7.1.0",
|
|
83
83
|
"color-convert": "2.0.1",
|
|
84
84
|
"color-name": "1.1.4",
|
|
85
85
|
"is-core-module": "2.13.1",
|