@cetusprotocol/deepbook-utils 1.4.4 → 1.4.5

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -25,7 +25,7 @@ Clients should implement reconnection logic to maintain continuous price updates
25
25
  }
26
26
  }
27
27
  }
28
- `),i=(await this._graphQLClient.query({query:r,variables:{coinType:`0x2::coin::CoinMetadata<${n}>`}})).data?.objects?.nodes[0]?.address??null;return i&&this.updateCache(e,i),i}async getSuiTransactionResponse(n){let e;try{e=await this._client.getTransactionBlock({digest:n,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{e=await this._client.getTransactionBlock({digest:n,options:{showEvents:!0,showEffects:!0}})}return e}async queryEventsByPage(n,e="all"){let t=[],r=!0,i=e==="all",s=i?null:e.cursor;do{let a=await this._client.queryEvents({query:n,cursor:s,limit:i?null:e.limit});a.data?(t=[...t,...a.data],r=a.hasNextPage,s=a.nextCursor):r=!1}while(i&&r);return{data:t,next_cursor:s,has_next_page:r}}async queryTransactionBlocksByPage(n,e="all",t="ascending"){let r=[],i=!0,s=e==="all",a=s?null:e.cursor;do{let o=await this._client.queryTransactionBlocks({filter:n,cursor:a,order:t,limit:s?null:e.limit,options:{showEvents:!0}});o.data?(r=[...r,...o.data],i=o.hasNextPage,a=o.nextCursor):i=!1}while(s&&i);return{data:r,next_cursor:a,has_next_page:i}}async getOwnedObjectsByPage(n,e,t="all"){let r=async i=>{let s=[],a=!0,o=t==="all",u=o?null:t.cursor;do{let l=await i.getOwnedObjects({owner:n,...e,cursor:u,limit:o?null:t.limit});l.data?(s=[...s,...l.data],a=l.hasNextPage,u=l.nextCursor):a=!1}while(o&&a);return{data:s,next_cursor:u,has_next_page:a}};try{return await r(this._client)}catch(i){let s=i;for(let a of uu)try{let o=mi(new du({url:a,network:this._env}),this._graphQLClient,this._suiGrpcClient,this._env);return await r(o)}catch(o){s=o;continue}throw s}}async getDynamicFieldsByPage(n,e="all"){let t=[],r=!0,i=e==="all",s=i?null:e.cursor;do{let a=await this._client.getDynamicFields({parentId:n,cursor:s,limit:i?null:e.limit});a.data?(t=[...t,...a.data],r=a.hasNextPage,s=a.nextCursor):r=!1}while(i&&r);return{data:t,next_cursor:s,has_next_page:r}}async getDynamicFieldObjects(n,e,t,r,i={showContent:!0,showType:!0,showOwner:!0}){let s=e.map(a=>cu(n,a,t,r));return s.length===0?[]:await this.batchGetObjects(s,i)}async batchGetObjects(n,e,t=50){let r=[];try{for(let i=0;i<Math.ceil(n.length/t);i++){let s=await this._client.multiGetObjects({ids:n.slice(i*t,t*(i+1)),options:e});r=[...r,...s]}}catch(i){console.log(i)}return r}async calculationTxGas(n){let{sender:e}=n.getData();if(!e)throw Error("sdk sender is empty");let t=await this._client.devInspectTransactionBlock({transactionBlock:n,sender:e}),{gasUsed:r}=t.effects;return Number(r.computationCost)+Number(r.storageCost)-Number(r.storageRebate)}async sendTransaction(n,e){try{return await this._client.signAndExecuteTransaction({transaction:e,signer:n,options:{showEffects:!0,showEvents:!0}})}catch(t){console.log("error: ",t)}}async sendSimulationTransaction(n,e){try{return n.setSender(e),await this._client.dryRunTransactionBlock({transactionBlock:await n.build({client:this._client})})}catch(t){throw console.log("devInspectTransactionBlock error",t),t}}async executeTx(n,e,t){try{if(t){let r=typeof n=="string"?As(n):As(n.getPublicKey().toSuiAddress()),i=await this.sendSimulationTransaction(e,r);return i.events.length>0?i.events:i}else{if(typeof n=="string")throw new Error("Cannot send transaction with string address - keypair required for signing");return await this.sendTransaction(n,e)}}catch(r){return r}}async getOwnerCoinAssets(n,e){let t=[],r=null;for(;;){let i=await(e?this._client.getCoins({owner:n,coinType:e,cursor:r}):this._client.getAllCoins({owner:n,cursor:r}));if(i.data.forEach(s=>{BigInt(s.balance)>0&&t.push({coin_type:jr(s.coinType).source_address,coin_object_id:s.coinObjectId,balance:BigInt(s.balance)})}),r=i.nextCursor,!i.hasNextPage)break}return t}async getOwnerCoinBalances(n,e){let t=[];return e?t=[await this._client.getBalance({owner:n,coinType:e})]:t=[...await this._client.getAllBalances({owner:n})],t}updateCache(n,e,t=864e5){let r=this._cache[n];r?(r.overdue_time=Ms(t),r.value=e):r=new dc(e,Ms(t)),this._cache[n]=r}getCache(n,e=!1){let t=this._cache[n],r=t?.isValid();if(!e&&r)return t.value;r||delete this._cache[n]}};function mi(n,e,t,r){let i=new pu(n,e,t,r);return new Proxy(i,{get(s,a,o){if(a in s)return Reflect.get(s,a,o);if(a in s._client){let u=Reflect.get(s._client,a);return typeof u=="function"?u.bind(s._client):u}throw new Error(`Property or method "${String(a)}" does not exist on FullClient or its client.`)}})}var fu=Wr(Hr(),1);var _d=new fu.default(1e6),mu=(n=>(n[n.BelowRange=0]="BelowRange",n[n.InRange=1]="InRange",n[n.AboveRange=2]="AboveRange",n))(mu||{}),ci=10n,gu={pyth_package_id:"0x04e20ddf36af412a4096f9014f4a565af9e812db9a05cc40254846cf6ed0ad91",pyth_published_at:"0x04e20ddf36af412a4096f9014f4a565af9e812db9a05cc40254846cf6ed0ad91",pyth_state_id:"0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8",wormhole_state_id:"0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c",hermes_service_urls:[]},_u={"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC":{coin_type:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC",price_feed_id:"0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",coin_decimals:6},"0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI":{coin_type:"0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",price_feed_id:"0x23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744",coin_decimals:9},"0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS":{coin_type:"0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS",price_feed_id:"0xe5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef",coin_decimals:9},"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP":{coin_type:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",price_feed_id:"0x29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff",coin_decimals:6},"0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX":{coin_type:"0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX",price_feed_id:"0x88250f854c019ef4f88a5c073d52a18bb1c6ac437033f5932cd017d24917ab46",coin_decimals:9},"0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN":{coin_type:"0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN",price_feed_id:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",coin_decimals:9},"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI":{coin_type:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI",price_feed_id:"0x6120ffcf96395c70aa77e72dcb900bf9d40dccab228efca59a17b90ce423d5e8",coin_decimals:9},"0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH":{coin_type:"0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH",price_feed_id:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",coin_decimals:8},"0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL":{coin_type:"0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL",price_feed_id:"0xeba0732395fae9dec4bae12e52760b35fc1c5671e2da8b449c9af4efe5d54341",coin_decimals:9},"0x3e8e9423d80e1774a7ca128fccd8bf5f1f7753be658c5e645929037f7c819040::lbtc::LBTC":{coin_type:"0x3e8e9423d80e1774a7ca128fccd8bf5f1f7753be658c5e645929037f7c819040::lbtc::LBTC",price_feed_id:"0x8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b",coin_decimals:8},"0x3a304c7feba2d819ea57c3542d68439ca2c386ba02159c740f7b406e592c62ea::haedal::HAEDAL":{coin_type:"0x3a304c7feba2d819ea57c3542d68439ca2c386ba02159c740f7b406e592c62ea::haedal::HAEDAL",price_feed_id:"0xe67d98cc1fbd94f569d5ba6c3c3c759eb3ffc5d2b28e64538a53ae13efad8fd1",coin_decimals:9}};function yu(n,e){if(!ci)throw new Error("oraclePriceMultiplierDecimal is required");if(n===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(ci- -e);return n*t}return n/10n**(e+ci)}var Bs=16*1024,Xs=class{constructor(n,e=gu){this.hasChangeConnection=!1,this.pythConfigs=e,this.fullClient=n;let t=[...e.hermes_service_urls];t.includes("https://hermes.pyth.network")||t.push("https://hermes.pyth.network"),this.hermesClients=t.map(r=>new on(r,{timeout:3e3}))}async getFeedInfoList(n){let e=n.map(t=>this.getFeedInfo(t,!1));return await Promise.all(e)}priceCheck(n,e=60){let t=Math.floor(Date.now()/1e3);if(!(Math.abs(t-n.last_update_time)>e))return n}async getPackageId(n){let e=await this.fullClient.getObject({id:n,options:{showContent:!0}});if(e.data?.content?.dataType=="moveObject")return e.data.content.fields.upgrade_cap.fields.package;throw new Error("upgrade_cap not found")}async getWormholePackageId(){let{wormhole_state_id:n}=this.pythConfigs,e=`getWormholePackageId_${n}`,t=this.fullClient.getCache(e);if(t)return t;let r=await this.getPackageId(this.pythConfigs.wormhole_state_id);return this.fullClient.updateCache(e,r),r}async getLatestPrice(n,e=!1){let t={},r=[];if(e?n.forEach(s=>{let a=this.fullClient.getCache(`getLatestPrice_${s}`);a&&this.priceCheck(a,60)?t[s]=a:r.push(s)}):r=[...n],r.length===0)return t;let i=await this.getFeedInfoList(r);return(await this.getLatestPriceFeeds(i.map(s=>s.price_feed_id)))?.parsed?.forEach((s,a)=>{if(s){let{price:o,expo:u,publish_time:l}=s.price,f=dn(o).mul(dn(10).pow(dn(u))).toString(),p=i[a],g={coin_type:p.coin_type,price:f,coin_decimals:p.coin_decimals,oracle_price:0n,last_update_time:l};g.oracle_price=yu(BigInt(o),BigInt(u)),t[r[a]]=g,this.fullClient.updateCache(`getLatestPrice_${g.coin_type}`,g)}}),t}async getPriceFeedsUpdateData(n){let e=null;for(let t of this.hermesClients)try{return(await t.getLatestPriceUpdates(n,{encoding:"hex"})).binary.data.map(r=>Buffer.from(r,"hex"))}catch(r){console.log("\u{1F680} ~ PythPriceModule ~ getPriceFeedsUpdateData ~ e:",r),e=r;continue}throw new Error(`All Pyth Hermes endpoints are unavailable. getPriceFeedsUpdateData Detailed error: ${e?.message}`)}async getLatestPriceFeeds(n){let e=null;for(let t of this.hermesClients)try{return await t.getLatestPriceUpdates(n,{parsed:!0})}catch(r){console.log("\u{1F680} ~ PythPriceModule ~ getLatestPriceFeeds ~ error:",r),e=r;continue}throw new Error(`All Pyth Hermes endpoints are unavailable. getLatestPriceFeeds Detailed error: ${e?.message}`)}extractVaaBytesFromAccumulatorMessage(n){let e=7+n.readUint8(6)+1,t=n.readUint16BE(e),r=e+2;return n.subarray(r,r+t)}async verifyVaas(n,e){let t=await this.getWormholePackageId(),r=[];for(let i of n){let[s]=e.moveCall({target:`${t}::vaa::parse_and_verify`,arguments:[e.object(this.pythConfigs.wormhole_state_id),e.pure(cn.vector(cn.u8()).serialize(Array.from(i),{maxSize:Bs}).toBytes()),e.object(ui)]});r.push(s)}return r}async getPriceTableInfo(){if(this.priceTableInfo===void 0){let n=await this.fullClient.getDynamicFieldObject({parentId:this.pythConfigs.pyth_state_id,name:{type:"vector<u8>",value:"price_info"}});if(!n.data?.type)throw new Error("Price Table not found, contract may not be initialized");let e=n.data.type.replace("0x2::table::Table<","");e=e.replace("::price_identifier::PriceIdentifier, 0x2::object::ID>",""),this.priceTableInfo={id:n.data.objectId,fieldType:e}}return this.priceTableInfo}async getPriceFeedObjectId(n){let e=n.replace("0x",""),t=`getPriceFeedObjectId_${e}`,r=this.fullClient.getCache(t);if(r)return r;let{id:i,fieldType:s}=await this.getPriceTableInfo(),a=await this.fullClient.getDynamicFieldObject({parentId:i,name:{type:`${s}::price_identifier::PriceIdentifier`,value:{bytes:[...Buffer.from(e,"hex")]}}});if(a.data?.content){if(a.data.content.dataType!=="moveObject")throw new Error("Price feed type mismatch");return this.fullClient.updateCache(t,a.data.content.fields.value),a.data.content.fields.value}}async verifyVaasAndGetHotPotato(n,e,t){if(e.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let r=this.extractVaaBytesFromAccumulatorMessage(e[0]),i=await this.verifyVaas([r],n),[s]=n.moveCall({target:`${t}::pyth::create_authenticated_price_infos_using_accumulator`,arguments:[n.object(this.pythConfigs.pyth_state_id),n.pure(cn.vector(cn.u8()).serialize(Array.from(e[0]),{maxSize:Bs}).toBytes()),i[0],n.object(ui)]});return s}async buildUpdatePythPricePayload(n,e,t){let{pyth_state_id:r,pyth_published_at:i,pyth_package_id:s}=this.pythConfigs,a=(await this.getFeedInfoList(n)).map(f=>f.price_feed_id);if(n.length!==a.length)throw Error("find feed id fail");let o=await this.getPriceFeedsUpdateData(a);if(!o)throw new Error("get price update data fail");if(o.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let u=await this.verifyVaasAndGetHotPotato(e,o,i),l=0;for(let f of a){let p=await this.getPriceFeedObjectId(f);if(!p)throw new Error(`Price feed ${f} not found, please create it first`);u=t({tx:e,coinType:n[l],priceUpdatesHotPotato:u,priceInfoObjectId:p}),l+=1}return e.moveCall({target:`${i}::hot_potato_vector::destroy`,arguments:[u],typeArguments:[`${s}::price_info::PriceInfo`]}),e}async getBaseUpdateFee(){if(this.baseUpdateFee===void 0){let n=await this.fullClient.getObject({id:this.pythConfigs.pyth_state_id,options:{showContent:!0}});if(!n.data?.content||n.data.content.dataType!=="moveObject")throw new Error("Unable to fetch pyth state object");this.baseUpdateFee=n.data.content.fields.base_update_fee}return this.baseUpdateFee}async updatePriceFeeds(n,e,t){let r=this.pythConfigs.pyth_package_id,i=await this.verifyVaasAndGetHotPotato(n,e,r),s=await this.getBaseUpdateFee(),a=n.splitCoins(n.gas,t.map(()=>n.pure.u64(s))),o=[],u=0;for(let l of t){let f=await this.getPriceFeedObjectId(l);if(!f)throw new Error(`Price feed ${l} not found, please create it first`);o.push(f),[i]=n.moveCall({target:`${r}::pyth::update_single_price_feed`,arguments:[n.object(this.pythConfigs.pyth_state_id),i,n.object(f),a[u],n.object(ui)]}),u++}return n.moveCall({target:`${r}::hot_potato_vector::destroy`,arguments:[i],typeArguments:[`${r}::price_info::PriceInfo`]}),o}async buildUpdatePythPricePayloadV2(n,e,t){if(n.length===0)return e;let r=(await this.getFeedInfoList(n)).map(o=>o.price_feed_id);if(n.length!==r.length)throw Error("find feed id fail");let i=await this.getPriceFeedsUpdateData(r);if(!i)throw new Error("get price update data fail");if(i.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let s=await this.updatePriceFeeds(e,i,r),a=0;for(let o of s)t({tx:e,coinType:n[a],priceUpdatesHotPotato:{},priceInfoObjectId:o}),a+=1;return e}getFeedInfoByJson(n){let e=Ps(n,!1);return _u[e]}async getFeedInfo(n,e){let t=`getFeedInfo_${n}`,r=this.fullClient.getCache(t,e);if(r)return r;let i=this.getFeedInfoByJson(n);if(i)return i;let{feed_info_handle:s}=this.pythConfigs;if(!s)throw new Error("feed_info_handle is not set");let a=await this.fullClient.getDynamicFieldObject({parentId:s,name:{type:"0x1::type_name::TypeName",value:Ps(n,!0)}}),{fields:o}=a.data.content.fields.value,u={coin_type:n,price_feed_id:lu(o.price_feed_id),coin_decimals:o.coin_decimals};return console.log("\u{1F680} ~ PythPriceModule ~ getFeedInfo ~ info:",u),this.fullClient.updateCache(t,u),u}},Pr=Wr(Hr(),1),bd=new Pr.default(0),Js=new Pr.default(1),gi=new Pr.default(2),wd=gi.pow(new Pr.default(128)),vd=gi.pow(new Pr.default(64)).sub(Js),kd=gi.pow(new Pr.default(128)).sub(Js);mn.config({precision:64,rounding:mn.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var Cd=Wr(Hr(),1),Td=Wr(Hr(),1);var Md=Wr(Hr(),1);import{SuiGraphQLClient as Hu}from"@mysten/sui/graphql";import{SuiJsonRpcClient as Ku}from"@mysten/sui/jsonRpc";import{DeepBookClient as Fu}from"@mysten/deepbook-v3";import{bcs as L}from"@mysten/sui/bcs";import{Transaction as ae,coinWithBalance as ka}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as rt,normalizeStructTag as wt,normalizeSuiObjectId as Lu}from"@mysten/sui/utils";import{Base64 as Vu}from"js-base64";var Ys=6e4,ea=3e5,Qt=864e5;function qr(n){return Date.parse(new Date().toString())+n}var Br=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{SUI_TYPE_ARG as Mu,normalizeStructTag as Au,normalizeSuiObjectId as wi}from"@mysten/sui/utils";import{coinWithBalance as ta}from"@mysten/sui/transactions";var bu="0x2::coin::Coin",wu=/^0x2::coin::Coin<(.+)>$/,qd=1e3,Rd=500,Dd=100,Ud=100,$d=1e3,yi="0x2::sui::SUI",ra="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",Nd="SUI",Fd=450,Ld="0x0000000000000000000000000000000000000005",se=class{static getCoinTypeArg(e){let t=e.type.match(wu);return t?t[1]:null}static isSUI(e){let t=se.getCoinTypeArg(e);return t?se.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(i=>{t===i.coinAddress&&(r+=BigInt(i.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${bu}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(i=>{_i(i.coinAddress)===_i(e)&&r.push(i)}),r}static isSuiCoin(e){return Et(e).full_address===yi}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let i=se.selectCoinAssetGreaterThanOrEqual(e,t,r),s=i.selectedCoins.map(u=>u.coinObjectId),a=i.remainingCoins,o=i.selectedCoins.map(u=>u.balance.toString());return{objectArray:s,remainCoins:a,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let i=se.sortByBalance(e.filter(l=>!r.includes(l.coinObjectId))),s=se.calculateTotalBalance(i);if(s<t)return{selectedCoins:[],remainingCoins:i};if(s===t)return{selectedCoins:i,remainingCoins:[]};let a=BigInt(0),o=[],u=[...i];for(;a<s;){let l=t-a,f=u.findIndex(g=>g.balance>=l);if(f!==-1){o.push(u[f]),u.splice(f,1);break}let p=u.pop();p.balance>0&&(o.push(p),a+=p.balance)}return{selectedCoins:se.sortByBalance(o),remainingCoins:se.sortByBalance(u)}}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)&&se.isSuiCoin(t)?r.add(ta({balance:e,useGasCoin:!1})):r.add(ta({balance:e,type:t}))}};var vu=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function na(n){return n.startsWith("0x")?n:`0x${n}`}function bi(n){return n.startsWith("0x")?`${n.slice(2)}`:n}function ku(n,e=4,t=4){let r=Math.max(e,1),i=Math.max(t,1);return`${n.slice(0,r+2)} ... ${n.slice(-i)}`}function Zd(n,e=4,t=4){return ku(na(n),e,t)}function zd(n,e={leadingZero:!0}){if(typeof n!="string")return!1;let t=n;if(e.leadingZero){if(!n.startsWith("0x"))return!1;t=t.substring(2)}return vu.test(t)}function Cu(n){if(!Buffer.isBuffer(n))if(Array.isArray(n))n=Buffer.from(n);else if(typeof n=="string")exports.isHexString(n)?n=Buffer.from(exports.padToEven(exports.stripHexPrefix(n)),"hex"):n=Buffer.from(n);else if(typeof n=="number")n=exports.intToBuffer(n);else if(n==null)n=Buffer.allocUnsafe(0);else if(n.toArray)n=Buffer.from(n.toArray());else throw new Error("invalid type");return n}function Gd(n){return na(Cu(n).toString("hex"))}function Wd(n){let e=new ArrayBuffer(4),t=new DataView(e);for(let i=0;i<n.length;i++)t.setUint8(i,n.charCodeAt(i));return t.getUint32(0,!0)}function Tu(n){let e,t,r,i,s;e="";let a=n.length;for(t=0;t<a;)switch(r=n.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=n.charAt(t-1);break;case 12:case 13:i=n.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|i&63);break;case 14:i=n.charCodeAt(t++),s=n.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(i&63)<<6|(s&63)<<0);break}return e}function Hd(n){let e="",t=bi(n),r=t.length/2;for(let i=0;i<r;i++)e+=String.fromCharCode(Number.parseInt(t.substr(i*2,2),16));return Tu(e)}var Su=0,aa=1,Ou=2;function ia(n,e){return n===e?Su:n<e?aa:Ou}function Eu(n,e){let t=0,r=n.length<=e.length?n.length:e.length,i=ia(n.length,e.length);for(;t<r;){let s=ia(n.charCodeAt(t),e.charCodeAt(t));if(t+=1,s!==0)return s}return i}function Yd(n,e){return Eu(n,e)===aa}function sa(n,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],i=[n,...e].filter(Boolean).join("::");return t&&t.length&&(i+=`<${t.join(", ")}>`),i}function eh(n){return n.split("::")[0]}function Et(n){try{let e=n.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let u={...Et(e),type_arguments:r.map(l=>Et(l).source_address)};return u.type_arguments=u.type_arguments.map(l=>se.isSuiCoin(l)?l:Et(l).source_address),u.source_address=sa(u.full_address,u.type_arguments),u}let i=e.split("::"),a={full_address:e,address:e===yi||e===ra?"0x2":wi(i[0]),module:i[1],name:i[2],type_arguments:[],source_address:""};return a.full_address=`${a.address}::${a.module}::${a.name}`,a.source_address=sa(a.full_address,a.type_arguments),a}catch{return{full_address:n,address:"",module:"",name:"",type_arguments:[],source_address:n}}}function _i(n){return Et(n).source_address}function xu(n){return n.toLowerCase().startsWith("0x")?wi(n):n}var th=(n,e=!0)=>{let t=n.split("::"),r=t.shift(),i=wi(r);return e&&(i=bi(i)),`${i}::${t.join("::")}`};function vi(n){for(let e in n){let t=typeof n[e];if(t==="object")vi(n[e]);else if(t==="string"){let r=n[e];n[e]=xu(r)}}}var rh=Au(Mu);import oa from"decimal.js";oa.config({precision:64,rounding:oa.ROUND_DOWN,toExpNeg:-64,toExpPos:64});import vn from"decimal.js";function T(n){return vn.isDecimal(n)?n:new vn(n===void 0?0:n)}function ki(n){return T(10).pow(T(n).abs())}var fr=(n,e)=>{try{return T(n).toDP(e,vn.ROUND_DOWN).toString()}catch{return n}},Ci=(n,e)=>vn.max(T(n),T(e));import{Transaction as ju}from"@mysten/sui/transactions";async function lh(n,e=!0){console.log("inputs",n.getData().inputs),n.getData().commands.forEach((t,r)=>{e&&console.log(`transaction ${r}: `,t)})}var Ut=class{static async adjustTransactionForGas(e,t,r,i){i.setSender(e.senderAddress);let s=se.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(s.length===0)throw new Error("Insufficient balance");let a=se.calculateTotalBalance(t);if(a-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(i);if(se.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),s.map(l=>l.coinObjectId)).selectedCoins.length===0){let l=BigInt(o)+BigInt(500);if(a-r<l){if(r-=l,r<0)throw new Error("gas Insufficient balance");let f=new ju;return{fixAmount:r,newTx:f}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,i,s=!0,a=!1){let o=se.getCoinAssets(i,t);if(r===BigInt(0)&&o.length===0)return Ut.buildZeroValueCoin(t,e,i,s);let u=se.calculateTotalBalance(o);if(u<r)throw new Error(`The amount(${u}) is Insufficient balance for ${i} , expect ${r} `);return Ut.buildCoin(e,t,o,r,i,s,a)}static buildCoin(e,t,r,i,s,a=!0,o=!1){if(se.isSuiCoin(s)){if(a){let S=e.splitCoins(e.gas,[e.pure.u64(i)]);return{targetCoin:e.makeMoveVec({elements:[S]}),remainCoins:t,tragetCoinAmount:i.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(i===0n&&r.length>1){let S=se.selectCoinObjectIdGreaterThanOrEqual(r,i);return{targetCoin:e.object(S.objectArray[0]),remainCoins:S.remainCoins,tragetCoinAmount:S.amountArray[0],isMintZeroCoin:!1}}let E=se.selectCoinObjectIdGreaterThanOrEqual(r,i);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(i)]),remainCoins:E.remainCoins,tragetCoinAmount:i.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let u=se.selectCoinObjectIdGreaterThanOrEqual(r,i),l=u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),f=u.objectArray;if(a)return{targetCoin:e.makeMoveVec({elements:f.map(E=>e.object(E))}),remainCoins:u.remainCoins,tragetCoinAmount:u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),isMintZeroCoin:!1};let[p,...g]=f,w=e.object(p),C=w,A=u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),j;return g.length>0&&e.mergeCoins(w,g.map(E=>e.object(E))),o&&Number(l)>Number(i)&&(C=e.splitCoins(w,[e.pure.u64(i)]),A=i.toString(),j=w),{targetCoin:C,remainCoins:u.remainCoins,originalSplitedCoin:j,tragetCoinAmount:A,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,i=!0){let s=Ut.callMintZeroValueCoin(t,r),a;return i?a=t.makeMoveVec({elements:[s]}):a=s,{targetCoin:a,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,i,s=!0){let a=se.getCoinAssets(i,t);if(r.amountFirst===BigInt(0))return a.length>0?Ut.buildCoin(e,[...t],[...a],r.amountFirst,i,s):Ut.buildZeroValueCoin(t,e,i,s);let o=se.calculateTotalBalance(a);if(o>=r.amountFirst)return Ut.buildCoin(e,[...t],[...a],r.amountFirst,i,s);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${i} , expect ${r.amountSecond} `);return Ut.buildCoin(e,[...t],[...a],r.amountSecond,i,s)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let i=[];i.push(e[0],e[1]),r.push(i)}else{let i=[];i.push(e[0],e[e.length-1]),r.push(i);for(let s=1;s<e.length-1;s+=1){if(t[s-1]===0)continue;let a=[];a.push(e[0],e[s],e[e.length-1]),r.push(a)}}return r}},mr=Ut;zi(mr,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));function Rr(n){return n.data}function Iu(n){if(n.error&&"object_id"in n.error&&"version"in n.error&&"digest"in n.error){let{error:e}=n;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function Pu(n){if(n.error&&"object_id"in n.error&&!("version"in n.error)&&!("digest"in n.error))return n.error.object_id}function ca(n){if("reference"in n)return n.reference;let e=Rr(n);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:Iu(n)}function ua(n){return"objectId"in n?n.objectId:ca(n)?.objectId??Pu(n)}function ph(n){return"version"in n?n.version:ca(n)?.version}function Bu(n){return n.data!==void 0}function qu(n){return n.content!==void 0}function fh(n){let e=Rr(n);if(e?.content?.dataType==="package")return e.content.disassembled}function Ti(n){let e="data"in n?Rr(n):n;if(!(!e||!qu(e)||e.content.dataType!=="moveObject"))return e.content}function Ru(n){return Ti(n)?.type}function mh(n){let e=Bu(n)?n.data:n;return!e?.type&&"data"in n?e?.content?.dataType==="package"?"package":Ru(n):e?.type}function gh(n){return Rr(n)?.previousTransaction}function _h(n){return Rr(n)?.owner}function yh(n){let e=Rr(n)?.display;return e||{data:null,error:null}}function la(n){let e=Ti(n)?.fields;if(e)return"fields"in e?e.fields:e}function bh(n){return Ti(n)?.hasPublicTransfer??!1}import{Ed25519Keypair as da}from"@mysten/sui/keypairs/ed25519";import{Secp256k1Keypair as ha}from"@mysten/sui/keypairs/secp256k1";import{fromBase64 as pa,fromHex as fa}from"@mysten/sui/utils";function Qr(n,e){let t=ki(T(e));return Number(T(n).mul(t))}function Mh(n,e=32){return BigInt.asUintN(e,BigInt(n)).toString()}function Ah(n,e=32){return Number(BigInt.asIntN(e,BigInt(n)))}function gr(n,e){let t=ki(T(e));return Number(T(n).div(t))}function Sh(n,e="hex"){if(n instanceof Uint8Array){let r=Buffer.from(n);return da.fromSecretKey(r)}let t=e==="hex"?fa(n):pa(n);return da.fromSecretKey(t)}function Oh(n,e="hex"){if(n instanceof Uint8Array){let r=Buffer.from(n);return ha.fromSecretKey(r)}let t=e==="hex"?fa(n):pa(n);return ha.fromSecretKey(t)}var ma=async n=>new Promise(e=>{setTimeout(()=>{e(1)},n)});var jh=({totalAssetsValue:n,totalDebtValue:e})=>T(e).eq(0)||T(n).eq(0)?"0":T(n).div(T(e)).toString(),ga=n=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:i,user_liquidation_reward:s}=n.value.fields,{liquidation_risk_ratio:a,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:u,target_liquidation_risk_ratio:l}=n.value.fields.risk_ratios.fields;return{id:n.id.id,name:n.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:i,user_liquidation_reward:s,liquidation_risk_ratio:a,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:u,target_liquidation_risk_ratio:l}},_a=(n,e)=>{let{deposit_coin_type:t}=e,r=n.id.id,{max_utilization_rate:i,min_borrow:s,protocol_spread:a,supply_cap:o}=n.config.fields.margin_pool_config.fields,{maintainer_fees:u,protocol_fees:l}=n.protocol_fees.fields,{total_supply:f,total_borrow:p}=n.state.fields,g=T(o).sub(f).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:f,total_borrow:p,available_supply:g,max_utilization_rate:i,min_borrow:s,protocol_spread:a,maintainer_fees:u,protocol_fees:l}};var xt=1000000000n,Du=365n*24n*60n*60n*1000n;function Uu(n,e){return e===0n?0n:n*xt/e}function $u(n,e){let{base_rate:t,base_slope:r,optimal_utilization:i,excess_slope:s}=e;if(n<i)return t+n*r/xt;{let a=n-i,o=i*r/xt,u=a*s/xt;return t+o+u}}function ya(n,e){let t=n*e,r=t/xt;return t%xt>0n?r+1n:r}function Nu(n,e,t,r){let i=e.borrow_shares===0n?xt:e.total_borrow*xt/e.borrow_shares,s=ya(n,i),a=Uu(e.total_borrow,e.total_supply),o=$u(a,t),u=r-e.last_update_timestamp,l=e.total_borrow*o/xt*u/Du,f=e.borrow_shares===0n?0n:ya(l,n*xt/e.borrow_shares),p=s+f;return{confirmedDebt:s,estimatedInterest:f,totalDebt:p,annualInterestRate:o}}function Ph(n,e,t,r,i=60000n){let s=r+i,{totalDebt:a}=Nu(n,e,t,s);return a}var ba={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},wa={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function va(...n){console.log("DeepbookV3_Utils_Sdk###",...n)}var Mi=1e6,vt=1e9,Zu={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},zu={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},Cn=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?zu:Zu}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new ae,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 i=new ae;i.setSenderIfNotSet(e);let s=i.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),a=ka({type:t.coinType,balance:BigInt(r)});return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s,a],typeArguments:[t.coinType]}),i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),s],typeArguments:[]}),i.moveCall({target:"0x2::transfer::public_share_object",arguments:[s],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),i}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:i,tx:s}){let a=s||new ae;if(t){a.setSenderIfNotSet(e);let o=ka({type:r.coinType,balance:BigInt(i)});return a.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[a.object(t),o],typeArguments:[r.coinType]}),a}return null}async withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:i,returnAssets:s,txb:a}){let o=a||new ae,u=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(i)],typeArguments:[r.coinType]});if(s)return u;let f=(await this._sdk.getOwnerCoinAssets(e,r.coinType)).map(g=>({coinAddress:g.coinAddress,coinObjectId:g.coinObjectId,balance:BigInt(g.balance)})),p=mr.buildCoinForAmount(o,f,BigInt(0),r.coinType,!1);return p.targetCoin?(o.mergeCoins(p.targetCoin,[u]),p.isMintZeroCoin&&o.transferObjects([p.targetCoin],e)):o.transferObjects([u],e),o}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new ae}){for(let i in t)t[i].forEach(a=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(i),r.pure.u64(a.amount)],typeArguments:[a.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,i=this.getCache(r,t);if(!t&&i!==void 0)return i;try{let s=new ae;s.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[s.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),s.pure.address(e)],typeArguments:[]});let u=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:s}))?.events?.filter(f=>f.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],l=[];return u.forEach(f=>{l.push({balanceManager:f,cetusBalanceManager:""})}),this.updateCache(r,l,864e5),l||[]}catch(s){throw s instanceof Error?s:new Error(String(s))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new ae){let i=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),i],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let i=new ae;r.forEach(o=>{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[i.object(t)],typeArguments:[o.coinType]})});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}),a={};return s.results?.forEach((o,u)=>{let l=r[u],f=o.returnValues[0][0],p=L.U64.parse(new Uint8Array(f)),g=T(p),w=g.eq(0)?"0":g.div(Math.pow(10,l.decimals)).toString();a[l.coinType]={adjusted_balance:w,balance:g.toString()}}),a}catch(i){throw i instanceof Error?i:new Error(String(i))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new ae,i=await this.getBalanceManager(e,!0);if(!Array.isArray(i)||i.length===0)return{};i.forEach(o=>{t.forEach(u=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[u.coinType]})})});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),a={};return i.forEach((o,u)=>{let l={},f=u*t.length;t.forEach((p,g)=>{let w=f+g,C=s.results?.[w];if(C){let A=C.returnValues[0][0],j=L.U64.parse(new Uint8Array(A)),E=T(j),q=E.eq(0)?"0":E.div(Math.pow(10,p.decimals)).toString();l[p.coinType]={adjusted_balance:q,balance:E.toString()}}}),a[o.balanceManager]=l}),a}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new ae;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],s=Number(L.U64.parse(new Uint8Array(i))),a=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return T(s).mul(a).div(o).div(vt).toString()}catch(t){return va("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let i=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),s=/<([^>]+)>/,a=[];return i?.data?.forEach(o=>{let u=o?.parsedJson,l=o.type.match(s);if(l){let p=l[1].split(", ");a.push({...u,baseCoinType:p[0],quoteCoinType:p[1]})}}),this.updateCache(t,a,864e5),a}async getQuoteQuantityOut(e,t,r){let i=new ae;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:i}),a=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),o=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:T(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:T(a).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(u).div(Mi).toString(),baseQuantity:t,baseOut:a,quoteOut:o,deepRequired:u}}async getBaseQuantityOut(e,t,r){let i=new ae;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:i}),a=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),o=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{quoteQuantityDisplay:T(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:T(a).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(u).div(Mi).toString(),quoteQuantity:t,baseOut:a,quoteOut:o,deepRequired:u}}async getQuantityOut(e,t,r,i){let s=new ae;s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[s.object(e.address),s.pure.u64(t),s.pure.u64(r),s.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:i,transactionBlock:s}),o=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[0][0]))),u=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[1][0]))),l=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[2][0])));return{baseQuantityDisplay:T(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:T(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:T(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(u).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(l).div(Mi).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:u,deepRequired:l}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,i=e.quoteCoin.coinType,s=this._deep.coinType;for(let a=0;a<t.length;a++){let o=t[a];if(o.address===e.address)continue;let u=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===s&&(u.includes(r)||u.includes(i)))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(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,i,s,a,o){let u=this.deepCoin;try{let{taker_fee:l,maker_fee:f}=e,p=T(l).div(vt).toString(),g=T(f).div(vt).toString(),w=await this.getMarketPrice(e),C=a?r:w!=="0"?w:o;if(C==="0")throw new Error("Cannot get market price");let A=Math.pow(10,e.baseCoin.decimals).toString(),j=Math.pow(10,e.quoteCoin.decimals).toString(),E=T(C).div(A).mul(j).mul(vt).toString();if(i){let U=await this.getMarketPrice(e),R=T(a?r:U!=="0"?U:o).div(A).mul(j).mul(vt).toString(),ne=await this.getOrderDeepPrice(e);if(!ne)throw new Error("Cannot get deep price");let ie=Ci(R,r),ue=T(t).mul(T(p)).mul(T(ne.deep_per_asset)).div(T(vt)),oe=T(t).mul(T(g)).mul(T(ne.deep_per_asset)).div(T(vt));ne.asset_is_base||(ue=ue.mul(ie).div(T(vt)),oe=oe.mul(ie).div(T(vt)));let Je=ue.ceil().toString(),ut=oe.ceil().toString();return{takerFee:Je,makerFee:ut,takerFeeDisplay:gr(Je,u.decimals).toString(),makerFeeDisplay:gr(ut,u.decimals).toString(),feeType:u.coinType}}if(s){let U=Ci(E,a?r:w),Q=T(t).mul(U).mul(T(p).mul(1.25)).div(T(vt)).ceil().toFixed(0),R=T(t).mul(U).mul(T(g).mul(1.25)).div(T(vt)).ceil().toFixed(0);return{takerFee:Q,makerFee:R,takerFeeDisplay:gr(Q,e.quoteCoin.decimals).toString(),makerFeeDisplay:gr(R,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let q=T(t).mul(T(p).mul(1.25)).ceil().toFixed(0),S=T(t).mul(T(g).mul(1.25)).ceil().toFixed(0);return{takerFee:q,makerFee:S,takerFeeDisplay:gr(q,e.baseCoin.decimals).toString(),makerFeeDisplay:gr(S,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,i=this.getCache(r);if(i!==void 0)return i;try{let s=new ae,a=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,s)&&(a=!0),s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[s.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:s}),u=a?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],l=this.parseOrderDeepPrice(new Uint8Array(u));return this.updateCache(r,l,6e4),l}catch{return await ma(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,i=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:i}}getCoinAssets(e,t,r){return se.buildCoinWithBalance(BigInt(T(t).abs().ceil().toString()),e,r)}async getTransactionRelatedBalance(e,t,r,i,s,a,o){let u=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let l=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];i&&l.push(u);let f=await this.getManagerBalance({account:s,balanceManager:o,coins:l}),p=f?.[t]?.balance||"0",g=f?.[r]?.balance||"0",w=a&&f?.[u.coinType]?.balance||"0";return{baseManagerBlance:p,quoteManagerBlance:g,feeManaerBalance:w}}catch(l){throw l instanceof Error?l:new Error(String(l))}}getFeeAsset(e,t,r,i,s,a,o,u,l){let f=T(e).gt(0)&&u,p="0";if(!f)return{feeAsset:this.getEmptyCoin(l,t),haveDepositFee:"0"};if(a||o){let g=T(s).sub(a?i:r);p=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else p=T(s).sub(e).lt("0")?T(s).sub(e).abs().toString():"0";return{feeAsset:T(p).gt("0")?this.getCoinAssets(t,p,l):this.getEmptyCoin(l,t),haveDepositFee:p}}async getTransactionRelatedAssets(e,t,r,i,s,a,o,u,l){try{let f=this.deepCoin,p=wt(e.baseCoin.coinType),g=wt(e.quoteCoin.coinType),w=p===f.coinType,C=g===f.coinType,A=!w&&!C,{baseManagerBlance:j,quoteManagerBlance:E,feeManaerBalance:q}=await this.getTransactionRelatedBalance(e,p,g,A,a,o,u);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:j,quoteManagerBlance:E});let S,U,Q=!1;if(s){o||(r=T(r).add(T(i)).toString());let ne=T(E).sub(r).toString();T(ne).lt(0)?(Q=!0,U=this.getCoinAssets(g,ne,l)):U=this.getEmptyCoin(l,g),S=this.getEmptyCoin(l,p)}else{o||(t=T(t).add(T(i)).toString());let ne=T(j).sub(t).toString();T(ne).lt(0)?(Q=!0,S=this.getCoinAssets(p,ne,l)):S=this.getEmptyCoin(l,p),U=this.getEmptyCoin(l,g)}let R=this.getFeeAsset(i,f.coinType,t,r,q,C,w,o,l);return{baseAsset:S,quoteAsset:U,feeAsset:R,haveDeposit:Q}}catch(f){throw f instanceof Error?f:new Error(String(f))}}async getMarketTransactionRelatedAssets(e,t,r,i,s,a,o,u,l,f){try{let p=this.deepCoin,g=wt(e.baseCoin.coinType),w=wt(e.quoteCoin.coinType),C=g===p.coinType,A=w===p.coinType,j=!C&&!A,E=await this.getTransactionRelatedBalance(e,g,w,j,a,o,u),{feeManaerBalance:q}=E,S=T(E.baseManagerBlance).add(T(f?.base||"0")).toString(),U=T(E.quoteManagerBlance).add(T(f?.quote||"0")).toString(),Q;o&&T(q).lt(i)?Q=this.getCoinAssets(p.coinType,T(i).sub(q).toString(),l):Q=this.getEmptyCoin(l,p.coinType);let R,ne;if(s){o||(r=T(r).add(T(i)).toString());let ie=T(U).sub(r).toString();if(T(ie).lt(0)){let ue;T(U).gt(0)&&(ue=this.withdrawFromManager({account:a,balanceManager:u,coin:e.quoteCoin,amountToWithdraw:U,returnAssets:!0,txb:l}));let oe=this.getCoinAssets(w,ie,l);ue&&l.mergeCoins(oe,[ue]),ne=oe}else ne=this.withdrawFromManager({account:a,balanceManager:u,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:l});R=this.getEmptyCoin(l,g)}else{o||(t=T(t).add(T(i)).toString());let ie=T(S).sub(t).toString();if(T(ie).lt(0)){let ue;T(S).gt(0)&&(ue=this.withdrawFromManager({account:a,balanceManager:u,coin:e.baseCoin,amountToWithdraw:S,returnAssets:!0,txb:l}));let oe=this.getCoinAssets(g,ie,l);ue&&l.mergeCoins(oe,[ue]),R=oe}else R=this.withdrawFromManager({account:a,balanceManager:u,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:l});ne=this.getEmptyCoin(l,w)}return{baseAsset:R,quoteAsset:ne,feeAsset:Q}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:i,isBid:s,maxFee:a,account:o,payWithDeep:u,expirationTimestamp:l=Date.now()+31536e8}){try{let f=this.deepCoin,p=e.address,g=e.baseCoin.decimals,w=e.quoteCoin.decimals,C=e.baseCoin.coinType,A=e.quoteCoin.coinType,j=T(t).mul(10**(w-g+9)).toString(),E=wt(C),q=wt(A),S=new ae,U,Q,R=await this._sdk.getOwnerCoinAssets(o);if(s){let oe=T(t).mul(T(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();u||(oe=T(oe).add(T(a)).toString()),Q=se.buildCoinWithBalance(BigInt(oe),q,S)}else{let oe=r;u||(oe=T(r).abs().add(T(a)).toString()),U=se.buildCoinWithBalance(BigInt(oe),E,S)}let ne=u?T(a).gt(0)?se.buildCoinWithBalance(BigInt(T(a).abs().ceil().toString()),f.coinType,S):this.getEmptyCoin(S,f.coinType):this.getEmptyCoin(S,f.coinType),ie=S.moveCall({typeArguments:[s?C:A],target:"0x2::coin::zero",arguments:[]}),ue=[S.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),S.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),S.object(p),s?ie:U,s?Q:ie,ne,S.pure.u8(i),S.pure.u8(0),S.pure.u64(j),S.pure.u64(r),S.pure.bool(s),S.pure.bool(!1),S.pure.u64(l),S.object(rt)];return S.moveCall({typeArguments:[E,q],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:ue}),S}catch(f){throw f instanceof Error?f:new Error(String(f))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:i,account:s,payWithDeep:a,slippage:o=.01}){try{let u=e.address,l=e.baseCoin.coinType,f=e.quoteCoin.coinType,p=wt(l),g=wt(f),w=new ae,C,A,j=t,E,q=await this.getOrderBook(e,"all",6);if(r){let Q=q?.ask?.[0]?.price||"0",R=T(Q).mul(T(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();E=T(R).plus(T(R).mul(o)).ceil().toString()}else{let Q=await q?.bid?.[0]?.price||"0",R=T(Q).mul(T(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();E=T(R).minus(T(R).mul(o)).floor().toString()}r?(a||(E=T(E).add(T(i)).toString()),A=this.getCoinAssets(g,E,w),C=this.getEmptyCoin(w,p)):(a||(j=T(j).add(T(i)).toString()),A=this.getEmptyCoin(w,g),C=this.getCoinAssets(p,j,w));let S=a?T(i).gt(0)?se.buildCoinWithBalance(BigInt(T(i).abs().ceil().toString()),this.deepCoin.coinType,w):this.getEmptyCoin(w,this.deepCoin.coinType):this.getEmptyCoin(w,this.deepCoin.coinType),U=[w.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),w.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),w.object(u),C,A,S,w.pure.u8(0),w.pure.u64(t),w.pure.bool(r),w.pure.bool(a),w.pure.u64(E),w.object(rt)];return w.moveCall({typeArguments:[p,g],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:U}),w}catch(u){throw u instanceof Error?u:new Error(String(u))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:i,isBid:s,orderType:a,maxFee:o,account:u,payWithDeep:l,expirationTimestamp:f=Date.now()+31536e8}){try{let p=this.deepCoin,g=T(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),w=t.baseCoin.coinType,C=t.quoteCoin.coinType,A=new ae,j=s?T(r).mul(T(i).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",E=s?"0":i,{baseAsset:q,quoteAsset:S,feeAsset:U,haveDeposit:Q}=await this.getTransactionRelatedAssets(t,E,j,o,s,u,l,e,A);if(Q){let ie=[A.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),A.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),A.object(t.address),A.object(e),q,S,U.feeAsset,A.pure.u8(a),A.pure.u8(0),A.pure.u64(g),A.pure.u64(i),A.pure.bool(s),A.pure.bool(l),A.pure.u64(f),A.object(rt)];return A.moveCall({typeArguments:[w,C],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:ie}),A}let R=new ae;T(U.haveDepositFee).gt(0)&&this.depositIntoManager({account:u,balanceManager:e,coin:p,amountToDeposit:U.haveDepositFee,tx:R});let ne=[R.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),R.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),R.object(t.address),R.object(e),R.pure.u8(a),R.pure.u8(0),R.pure.u64(g),R.pure.u64(i),R.pure.bool(s),R.pure.bool(l),R.pure.u64(f),R.object(rt)];return R.moveCall({typeArguments:[w,C],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:ne}),R}catch(p){throw p instanceof Error?p:new Error(String(p))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:i}){let s=new ae;return s.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[s.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),s.object(e),s.object(t.address),s.pure.u128(r),s.pure.u64(i),s.object(rt)]}),s}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,i=new ae,s=await this.getMarketPrice(e),a=T(s).gt(0)?s:Math.pow(10,-1),o=Math.pow(10,6),u=T(a).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),l=T(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(u),i.pure.u64(l),i.pure.bool(!1),i.object(rt)],typeArguments:[t.coinType,r.coinType]});let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:i}),g=[],w=p.results[0].returnValues[0][0],C=L.vector(L.u64()).parse(new Uint8Array(w)),A=p.results[0].returnValues[1][0],j=L.vector(L.u64()).parse(new Uint8Array(A));return C.forEach((E,q)=>{let S=T(E).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),U=T(j[q]).div(Math.pow(10,t.decimals)).toString();g.push({price:S,quantity:U})}),g?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,i=new ae,s=await this.getMarketPrice(e),a=T(s).gt(0)?T(s).div(3).toNumber():Math.pow(10,-6),o=T(s).gt(0)?s:Math.pow(10,6),u=T(a).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),l=T(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(fr(u,0)),i.pure.u64(fr(l,0)),i.pure.bool(!0),i.object(rt)],typeArguments:[t.coinType,r.coinType]});let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:i}),g=[],w=p.results[0].returnValues[0][0],C=L.vector(L.u64()).parse(new Uint8Array(w)),A=p.results[0].returnValues[1][0],j=L.vector(L.u64()).parse(new Uint8Array(A));return C.forEach((E,q)=>{let S=T(E).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),U=T(j[q]).div(Math.pow(10,t.decimals)).toString();g.push({price:S,quantity:U})}),g?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:i}=e,s=new ae,a=await this.getMarketPrice(e),o,u;t?(o=T(a).gt(0)?T(a).div(3).toNumber():Math.pow(10,-6),u=T(a).gt(0)?a:Math.pow(10,6)):(o=T(a).gt(0)?a:Math.pow(10,-1),u=T(a).gt(0)?T(a).mul(3).toNumber():Math.pow(10,6));let l=T(o).mul(Math.pow(10,9+i.decimals-r.decimals)).toString(),f=T(u).mul(Math.pow(10,9+i.decimals-r.decimals)).toString();s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[s.object(e.address),s.pure.u64(fr(l,0)),s.pure.u64(fr(f,0)),s.pure.bool(t),s.object(rt)],typeArguments:[r.coinType,i.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,g=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:s}),w=[],C=g.results[0].returnValues[0][0],A=L.vector(L.u64()).parse(new Uint8Array(C)),j=g.results[0].returnValues[1][0],E=L.vector(L.u64()).parse(new Uint8Array(j));return A.forEach((q,S)=>{let U=T(q).div(Math.pow(10,9+i.decimals-r.decimals)).toString(),Q=T(E[S]).div(Math.pow(10,r.decimals)).toString();w.push({price:U,quantity:Q})}),w?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:i,isBid:s,maxFee:a,account:o,payWithDeep:u,slippage:l=.01,settled_balances:f={base:"0",quote:"0"}}){try{let p=wt(t.baseCoin.coinType),g=wt(t.quoteCoin.coinType),w=new ae;f&&(T(f.base).gt(0)||T(f.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},w);let{baseAsset:C,quoteAsset:A,feeAsset:j}=await this.getMarketTransactionRelatedAssets(t,r,i,a,s,o,u,e,w,f),E=await this.getOrderBook(t,"all",6);if(s){let U=E?.ask?.[0]?.price||"0",Q=T(U).mul(T(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();i=T(Q).plus(T(Q).mul(l)).ceil().toString()}else{let U=await E?.bid?.[0]?.price||"0",Q=T(U).mul(T(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();i=T(Q).minus(T(Q).mul(l)).floor().toString()}let q=i,S=[w.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),w.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),w.object(t.address),w.object(e),C,A,j,w.pure.u8(0),w.pure.u64(r),w.pure.bool(s),w.pure.bool(u),w.pure.u64(q),w.object(rt)];return w.setSenderIfNotSet(o),w.moveCall({typeArguments:[p,g],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:S}),w}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getOrderInfoList(e,t){try{let r=new ae;e.forEach(l=>{let f=l?.pool,p=l?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(f.pool_id),r.pure.u128(BigInt(p))],typeArguments:[f.baseCoinType,f.quoteCoinType]})});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),s=L.struct("ID",{bytes:L.Address}),a=L.struct("OrderDeepPrice",{asset_is_base:L.bool(),deep_per_asset:L.u64()}),o=L.struct("Order",{balance_manager_id:s,order_id:L.u128(),client_order_id:L.u64(),quantity:L.u64(),filled_quantity:L.u64(),fee_is_deep:L.bool(),order_deep_price:a,epoch:L.u64(),status:L.u8(),expire_timestamp:L.u64()}),u=[];return i?.results?.forEach(l=>{let f=l.returnValues[0][0],p=o.parse(new Uint8Array(f));u.push(p)}),u}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),i=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:i}}async getOpenOrder(e,t,r,i,s=!1,a=new ae){let o;if(i)o=i;else{a.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[a.object(e.address),s?r:a.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let g=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:a})).results[s?1:0].returnValues[0][0];o=L.struct("VecSet",{constants:L.vector(L.U128)}).parse(new Uint8Array(g)).constants}if(o.length===0)return[];let u=o.map(p=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:p})),l=await this.getOrderInfoList(u,t)||[],f=[];return l.forEach(p=>{let g=this.decodeOrderId(BigInt(p.order_id));f.push({...p,price:g.price,isBid:g.isBid,pool:e})}),f}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),i=new ae;r.forEach(p=>{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[i.object(p.pool_id),i.object(t)],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let a=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i})).results?.map(p=>p.returnValues?.[0]?.[0])||[],o=L.struct("VecSet",{constants:L.vector(L.U128)}),u=[];a.forEach((p,g)=>{let w=o.parse(new Uint8Array(p)).constants;w.length>0&&w.forEach(C=>{u.push({pool:r[g],orderId:C})})});let l=await this.getOrderInfoList(u,e)||[],f=[];return u.forEach((p,g)=>{let w=this.decodeOrderId(BigInt(p.orderId)),C=l.find(A=>A.order_id===p.orderId)||{};f.push({...p,...C,price:w.price,isBid:w.isBid})}),f}catch(r){return console.log("\u{1F680} ~ DeepbookUtilsModule ~ getAllMarketsOpenOrders ~ error:",r),[]}}cancelOrders(e,t,r=new ae){return e.forEach(i=>{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(i.poolInfo.address),r.pure.u128(i.orderId),r.object(rt)],typeArguments:[i.poolInfo.baseCoin.coinType,i.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,i,s,a){let o=this._sdk.fullClient,l=await new Fu({client:o,address:s,network:"testnet",balanceManagers:{test1:{address:a,tradeCap:""}}}).getLevel2Range(e,t,r,i)}processOrderBookData(e,t,r,i){let s=e.returnValues[0][0],a=L.vector(L.u64()).parse(new Uint8Array(s)),o=e.returnValues[1][0],u=L.vector(L.u64()).parse(new Uint8Array(o)),l={};return a.forEach((p,g)=>{let w=T(p).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),C=T(u[g]).div(Math.pow(10,t.decimals)).toString();l[w]?l[w]={price:w,quantity:T(l[w].quantity).add(C).toString()}:l[w]={price:w,quantity:C}}),Object.values(l)}getLevel2RangeTx(e,t,r,i,s=new ae){let{baseCoin:a,quoteCoin:o}=e,u=fr(T(r).mul(Math.pow(10,9+o.decimals-a.decimals)).toString(),0),l=fr(T(i).mul(Math.pow(10,9+o.decimals-a.decimals)).toString(),0);return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[s.object(e.address),s.pure.u64(u),s.pure.u64(l),s.pure.bool(t),s.object(rt)],typeArguments:[a.coinType,o.coinType]}),s}async fetchOrderBook(e,t,r,i,s,a){let o=new ae,{baseCoin:u,quoteCoin:l}=e;try{if(t==="bid"||t==="all"){let C=i,A=r==="0"?s:r;o=this.getLevel2RangeTx(e,!0,C,A,o)}if(t==="ask"||t==="all"){let C=r==="0"?i:r,A=s;o=this.getLevel2RangeTx(e,!1,C,A,o)}let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:o}),g=[];(t==="bid"||t==="all")&&(g=p.results?.[0]?this.processOrderBookData(p.results[0],u,l,a):[]);let w=[];if(t==="ask"||t==="all"){let C=t==="ask"?0:1;w=p.results?.[C]?this.processOrderBookData(p.results[C],u,l,a):[]}return{bid:g.sort((C,A)=>A.price-C.price),ask:w.sort((C,A)=>C.price-A.price)}}catch{let p=this._sdk.sdkOptions.simulationAccount.address,g=[],w=[];try{let C=this.getLevel2RangeTx(e,!0,i,r),A=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:C});g=A.results?.[0]?this.processOrderBookData(A.results[0],u,l,a):[]}catch{g=[]}try{let C=this.getLevel2RangeTx(e,!1,i,r),A=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:C});w=A.results?.[0]?this.processOrderBookData(A.results[0],u,l,a):[]}catch{w=[]}return{bid:g,ask:w}}}async getOrderBook(e,t,r){let i={bid:[],ask:[]};try{let s=await this.getMarketPrice(e),a=t,o=Math.pow(10,-r),u=Math.pow(10,r),l=await this.fetchOrderBook(e,a,s,o,u,r);return{bid:l?.bid,ask:l?.ask}}catch{return i}}async getOrderBookOrigin(e,t){try{let r=new ae,i=await this.getMarketPrice(e),{baseCoin:s,quoteCoin:a}=e;if(t==="bid"||t==="all"){let p=Math.pow(10,-6),g=i,w=T(p).mul(Math.pow(10,9+a.decimals-s.decimals)).toString(),C=T(g).mul(Math.pow(10,9+a.decimals-s.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(w),r.pure.u64(C),r.pure.bool(!0),r.object(rt)],typeArguments:[s.coinType,a.coinType]})}if(t==="ask"||t==="all"){let p=i,g=Math.pow(10,6),w=T(p).mul(Math.pow(10,9+a.decimals-s.decimals)).toString(),C=T(g).mul(Math.pow(10,9+a.decimals-s.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(w),r.pure.u64(C),r.pure.bool(!1),r.object(rt)],typeArguments:[s.coinType,a.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,u=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),l=[];if(t==="bid"||t==="all"){let p=u.results[0]?.returnValues[0]?.[0],g=L.vector(L.u64()).parse(new Uint8Array(p)),w=u.results[0]?.returnValues[1]?.[0],C=L.vector(L.u64()).parse(new Uint8Array(w));g.forEach((A,j)=>{let E=T(A).div(Math.pow(10,9+a.decimals-s.decimals)).toString(),q=T(C[j]).div(Math.pow(10,s.decimals)).toString();l.push({price:E,quantity:q})})}let f=[];if(t==="ask"||t==="all"){let p=t==="ask"?0:1,g=u.results[p]?.returnValues[0]?.[0],w=L.vector(L.u64()).parse(new Uint8Array(g)),C=u.results[p]?.returnValues[1]?.[0],A=L.vector(L.u64()).parse(new Uint8Array(C));w.forEach((j,E)=>{let q=T(j).div(Math.pow(10,9+a.decimals-s.decimals)).toString(),S=T(A[E]).div(Math.pow(10,s.decimals)).toString();f.push({price:q,quantity:S})})}return{bid:l,ask:f}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((i,s)=>[wt(i.coinType),i]))}async getAccount(e,t,r=new ae){for(let o=0;o<t.length;o++){let u=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(u.address),typeof e=="string"?r.object(e):e],typeArguments:[u.baseCoin.coinType,u.quoteCoin.coinType]})}let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),s;if(i?.events.length===0)return null;let a=[];return i?.events?.forEach((o,u)=>{s=o?.parsedJson;let l=s.account.open_orders.contents,f=s.account.owed_balances,p=s.account.settled_balances,g=s.account.unclaimed_rebates,w=s.account.taker_volume;a.push({balance_manager_id:e,open_orders:l,owed_balances:f,settled_balances:p,unclaimed_rebates:g,taker_volume:w,poolInfo:t[u]})}),a}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,i=this.getCache(r,t);if(i!==void 0)return i;let s;try{s=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{s=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,s,864e5),s}transformExtensions(e,t,r=!0){let i=[];for(let s of t){let{key:a}=s.fields,{value:o}=s.fields;if(a==="labels")try{o=JSON.parse(decodeURIComponent(Vu.decode(o)))}catch{}r&&(e[a]=o),i.push({key:a,value:o})}delete e.extension_fields,r||(e.extensions=i)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,i=`${r}_getCoinConfigs`,s=this.getCache(i,e);if(s)return s;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(f=>f.objectId),u=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),l=[];return u.forEach(f=>{let p=this.buildCoinConfig(f,t);this.updateCache(`${r}_${p.address}_getCoinConfig`,p,864e5),l.push({...p})}),this.updateCache(i,l,864e5),l}buildCoinConfig(e,t=!0){let r=la(e);r=r.value.fields;let i={...r};return i.id=ua(e),i.address=Et(r.coin_type.fields.name).full_address,r.pyth_id&&(i.pyth_id=Lu(r.pyth_id)),this.transformExtensions(i,r.extension_fields.fields.contents,t),delete i.coin_type,i}updateCache(e,t,r=3e5){let i=this._cache[e];i?(i.overdueTime=qr(r),i.value=t):i=new Br(t,qr(r)),this._cache[e]=i}getCache(e,t=!1){let r=this._cache[e],i=r?.isValid();if(!t&&i)return r.value;i||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:i,quoteCoinType:s}){let a=new ae,o=se.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",a);a.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[i,s],arguments:[a.object(this.sdk.sdkOptions.deepbook.registry_id),a.pure.u64(e),a.pure.u64(t),a.pure.u64(r),o]});try{let u=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:a});if(u.effects.status.status==="success")return a;if(u.effects.status.status==="failure"&&u.effects.status.error&&u.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(u){throw u instanceof Error?u:new Error(String(u))}return a}};import{bcs as P}from"@mysten/sui/bcs";import{Transaction as H}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as fe,normalizeSuiAddress as Tn}from"@mysten/sui/utils";var Ai=10n;function Gu(n,e){if(!Ai)throw new Error("oraclePriceMultiplierDecimal is required");if(n===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(Ai- -e);return n*t}return n/10n**(e+Ai)}var Dr=class{_sdk;hasChangeConnection=!1;_commonPythPrice;_cache={};constructor(e){this._sdk=e,this._commonPythPrice=new Xs(e.fullClient)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,i=null;try{r=await this._commonPythPrice.getPriceFeedsUpdateData(e)}catch(o){i=o,console.log("Error: ",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: ${i?.message}`);let s=[];try{s=await this._commonPythPrice.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 a=new Map;for(let o=0;o<e.length;o++)a.set(e[o],s[o]);return a}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={},i=[];if(t?e.forEach(o=>{let u=this._sdk.getCache(`getLatestPrice_${o.coinType}`);u&&this.priceCheck(u,60)?r[o.coinType]=u:i.push(o.coinType)}):i=e.map(o=>o.coinType),i.length===0)return r;let s=e.map(o=>o.feed);return(await this._commonPythPrice.getLatestPriceFeeds(s))?.parsed?.forEach((o,u)=>{let l=o.price;if(l){let{price:f,expo:p}=l,g=T(f).mul(T(10).pow(T(p))).toString(),C={coin_type:e[u].coinType,price:g,oracle_price:0n,last_update_time:l.publish_time};C.oracle_price=Gu(BigInt(f),BigInt(p)),r[i[u]]=C,this._sdk.updateCache(`getLatestPrice_${C.coin_type}`,C)}}),r}};var Mn=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new Dr(e),this._deep=e.sdkOptions.network==="mainnet"?wa:ba}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new H){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:i}=e;try{let{margin_manager:s,initializer:a}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:s,initializer:a,baseCoin:r,quoteCoin:i},t),{tx:t,margin_manager:s,initializer:a}}catch(s){throw new Error(`Failed to create and share margin manager: ${s instanceof Error?s.message:String(s)}`)}}createMarginManager(e,t=new H){if(console.log("\u{1F680}\u{1F680}\u{1F680} ~ marginUtilsModule.ts:90 ~ MarginUtilsModule ~ createMarginManager ~ poolInfo:",e),!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:i,quoteCoin:s}=e;try{let[a,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(fe)],typeArguments:[i.coinType,s.coinType]});return{tx:t,margin_manager:a,initializer:o}}catch(a){throw new Error(`Failed to create margin manager: ${a instanceof Error?a.message:String(a)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:i},s=new H){try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,i.coinType]}),s}catch(a){throw new Error(`Failed to share margin manager: ${a instanceof Error?a.message:String(a)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
28
+ `),i=(await this._graphQLClient.query({query:r,variables:{coinType:`0x2::coin::CoinMetadata<${n}>`}})).data?.objects?.nodes[0]?.address??null;return i&&this.updateCache(e,i),i}async getSuiTransactionResponse(n){let e;try{e=await this._client.getTransactionBlock({digest:n,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{e=await this._client.getTransactionBlock({digest:n,options:{showEvents:!0,showEffects:!0}})}return e}async queryEventsByPage(n,e="all"){let t=[],r=!0,i=e==="all",s=i?null:e.cursor;do{let a=await this._client.queryEvents({query:n,cursor:s,limit:i?null:e.limit});a.data?(t=[...t,...a.data],r=a.hasNextPage,s=a.nextCursor):r=!1}while(i&&r);return{data:t,next_cursor:s,has_next_page:r}}async queryTransactionBlocksByPage(n,e="all",t="ascending"){let r=[],i=!0,s=e==="all",a=s?null:e.cursor;do{let o=await this._client.queryTransactionBlocks({filter:n,cursor:a,order:t,limit:s?null:e.limit,options:{showEvents:!0}});o.data?(r=[...r,...o.data],i=o.hasNextPage,a=o.nextCursor):i=!1}while(s&&i);return{data:r,next_cursor:a,has_next_page:i}}async getOwnedObjectsByPage(n,e,t="all"){let r=async i=>{let s=[],a=!0,o=t==="all",u=o?null:t.cursor;do{let l=await i.getOwnedObjects({owner:n,...e,cursor:u,limit:o?null:t.limit});l.data?(s=[...s,...l.data],a=l.hasNextPage,u=l.nextCursor):a=!1}while(o&&a);return{data:s,next_cursor:u,has_next_page:a}};try{return await r(this._client)}catch(i){let s=i;for(let a of uu)try{let o=mi(new du({url:a,network:this._env}),this._graphQLClient,this._suiGrpcClient,this._env);return await r(o)}catch(o){s=o;continue}throw s}}async getDynamicFieldsByPage(n,e="all"){let t=[],r=!0,i=e==="all",s=i?null:e.cursor;do{let a=await this._client.getDynamicFields({parentId:n,cursor:s,limit:i?null:e.limit});a.data?(t=[...t,...a.data],r=a.hasNextPage,s=a.nextCursor):r=!1}while(i&&r);return{data:t,next_cursor:s,has_next_page:r}}async getDynamicFieldObjects(n,e,t,r,i={showContent:!0,showType:!0,showOwner:!0}){let s=e.map(a=>cu(n,a,t,r));return s.length===0?[]:await this.batchGetObjects(s,i)}async batchGetObjects(n,e,t=50){let r=[];try{for(let i=0;i<Math.ceil(n.length/t);i++){let s=await this._client.multiGetObjects({ids:n.slice(i*t,t*(i+1)),options:e});r=[...r,...s]}}catch(i){console.log(i)}return r}async calculationTxGas(n){let{sender:e}=n.getData();if(!e)throw Error("sdk sender is empty");let t=await this._client.devInspectTransactionBlock({transactionBlock:n,sender:e}),{gasUsed:r}=t.effects;return Number(r.computationCost)+Number(r.storageCost)-Number(r.storageRebate)}async sendTransaction(n,e){try{return await this._client.signAndExecuteTransaction({transaction:e,signer:n,options:{showEffects:!0,showEvents:!0}})}catch(t){console.log("error: ",t)}}async sendSimulationTransaction(n,e){try{return n.setSender(e),await this._client.dryRunTransactionBlock({transactionBlock:await n.build({client:this._client})})}catch(t){throw console.log("devInspectTransactionBlock error",t),t}}async executeTx(n,e,t){try{if(t){let r=typeof n=="string"?As(n):As(n.getPublicKey().toSuiAddress()),i=await this.sendSimulationTransaction(e,r);return i.events.length>0?i.events:i}else{if(typeof n=="string")throw new Error("Cannot send transaction with string address - keypair required for signing");return await this.sendTransaction(n,e)}}catch(r){return r}}async getOwnerCoinAssets(n,e){let t=[],r=null;for(;;){let i=await(e?this._client.getCoins({owner:n,coinType:e,cursor:r}):this._client.getAllCoins({owner:n,cursor:r}));if(i.data.forEach(s=>{BigInt(s.balance)>0&&t.push({coin_type:jr(s.coinType).source_address,coin_object_id:s.coinObjectId,balance:BigInt(s.balance)})}),r=i.nextCursor,!i.hasNextPage)break}return t}async getOwnerCoinBalances(n,e){let t=[];return e?t=[await this._client.getBalance({owner:n,coinType:e})]:t=[...await this._client.getAllBalances({owner:n})],t}updateCache(n,e,t=864e5){let r=this._cache[n];r?(r.overdue_time=Ms(t),r.value=e):r=new dc(e,Ms(t)),this._cache[n]=r}getCache(n,e=!1){let t=this._cache[n],r=t?.isValid();if(!e&&r)return t.value;r||delete this._cache[n]}};function mi(n,e,t,r){let i=new pu(n,e,t,r);return new Proxy(i,{get(s,a,o){if(a in s)return Reflect.get(s,a,o);if(a in s._client){let u=Reflect.get(s._client,a);return typeof u=="function"?u.bind(s._client):u}throw new Error(`Property or method "${String(a)}" does not exist on FullClient or its client.`)}})}var fu=Wr(Hr(),1);var _d=new fu.default(1e6),mu=(n=>(n[n.BelowRange=0]="BelowRange",n[n.InRange=1]="InRange",n[n.AboveRange=2]="AboveRange",n))(mu||{}),ci=10n,gu={pyth_package_id:"0x04e20ddf36af412a4096f9014f4a565af9e812db9a05cc40254846cf6ed0ad91",pyth_published_at:"0x04e20ddf36af412a4096f9014f4a565af9e812db9a05cc40254846cf6ed0ad91",pyth_state_id:"0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8",wormhole_state_id:"0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c",hermes_service_urls:[]},_u={"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC":{coin_type:"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC",price_feed_id:"0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",coin_decimals:6},"0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI":{coin_type:"0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",price_feed_id:"0x23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744",coin_decimals:9},"0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS":{coin_type:"0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS",price_feed_id:"0xe5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef",coin_decimals:9},"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP":{coin_type:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",price_feed_id:"0x29bdd5248234e33bd93d3b81100b5fa32eaa5997843847e2c2cb16d7c6d9f7ff",coin_decimals:6},"0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX":{coin_type:"0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX",price_feed_id:"0x88250f854c019ef4f88a5c073d52a18bb1c6ac437033f5932cd017d24917ab46",coin_decimals:9},"0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN":{coin_type:"0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN",price_feed_id:"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",coin_decimals:9},"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI":{coin_type:"0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI",price_feed_id:"0x6120ffcf96395c70aa77e72dcb900bf9d40dccab228efca59a17b90ce423d5e8",coin_decimals:9},"0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH":{coin_type:"0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH",price_feed_id:"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",coin_decimals:8},"0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL":{coin_type:"0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL",price_feed_id:"0xeba0732395fae9dec4bae12e52760b35fc1c5671e2da8b449c9af4efe5d54341",coin_decimals:9},"0x3e8e9423d80e1774a7ca128fccd8bf5f1f7753be658c5e645929037f7c819040::lbtc::LBTC":{coin_type:"0x3e8e9423d80e1774a7ca128fccd8bf5f1f7753be658c5e645929037f7c819040::lbtc::LBTC",price_feed_id:"0x8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b",coin_decimals:8},"0x3a304c7feba2d819ea57c3542d68439ca2c386ba02159c740f7b406e592c62ea::haedal::HAEDAL":{coin_type:"0x3a304c7feba2d819ea57c3542d68439ca2c386ba02159c740f7b406e592c62ea::haedal::HAEDAL",price_feed_id:"0xe67d98cc1fbd94f569d5ba6c3c3c759eb3ffc5d2b28e64538a53ae13efad8fd1",coin_decimals:9}};function yu(n,e){if(!ci)throw new Error("oraclePriceMultiplierDecimal is required");if(n===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(ci- -e);return n*t}return n/10n**(e+ci)}var Bs=16*1024,Xs=class{constructor(n,e=gu){this.hasChangeConnection=!1,this.pythConfigs=e,this.fullClient=n;let t=[...e.hermes_service_urls];t.includes("https://hermes.pyth.network")||t.push("https://hermes.pyth.network"),this.hermesClients=t.map(r=>new on(r,{timeout:3e3}))}async getFeedInfoList(n){let e=n.map(t=>this.getFeedInfo(t,!1));return await Promise.all(e)}priceCheck(n,e=60){let t=Math.floor(Date.now()/1e3);if(!(Math.abs(t-n.last_update_time)>e))return n}async getPackageId(n){let e=await this.fullClient.getObject({id:n,options:{showContent:!0}});if(e.data?.content?.dataType=="moveObject")return e.data.content.fields.upgrade_cap.fields.package;throw new Error("upgrade_cap not found")}async getWormholePackageId(){let{wormhole_state_id:n}=this.pythConfigs,e=`getWormholePackageId_${n}`,t=this.fullClient.getCache(e);if(t)return t;let r=await this.getPackageId(this.pythConfigs.wormhole_state_id);return this.fullClient.updateCache(e,r),r}async getLatestPrice(n,e=!1){let t={},r=[];if(e?n.forEach(s=>{let a=this.fullClient.getCache(`getLatestPrice_${s}`);a&&this.priceCheck(a,60)?t[s]=a:r.push(s)}):r=[...n],r.length===0)return t;let i=await this.getFeedInfoList(r);return(await this.getLatestPriceFeeds(i.map(s=>s.price_feed_id)))?.parsed?.forEach((s,a)=>{if(s){let{price:o,expo:u,publish_time:l}=s.price,f=dn(o).mul(dn(10).pow(dn(u))).toString(),p=i[a],g={coin_type:p.coin_type,price:f,coin_decimals:p.coin_decimals,oracle_price:0n,last_update_time:l};g.oracle_price=yu(BigInt(o),BigInt(u)),t[r[a]]=g,this.fullClient.updateCache(`getLatestPrice_${g.coin_type}`,g)}}),t}async getPriceFeedsUpdateData(n){let e=null;for(let t of this.hermesClients)try{return(await t.getLatestPriceUpdates(n,{encoding:"hex"})).binary.data.map(r=>Buffer.from(r,"hex"))}catch(r){console.log("\u{1F680} ~ PythPriceModule ~ getPriceFeedsUpdateData ~ e:",r),e=r;continue}throw new Error(`All Pyth Hermes endpoints are unavailable. getPriceFeedsUpdateData Detailed error: ${e?.message}`)}async getLatestPriceFeeds(n){let e=null;for(let t of this.hermesClients)try{return await t.getLatestPriceUpdates(n,{parsed:!0})}catch(r){console.log("\u{1F680} ~ PythPriceModule ~ getLatestPriceFeeds ~ error:",r),e=r;continue}throw new Error(`All Pyth Hermes endpoints are unavailable. getLatestPriceFeeds Detailed error: ${e?.message}`)}extractVaaBytesFromAccumulatorMessage(n){let e=7+n.readUint8(6)+1,t=n.readUint16BE(e),r=e+2;return n.subarray(r,r+t)}async verifyVaas(n,e){let t=await this.getWormholePackageId(),r=[];for(let i of n){let[s]=e.moveCall({target:`${t}::vaa::parse_and_verify`,arguments:[e.object(this.pythConfigs.wormhole_state_id),e.pure(cn.vector(cn.u8()).serialize(Array.from(i),{maxSize:Bs}).toBytes()),e.object(ui)]});r.push(s)}return r}async getPriceTableInfo(){if(this.priceTableInfo===void 0){let n=await this.fullClient.getDynamicFieldObject({parentId:this.pythConfigs.pyth_state_id,name:{type:"vector<u8>",value:"price_info"}});if(!n.data?.type)throw new Error("Price Table not found, contract may not be initialized");let e=n.data.type.replace("0x2::table::Table<","");e=e.replace("::price_identifier::PriceIdentifier, 0x2::object::ID>",""),this.priceTableInfo={id:n.data.objectId,fieldType:e}}return this.priceTableInfo}async getPriceFeedObjectId(n){let e=n.replace("0x",""),t=`getPriceFeedObjectId_${e}`,r=this.fullClient.getCache(t);if(r)return r;let{id:i,fieldType:s}=await this.getPriceTableInfo(),a=await this.fullClient.getDynamicFieldObject({parentId:i,name:{type:`${s}::price_identifier::PriceIdentifier`,value:{bytes:[...Buffer.from(e,"hex")]}}});if(a.data?.content){if(a.data.content.dataType!=="moveObject")throw new Error("Price feed type mismatch");return this.fullClient.updateCache(t,a.data.content.fields.value),a.data.content.fields.value}}async verifyVaasAndGetHotPotato(n,e,t){if(e.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let r=this.extractVaaBytesFromAccumulatorMessage(e[0]),i=await this.verifyVaas([r],n),[s]=n.moveCall({target:`${t}::pyth::create_authenticated_price_infos_using_accumulator`,arguments:[n.object(this.pythConfigs.pyth_state_id),n.pure(cn.vector(cn.u8()).serialize(Array.from(e[0]),{maxSize:Bs}).toBytes()),i[0],n.object(ui)]});return s}async buildUpdatePythPricePayload(n,e,t){let{pyth_state_id:r,pyth_published_at:i,pyth_package_id:s}=this.pythConfigs,a=(await this.getFeedInfoList(n)).map(f=>f.price_feed_id);if(n.length!==a.length)throw Error("find feed id fail");let o=await this.getPriceFeedsUpdateData(a);if(!o)throw new Error("get price update data fail");if(o.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let u=await this.verifyVaasAndGetHotPotato(e,o,i),l=0;for(let f of a){let p=await this.getPriceFeedObjectId(f);if(!p)throw new Error(`Price feed ${f} not found, please create it first`);u=t({tx:e,coinType:n[l],priceUpdatesHotPotato:u,priceInfoObjectId:p}),l+=1}return e.moveCall({target:`${i}::hot_potato_vector::destroy`,arguments:[u],typeArguments:[`${s}::price_info::PriceInfo`]}),e}async getBaseUpdateFee(){if(this.baseUpdateFee===void 0){let n=await this.fullClient.getObject({id:this.pythConfigs.pyth_state_id,options:{showContent:!0}});if(!n.data?.content||n.data.content.dataType!=="moveObject")throw new Error("Unable to fetch pyth state object");this.baseUpdateFee=n.data.content.fields.base_update_fee}return this.baseUpdateFee}async updatePriceFeeds(n,e,t){let r=this.pythConfigs.pyth_package_id,i=await this.verifyVaasAndGetHotPotato(n,e,r),s=await this.getBaseUpdateFee(),a=n.splitCoins(n.gas,t.map(()=>n.pure.u64(s))),o=[],u=0;for(let l of t){let f=await this.getPriceFeedObjectId(l);if(!f)throw new Error(`Price feed ${l} not found, please create it first`);o.push(f),[i]=n.moveCall({target:`${r}::pyth::update_single_price_feed`,arguments:[n.object(this.pythConfigs.pyth_state_id),i,n.object(f),a[u],n.object(ui)]}),u++}return n.moveCall({target:`${r}::hot_potato_vector::destroy`,arguments:[i],typeArguments:[`${r}::price_info::PriceInfo`]}),o}async buildUpdatePythPricePayloadV2(n,e,t){if(n.length===0)return e;let r=(await this.getFeedInfoList(n)).map(o=>o.price_feed_id);if(n.length!==r.length)throw Error("find feed id fail");let i=await this.getPriceFeedsUpdateData(r);if(!i)throw new Error("get price update data fail");if(i.length>1)throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");let s=await this.updatePriceFeeds(e,i,r),a=0;for(let o of s)t({tx:e,coinType:n[a],priceUpdatesHotPotato:{},priceInfoObjectId:o}),a+=1;return e}getFeedInfoByJson(n){let e=Ps(n,!1);return _u[e]}async getFeedInfo(n,e){let t=`getFeedInfo_${n}`,r=this.fullClient.getCache(t,e);if(r)return r;let i=this.getFeedInfoByJson(n);if(i)return i;let{feed_info_handle:s}=this.pythConfigs;if(!s)throw new Error("feed_info_handle is not set");let a=await this.fullClient.getDynamicFieldObject({parentId:s,name:{type:"0x1::type_name::TypeName",value:Ps(n,!0)}}),{fields:o}=a.data.content.fields.value,u={coin_type:n,price_feed_id:lu(o.price_feed_id),coin_decimals:o.coin_decimals};return console.log("\u{1F680} ~ PythPriceModule ~ getFeedInfo ~ info:",u),this.fullClient.updateCache(t,u),u}},Pr=Wr(Hr(),1),bd=new Pr.default(0),Js=new Pr.default(1),gi=new Pr.default(2),wd=gi.pow(new Pr.default(128)),vd=gi.pow(new Pr.default(64)).sub(Js),kd=gi.pow(new Pr.default(128)).sub(Js);mn.config({precision:64,rounding:mn.ROUND_DOWN,toExpNeg:-64,toExpPos:64});var Cd=Wr(Hr(),1),Td=Wr(Hr(),1);var Md=Wr(Hr(),1);import{SuiGraphQLClient as Hu}from"@mysten/sui/graphql";import{SuiJsonRpcClient as Ku}from"@mysten/sui/jsonRpc";import{DeepBookClient as Fu}from"@mysten/deepbook-v3";import{bcs as L}from"@mysten/sui/bcs";import{Transaction as ae,coinWithBalance as ka}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as rt,normalizeStructTag as wt,normalizeSuiObjectId as Lu}from"@mysten/sui/utils";import{Base64 as Vu}from"js-base64";var Ys=6e4,ea=3e5,Qt=864e5;function qr(n){return Date.parse(new Date().toString())+n}var Br=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{SUI_TYPE_ARG as Mu,normalizeStructTag as Au,normalizeSuiObjectId as wi}from"@mysten/sui/utils";import{coinWithBalance as ta}from"@mysten/sui/transactions";var bu="0x2::coin::Coin",wu=/^0x2::coin::Coin<(.+)>$/,qd=1e3,Rd=500,Dd=100,Ud=100,$d=1e3,yi="0x2::sui::SUI",ra="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",Nd="SUI",Fd=450,Ld="0x0000000000000000000000000000000000000005",se=class{static getCoinTypeArg(e){let t=e.type.match(wu);return t?t[1]:null}static isSUI(e){let t=se.getCoinTypeArg(e);return t?se.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(i=>{t===i.coinAddress&&(r+=BigInt(i.balance))}),r}static getID(e){return e.fields.id.id}static getCoinTypeFromArg(e){return`${bu}<${e}>`}static getCoinAssets(e,t){let r=[];return t.forEach(i=>{_i(i.coinAddress)===_i(e)&&r.push(i)}),r}static isSuiCoin(e){return Et(e).full_address===yi}static selectCoinObjectIdGreaterThanOrEqual(e,t,r=[]){let i=se.selectCoinAssetGreaterThanOrEqual(e,t,r),s=i.selectedCoins.map(u=>u.coinObjectId),a=i.remainingCoins,o=i.selectedCoins.map(u=>u.balance.toString());return{objectArray:s,remainCoins:a,amountArray:o}}static selectCoinAssetGreaterThanOrEqual(e,t,r=[]){let i=se.sortByBalance(e.filter(l=>!r.includes(l.coinObjectId))),s=se.calculateTotalBalance(i);if(s<t)return{selectedCoins:[],remainingCoins:i};if(s===t)return{selectedCoins:i,remainingCoins:[]};let a=BigInt(0),o=[],u=[...i];for(;a<s;){let l=t-a,f=u.findIndex(g=>g.balance>=l);if(f!==-1){o.push(u[f]),u.splice(f,1);break}let p=u.pop();p.balance>0&&(o.push(p),a+=p.balance)}return{selectedCoins:se.sortByBalance(o),remainingCoins:se.sortByBalance(u)}}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)&&se.isSuiCoin(t)?r.add(ta({balance:e,useGasCoin:!1})):r.add(ta({balance:e,type:t}))}};var vu=/^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;function na(n){return n.startsWith("0x")?n:`0x${n}`}function bi(n){return n.startsWith("0x")?`${n.slice(2)}`:n}function ku(n,e=4,t=4){let r=Math.max(e,1),i=Math.max(t,1);return`${n.slice(0,r+2)} ... ${n.slice(-i)}`}function Zd(n,e=4,t=4){return ku(na(n),e,t)}function zd(n,e={leadingZero:!0}){if(typeof n!="string")return!1;let t=n;if(e.leadingZero){if(!n.startsWith("0x"))return!1;t=t.substring(2)}return vu.test(t)}function Cu(n){if(!Buffer.isBuffer(n))if(Array.isArray(n))n=Buffer.from(n);else if(typeof n=="string")exports.isHexString(n)?n=Buffer.from(exports.padToEven(exports.stripHexPrefix(n)),"hex"):n=Buffer.from(n);else if(typeof n=="number")n=exports.intToBuffer(n);else if(n==null)n=Buffer.allocUnsafe(0);else if(n.toArray)n=Buffer.from(n.toArray());else throw new Error("invalid type");return n}function Gd(n){return na(Cu(n).toString("hex"))}function Wd(n){let e=new ArrayBuffer(4),t=new DataView(e);for(let i=0;i<n.length;i++)t.setUint8(i,n.charCodeAt(i));return t.getUint32(0,!0)}function Tu(n){let e,t,r,i,s;e="";let a=n.length;for(t=0;t<a;)switch(r=n.charCodeAt(t++),r>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:e+=n.charAt(t-1);break;case 12:case 13:i=n.charCodeAt(t++),e+=String.fromCharCode((r&31)<<6|i&63);break;case 14:i=n.charCodeAt(t++),s=n.charCodeAt(t++),e+=String.fromCharCode((r&15)<<12|(i&63)<<6|(s&63)<<0);break}return e}function Hd(n){let e="",t=bi(n),r=t.length/2;for(let i=0;i<r;i++)e+=String.fromCharCode(Number.parseInt(t.substr(i*2,2),16));return Tu(e)}var Su=0,aa=1,Ou=2;function ia(n,e){return n===e?Su:n<e?aa:Ou}function Eu(n,e){let t=0,r=n.length<=e.length?n.length:e.length,i=ia(n.length,e.length);for(;t<r;){let s=ia(n.charCodeAt(t),e.charCodeAt(t));if(t+=1,s!==0)return s}return i}function Yd(n,e){return Eu(n,e)===aa}function sa(n,...e){let t=Array.isArray(e[e.length-1])?e.pop():[],i=[n,...e].filter(Boolean).join("::");return t&&t.length&&(i+=`<${t.join(", ")}>`),i}function eh(n){return n.split("::")[0]}function Et(n){try{let e=n.replace(/\s/g,""),r=e.match(/(<.+>)$/)?.[0]?.match(/(\w+::\w+::\w+)(?:<.*?>(?!>))?/g);if(r){e=e.slice(0,e.indexOf("<"));let u={...Et(e),type_arguments:r.map(l=>Et(l).source_address)};return u.type_arguments=u.type_arguments.map(l=>se.isSuiCoin(l)?l:Et(l).source_address),u.source_address=sa(u.full_address,u.type_arguments),u}let i=e.split("::"),a={full_address:e,address:e===yi||e===ra?"0x2":wi(i[0]),module:i[1],name:i[2],type_arguments:[],source_address:""};return a.full_address=`${a.address}::${a.module}::${a.name}`,a.source_address=sa(a.full_address,a.type_arguments),a}catch{return{full_address:n,address:"",module:"",name:"",type_arguments:[],source_address:n}}}function _i(n){return Et(n).source_address}function xu(n){return n.toLowerCase().startsWith("0x")?wi(n):n}var th=(n,e=!0)=>{let t=n.split("::"),r=t.shift(),i=wi(r);return e&&(i=bi(i)),`${i}::${t.join("::")}`};function vi(n){for(let e in n){let t=typeof n[e];if(t==="object")vi(n[e]);else if(t==="string"){let r=n[e];n[e]=xu(r)}}}var rh=Au(Mu);import oa from"decimal.js";oa.config({precision:64,rounding:oa.ROUND_DOWN,toExpNeg:-64,toExpPos:64});import vn from"decimal.js";function T(n){return vn.isDecimal(n)?n:new vn(n===void 0?0:n)}function ki(n){return T(10).pow(T(n).abs())}var fr=(n,e)=>{try{return T(n).toDP(e,vn.ROUND_DOWN).toString()}catch{return n}},Ci=(n,e)=>vn.max(T(n),T(e));import{Transaction as ju}from"@mysten/sui/transactions";async function lh(n,e=!0){console.log("inputs",n.getData().inputs),n.getData().commands.forEach((t,r)=>{e&&console.log(`transaction ${r}: `,t)})}var Ut=class{static async adjustTransactionForGas(e,t,r,i){i.setSender(e.senderAddress);let s=se.selectCoinAssetGreaterThanOrEqual(t,r).selectedCoins;if(s.length===0)throw new Error("Insufficient balance");let a=se.calculateTotalBalance(t);if(a-r>1e9)return{fixAmount:r};let o=await e.fullClient.calculationTxGas(i);if(se.selectCoinAssetGreaterThanOrEqual(t,BigInt(o),s.map(l=>l.coinObjectId)).selectedCoins.length===0){let l=BigInt(o)+BigInt(500);if(a-r<l){if(r-=l,r<0)throw new Error("gas Insufficient balance");let f=new ju;return{fixAmount:r,newTx:f}}}return{fixAmount:r}}static buildCoinForAmount(e,t,r,i,s=!0,a=!1){let o=se.getCoinAssets(i,t);if(r===BigInt(0)&&o.length===0)return Ut.buildZeroValueCoin(t,e,i,s);let u=se.calculateTotalBalance(o);if(u<r)throw new Error(`The amount(${u}) is Insufficient balance for ${i} , expect ${r} `);return Ut.buildCoin(e,t,o,r,i,s,a)}static buildCoin(e,t,r,i,s,a=!0,o=!1){if(se.isSuiCoin(s)){if(a){let S=e.splitCoins(e.gas,[e.pure.u64(i)]);return{targetCoin:e.makeMoveVec({elements:[S]}),remainCoins:t,tragetCoinAmount:i.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}if(i===0n&&r.length>1){let S=se.selectCoinObjectIdGreaterThanOrEqual(r,i);return{targetCoin:e.object(S.objectArray[0]),remainCoins:S.remainCoins,tragetCoinAmount:S.amountArray[0],isMintZeroCoin:!1}}let E=se.selectCoinObjectIdGreaterThanOrEqual(r,i);return{targetCoin:e.splitCoins(e.gas,[e.pure.u64(i)]),remainCoins:E.remainCoins,tragetCoinAmount:i.toString(),isMintZeroCoin:!1,originalSplitedCoin:e.gas}}let u=se.selectCoinObjectIdGreaterThanOrEqual(r,i),l=u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),f=u.objectArray;if(a)return{targetCoin:e.makeMoveVec({elements:f.map(E=>e.object(E))}),remainCoins:u.remainCoins,tragetCoinAmount:u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),isMintZeroCoin:!1};let[p,...g]=f,w=e.object(p),C=w,A=u.amountArray.reduce((E,q)=>Number(E)+Number(q),0).toString(),j;return g.length>0&&e.mergeCoins(w,g.map(E=>e.object(E))),o&&Number(l)>Number(i)&&(C=e.splitCoins(w,[e.pure.u64(i)]),A=i.toString(),j=w),{targetCoin:C,remainCoins:u.remainCoins,originalSplitedCoin:j,tragetCoinAmount:A,isMintZeroCoin:!1}}static buildZeroValueCoin(e,t,r,i=!0){let s=Ut.callMintZeroValueCoin(t,r),a;return i?a=t.makeMoveVec({elements:[s]}):a=s,{targetCoin:a,remainCoins:e,isMintZeroCoin:!0,tragetCoinAmount:"0"}}static buildCoinForAmountInterval(e,t,r,i,s=!0){let a=se.getCoinAssets(i,t);if(r.amountFirst===BigInt(0))return a.length>0?Ut.buildCoin(e,[...t],[...a],r.amountFirst,i,s):Ut.buildZeroValueCoin(t,e,i,s);let o=se.calculateTotalBalance(a);if(o>=r.amountFirst)return Ut.buildCoin(e,[...t],[...a],r.amountFirst,i,s);if(o<r.amountSecond)throw new Error(`The amount(${o}) is Insufficient balance for ${i} , expect ${r.amountSecond} `);return Ut.buildCoin(e,[...t],[...a],r.amountSecond,i,s)}static buildCoinTypePair(e,t){let r=[];if(e.length===2){let i=[];i.push(e[0],e[1]),r.push(i)}else{let i=[];i.push(e[0],e[e.length-1]),r.push(i);for(let s=1;s<e.length-1;s+=1){if(t[s-1]===0)continue;let a=[];a.push(e[0],e[s],e[e.length-1]),r.push(a)}}return r}},mr=Ut;zi(mr,"callMintZeroValueCoin",(e,t)=>e.moveCall({target:"0x2::coin::zero",typeArguments:[t]}));function Rr(n){return n.data}function Iu(n){if(n.error&&"object_id"in n.error&&"version"in n.error&&"digest"in n.error){let{error:e}=n;return{objectId:e.object_id,version:e.version,digest:e.digest}}}function Pu(n){if(n.error&&"object_id"in n.error&&!("version"in n.error)&&!("digest"in n.error))return n.error.object_id}function ca(n){if("reference"in n)return n.reference;let e=Rr(n);return e?{objectId:e.objectId,version:e.version,digest:e.digest}:Iu(n)}function ua(n){return"objectId"in n?n.objectId:ca(n)?.objectId??Pu(n)}function ph(n){return"version"in n?n.version:ca(n)?.version}function Bu(n){return n.data!==void 0}function qu(n){return n.content!==void 0}function fh(n){let e=Rr(n);if(e?.content?.dataType==="package")return e.content.disassembled}function Ti(n){let e="data"in n?Rr(n):n;if(!(!e||!qu(e)||e.content.dataType!=="moveObject"))return e.content}function Ru(n){return Ti(n)?.type}function mh(n){let e=Bu(n)?n.data:n;return!e?.type&&"data"in n?e?.content?.dataType==="package"?"package":Ru(n):e?.type}function gh(n){return Rr(n)?.previousTransaction}function _h(n){return Rr(n)?.owner}function yh(n){let e=Rr(n)?.display;return e||{data:null,error:null}}function la(n){let e=Ti(n)?.fields;if(e)return"fields"in e?e.fields:e}function bh(n){return Ti(n)?.hasPublicTransfer??!1}import{Ed25519Keypair as da}from"@mysten/sui/keypairs/ed25519";import{Secp256k1Keypair as ha}from"@mysten/sui/keypairs/secp256k1";import{fromBase64 as pa,fromHex as fa}from"@mysten/sui/utils";function Qr(n,e){let t=ki(T(e));return Number(T(n).mul(t))}function Mh(n,e=32){return BigInt.asUintN(e,BigInt(n)).toString()}function Ah(n,e=32){return Number(BigInt.asIntN(e,BigInt(n)))}function gr(n,e){let t=ki(T(e));return Number(T(n).div(t))}function Sh(n,e="hex"){if(n instanceof Uint8Array){let r=Buffer.from(n);return da.fromSecretKey(r)}let t=e==="hex"?fa(n):pa(n);return da.fromSecretKey(t)}function Oh(n,e="hex"){if(n instanceof Uint8Array){let r=Buffer.from(n);return ha.fromSecretKey(r)}let t=e==="hex"?fa(n):pa(n);return ha.fromSecretKey(t)}var ma=async n=>new Promise(e=>{setTimeout(()=>{e(1)},n)});var jh=({totalAssetsValue:n,totalDebtValue:e})=>T(e).eq(0)||T(n).eq(0)?"0":T(n).div(T(e)).toString(),ga=n=>{let{base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:i,user_liquidation_reward:s}=n.value.fields,{liquidation_risk_ratio:a,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:u,target_liquidation_risk_ratio:l}=n.value.fields.risk_ratios.fields;return{id:n.id.id,name:n.name,base_margin_pool_id:e,quote_margin_pool_id:t,enabled:r,pool_liquidation_reward:i,user_liquidation_reward:s,liquidation_risk_ratio:a,min_borrow_risk_ratio:o,min_withdraw_risk_ratio:u,target_liquidation_risk_ratio:l}},_a=(n,e)=>{let{deposit_coin_type:t}=e,r=n.id.id,{max_utilization_rate:i,min_borrow:s,protocol_spread:a,supply_cap:o}=n.config.fields.margin_pool_config.fields,{maintainer_fees:u,protocol_fees:l}=n.protocol_fees.fields,{total_supply:f,total_borrow:p}=n.state.fields,g=T(o).sub(f).toString();return{deposit_coin_type:t,id:r,supply_cap:o,total_supply:f,total_borrow:p,available_supply:g,max_utilization_rate:i,min_borrow:s,protocol_spread:a,maintainer_fees:u,protocol_fees:l}};var xt=1000000000n,Du=365n*24n*60n*60n*1000n;function Uu(n,e){return e===0n?0n:n*xt/e}function $u(n,e){let{base_rate:t,base_slope:r,optimal_utilization:i,excess_slope:s}=e;if(n<i)return t+n*r/xt;{let a=n-i,o=i*r/xt,u=a*s/xt;return t+o+u}}function ya(n,e){let t=n*e,r=t/xt;return t%xt>0n?r+1n:r}function Nu(n,e,t,r){let i=e.borrow_shares===0n?xt:e.total_borrow*xt/e.borrow_shares,s=ya(n,i),a=Uu(e.total_borrow,e.total_supply),o=$u(a,t),u=r-e.last_update_timestamp,l=e.total_borrow*o/xt*u/Du,f=e.borrow_shares===0n?0n:ya(l,n*xt/e.borrow_shares),p=s+f;return{confirmedDebt:s,estimatedInterest:f,totalDebt:p,annualInterestRate:o}}function Ph(n,e,t,r,i=60000n){let s=r+i,{totalDebt:a}=Nu(n,e,t,s);return a}var ba={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},wa={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6};function va(...n){console.log("DeepbookV3_Utils_Sdk###",...n)}var Mi=1e6,vt=1e9,Zu={coinType:"0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP",decimals:6},zu={coinType:"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",decimals:6},Cn=class{_sdk;_deep;_cache={};constructor(e){this._sdk=e,this._deep=e.sdkOptions.network==="mainnet"?zu:Zu}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareBalanceManager(){let e=new ae,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 i=new ae;i.setSenderIfNotSet(e);let s=i.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::new`}),a=ka({type:t.coinType,balance:BigInt(r)});return i.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[s,a],typeArguments:[t.coinType]}),i.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::cetus_balance_manager::check_and_add_deepbook_balance_manager_indexer`,arguments:[i.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),s],typeArguments:[]}),i.moveCall({target:"0x2::transfer::public_share_object",arguments:[s],typeArguments:[`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::BalanceManager`]}),i}depositIntoManager({account:e,balanceManager:t,coin:r,amountToDeposit:i,tx:s}){let a=s||new ae;if(t){a.setSenderIfNotSet(e);let o=ka({type:r.coinType,balance:BigInt(i)});return a.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::deposit`,arguments:[a.object(t),o],typeArguments:[r.coinType]}),a}return null}async withdrawFromManager({account:e,balanceManager:t,coin:r,amountToWithdraw:i,returnAssets:s,txb:a}){let o=a||new ae,u=o.moveCall({target:`${this._sdk.sdkOptions.deepbook.published_at}::balance_manager::withdraw`,arguments:[o.object(t),o.pure.u64(i)],typeArguments:[r.coinType]});if(s)return u;let f=(await this._sdk.getOwnerCoinAssets(e,r.coinType)).map(g=>({coinAddress:g.coinAddress,coinObjectId:g.coinObjectId,balance:BigInt(g.balance)})),p=mr.buildCoinForAmount(o,f,BigInt(0),r.coinType,!1);return p.targetCoin?(o.mergeCoins(p.targetCoin,[u]),p.isMintZeroCoin&&o.transferObjects([p.targetCoin],e)):o.transferObjects([u],e),o}withdrawManagersFreeBalance({account:e,balanceManagers:t,tx:r=new ae}){for(let i in t)t[i].forEach(a=>{let o=r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::withdraw`,arguments:[r.object(i),r.pure.u64(a.amount)],typeArguments:[a.coinType]});r.transferObjects([o],e)});return r}async getBalanceManager(e,t=!0){let r=`getBalanceManager_${e}`,i=this.getCache(r,t);if(!t&&i!==void 0)return i;try{let s=new ae;s.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::get_balance_managers_by_owner`,arguments:[s.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),s.pure.address(e)],typeArguments:[]});let u=(await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:s}))?.events?.filter(f=>f.type===`${this._sdk.sdkOptions.deepbook_utils.package_id}::cetus_balance_manager::GetCetusBalanceManagerList`)?.[0]?.parsedJson?.deepbook_balance_managers||[],l=[];return u.forEach(f=>{l.push({balanceManager:f,cetusBalanceManager:""})}),this.updateCache(r,l,864e5),l||[]}catch(s){throw s instanceof Error?s:new Error(String(s))}}withdrawSettledAmounts({poolInfo:e,balanceManager:t},r=new ae){let i=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),i],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]}),r}async getManagerBalance({account:e,balanceManager:t,coins:r}){try{let i=new ae;r.forEach(o=>{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[i.object(t)],typeArguments:[o.coinType]})});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i}),a={};return s.results?.forEach((o,u)=>{let l=r[u],f=o.returnValues[0][0],p=L.U64.parse(new Uint8Array(f)),g=T(p),w=g.eq(0)?"0":g.div(Math.pow(10,l.decimals)).toString();a[l.coinType]={adjusted_balance:w,balance:g.toString()}}),a}catch(i){throw i instanceof Error?i:new Error(String(i))}}async getAccountAllManagerBalance({account:e,coins:t}){try{let r=new ae,i=await this.getBalanceManager(e,!0);if(!Array.isArray(i)||i.length===0)return{};i.forEach(o=>{t.forEach(u=>{r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::balance_manager::balance`,arguments:[r.object(o.balanceManager)],typeArguments:[u.coinType]})})});let s=await this.sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:r}),a={};return i.forEach((o,u)=>{let l={},f=u*t.length;t.forEach((p,g)=>{let w=f+g,C=s.results?.[w];if(C){let A=C.returnValues[0][0],j=L.U64.parse(new Uint8Array(A)),E=T(j),q=E.eq(0)?"0":E.div(Math.pow(10,p.decimals)).toString();l[p.coinType]={adjusted_balance:q,balance:E.toString()}}}),a[o.balanceManager]=l}),a}catch(r){throw r instanceof Error?r:new Error(String(r))}}async getMarketPrice(e){try{let t=new ae;t.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::mid_price`,arguments:[t.object(e.address),t.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let i=(await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:t})).results[0]?.returnValues[0]?.[0],s=Number(L.U64.parse(new Uint8Array(i))),a=Math.pow(10,e.baseCoin.decimals).toString(),o=Math.pow(10,e.quoteCoin.decimals).toString();return T(s).mul(a).div(o).div(vt).toString()}catch(t){return va("getMarketPrice ~ error:",t),"0"}}async getPools(e=!1){let t="Deepbook_getPools",r=this.getCache(t,e);if(r!==void 0)return r;let i=await this._sdk.fullClient?.queryEventsByPage({MoveEventModule:{module:"pool",package:this._sdk.sdkOptions.deepbook.package_id}}),s=/<([^>]+)>/,a=[];return i?.data?.forEach(o=>{let u=o?.parsedJson,l=o.type.match(s);if(l){let p=l[1].split(", ");a.push({...u,baseCoinType:p[0],quoteCoinType:p[1]})}}),this.updateCache(t,a,864e5),a}async getQuoteQuantityOut(e,t,r){let i=new ae;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quote_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:i}),a=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),o=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{baseQuantityDisplay:T(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),baseOutDisplay:T(a).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(u).div(Mi).toString(),baseQuantity:t,baseOut:a,quoteOut:o,deepRequired:u}}async getBaseQuantityOut(e,t,r){let i=new ae;i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_base_quantity_out`,arguments:[i.object(e.address),i.pure.u64(t),i.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let s=await this._sdk.fullClient.devInspectTransactionBlock({sender:r,transactionBlock:i}),a=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[0][0]))),o=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[1][0]))),u=String(L.U64.parse(new Uint8Array(s.results[0].returnValues[2][0])));return{quoteQuantityDisplay:T(t).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:T(a).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(o).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(u).div(Mi).toString(),quoteQuantity:t,baseOut:a,quoteOut:o,deepRequired:u}}async getQuantityOut(e,t,r,i){let s=new ae;s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_quantity_out`,arguments:[s.object(e.address),s.pure.u64(t),s.pure.u64(r),s.object(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let a=await this._sdk.fullClient.devInspectTransactionBlock({sender:i,transactionBlock:s}),o=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[0][0]))),u=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[1][0]))),l=Number(L.U64.parse(new Uint8Array(a.results[0].returnValues[2][0])));return{baseQuantityDisplay:T(t).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteQuantityDisplay:T(r).div(Math.pow(10,e.quoteCoin.decimals)).toString(),baseOutDisplay:T(o).div(Math.pow(10,e.baseCoin.decimals)).toString(),quoteOutDisplay:T(u).div(Math.pow(10,e.quoteCoin.decimals)).toString(),deepRequiredDisplay:T(l).div(Mi).toString(),baseQuantity:t,quoteQuantity:r,baseOut:o,quoteOut:u,deepRequired:l}}async getReferencePool(e){let t=await this.getPools(),r=e.baseCoin.coinType,i=e.quoteCoin.coinType,s=this._deep.coinType;for(let a=0;a<t.length;a++){let o=t[a];if(o.address===e.address)continue;let u=[o.baseCoinType,o.quoteCoinType];if(o.baseCoinType===s&&(u.includes(r)||u.includes(i)))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(rt)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType,r.baseCoinType,r.quoteCoinType]}),t):null}async estimatedMaxFee(e,t,r,i,s,a,o){let u=this.deepCoin;try{let{taker_fee:l,maker_fee:f}=e,p=T(l).div(vt).toString(),g=T(f).div(vt).toString(),w=await this.getMarketPrice(e),C=a?r:w!=="0"?w:o;if(C==="0")throw new Error("Cannot get market price");let A=Math.pow(10,e.baseCoin.decimals).toString(),j=Math.pow(10,e.quoteCoin.decimals).toString(),E=T(C).div(A).mul(j).mul(vt).toString();if(i){let U=await this.getMarketPrice(e),R=T(a?r:U!=="0"?U:o).div(A).mul(j).mul(vt).toString(),ne=await this.getOrderDeepPrice(e);if(!ne)throw new Error("Cannot get deep price");let ie=Ci(R,r),ue=T(t).mul(T(p)).mul(T(ne.deep_per_asset)).div(T(vt)),oe=T(t).mul(T(g)).mul(T(ne.deep_per_asset)).div(T(vt));ne.asset_is_base||(ue=ue.mul(ie).div(T(vt)),oe=oe.mul(ie).div(T(vt)));let Je=ue.ceil().toString(),ut=oe.ceil().toString();return{takerFee:Je,makerFee:ut,takerFeeDisplay:gr(Je,u.decimals).toString(),makerFeeDisplay:gr(ut,u.decimals).toString(),feeType:u.coinType}}if(s){let U=Ci(E,a?r:w),Q=T(t).mul(U).mul(T(p).mul(1.25)).div(T(vt)).ceil().toFixed(0),R=T(t).mul(U).mul(T(g).mul(1.25)).div(T(vt)).ceil().toFixed(0);return{takerFee:Q,makerFee:R,takerFeeDisplay:gr(Q,e.quoteCoin.decimals).toString(),makerFeeDisplay:gr(R,e.quoteCoin.decimals).toString(),feeType:e.quoteCoin.coinType}}let q=T(t).mul(T(p).mul(1.25)).ceil().toFixed(0),S=T(t).mul(T(g).mul(1.25)).ceil().toFixed(0);return{takerFee:q,makerFee:S,takerFeeDisplay:gr(q,e.baseCoin.decimals).toString(),makerFeeDisplay:gr(S,e.baseCoin.decimals).toString(),feeType:e.baseCoin.coinType}}catch(l){throw l instanceof Error?l:new Error(String(l))}}async getOrderDeepPrice(e,t=!0){let r=`getOrderDeepPrice_${e.address}}`,i=this.getCache(r);if(i!==void 0)return i;try{let s=new ae,a=!1;t&&e?.baseCoin?.coinType!==this._deep.coinType&&e?.quoteCoin?.coinType!==this._deep.coinType&&await this.updateDeepPrice(e,s)&&(a=!0),s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order_deep_price`,arguments:[s.object(e.address)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let o=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.sdkOptions.simulationAccount.address,transactionBlock:s}),u=a?o.results[1]?.returnValues[0]?.[0]:o.results[0]?.returnValues[0]?.[0],l=this.parseOrderDeepPrice(new Uint8Array(u));return this.updateCache(r,l,6e4),l}catch{return await ma(2e3),this.getOrderDeepPrice(e,!1)}}parseOrderDeepPrice(e){let t=new DataView(e.buffer),r=t.getUint8(0)!==0,i=Number(t.getBigUint64(1,!0));return{asset_is_base:r,deep_per_asset:i}}getCoinAssets(e,t,r){return se.buildCoinWithBalance(BigInt(T(t).abs().ceil().toString()),e,r)}async getTransactionRelatedBalance(e,t,r,i,s,a,o){let u=this.deepCoin;if(!o)return{baseManagerBlance:"0",quoteManagerBlance:"0",feeManaerBalance:"0"};try{let l=[{coinType:e.baseCoin.coinType,decimals:e.baseCoin.decimals},{coinType:e.quoteCoin.coinType,decimals:e.quoteCoin.decimals}];i&&l.push(u);let f=await this.getManagerBalance({account:s,balanceManager:o,coins:l}),p=f?.[t]?.balance||"0",g=f?.[r]?.balance||"0",w=a&&f?.[u.coinType]?.balance||"0";return{baseManagerBlance:p,quoteManagerBlance:g,feeManaerBalance:w}}catch(l){throw l instanceof Error?l:new Error(String(l))}}getFeeAsset(e,t,r,i,s,a,o,u,l){let f=T(e).gt(0)&&u,p="0";if(!f)return{feeAsset:this.getEmptyCoin(l,t),haveDepositFee:"0"};if(a||o){let g=T(s).sub(a?i:r);p=g.lte(0)?e:g.sub(e).lt(0)?g.sub(e).toString():"0"}else p=T(s).sub(e).lt("0")?T(s).sub(e).abs().toString():"0";return{feeAsset:T(p).gt("0")?this.getCoinAssets(t,p,l):this.getEmptyCoin(l,t),haveDepositFee:p}}async getTransactionRelatedAssets(e,t,r,i,s,a,o,u,l){try{let f=this.deepCoin,p=wt(e.baseCoin.coinType),g=wt(e.quoteCoin.coinType),w=p===f.coinType,C=g===f.coinType,A=!w&&!C,{baseManagerBlance:j,quoteManagerBlance:E,feeManaerBalance:q}=await this.getTransactionRelatedBalance(e,p,g,A,a,o,u);console.log("\u{1F680}\u{1F680}\u{1F680} ~ deepbookUtilsModule.ts:897 ~ DeepbookUtilsModule ~ getTransactionRelatedAssets ~ quoteManagerBlance:",{baseManagerBlance:j,quoteManagerBlance:E});let S,U,Q=!1;if(s){o||(r=T(r).add(T(i)).toString());let ne=T(E).sub(r).toString();T(ne).lt(0)?(Q=!0,U=this.getCoinAssets(g,ne,l)):U=this.getEmptyCoin(l,g),S=this.getEmptyCoin(l,p)}else{o||(t=T(t).add(T(i)).toString());let ne=T(j).sub(t).toString();T(ne).lt(0)?(Q=!0,S=this.getCoinAssets(p,ne,l)):S=this.getEmptyCoin(l,p),U=this.getEmptyCoin(l,g)}let R=this.getFeeAsset(i,f.coinType,t,r,q,C,w,o,l);return{baseAsset:S,quoteAsset:U,feeAsset:R,haveDeposit:Q}}catch(f){throw f instanceof Error?f:new Error(String(f))}}async getMarketTransactionRelatedAssets(e,t,r,i,s,a,o,u,l,f){try{let p=this.deepCoin,g=wt(e.baseCoin.coinType),w=wt(e.quoteCoin.coinType),C=g===p.coinType,A=w===p.coinType,j=!C&&!A,E=await this.getTransactionRelatedBalance(e,g,w,j,a,o,u),{feeManaerBalance:q}=E,S=T(E.baseManagerBlance).add(T(f?.base||"0")).toString(),U=T(E.quoteManagerBlance).add(T(f?.quote||"0")).toString(),Q;o&&T(q).lt(i)?Q=this.getCoinAssets(p.coinType,T(i).sub(q).toString(),l):Q=this.getEmptyCoin(l,p.coinType);let R,ne;if(s){o||(r=T(r).add(T(i)).toString());let ie=T(U).sub(r).toString();if(T(ie).lt(0)){let ue;T(U).gt(0)&&(ue=await this.withdrawFromManager({account:a,balanceManager:u,coin:e.quoteCoin,amountToWithdraw:U,returnAssets:!0,txb:l}));let oe=this.getCoinAssets(w,ie,l);ue&&l.mergeCoins(oe,[ue]),ne=oe}else ne=await this.withdrawFromManager({account:a,balanceManager:u,coin:e.quoteCoin,amountToWithdraw:r,returnAssets:!0,txb:l});R=this.getEmptyCoin(l,g)}else{o||(t=T(t).add(T(i)).toString());let ie=T(S).sub(t).toString();if(T(ie).lt(0)){let ue;T(S).gt(0)&&(ue=await this.withdrawFromManager({account:a,balanceManager:u,coin:e.baseCoin,amountToWithdraw:S,returnAssets:!0,txb:l}));let oe=this.getCoinAssets(g,ie,l);ue&&l.mergeCoins(oe,[ue]),R=oe}else R=await this.withdrawFromManager({account:a,balanceManager:u,coin:e.baseCoin,amountToWithdraw:t,returnAssets:!0,txb:l});ne=this.getEmptyCoin(l,w)}return{baseAsset:R,quoteAsset:ne,feeAsset:Q}}catch(p){throw p instanceof Error?p:new Error(String(p))}}async createDepositThenPlaceLimitOrder({poolInfo:e,priceInput:t,quantity:r,orderType:i,isBid:s,maxFee:a,account:o,payWithDeep:u,expirationTimestamp:l=Date.now()+31536e8}){try{let f=this.deepCoin,p=e.address,g=e.baseCoin.decimals,w=e.quoteCoin.decimals,C=e.baseCoin.coinType,A=e.quoteCoin.coinType,j=T(t).mul(10**(w-g+9)).toString(),E=wt(C),q=wt(A),S=new ae,U,Q,R=await this._sdk.getOwnerCoinAssets(o);if(s){let oe=T(t).mul(T(r).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();u||(oe=T(oe).add(T(a)).toString()),Q=se.buildCoinWithBalance(BigInt(oe),q,S)}else{let oe=r;u||(oe=T(r).abs().add(T(a)).toString()),U=se.buildCoinWithBalance(BigInt(oe),E,S)}let ne=u?T(a).gt(0)?se.buildCoinWithBalance(BigInt(T(a).abs().ceil().toString()),f.coinType,S):this.getEmptyCoin(S,f.coinType):this.getEmptyCoin(S,f.coinType),ie=S.moveCall({typeArguments:[s?C:A],target:"0x2::coin::zero",arguments:[]}),ue=[S.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),S.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),S.object(p),s?ie:U,s?Q:ie,ne,S.pure.u8(i),S.pure.u8(0),S.pure.u64(j),S.pure.u64(r),S.pure.bool(s),S.pure.bool(!1),S.pure.u64(l),S.object(rt)];return S.moveCall({typeArguments:[E,q],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_limit_order`,arguments:ue}),S}catch(f){throw f instanceof Error?f:new Error(String(f))}}getEmptyCoin(e,t){return e.moveCall({typeArguments:[t],target:"0x2::coin::zero",arguments:[]})}async createDepositThenPlaceMarketOrder({poolInfo:e,quantity:t,isBid:r,maxFee:i,account:s,payWithDeep:a,slippage:o=.01}){try{let u=e.address,l=e.baseCoin.coinType,f=e.quoteCoin.coinType,p=wt(l),g=wt(f),w=new ae,C,A,j=t,E,q=await this.getOrderBook(e,"all",6);if(r){let Q=q?.ask?.[0]?.price||"0",R=T(Q).mul(T(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();E=T(R).plus(T(R).mul(o)).ceil().toString()}else{let Q=await q?.bid?.[0]?.price||"0",R=T(Q).mul(T(t).div(Math.pow(10,e.baseCoin.decimals))).mul(Math.pow(10,e.quoteCoin.decimals)).toString();E=T(R).minus(T(R).mul(o)).floor().toString()}r?(a||(E=T(E).add(T(i)).toString()),A=this.getCoinAssets(g,E,w),C=this.getEmptyCoin(w,p)):(a||(j=T(j).add(T(i)).toString()),A=this.getEmptyCoin(w,g),C=this.getCoinAssets(p,j,w));let S=a?T(i).gt(0)?se.buildCoinWithBalance(BigInt(T(i).abs().ceil().toString()),this.deepCoin.coinType,w):this.getEmptyCoin(w,this.deepCoin.coinType):this.getEmptyCoin(w,this.deepCoin.coinType),U=[w.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),w.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),w.object(u),C,A,S,w.pure.u8(0),w.pure.u64(t),w.pure.bool(r),w.pure.bool(a),w.pure.u64(E),w.object(rt)];return w.moveCall({typeArguments:[p,g],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::create_deposit_then_place_market_order_v2`,arguments:U}),w}catch(u){throw u instanceof Error?u:new Error(String(u))}}async placeLimitOrder({balanceManager:e,poolInfo:t,priceInput:r,quantity:i,isBid:s,orderType:a,maxFee:o,account:u,payWithDeep:l,expirationTimestamp:f=Date.now()+31536e8}){try{let p=this.deepCoin,g=T(r).mul(10**(t.quoteCoin.decimals-t.baseCoin.decimals+9)).toString(),w=t.baseCoin.coinType,C=t.quoteCoin.coinType,A=new ae,j=s?T(r).mul(T(i).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString():"0",E=s?"0":i,{baseAsset:q,quoteAsset:S,feeAsset:U,haveDeposit:Q}=await this.getTransactionRelatedAssets(t,E,j,o,s,u,l,e,A);if(Q){let ie=[A.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),A.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),A.object(t.address),A.object(e),q,S,U.feeAsset,A.pure.u8(a),A.pure.u8(0),A.pure.u64(g),A.pure.u64(i),A.pure.bool(s),A.pure.bool(l),A.pure.u64(f),A.object(rt)];return A.moveCall({typeArguments:[w,C],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_limit_order_by_owner`,arguments:ie}),A}let R=new ae;T(U.haveDepositFee).gt(0)&&this.depositIntoManager({account:u,balanceManager:e,coin:p,amountToDeposit:U.haveDepositFee,tx:R});let ne=[R.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),R.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),R.object(t.address),R.object(e),R.pure.u8(a),R.pure.u8(0),R.pure.u64(g),R.pure.u64(i),R.pure.bool(s),R.pure.bool(l),R.pure.u64(f),R.object(rt)];return R.moveCall({typeArguments:[w,C],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::place_limit_order`,arguments:ne}),R}catch(p){throw p instanceof Error?p:new Error(String(p))}}modifyOrder({balanceManager:e,poolInfo:t,orderId:r,newOrderQuantity:i}){let s=new ae;return s.moveCall({typeArguments:[t.baseCoin.coinType,t.quoteCoin.coinType],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::modify_order`,arguments:[s.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),s.object(e),s.object(t.address),s.pure.u128(r),s.pure.u64(i),s.object(rt)]}),s}async getBestAskprice(e){try{let{baseCoin:t,quoteCoin:r}=e,i=new ae,s=await this.getMarketPrice(e),a=T(s).gt(0)?s:Math.pow(10,-1),o=Math.pow(10,6),u=T(a).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),l=T(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(u),i.pure.u64(l),i.pure.bool(!1),i.object(rt)],typeArguments:[t.coinType,r.coinType]});let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:i}),g=[],w=p.results[0].returnValues[0][0],C=L.vector(L.u64()).parse(new Uint8Array(w)),A=p.results[0].returnValues[1][0],j=L.vector(L.u64()).parse(new Uint8Array(A));return C.forEach((E,q)=>{let S=T(E).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),U=T(j[q]).div(Math.pow(10,t.decimals)).toString();g.push({price:S,quantity:U})}),g?.[0]?.price||0}catch{return 0}}async getBestBidprice(e){try{let{baseCoin:t,quoteCoin:r}=e,i=new ae,s=await this.getMarketPrice(e),a=T(s).gt(0)?T(s).div(3).toNumber():Math.pow(10,-6),o=T(s).gt(0)?s:Math.pow(10,6),u=T(a).mul(Math.pow(10,9+r.decimals-t.decimals)).toString(),l=T(o).mul(Math.pow(10,9+r.decimals-t.decimals)).toString();i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[i.object(e.address),i.pure.u64(fr(u,0)),i.pure.u64(fr(l,0)),i.pure.bool(!0),i.object(rt)],typeArguments:[t.coinType,r.coinType]});let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:i}),g=[],w=p.results[0].returnValues[0][0],C=L.vector(L.u64()).parse(new Uint8Array(w)),A=p.results[0].returnValues[1][0],j=L.vector(L.u64()).parse(new Uint8Array(A));return C.forEach((E,q)=>{let S=T(E).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),U=T(j[q]).div(Math.pow(10,t.decimals)).toString();g.push({price:S,quantity:U})}),g?.[0]?.price||0}catch{return 0}}async getBestAskOrBidPrice(e,t){try{let{baseCoin:r,quoteCoin:i}=e,s=new ae,a=await this.getMarketPrice(e),o,u;t?(o=T(a).gt(0)?T(a).div(3).toNumber():Math.pow(10,-6),u=T(a).gt(0)?a:Math.pow(10,6)):(o=T(a).gt(0)?a:Math.pow(10,-1),u=T(a).gt(0)?T(a).mul(3).toNumber():Math.pow(10,6));let l=T(o).mul(Math.pow(10,9+i.decimals-r.decimals)).toString(),f=T(u).mul(Math.pow(10,9+i.decimals-r.decimals)).toString();s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[s.object(e.address),s.pure.u64(fr(l,0)),s.pure.u64(fr(f,0)),s.pure.bool(t),s.object(rt)],typeArguments:[r.coinType,i.coinType]});let p=this._sdk.sdkOptions.simulationAccount.address,g=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:s}),w=[],C=g.results[0].returnValues[0][0],A=L.vector(L.u64()).parse(new Uint8Array(C)),j=g.results[0].returnValues[1][0],E=L.vector(L.u64()).parse(new Uint8Array(j));return A.forEach((q,S)=>{let U=T(q).div(Math.pow(10,9+i.decimals-r.decimals)).toString(),Q=T(E[S]).div(Math.pow(10,r.decimals)).toString();w.push({price:U,quantity:Q})}),w?.[0]?.price||0}catch{return 0}}async placeMarketOrder({balanceManager:e,poolInfo:t,baseQuantity:r,quoteQuantity:i,isBid:s,maxFee:a,account:o,payWithDeep:u,slippage:l=.01,settled_balances:f={base:"0",quote:"0"}}){try{let p=wt(t.baseCoin.coinType),g=wt(t.quoteCoin.coinType),w=new ae;f&&(T(f.base).gt(0)||T(f.quote).gt(0))&&this.withdrawSettledAmounts({poolInfo:t,balanceManager:e},w);let{baseAsset:C,quoteAsset:A,feeAsset:j}=await this.getMarketTransactionRelatedAssets(t,r,i,a,s,o,u,e,w,f),E=await this.getOrderBook(t,"all",6);if(s){let U=E?.ask?.[0]?.price||"0",Q=T(U).mul(T(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();i=T(Q).plus(T(Q).mul(l)).ceil().toString()}else{let U=await E?.bid?.[0]?.price||"0",Q=T(U).mul(T(r).div(Math.pow(10,t.baseCoin.decimals))).mul(Math.pow(10,t.quoteCoin.decimals)).toString();i=T(Q).minus(T(Q).mul(l)).floor().toString()}let q=i,S=[w.object(this._sdk.sdkOptions.deepbook_utils.global_config_id),w.object(this._sdk.sdkOptions.deepbook_utils.cetus_balance_manager_indexer_id),w.object(t.address),w.object(e),C,A,j,w.pure.u8(0),w.pure.u64(r),w.pure.bool(s),w.pure.bool(u),w.pure.u64(q),w.object(rt)];return w.setSenderIfNotSet(o),w.moveCall({typeArguments:[p,g],target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::deepbookv3_utils::deposit_then_place_market_order_by_owner_v2`,arguments:S}),w}catch(p){throw p instanceof Error?p:new Error(String(p))}}async getOrderInfoList(e,t){try{let r=new ae;e.forEach(l=>{let f=l?.pool,p=l?.orderId;r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_order`,arguments:[r.object(f.pool_id),r.pure.u128(BigInt(p))],typeArguments:[f.baseCoinType,f.quoteCoinType]})});let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:r}),s=L.struct("ID",{bytes:L.Address}),a=L.struct("OrderDeepPrice",{asset_is_base:L.bool(),deep_per_asset:L.u64()}),o=L.struct("Order",{balance_manager_id:s,order_id:L.u128(),client_order_id:L.u64(),quantity:L.u64(),filled_quantity:L.u64(),fee_is_deep:L.bool(),order_deep_price:a,epoch:L.u64(),status:L.u8(),expire_timestamp:L.u64()}),u=[];return i?.results?.forEach(l=>{let f=l.returnValues[0][0],p=o.parse(new Uint8Array(f));u.push(p)}),u}catch{return[]}}decodeOrderId(e){let t=e>>BigInt(127)===BigInt(0),r=e>>BigInt(64)&(BigInt(1)<<BigInt(63))-BigInt(1),i=e&(BigInt(1)<<BigInt(64))-BigInt(1);return{isBid:t,price:r,orderId:i}}async getOpenOrder(e,t,r,i,s=!1,a=new ae){let o;if(i)o=i;else{a.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[a.object(e.address),s?r:a.object(r)],typeArguments:[e.baseCoin.coinType,e.quoteCoin.coinType]});let g=(await this._sdk.fullClient.devInspectTransactionBlock({sender:t,transactionBlock:a})).results[s?1:0].returnValues[0][0];o=L.struct("VecSet",{constants:L.vector(L.U128)}).parse(new Uint8Array(g)).constants}if(o.length===0)return[];let u=o.map(p=>({pool:{pool_id:e.address,baseCoinType:e.baseCoin.coinType,quoteCoinType:e.quoteCoin.coinType},orderId:p})),l=await this.getOrderInfoList(u,t)||[],f=[];return l.forEach(p=>{let g=this.decodeOrderId(BigInt(p.order_id));f.push({...p,price:g.price,isBid:g.isBid,pool:e})}),f}async getAllMarketsOpenOrders(e,t){try{let r=await this.getPools(),i=new ae;r.forEach(p=>{i.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::account_open_orders`,arguments:[i.object(p.pool_id),i.object(t)],typeArguments:[p.baseCoinType,p.quoteCoinType]})});let a=(await this._sdk.fullClient.devInspectTransactionBlock({sender:e,transactionBlock:i})).results?.map(p=>p.returnValues?.[0]?.[0])||[],o=L.struct("VecSet",{constants:L.vector(L.U128)}),u=[];a.forEach((p,g)=>{let w=o.parse(new Uint8Array(p)).constants;w.length>0&&w.forEach(C=>{u.push({pool:r[g],orderId:C})})});let l=await this.getOrderInfoList(u,e)||[],f=[];return u.forEach((p,g)=>{let w=this.decodeOrderId(BigInt(p.orderId)),C=l.find(A=>A.order_id===p.orderId)||{};f.push({...p,...C,price:w.price,isBid:w.isBid})}),f}catch(r){return console.log("\u{1F680} ~ DeepbookUtilsModule ~ getAllMarketsOpenOrders ~ error:",r),[]}}cancelOrders(e,t,r=new ae){return e.forEach(i=>{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(i.poolInfo.address),r.pure.u128(i.orderId),r.object(rt)],typeArguments:[i.poolInfo.baseCoin.coinType,i.poolInfo.quoteCoin.coinType]})}),r}async getDeepbookOrderBook(e,t,r,i,s,a){let o=this._sdk.fullClient,l=await new Fu({client:o,address:s,network:"testnet",balanceManagers:{test1:{address:a,tradeCap:""}}}).getLevel2Range(e,t,r,i)}processOrderBookData(e,t,r,i){let s=e.returnValues[0][0],a=L.vector(L.u64()).parse(new Uint8Array(s)),o=e.returnValues[1][0],u=L.vector(L.u64()).parse(new Uint8Array(o)),l={};return a.forEach((p,g)=>{let w=T(p).div(Math.pow(10,9+r.decimals-t.decimals)).toString(),C=T(u[g]).div(Math.pow(10,t.decimals)).toString();l[w]?l[w]={price:w,quantity:T(l[w].quantity).add(C).toString()}:l[w]={price:w,quantity:C}}),Object.values(l)}getLevel2RangeTx(e,t,r,i,s=new ae){let{baseCoin:a,quoteCoin:o}=e,u=fr(T(r).mul(Math.pow(10,9+o.decimals-a.decimals)).toString(),0),l=fr(T(i).mul(Math.pow(10,9+o.decimals-a.decimals)).toString(),0);return s.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[s.object(e.address),s.pure.u64(u),s.pure.u64(l),s.pure.bool(t),s.object(rt)],typeArguments:[a.coinType,o.coinType]}),s}async fetchOrderBook(e,t,r,i,s,a){let o=new ae,{baseCoin:u,quoteCoin:l}=e;try{if(t==="bid"||t==="all"){let C=i,A=r==="0"?s:r;o=this.getLevel2RangeTx(e,!0,C,A,o)}if(t==="ask"||t==="all"){let C=r==="0"?i:r,A=s;o=this.getLevel2RangeTx(e,!1,C,A,o)}let f=this._sdk.sdkOptions.simulationAccount.address,p=await this._sdk.fullClient.devInspectTransactionBlock({sender:f,transactionBlock:o}),g=[];(t==="bid"||t==="all")&&(g=p.results?.[0]?this.processOrderBookData(p.results[0],u,l,a):[]);let w=[];if(t==="ask"||t==="all"){let C=t==="ask"?0:1;w=p.results?.[C]?this.processOrderBookData(p.results[C],u,l,a):[]}return{bid:g.sort((C,A)=>A.price-C.price),ask:w.sort((C,A)=>C.price-A.price)}}catch{let p=this._sdk.sdkOptions.simulationAccount.address,g=[],w=[];try{let C=this.getLevel2RangeTx(e,!0,i,r),A=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:C});g=A.results?.[0]?this.processOrderBookData(A.results[0],u,l,a):[]}catch{g=[]}try{let C=this.getLevel2RangeTx(e,!1,i,r),A=await this._sdk.fullClient.devInspectTransactionBlock({sender:p,transactionBlock:C});w=A.results?.[0]?this.processOrderBookData(A.results[0],u,l,a):[]}catch{w=[]}return{bid:g,ask:w}}}async getOrderBook(e,t,r){let i={bid:[],ask:[]};try{let s=await this.getMarketPrice(e),a=t,o=Math.pow(10,-r),u=Math.pow(10,r),l=await this.fetchOrderBook(e,a,s,o,u,r);return{bid:l?.bid,ask:l?.ask}}catch{return i}}async getOrderBookOrigin(e,t){try{let r=new ae,i=await this.getMarketPrice(e),{baseCoin:s,quoteCoin:a}=e;if(t==="bid"||t==="all"){let p=Math.pow(10,-6),g=i,w=T(p).mul(Math.pow(10,9+a.decimals-s.decimals)).toString(),C=T(g).mul(Math.pow(10,9+a.decimals-s.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(w),r.pure.u64(C),r.pure.bool(!0),r.object(rt)],typeArguments:[s.coinType,a.coinType]})}if(t==="ask"||t==="all"){let p=i,g=Math.pow(10,6),w=T(p).mul(Math.pow(10,9+a.decimals-s.decimals)).toString(),C=T(g).mul(Math.pow(10,9+a.decimals-s.decimals)).toString();r.moveCall({target:`${this._sdk.sdkOptions.deepbook.package_id}::pool::get_level2_range`,arguments:[r.object(e.address),r.pure.u64(w),r.pure.u64(C),r.pure.bool(!1),r.object(rt)],typeArguments:[s.coinType,a.coinType]})}let o=this._sdk.sdkOptions.simulationAccount.address,u=await this._sdk.fullClient.devInspectTransactionBlock({sender:o,transactionBlock:r}),l=[];if(t==="bid"||t==="all"){let p=u.results[0]?.returnValues[0]?.[0],g=L.vector(L.u64()).parse(new Uint8Array(p)),w=u.results[0]?.returnValues[1]?.[0],C=L.vector(L.u64()).parse(new Uint8Array(w));g.forEach((A,j)=>{let E=T(A).div(Math.pow(10,9+a.decimals-s.decimals)).toString(),q=T(C[j]).div(Math.pow(10,s.decimals)).toString();l.push({price:E,quantity:q})})}let f=[];if(t==="ask"||t==="all"){let p=t==="ask"?0:1,g=u.results[p]?.returnValues[0]?.[0],w=L.vector(L.u64()).parse(new Uint8Array(g)),C=u.results[p]?.returnValues[1]?.[0],A=L.vector(L.u64()).parse(new Uint8Array(C));w.forEach((j,E)=>{let q=T(j).div(Math.pow(10,9+a.decimals-s.decimals)).toString(),S=T(A[E]).div(Math.pow(10,s.decimals)).toString();f.push({price:q,quantity:S})})}return{bid:l,ask:f}}catch{return{bids:[],asks:[]}}}async getWalletBalance(e){let t=await this._sdk.fullClient?.getAllBalances({owner:e});return Object.fromEntries(t.map((i,s)=>[wt(i.coinType),i]))}async getAccount(e,t,r=new ae){for(let o=0;o<t.length;o++){let u=t[o];r.moveCall({target:`${this._sdk.sdkOptions.deepbook_utils.published_at}::order_trader::get_account_id`,arguments:[r.object(u.address),typeof e=="string"?r.object(e):e],typeArguments:[u.baseCoin.coinType,u.quoteCoin.coinType]})}let i=await this._sdk.fullClient.devInspectTransactionBlock({sender:this._sdk.senderAddress,transactionBlock:r}),s;if(i?.events.length===0)return null;let a=[];return i?.events?.forEach((o,u)=>{s=o?.parsedJson;let l=s.account.open_orders.contents,f=s.account.owed_balances,p=s.account.settled_balances,g=s.account.unclaimed_rebates,w=s.account.taker_volume;a.push({balance_manager_id:e,open_orders:l,owed_balances:f,settled_balances:p,unclaimed_rebates:g,taker_volume:w,poolInfo:t[u]})}),a}async getSuiTransactionResponse(e,t=!1){let r=`${e}_getSuiTransactionResponse`,i=this.getCache(r,t);if(i!==void 0)return i;let s;try{s=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0,showBalanceChanges:!0,showInput:!0,showObjectChanges:!0}})}catch{s=await this._sdk.fullClient.getTransactionBlock({digest:e,options:{showEvents:!0,showEffects:!0}})}return this.updateCache(r,s,864e5),s}transformExtensions(e,t,r=!0){let i=[];for(let s of t){let{key:a}=s.fields,{value:o}=s.fields;if(a==="labels")try{o=JSON.parse(decodeURIComponent(Vu.decode(o)))}catch{}r&&(e[a]=o),i.push({key:a,value:o})}delete e.extension_fields,r||(e.extensions=i)}async getCoinConfigs(e=!1,t=!0){let r=this.sdk.sdkOptions.coinlist.handle,i=`${r}_getCoinConfigs`,s=this.getCache(i,e);if(s)return s;let o=(await this._sdk.fullClient.getDynamicFieldsByPage(r)).data.map(f=>f.objectId),u=await this._sdk.fullClient.batchGetObjects(o,{showContent:!0}),l=[];return u.forEach(f=>{let p=this.buildCoinConfig(f,t);this.updateCache(`${r}_${p.address}_getCoinConfig`,p,864e5),l.push({...p})}),this.updateCache(i,l,864e5),l}buildCoinConfig(e,t=!0){let r=la(e);r=r.value.fields;let i={...r};return i.id=ua(e),i.address=Et(r.coin_type.fields.name).full_address,r.pyth_id&&(i.pyth_id=Lu(r.pyth_id)),this.transformExtensions(i,r.extension_fields.fields.contents,t),delete i.coin_type,i}updateCache(e,t,r=3e5){let i=this._cache[e];i?(i.overdueTime=qr(r),i.value=t):i=new Br(t,qr(r)),this._cache[e]=i}getCache(e,t=!1){let r=this._cache[e],i=r?.isValid();if(!t&&i)return r.value;i||delete this._cache[e]}async createPermissionlessPool({tickSize:e,lotSize:t,minSize:r,baseCoinType:i,quoteCoinType:s}){let a=new ae,o=se.buildCoinWithBalance(BigInt(500*10**6),"0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP",a);a.moveCall({target:`${this.sdk.sdkOptions.deepbook.published_at}::pool::create_permissionless_pool`,typeArguments:[i,s],arguments:[a.object(this.sdk.sdkOptions.deepbook.registry_id),a.pure.u64(e),a.pure.u64(t),a.pure.u64(r),o]});try{let u=await this._sdk.fullClient.devInspectTransactionBlock({sender:this.sdk.senderAddress,transactionBlock:a});if(u.effects.status.status==="success")return a;if(u.effects.status.status==="failure"&&u.effects.status.error&&u.effects.status.error.indexOf('Some("register_pool") }, 1)')>-1)throw new Error("Pool already exists")}catch(u){throw u instanceof Error?u:new Error(String(u))}return a}};import{bcs as P}from"@mysten/sui/bcs";import{Transaction as H}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as fe,normalizeSuiAddress as Tn}from"@mysten/sui/utils";var Ai=10n;function Gu(n,e){if(!Ai)throw new Error("oraclePriceMultiplierDecimal is required");if(n===0n)throw new Error("Invalid oracle price");if(e<0n){let t=10n**(Ai- -e);return n*t}return n/10n**(e+Ai)}var Dr=class{_sdk;hasChangeConnection=!1;_commonPythPrice;_cache={};constructor(e){this._sdk=e,this._commonPythPrice=new Xs(e.fullClient)}get sdk(){return this._sdk}async updatePythPriceIDs(e,t){let r=null,i=null;try{r=await this._commonPythPrice.getPriceFeedsUpdateData(e)}catch(o){i=o,console.log("Error: ",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: ${i?.message}`);let s=[];try{s=await this._commonPythPrice.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 a=new Map;for(let o=0;o<e.length;o++)a.set(e[o],s[o]);return a}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={},i=[];if(t?e.forEach(o=>{let u=this._sdk.getCache(`getLatestPrice_${o.coinType}`);u&&this.priceCheck(u,60)?r[o.coinType]=u:i.push(o.coinType)}):i=e.map(o=>o.coinType),i.length===0)return r;let s=e.map(o=>o.feed);return(await this._commonPythPrice.getLatestPriceFeeds(s))?.parsed?.forEach((o,u)=>{let l=o.price;if(l){let{price:f,expo:p}=l,g=T(f).mul(T(10).pow(T(p))).toString(),C={coin_type:e[u].coinType,price:g,oracle_price:0n,last_update_time:l.publish_time};C.oracle_price=Gu(BigInt(f),BigInt(p)),r[i[u]]=C,this._sdk.updateCache(`getLatestPrice_${C.coin_type}`,C)}}),r}};var Mn=class{_sdk;pythPrice;_deep;_cache={};constructor(e){if(!e)throw new Error("SDK instance is required");this._sdk=e,this.pythPrice=new Dr(e),this._deep=e.sdkOptions.network==="mainnet"?wa:ba}get sdk(){return this._sdk}get deepCoin(){return this._deep}createAndShareMarginManager(e,t=new H){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:i}=e;try{let{margin_manager:s,initializer:a}=this.createMarginManager(e,t);return this.shareMarginManager({marginManager:s,initializer:a,baseCoin:r,quoteCoin:i},t),{tx:t,margin_manager:s,initializer:a}}catch(s){throw new Error(`Failed to create and share margin manager: ${s instanceof Error?s.message:String(s)}`)}}createMarginManager(e,t=new H){if(console.log("\u{1F680}\u{1F680}\u{1F680} ~ marginUtilsModule.ts:90 ~ MarginUtilsModule ~ createMarginManager ~ poolInfo:",e),!e)throw new Error("Pool info is required");if(!e.id)throw new Error("Pool ID is required");let{id:r,baseCoin:i,quoteCoin:s}=e;try{let[a,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(fe)],typeArguments:[i.coinType,s.coinType]});return{tx:t,margin_manager:a,initializer:o}}catch(a){throw new Error(`Failed to create margin manager: ${a instanceof Error?a.message:String(a)}`)}}shareMarginManager({marginManager:e,initializer:t,baseCoin:r,quoteCoin:i},s=new H){try{return s.moveCall({target:`${this._sdk.sdkOptions.margin_utils.published_at}::margin_utils::share_margin_manager`,arguments:[e,t],typeArguments:[r.coinType,i.coinType]}),s}catch(a){throw new Error(`Failed to share margin manager: ${a instanceof Error?a.message:String(a)}`)}}async getBalanceManagerByMarginManager(e){if(!e||typeof e!="string")throw new Error("Valid account address is required");let t=`
29
29
  query Events($filter: EventFilter) {
30
30
  events(filter: $filter) {
31
31
  nodes {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cetusprotocol/deepbook-utils",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "cetus deepbook utils sdk",
5
5
  "typings": "dist/index.d.ts",
6
6
  "main": "dist/index.js",